commit aab7c19a8075dcad8edcaf8a6437709d261aff55 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun Mar 15 12:44:04 2026 +0000 deploy: 2026-03-15 12:44:04 UTC diff --git a/404.html b/404.html new file mode 100644 index 0000000..9a08f2c --- /dev/null +++ b/404.html @@ -0,0 +1 @@ +HMCL 文档

404

页面不存在

diff --git a/assets/css/main.css b/assets/css/main.css new file mode 100644 index 0000000..4ec2dc8 --- /dev/null +++ b/assets/css/main.css @@ -0,0 +1,6 @@ +/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #6f777d;outline:5px auto #6f777d;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#fff;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:rgb(47.2,124.8,148.8)}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:#3d4144;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid #3d4144}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted #3d4144}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #6f777d}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:rgb(78.37,144.33,164.73)}a:hover{color:rgb(35.4,93.6,111.6);outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid rgb(241.7,242.5,243.1)}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:rgb(99.8,103,105.4);font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:rgb(35.4,93.6,111.6)}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(241.7,242.5,243.1)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:#3d4144;border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:#3d4144;cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:#3d4144;background-color:#fff;border:rgb(241.7,242.5,243.1);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#6f777d;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(61,65,68,.06),0 0 5px rgba(111,119,125,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:rgb(99.8,103,105.4)}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:rgb(241.7,242.5,243.1);border-bottom:2px solid rgb(181.275,181.875,182.325)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid rgb(181.275,181.875,182.325)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#6f777d;color:#fff}.btn--primary:visited{background-color:#6f777d;color:#fff}.btn--primary:hover{background-color:rgb(88.8,95.2,100);color:#fff}.btn--inverse{background-color:#fff;color:#3d4144;border:1px solid rgb(241.7,242.5,243.1)}.btn--inverse:visited{background-color:#fff;color:#3d4144}.btn--inverse:hover{background-color:#ccc;color:#3d4144}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#3fa63f;color:#fff}.btn--success:visited{background-color:#3fa63f;color:#fff}.btn--success:hover{background-color:rgb(50.4,132.8,50.4);color:#fff}.btn--warning{background-color:#d67f05;color:#fff}.btn--warning:visited{background-color:#d67f05;color:#fff}.btn--warning:hover{background-color:rgb(171.2,101.6,4);color:#fff}.btn--danger{background-color:#ee5f5b;color:#fff}.btn--danger:visited{background-color:#ee5f5b;color:#fff}.btn--danger:hover{background-color:rgb(190.4,76,72.8);color:#fff}.btn--info{background-color:#3b9cba;color:#fff}.btn--info:visited{background-color:#3b9cba;color:#fff}.btn--info:hover{background-color:rgb(47.2,124.8,148.8);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:#3d4144;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(241.7,242.5,243.1);border-radius:4px;box-shadow:0 1px 1px rgba(188.5,192.5,195.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(169.65,173.25,175.95)}.notice a:hover{color:rgb(94.25,96.25,97.75)}blockquote.notice{border-inline-start-color:rgb(169.65,173.25,175.95)}.notice code{background-color:rgb(248.35,248.75,249.05)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:#3d4144;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(226.2,227.8,229);border-radius:4px;box-shadow:0 1px 1px rgba(111,119,125,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(99.9,107.1,112.5)}.notice--primary a:hover{color:rgb(55.5,59.5,62.5)}blockquote.notice--primary{border-inline-start-color:rgb(99.9,107.1,112.5)}.notice--primary code{background-color:rgb(240.6,241.4,242)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:#3d4144;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(215.8,235.2,241.2);border-radius:4px;box-shadow:0 1px 1px rgba(59,156,186,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(53.1,140.4,167.4)}.notice--info a:hover{color:rgb(29.5,78,93)}blockquote.notice--info{border-inline-start-color:rgb(53.1,140.4,167.4)}.notice--info code{background-color:rgb(235.4,245.1,248.1)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:#3d4144;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(246.8,229.4,205);border-radius:4px;box-shadow:0 1px 1px rgba(214,127,5,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(192.6,114.3,4.5)}.notice--warning a:hover{color:rgb(107,63.5,2.5)}blockquote.notice--warning{border-inline-start-color:rgb(192.6,114.3,4.5)}.notice--warning code{background-color:rgb(250.9,242.2,230)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:#3d4144;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(216.6,237.2,216.6);border-radius:4px;box-shadow:0 1px 1px rgba(63,166,63,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(56.7,149.4,56.7)}.notice--success a:hover{color:rgb(31.5,83,31.5)}blockquote.notice--success{border-inline-start-color:rgb(56.7,149.4,56.7)}.notice--success code{background-color:rgb(235.8,246.1,235.8)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:#3d4144;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(251.6,223,222.2);border-radius:4px;box-shadow:0 1px 1px rgba(238,95,91,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(214.2,85.5,81.9)}.notice--danger a:hover{color:rgb(119,47.5,45.5)}blockquote.notice--danger{border-inline-start-color:rgb(214.2,85.5,81.9)}.notice--danger code{background-color:rgb(253.3,239,238.6)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid rgb(241.7,242.5,243.1);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:rgb(99.8,103,105.4);border:1px solid rgb(181.275,181.875,182.325);border-radius:0}.pagination li a:hover{color:rgb(35.4,93.6,111.6)}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#6f777d}.pagination li a.disabled{color:rgba(99.8,103,105.4,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:rgb(99.8,103,105.4);border:1px solid rgb(181.275,181.875,182.325);border-radius:4px}.pagination--pager:hover{background-color:rgb(99.8,103,105.4);color:#fff}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(99.8,103,105.4,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid rgb(241.7,242.5,243.1)}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#fff}.greedy-nav a{display:block;margin:0 1rem;color:#6f777d;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:rgb(83.25,89.25,93.75)}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#6f777d;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid rgb(241.7,242.5,243.1);border-radius:4px;background:#fff;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:rgb(83.25,89.25,93.75);background:rgb(219,221,222.5)}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(241.7,242.5,243.1) rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#fff rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid rgb(241.7,242.5,243.1)}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#7a8288;font-size:.75em;font-weight:bold;border:1px solid rgb(188.5,192.5,195.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#7a8288;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#7a8288;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid rgb(241.7,242.5,243.1)}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#7a8288;background-color:#fff;border:1px solid rgb(241.7,242.5,243.1);border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#6f777d;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(226.2,227.8,229);color:#3d4144}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:rgb(99.8,103,105.4);font-weight:bold;line-height:1.5;border-bottom:1px solid rgb(241.7,242.5,243.1)}.toc__menu a:hover{color:#3d4144}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:rgb(99.8,103,105.4);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:rgb(241.7,242.5,243.1)}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:rgb(99.8,103,105.4)}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#6f777d;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:rgb(83.25,89.25,93.75)}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#6f777d;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#6f777d;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#263238;color:#eff;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#b2ccd6;border-inline-end:1px solid #b2ccd6;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#eff}.highlight .c{color:#b2ccd6}.highlight .err{color:#f07178}.highlight .k{color:#c792ea}.highlight .l{color:#f78c6c}.highlight .n{color:#eff}.highlight .o{color:#89ddff}.highlight .p{color:#eff}.highlight .cm{color:#b2ccd6}.highlight .cp{color:#b2ccd6}.highlight .c1{color:#b2ccd6}.highlight .cs{color:#b2ccd6}.highlight .gd{color:#f07178}.highlight .ge{font-style:italic}.highlight .gh{color:#eff;font-weight:bold}.highlight .gi{color:#c3e88d}.highlight .gp{color:#b2ccd6;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#89ddff;font-weight:bold}.highlight .kc{color:#c792ea}.highlight .kd{color:#c792ea}.highlight .kn{color:#89ddff}.highlight .kp{color:#c792ea}.highlight .kr{color:#c792ea}.highlight .kt{color:#ffcb6b}.highlight .ld{color:#c3e88d}.highlight .m{color:#f78c6c}.highlight .s{color:#c3e88d}.highlight .na{color:#82aaff}.highlight .nb{color:#eff}.highlight .nc{color:#ffcb6b}.highlight .no{color:#f07178}.highlight .nd{color:#89ddff}.highlight .ni{color:#eff}.highlight .ne{color:#f07178}.highlight .nf{color:#82aaff}.highlight .nl{color:#eff}.highlight .nn{color:#ffcb6b}.highlight .nx{color:#82aaff}.highlight .py{color:#eff}.highlight .nt{color:#89ddff}.highlight .nv{color:#f07178}.highlight .ow{color:#89ddff}.highlight .w{color:#eff}.highlight .mf{color:#f78c6c}.highlight .mh{color:#f78c6c}.highlight .mi{color:#f78c6c}.highlight .mo{color:#f78c6c}.highlight .sb{color:#c3e88d}.highlight .sc{color:#eff}.highlight .sd{color:#b2ccd6}.highlight .s2{color:#c3e88d}.highlight .se{color:#f78c6c}.highlight .sh{color:#c3e88d}.highlight .si{color:#f78c6c}.highlight .sx{color:#c3e88d}.highlight .sr{color:#c3e88d}.highlight .s1{color:#c3e88d}.highlight .ss{color:#c3e88d}.highlight .bp{color:#eff}.highlight .vc{color:#f07178}.highlight .vg{color:#f07178}.highlight .vi{color:#f07178}.highlight .il{color:#f78c6c}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:#3d4144}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#6f777d;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#6f777d;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#fff;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:rgb(83.25,89.25,93.75)}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid rgb(241.7,242.5,243.1);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid rgb(241.7,242.5,243.1)}.footnote{color:rgb(155.25,161.25,165.75);text-decoration:none}.footnotes{color:rgb(155.25,161.25,165.75)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#7a8288;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#ee5f5b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:#3d4144;text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid rgb(241.7,242.5,243.1)}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:#fafafa;border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid rgb(241.7,242.5,243.1)}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:rgb(99.8,103,105.4);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid rgb(181.275,181.875,182.325);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:rgb(35.4,93.6,111.6)}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px rgb(241.7,242.5,243.1)}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:rgb(99.8,103,105.4)}.taxonomy__count{color:rgb(99.8,103,105.4)}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid rgb(241.7,242.5,243.1)}.back-to-top{display:block;clear:both;color:rgb(99.8,103,105.4);font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid rgb(241.7,242.5,243.1);text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid rgb(241.7,242.5,243.1)}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid rgb(241.7,242.5,243.1)}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid rgb(241.7,242.5,243.1)}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:rgb(99.8,103,105.4);border-bottom:1px solid rgb(241.7,242.5,243.1)}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid rgb(241.7,242.5,243.1)}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid rgb(241.7,242.5,243.1)}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid rgb(241.7,242.5,243.1);border-radius:4px;background:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(241.7,242.5,243.1) rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#fff rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/css/skins/air.css b/assets/css/skins/air.css new file mode 100644 index 0000000..c97c218 --- /dev/null +++ b/assets/css/skins/air.css @@ -0,0 +1,6 @@ +.page__footer{color:#fff !important}.page__footer-follow .social-icons .svg-inline--fa{color:inherit}/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #0092ca;outline:5px auto #0092ca;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#eee;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:#393e46}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:#222831;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid #222831}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted #222831}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #0092ca}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:rgb(86.7,90.95,97.75)}a:hover{color:rgb(42.75,46.5,52.5);outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid rgb(205.5,206.75,208.75)}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:#393e46;font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:rgb(42.75,46.5,52.5)}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(241.7,242.5,243.1)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:#222831;border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:#222831;cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:#222831;background-color:#eee;border:rgb(205.5,206.75,208.75);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#0092ca;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(34,40,49,.06),0 0 5px rgba(0,146,202,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:#393e46}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:rgb(205.5,206.75,208.75);border-bottom:2px solid rgb(154.125,155.0625,156.5625)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid rgb(154.125,155.0625,156.5625)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#0092ca;color:#fff}.btn--primary:visited{background-color:#0092ca;color:#fff}.btn--primary:hover{background-color:rgb(0,116.8,161.6);color:#fff}.btn--inverse{background-color:#fff;color:#3d4144;border:1px solid rgb(205.5,206.75,208.75)}.btn--inverse:visited{background-color:#fff;color:#3d4144}.btn--inverse:hover{background-color:#ccc;color:#3d4144}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#3fa63f;color:#fff}.btn--success:visited{background-color:#3fa63f;color:#fff}.btn--success:hover{background-color:rgb(50.4,132.8,50.4);color:#fff}.btn--warning{background-color:#d67f05;color:#fff}.btn--warning:visited{background-color:#d67f05;color:#fff}.btn--warning:hover{background-color:rgb(171.2,101.6,4);color:#fff}.btn--danger{background-color:#ee5f5b;color:#fff}.btn--danger:visited{background-color:#ee5f5b;color:#fff}.btn--danger:hover{background-color:rgb(190.4,76,72.8);color:#fff}.btn--info{background-color:#3b9cba;color:#fff}.btn--info:visited{background-color:#3b9cba;color:#fff}.btn--info:hover{background-color:rgb(47.2,124.8,148.8);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:#222831;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(228.1,228.9,229.5);border-radius:4px;box-shadow:0 1px 1px rgba(188.5,192.5,195.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(169.65,173.25,175.95)}.notice a:hover{color:rgb(94.25,96.25,97.75)}blockquote.notice{border-inline-start-color:rgb(169.65,173.25,175.95)}.notice code{background-color:rgb(233.05,233.45,233.75)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:#222831;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(190.4,219.6,230.8);border-radius:4px;box-shadow:0 1px 1px rgba(0,146,202,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(0,131.4,181.8)}.notice--primary a:hover{color:#004965}blockquote.notice--primary{border-inline-start-color:rgb(0,131.4,181.8)}.notice--primary code{background-color:rgb(214.2,228.8,234.4)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:#222831;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(202.2,221.6,227.6);border-radius:4px;box-shadow:0 1px 1px rgba(59,156,186,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(53.1,140.4,167.4)}.notice--info a:hover{color:rgb(29.5,78,93)}blockquote.notice--info{border-inline-start-color:rgb(53.1,140.4,167.4)}.notice--info code{background-color:rgb(220.1,229.8,232.8)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:#222831;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(233.2,215.8,191.4);border-radius:4px;box-shadow:0 1px 1px rgba(214,127,5,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(192.6,114.3,4.5)}.notice--warning a:hover{color:rgb(107,63.5,2.5)}blockquote.notice--warning{border-inline-start-color:rgb(192.6,114.3,4.5)}.notice--warning code{background-color:rgb(235.6,226.9,214.7)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:#222831;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(203,223.6,203);border-radius:4px;box-shadow:0 1px 1px rgba(63,166,63,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(56.7,149.4,56.7)}.notice--success a:hover{color:rgb(31.5,83,31.5)}blockquote.notice--success{border-inline-start-color:rgb(56.7,149.4,56.7)}.notice--success code{background-color:rgb(220.5,230.8,220.5)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:#222831;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(238,209.4,208.6);border-radius:4px;box-shadow:0 1px 1px rgba(238,95,91,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(214.2,85.5,81.9)}.notice--danger a:hover{color:rgb(119,47.5,45.5)}blockquote.notice--danger{border-inline-start-color:rgb(214.2,85.5,81.9)}.notice--danger code{background-color:rgb(238,223.7,223.3)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid rgb(205.5,206.75,208.75);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:#393e46;border:1px solid rgb(154.125,155.0625,156.5625);border-radius:0}.pagination li a:hover{color:rgb(42.75,46.5,52.5)}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#0092ca}.pagination li a.disabled{color:rgba(57,62,70,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:#393e46;border:1px solid rgb(154.125,155.0625,156.5625);border-radius:4px}.pagination--pager:hover{background-color:#393e46;color:#fff}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(57,62,70,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid rgb(205.5,206.75,208.75)}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#eee}.greedy-nav a{display:block;margin:0 1rem;color:#222831;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:#222831}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#0092ca;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid rgb(205.5,206.75,208.75);border-radius:4px;background:#eee;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:#222831;background:rgb(210.8,212,213.8)}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(205.5,206.75,208.75) rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#eee rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid rgb(205.5,206.75,208.75)}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#7a8288;font-size:.75em;font-weight:bold;border:1px solid rgb(188.5,192.5,195.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#7a8288;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#7a8288;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid rgb(205.5,206.75,208.75)}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#7a8288;background-color:#eee;border:1px solid rgb(205.5,206.75,208.75);border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#0092ca;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(204,233.2,244.4);color:#3d4144}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:#393e46;font-weight:bold;line-height:1.5;border-bottom:1px solid rgb(205.5,206.75,208.75)}.toc__menu a:hover{color:#222831}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:#393e46;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:#0092ca}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:#393e46}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#0092ca;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:rgb(0,109.5,151.5)}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#0092ca;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#0092ca;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#263238;color:#eff;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#b2ccd6;border-inline-end:1px solid #b2ccd6;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#eff}.highlight .c{color:#b2ccd6}.highlight .err{color:#f07178}.highlight .k{color:#c792ea}.highlight .l{color:#f78c6c}.highlight .n{color:#eff}.highlight .o{color:#89ddff}.highlight .p{color:#eff}.highlight .cm{color:#b2ccd6}.highlight .cp{color:#b2ccd6}.highlight .c1{color:#b2ccd6}.highlight .cs{color:#b2ccd6}.highlight .gd{color:#f07178}.highlight .ge{font-style:italic}.highlight .gh{color:#eff;font-weight:bold}.highlight .gi{color:#c3e88d}.highlight .gp{color:#b2ccd6;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#89ddff;font-weight:bold}.highlight .kc{color:#c792ea}.highlight .kd{color:#c792ea}.highlight .kn{color:#89ddff}.highlight .kp{color:#c792ea}.highlight .kr{color:#c792ea}.highlight .kt{color:#ffcb6b}.highlight .ld{color:#c3e88d}.highlight .m{color:#f78c6c}.highlight .s{color:#c3e88d}.highlight .na{color:#82aaff}.highlight .nb{color:#eff}.highlight .nc{color:#ffcb6b}.highlight .no{color:#f07178}.highlight .nd{color:#89ddff}.highlight .ni{color:#eff}.highlight .ne{color:#f07178}.highlight .nf{color:#82aaff}.highlight .nl{color:#eff}.highlight .nn{color:#ffcb6b}.highlight .nx{color:#82aaff}.highlight .py{color:#eff}.highlight .nt{color:#89ddff}.highlight .nv{color:#f07178}.highlight .ow{color:#89ddff}.highlight .w{color:#eff}.highlight .mf{color:#f78c6c}.highlight .mh{color:#f78c6c}.highlight .mi{color:#f78c6c}.highlight .mo{color:#f78c6c}.highlight .sb{color:#c3e88d}.highlight .sc{color:#eff}.highlight .sd{color:#b2ccd6}.highlight .s2{color:#c3e88d}.highlight .se{color:#f78c6c}.highlight .sh{color:#c3e88d}.highlight .si{color:#f78c6c}.highlight .sx{color:#c3e88d}.highlight .sr{color:#c3e88d}.highlight .s1{color:#c3e88d}.highlight .ss{color:#c3e88d}.highlight .bp{color:#eff}.highlight .vc{color:#f07178}.highlight .vg{color:#f07178}.highlight .vi{color:#f07178}.highlight .il{color:#f78c6c}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:#222831}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#0092ca;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#0092ca;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#eee;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:rgb(0,109.5,151.5)}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid rgb(205.5,206.75,208.75);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid rgb(205.5,206.75,208.75)}.footnote{color:rgb(155.25,161.25,165.75);text-decoration:none}.footnotes{color:rgb(155.25,161.25,165.75)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#7a8288;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#ee5f5b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:#222831;text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid rgb(205.5,206.75,208.75)}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:#fafafa;border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid rgb(205.5,206.75,208.75)}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:#393e46;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid rgb(154.125,155.0625,156.5625);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:rgb(42.75,46.5,52.5)}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px rgb(205.5,206.75,208.75)}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:#393e46}.taxonomy__count{color:#393e46}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid rgb(205.5,206.75,208.75)}.back-to-top{display:block;clear:both;color:#393e46;font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid rgb(205.5,206.75,208.75);text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid rgb(205.5,206.75,208.75)}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid rgb(205.5,206.75,208.75)}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid rgb(205.5,206.75,208.75)}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:#393e46;border-bottom:1px solid rgb(205.5,206.75,208.75)}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid rgb(205.5,206.75,208.75)}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid rgb(205.5,206.75,208.75)}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid rgb(205.5,206.75,208.75);border-radius:4px;background:#eee;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(205.5,206.75,208.75) rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#eee rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/css/skins/aqua.css b/assets/css/skins/aqua.css new file mode 100644 index 0000000..35d45a5 --- /dev/null +++ b/assets/css/skins/aqua.css @@ -0,0 +1,6 @@ +/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #1976d2;outline:5px auto #1976d2;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#f0fff0;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:#03a9f4}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:rgb(15,70.8,126);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid rgb(15,70.8,126)}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted rgb(15,70.8,126)}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #1976d2}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:rgb(66,190.5,246.75)}a:hover{color:rgb(2.25,126.75,183);outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid rgb(232,241.3,250.5)}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:rgb(63,107.64,151.8);font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:rgb(2.25,126.75,183)}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(232,241.3,250.5)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:rgb(15,70.8,126);border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:rgb(15,70.8,126);cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:rgb(15,70.8,126);background-color:#f0fff0;border:rgb(232,241.3,250.5);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#1976d2;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(15,70.8,126,.06),0 0 5px rgba(25,118,210,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:rgb(63,107.64,151.8)}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:rgb(232,241.3,250.5);border-bottom:2px solid rgb(174,180.975,187.875)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid rgb(174,180.975,187.875)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#1976d2;color:#fff}.btn--primary:visited{background-color:#1976d2;color:#fff}.btn--primary:hover{background-color:rgb(20,94.4,168);color:#fff}.btn--inverse{background-color:#fff;color:rgb(15,70.8,126);border:1px solid rgb(232,241.3,250.5)}.btn--inverse:visited{background-color:#fff;color:rgb(15,70.8,126)}.btn--inverse:hover{background-color:#ccc;color:rgb(15,70.8,126)}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#27ae60;color:#fff}.btn--success:visited{background-color:#27ae60;color:#fff}.btn--success:hover{background-color:rgb(31.2,139.2,76.8);color:#fff}.btn--warning{background-color:#e67e22;color:#fff}.btn--warning:visited{background-color:#e67e22;color:#fff}.btn--warning:hover{background-color:rgb(184,100.8,27.2);color:#fff}.btn--danger{background-color:#c0392b;color:#fff}.btn--danger:visited{background-color:#c0392b;color:#fff}.btn--danger:hover{background-color:rgb(153.6,45.6,34.4);color:#fff}.btn--info{background-color:#03a9f4;color:#fff}.btn--info:visited{background-color:#03a9f4;color:#fff}.btn--info:hover{background-color:rgb(2.4,135.2,195.2);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:rgb(15,70.8,126);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(230,248.15,239.25);border-radius:4px;box-shadow:0 1px 1px rgba(140,186.5,232.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(126,167.85,209.25)}.notice a:hover{color:rgb(70,93.25,116.25)}blockquote.notice{border-inline-start-color:rgb(126,167.85,209.25)}.notice code{background-color:rgb(235,251.575,239.625)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:rgb(15,70.8,126);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(218.5,241.3,237);border-radius:4px;box-shadow:0 1px 1px rgba(25,118,210,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(22.5,106.2,189)}.notice--primary a:hover{color:rgb(12.5,59,105)}blockquote.notice--primary{border-inline-start-color:rgb(22.5,106.2,189)}.notice--primary code{background-color:rgb(229.25,248.15,238.5)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:rgb(15,70.8,126);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(216.3,246.4,240.4);border-radius:4px;box-shadow:0 1px 1px rgba(3,169,244,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(2.7,152.1,219.6)}.notice--info a:hover{color:rgb(1.5,84.5,122)}blockquote.notice--info{border-inline-start-color:rgb(2.7,152.1,219.6)}.notice--info code{background-color:rgb(228.15,250.7,240.2)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:rgb(15,70.8,126);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(239,242.1,219.4);border-radius:4px;box-shadow:0 1px 1px rgba(230,126,34,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(207,113.4,30.6)}.notice--warning a:hover{color:#733f11}blockquote.notice--warning{border-inline-start-color:rgb(207,113.4,30.6)}.notice--warning code{background-color:rgb(239.5,248.55,229.7)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:rgb(15,70.8,126);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(219.9,246.9,225.6);border-radius:4px;box-shadow:0 1px 1px rgba(39,174,96,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(35.1,156.6,86.4)}.notice--success a:hover{color:rgb(19.5,87,48)}blockquote.notice--success{border-inline-start-color:rgb(35.1,156.6,86.4)}.notice--success code{background-color:rgb(229.95,250.95,232.8)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:rgb(15,70.8,126);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(235.2,235.2,220.3);border-radius:4px;box-shadow:0 1px 1px rgba(192,57,43,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(172.8,51.3,38.7)}.notice--danger a:hover{color:rgb(96,28.5,21.5)}blockquote.notice--danger{border-inline-start-color:rgb(172.8,51.3,38.7)}.notice--danger code{background-color:rgb(237.6,245.1,230.15)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid rgb(232,241.3,250.5);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:rgb(63,107.64,151.8);border:1px solid rgb(174,180.975,187.875);border-radius:0}.pagination li a:hover{color:rgb(2.25,126.75,183)}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#1976d2}.pagination li a.disabled{color:rgba(63,107.64,151.8,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:rgb(63,107.64,151.8);border:1px solid rgb(174,180.975,187.875);border-radius:4px}.pagination--pager:hover{background-color:rgb(63,107.64,151.8);color:#fff}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(63,107.64,151.8,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid rgb(232,241.3,250.5)}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#f0fff0}.greedy-nav a{display:block;margin:0 1rem;color:#1976d2;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:rgb(18.75,88.5,157.5)}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#1976d2;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid rgb(232,241.3,250.5);border-radius:4px;background:#f0fff0;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:rgb(18.75,88.5,157.5);background:rgb(197.5,220.75,243.75)}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(232,241.3,250.5) rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#f0fff0 rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid rgb(232,241.3,250.5)}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#1976d2;font-size:.75em;font-weight:bold;border:1px solid rgb(140,186.5,232.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#1976d2;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#1976d2;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid rgb(232,241.3,250.5)}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#1976d2;background-color:#f0fff0;border:1px solid rgb(232,241.3,250.5);border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#1976d2;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(209,227.6,246);color:rgb(15,70.8,126)}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:rgb(63,107.64,151.8);font-weight:bold;line-height:1.5;border-bottom:1px solid rgb(232,241.3,250.5)}.toc__menu a:hover{color:rgb(15,70.8,126)}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:rgb(63,107.64,151.8);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:rgb(232,241.3,250.5)}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:rgb(63,107.64,151.8)}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#1976d2;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:rgb(18.75,88.5,157.5)}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#1976d2;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#1976d2;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#263238;color:#eff;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#b2ccd6;border-inline-end:1px solid #b2ccd6;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#eff}.highlight .c{color:#b2ccd6}.highlight .err{color:#f07178}.highlight .k{color:#c792ea}.highlight .l{color:#f78c6c}.highlight .n{color:#eff}.highlight .o{color:#89ddff}.highlight .p{color:#eff}.highlight .cm{color:#b2ccd6}.highlight .cp{color:#b2ccd6}.highlight .c1{color:#b2ccd6}.highlight .cs{color:#b2ccd6}.highlight .gd{color:#f07178}.highlight .ge{font-style:italic}.highlight .gh{color:#eff;font-weight:bold}.highlight .gi{color:#c3e88d}.highlight .gp{color:#b2ccd6;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#89ddff;font-weight:bold}.highlight .kc{color:#c792ea}.highlight .kd{color:#c792ea}.highlight .kn{color:#89ddff}.highlight .kp{color:#c792ea}.highlight .kr{color:#c792ea}.highlight .kt{color:#ffcb6b}.highlight .ld{color:#c3e88d}.highlight .m{color:#f78c6c}.highlight .s{color:#c3e88d}.highlight .na{color:#82aaff}.highlight .nb{color:#eff}.highlight .nc{color:#ffcb6b}.highlight .no{color:#f07178}.highlight .nd{color:#89ddff}.highlight .ni{color:#eff}.highlight .ne{color:#f07178}.highlight .nf{color:#82aaff}.highlight .nl{color:#eff}.highlight .nn{color:#ffcb6b}.highlight .nx{color:#82aaff}.highlight .py{color:#eff}.highlight .nt{color:#89ddff}.highlight .nv{color:#f07178}.highlight .ow{color:#89ddff}.highlight .w{color:#eff}.highlight .mf{color:#f78c6c}.highlight .mh{color:#f78c6c}.highlight .mi{color:#f78c6c}.highlight .mo{color:#f78c6c}.highlight .sb{color:#c3e88d}.highlight .sc{color:#eff}.highlight .sd{color:#b2ccd6}.highlight .s2{color:#c3e88d}.highlight .se{color:#f78c6c}.highlight .sh{color:#c3e88d}.highlight .si{color:#f78c6c}.highlight .sx{color:#c3e88d}.highlight .sr{color:#c3e88d}.highlight .s1{color:#c3e88d}.highlight .ss{color:#c3e88d}.highlight .bp{color:#eff}.highlight .vc{color:#f07178}.highlight .vg{color:#f07178}.highlight .vi{color:#f07178}.highlight .il{color:#f78c6c}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:rgb(15,70.8,126)}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#1976d2;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#1976d2;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#f0fff0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:rgb(18.75,88.5,157.5)}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid rgb(232,241.3,250.5);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid rgb(232,241.3,250.5)}.footnote{color:rgb(82.5,152.25,221.25);text-decoration:none}.footnotes{color:rgb(82.5,152.25,221.25)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#1976d2;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#c0392b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:rgb(15,70.8,126);text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid rgb(232,241.3,250.5)}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:rgb(232,241.3,250.5);border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid rgb(232,241.3,250.5)}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:rgb(63,107.64,151.8);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid rgb(174,180.975,187.875);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:rgb(2.25,126.75,183)}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px rgb(232,241.3,250.5)}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:rgb(63,107.64,151.8)}.taxonomy__count{color:rgb(63,107.64,151.8)}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid rgb(232,241.3,250.5)}.back-to-top{display:block;clear:both;color:rgb(63,107.64,151.8);font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid rgb(232,241.3,250.5);text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid rgb(232,241.3,250.5)}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid rgb(232,241.3,250.5)}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid rgb(232,241.3,250.5)}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:rgb(63,107.64,151.8);border-bottom:1px solid rgb(232,241.3,250.5)}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid rgb(232,241.3,250.5)}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid rgb(232,241.3,250.5)}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid rgb(232,241.3,250.5);border-radius:4px;background:#f0fff0;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(232,241.3,250.5) rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#f0fff0 rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/css/skins/contrast.css b/assets/css/skins/contrast.css new file mode 100644 index 0000000..a966edf --- /dev/null +++ b/assets/css/skins/contrast.css @@ -0,0 +1,6 @@ +.page__content .notice,.page__content .notice--primary,.page__content .notice--info,.page__content .notice--warning,.page__content .notice--success,.page__content .notice--danger{color:#000}.page__footer{color:#fff !important}.page__footer-follow .social-icons i,.page__footer-follow .social-icons .svg-inline--fa{color:inherit}/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #b60000;outline:5px auto #b60000;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#fff;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:blue}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid #000}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted #000}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #b60000}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:hsl(240,100%,57.5%)}a:hover{color:rgb(0,0,191.25);outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid hsl(0,0%,75%)}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:#000;font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:rgb(0,0,191.25)}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(241.7,242.5,243.1)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:#000;border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:#000;cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:#000;background-color:#fff;border:hsl(0,0%,75%);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#b60000;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(0,0,0,.06),0 0 5px rgba(182,0,0,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:#000}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:hsl(0,0%,75%);border-bottom:2px solid hsl(0,0%,56.25%)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid hsl(0,0%,56.25%)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#b60000;color:#fff}.btn--primary:visited{background-color:#b60000;color:#fff}.btn--primary:hover{background-color:rgb(145.6,0,0);color:#fff}.btn--inverse{background-color:#fff;color:#3d4144;border:1px solid hsl(0,0%,75%)}.btn--inverse:visited{background-color:#fff;color:#3d4144}.btn--inverse:hover{background-color:#ccc;color:#3d4144}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#3fa63f;color:#fff}.btn--success:visited{background-color:#3fa63f;color:#fff}.btn--success:hover{background-color:rgb(50.4,132.8,50.4);color:#fff}.btn--warning{background-color:#d67f05;color:#fff}.btn--warning:visited{background-color:#d67f05;color:#fff}.btn--warning:hover{background-color:rgb(171.2,101.6,4);color:#fff}.btn--danger{background-color:#ee5f5b;color:#fff}.btn--danger:visited{background-color:#ee5f5b;color:#fff}.btn--danger:hover{background-color:rgb(190.4,76,72.8);color:#fff}.btn--info{background-color:#3b9cba;color:#fff}.btn--info:visited{background-color:#3b9cba;color:#fff}.btn--info:hover{background-color:rgb(47.2,124.8,148.8);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(241.7,242.5,243.1);border-radius:4px;box-shadow:0 1px 1px rgba(188.5,192.5,195.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(169.65,173.25,175.95)}.notice a:hover{color:rgb(94.25,96.25,97.75)}blockquote.notice{border-inline-start-color:rgb(169.65,173.25,175.95)}.notice code{background-color:rgb(248.35,248.75,249.05)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(240.4,204,204);border-radius:4px;box-shadow:0 1px 1px rgba(182,0,0,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(163.8,0,0)}.notice--primary a:hover{color:#5b0000}blockquote.notice--primary{border-inline-start-color:rgb(163.8,0,0)}.notice--primary code{background-color:rgb(247.7,229.5,229.5)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(215.8,235.2,241.2);border-radius:4px;box-shadow:0 1px 1px rgba(59,156,186,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(53.1,140.4,167.4)}.notice--info a:hover{color:rgb(29.5,78,93)}blockquote.notice--info{border-inline-start-color:rgb(53.1,140.4,167.4)}.notice--info code{background-color:rgb(235.4,245.1,248.1)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(246.8,229.4,205);border-radius:4px;box-shadow:0 1px 1px rgba(214,127,5,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(192.6,114.3,4.5)}.notice--warning a:hover{color:rgb(107,63.5,2.5)}blockquote.notice--warning{border-inline-start-color:rgb(192.6,114.3,4.5)}.notice--warning code{background-color:rgb(250.9,242.2,230)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(216.6,237.2,216.6);border-radius:4px;box-shadow:0 1px 1px rgba(63,166,63,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(56.7,149.4,56.7)}.notice--success a:hover{color:rgb(31.5,83,31.5)}blockquote.notice--success{border-inline-start-color:rgb(56.7,149.4,56.7)}.notice--success code{background-color:rgb(235.8,246.1,235.8)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(251.6,223,222.2);border-radius:4px;box-shadow:0 1px 1px rgba(238,95,91,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(214.2,85.5,81.9)}.notice--danger a:hover{color:rgb(119,47.5,45.5)}blockquote.notice--danger{border-inline-start-color:rgb(214.2,85.5,81.9)}.notice--danger code{background-color:rgb(253.3,239,238.6)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid hsl(0,0%,75%);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:#000;border:1px solid hsl(0,0%,56.25%);border-radius:0}.pagination li a:hover{color:rgb(0,0,191.25)}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#b60000}.pagination li a.disabled{color:rgba(0,0,0,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:#000;border:1px solid hsl(0,0%,56.25%);border-radius:4px}.pagination--pager:hover{background-color:#000;color:#fff}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(0,0,0,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid hsl(0,0%,75%)}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#fff}.greedy-nav a{display:block;margin:0 1rem;color:#000;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:#000}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#b60000;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid hsl(0,0%,75%);border-radius:4px;background:#fff;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:#000;background:#ccc}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:hsl(0,0%,75%) rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#fff rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid hsl(0,0%,75%)}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#7a8288;font-size:.75em;font-weight:bold;border:1px solid rgb(188.5,192.5,195.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#7a8288;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#7a8288;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid hsl(0,0%,75%)}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#7a8288;background-color:#fff;border:1px solid hsl(0,0%,75%);border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#b60000;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(240.4,204,204);color:#3d4144}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:#000;font-weight:bold;line-height:1.5;border-bottom:1px solid hsl(0,0%,75%)}.toc__menu a:hover{color:#000}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:#000;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:#000}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:#000}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#b60000;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:rgb(136.5,0,0)}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#b60000;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#b60000;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#000;color:#b5b3aa;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#918f88;border-inline-end:1px solid #918f88;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#d9d7cc}.highlight .c{color:#918f88}.highlight .err{color:#ff6c60}.highlight .k{color:#ff73fd}.highlight .l{color:#e9c062}.highlight .n{color:#b5b3aa}.highlight .o{color:#c6c5fe}.highlight .p{color:#b5b3aa}.highlight .cm{color:#918f88}.highlight .cp{color:#918f88}.highlight .c1{color:#918f88}.highlight .cs{color:#918f88}.highlight .gd{color:#ff6c60}.highlight .ge{font-style:italic}.highlight .gh{color:#b5b3aa;font-weight:bold}.highlight .gi{color:#a8ff60}.highlight .gp{color:#918f88;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#c6c5fe;font-weight:bold}.highlight .kc{color:#ff73fd}.highlight .kd{color:#ff73fd}.highlight .kn{color:#c6c5fe}.highlight .kp{color:#ff73fd}.highlight .kr{color:#ff73fd}.highlight .kt{color:#ffffb6}.highlight .ld{color:#a8ff60}.highlight .m{color:#e9c062}.highlight .s{color:#a8ff60}.highlight .na{color:#96cbfe}.highlight .nb{color:#b5b3aa}.highlight .nc{color:#ffffb6}.highlight .no{color:#ff6c60}.highlight .nd{color:#c6c5fe}.highlight .ni{color:#b5b3aa}.highlight .ne{color:#ff6c60}.highlight .nf{color:#96cbfe}.highlight .nl{color:#b5b3aa}.highlight .nn{color:#ffffb6}.highlight .nx{color:#96cbfe}.highlight .py{color:#b5b3aa}.highlight .nt{color:#c6c5fe}.highlight .nv{color:#ff6c60}.highlight .ow{color:#c6c5fe}.highlight .w{color:#b5b3aa}.highlight .mf{color:#e9c062}.highlight .mh{color:#e9c062}.highlight .mi{color:#e9c062}.highlight .mo{color:#e9c062}.highlight .sb{color:#a8ff60}.highlight .sc{color:#b5b3aa}.highlight .sd{color:#918f88}.highlight .s2{color:#a8ff60}.highlight .se{color:#e9c062}.highlight .sh{color:#a8ff60}.highlight .si{color:#e9c062}.highlight .sx{color:#a8ff60}.highlight .sr{color:#a8ff60}.highlight .s1{color:#a8ff60}.highlight .ss{color:#a8ff60}.highlight .bp{color:#b5b3aa}.highlight .vc{color:#ff6c60}.highlight .vg{color:#ff6c60}.highlight .vi{color:#ff6c60}.highlight .il{color:#e9c062}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:#000}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#b60000;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#b60000;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#fff;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:rgb(136.5,0,0)}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid hsl(0,0%,75%);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid hsl(0,0%,75%)}.footnote{color:rgb(155.25,161.25,165.75);text-decoration:none}.footnotes{color:rgb(155.25,161.25,165.75)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#7a8288;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#ee5f5b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:#000;text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid hsl(0,0%,75%)}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:#fafafa;border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid hsl(0,0%,75%)}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid hsl(0,0%,56.25%);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:rgb(0,0,191.25)}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px hsl(0,0%,75%)}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:#000}.taxonomy__count{color:#000}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid hsl(0,0%,75%)}.back-to-top{display:block;clear:both;color:#000;font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid hsl(0,0%,75%);text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid hsl(0,0%,75%)}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid hsl(0,0%,75%)}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid hsl(0,0%,75%)}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:#000;border-bottom:1px solid hsl(0,0%,75%)}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid hsl(0,0%,75%)}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid hsl(0,0%,75%)}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid hsl(0,0%,75%);border-radius:4px;background:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:hsl(0,0%,75%) rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#fff rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/css/skins/dark.css b/assets/css/skins/dark.css new file mode 100644 index 0000000..8b1215b --- /dev/null +++ b/assets/css/skins/dark.css @@ -0,0 +1,6 @@ +.author__urls.social-icons i,.author__urls.social-icons .svg-inline--fa,.page__footer-follow .social-icons i,.page__footer-follow .social-icons .svg-inline--fa{color:inherit}.ais-search-box .ais-search-box--input{background-color:rgb(31.45,35.7,44.2)}/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #00adb5;outline:5px auto #00adb5;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#252a34;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:rgb(140.4,209.6,212.8)}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:#eaeaea;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid #eaeaea}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted #eaeaea}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #00adb5}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:rgb(105.3,157.2,159.6)}a:hover{color:rgb(169.05,220.95,223.35);outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid rgb(80.6,84.6,92.6)}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:rgb(238.2,238.2,238.2);font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:rgb(169.05,220.95,223.35)}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(31.45,35.7,44.2)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:#eaeaea;border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:#eaeaea;cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:#eaeaea;background-color:#252a34;border:rgb(80.6,84.6,92.6);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#00adb5;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(234,234,234,.06),0 0 5px rgba(0,173,181,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:rgb(238.2,238.2,238.2)}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:rgb(80.6,84.6,92.6);border-bottom:2px solid rgb(60.45,63.45,69.45)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid rgb(60.45,63.45,69.45)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#00adb5;color:#fff}.btn--primary:visited{background-color:#00adb5;color:#fff}.btn--primary:hover{background-color:rgb(0,138.4,144.8);color:#fff}.btn--inverse{background-color:#fff;color:#3d4144;border:1px solid rgb(80.6,84.6,92.6)}.btn--inverse:visited{background-color:#fff;color:#3d4144}.btn--inverse:hover{background-color:#ccc;color:#3d4144}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#3fa63f;color:#fff}.btn--success:visited{background-color:#3fa63f;color:#fff}.btn--success:hover{background-color:rgb(50.4,132.8,50.4);color:#fff}.btn--warning{background-color:#d67f05;color:#fff}.btn--warning:visited{background-color:#d67f05;color:#fff}.btn--warning:hover{background-color:rgb(171.2,101.6,4);color:#fff}.btn--danger{background-color:#ee5f5b;color:#fff}.btn--danger:visited{background-color:#ee5f5b;color:#fff}.btn--danger:hover{background-color:rgb(190.4,76,72.8);color:#fff}.btn--info{background-color:#3b9cba;color:#fff}.btn--info:visited{background-color:#3b9cba;color:#fff}.btn--info:hover{background-color:rgb(47.2,124.8,148.8);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:#eaeaea;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(67.3,72.1,80.7);border-radius:4px;box-shadow:0 1px 1px rgba(188.5,192.5,195.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(169.65,173.25,175.95)}.notice a:hover{color:rgb(94.25,96.25,97.75)}blockquote.notice{border-inline-start-color:rgb(169.65,173.25,175.95)}.notice code{background-color:rgb(52.15,57.05,66.35)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:#eaeaea;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(29.6,68.2,77.8);border-radius:4px;box-shadow:0 1px 1px rgba(0,173,181,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(0,155.7,162.9)}.notice--primary a:hover{color:rgb(0,86.5,90.5)}blockquote.notice--primary{border-inline-start-color:rgb(0,155.7,162.9)}.notice--primary code{background-color:rgb(33.3,55.1,64.9)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:#eaeaea;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(41.4,64.8,78.8);border-radius:4px;box-shadow:0 1px 1px rgba(59,156,186,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(53.1,140.4,167.4)}.notice--info a:hover{color:rgb(29.5,78,93)}blockquote.notice--info{border-inline-start-color:rgb(53.1,140.4,167.4)}.notice--info code{background-color:rgb(39.2,53.4,65.4)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:#eaeaea;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(72.4,59,42.6);border-radius:4px;box-shadow:0 1px 1px rgba(214,127,5,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(192.6,114.3,4.5)}.notice--warning a:hover{color:rgb(107,63.5,2.5)}blockquote.notice--warning{border-inline-start-color:rgb(192.6,114.3,4.5)}.notice--warning code{background-color:rgb(54.7,50.5,47.3)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:#eaeaea;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(42.2,66.8,54.2);border-radius:4px;box-shadow:0 1px 1px rgba(63,166,63,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(56.7,149.4,56.7)}.notice--success a:hover{color:rgb(31.5,83,31.5)}blockquote.notice--success{border-inline-start-color:rgb(56.7,149.4,56.7)}.notice--success code{background-color:rgb(39.6,54.4,53.1)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:#eaeaea;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(77.2,52.6,59.8);border-radius:4px;box-shadow:0 1px 1px rgba(238,95,91,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(214.2,85.5,81.9)}.notice--danger a:hover{color:rgb(119,47.5,45.5)}blockquote.notice--danger{border-inline-start-color:rgb(214.2,85.5,81.9)}.notice--danger code{background-color:rgb(57.1,47.3,55.9)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid rgb(80.6,84.6,92.6);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:rgb(238.2,238.2,238.2);border:1px solid rgb(60.45,63.45,69.45);border-radius:0}.pagination li a:hover{color:rgb(169.05,220.95,223.35)}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#00adb5}.pagination li a.disabled{color:rgba(238.2,238.2,238.2,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:rgb(238.2,238.2,238.2);border:1px solid rgb(60.45,63.45,69.45);border-radius:4px}.pagination--pager:hover{background-color:rgb(238.2,238.2,238.2);color:#3d4144}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(238.2,238.2,238.2,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid rgb(80.6,84.6,92.6)}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#252a34}.greedy-nav a{display:block;margin:0 1rem;color:#eaeaea;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:rgb(187.2,187.2,187.2)}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#00adb5;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid rgb(80.6,84.6,92.6);border-radius:4px;background:#252a34;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:rgb(187.2,187.2,187.2);background:rgb(25.9,29.4,36.4)}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(80.6,84.6,92.6) rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#252a34 rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid rgb(80.6,84.6,92.6)}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#7a8288;font-size:.75em;font-weight:bold;border:1px solid rgb(188.5,192.5,195.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#7a8288;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#7a8288;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid rgb(80.6,84.6,92.6)}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#7a8288;background-color:#252a34;border:1px solid rgb(80.6,84.6,92.6);border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#00adb5;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(204,238.6,240.2);color:#3d4144}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:rgb(238.2,238.2,238.2);font-weight:bold;line-height:1.5;border-bottom:1px solid rgb(80.6,84.6,92.6)}.toc__menu a:hover{color:#eaeaea}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:rgb(238.2,238.2,238.2);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:rgb(25.9,29.4,36.4)}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:rgb(238.2,238.2,238.2)}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#00adb5;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:rgb(0,129.75,135.75)}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#00adb5;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#00adb5;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#263238;color:#eff;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#b2ccd6;border-inline-end:1px solid #b2ccd6;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#eff}.highlight .c{color:#b2ccd6}.highlight .err{color:#f07178}.highlight .k{color:#c792ea}.highlight .l{color:#f78c6c}.highlight .n{color:#eff}.highlight .o{color:#89ddff}.highlight .p{color:#eff}.highlight .cm{color:#b2ccd6}.highlight .cp{color:#b2ccd6}.highlight .c1{color:#b2ccd6}.highlight .cs{color:#b2ccd6}.highlight .gd{color:#f07178}.highlight .ge{font-style:italic}.highlight .gh{color:#eff;font-weight:bold}.highlight .gi{color:#c3e88d}.highlight .gp{color:#b2ccd6;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#89ddff;font-weight:bold}.highlight .kc{color:#c792ea}.highlight .kd{color:#c792ea}.highlight .kn{color:#89ddff}.highlight .kp{color:#c792ea}.highlight .kr{color:#c792ea}.highlight .kt{color:#ffcb6b}.highlight .ld{color:#c3e88d}.highlight .m{color:#f78c6c}.highlight .s{color:#c3e88d}.highlight .na{color:#82aaff}.highlight .nb{color:#eff}.highlight .nc{color:#ffcb6b}.highlight .no{color:#f07178}.highlight .nd{color:#89ddff}.highlight .ni{color:#eff}.highlight .ne{color:#f07178}.highlight .nf{color:#82aaff}.highlight .nl{color:#eff}.highlight .nn{color:#ffcb6b}.highlight .nx{color:#82aaff}.highlight .py{color:#eff}.highlight .nt{color:#89ddff}.highlight .nv{color:#f07178}.highlight .ow{color:#89ddff}.highlight .w{color:#eff}.highlight .mf{color:#f78c6c}.highlight .mh{color:#f78c6c}.highlight .mi{color:#f78c6c}.highlight .mo{color:#f78c6c}.highlight .sb{color:#c3e88d}.highlight .sc{color:#eff}.highlight .sd{color:#b2ccd6}.highlight .s2{color:#c3e88d}.highlight .se{color:#f78c6c}.highlight .sh{color:#c3e88d}.highlight .si{color:#f78c6c}.highlight .sx{color:#c3e88d}.highlight .sr{color:#c3e88d}.highlight .s1{color:#c3e88d}.highlight .ss{color:#c3e88d}.highlight .bp{color:#eff}.highlight .vc{color:#f07178}.highlight .vg{color:#f07178}.highlight .vi{color:#f07178}.highlight .il{color:#f78c6c}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:#eaeaea}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#00adb5;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#00adb5;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#252a34;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:rgb(0,129.75,135.75)}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid rgb(80.6,84.6,92.6);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid rgb(80.6,84.6,92.6)}.footnote{color:rgb(155.25,161.25,165.75);text-decoration:none}.footnotes{color:rgb(155.25,161.25,165.75)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#7a8288;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#ee5f5b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:#eaeaea;text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid rgb(80.6,84.6,92.6)}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:rgb(31.45,35.7,44.2);border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid rgb(80.6,84.6,92.6)}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:rgb(238.2,238.2,238.2);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid rgb(60.45,63.45,69.45);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:rgb(169.05,220.95,223.35)}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px rgb(80.6,84.6,92.6)}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:rgb(238.2,238.2,238.2)}.taxonomy__count{color:rgb(238.2,238.2,238.2)}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid rgb(80.6,84.6,92.6)}.back-to-top{display:block;clear:both;color:rgb(238.2,238.2,238.2);font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid rgb(80.6,84.6,92.6);text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid rgb(80.6,84.6,92.6)}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid rgb(80.6,84.6,92.6)}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid rgb(80.6,84.6,92.6)}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:rgb(238.2,238.2,238.2);border-bottom:1px solid rgb(80.6,84.6,92.6)}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid rgb(80.6,84.6,92.6)}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid rgb(80.6,84.6,92.6)}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid rgb(80.6,84.6,92.6);border-radius:4px;background:#252a34;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(80.6,84.6,92.6) rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#252a34 rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/css/skins/default.css b/assets/css/skins/default.css new file mode 100644 index 0000000..e69de29 diff --git a/assets/css/skins/dirt.css b/assets/css/skins/dirt.css new file mode 100644 index 0000000..b317b1c --- /dev/null +++ b/assets/css/skins/dirt.css @@ -0,0 +1,6 @@ +/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #343434;outline:5px auto #343434;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#f3f3f3;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:#343434}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:#343434;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid #343434}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted #343434}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #343434}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:rgb(82.45,82.45,82.45)}a:hover{color:#272727;outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid #e9dcbe}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:#8e8b82;font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:#272727}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(241.7,242.5,243.1)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:#343434;border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:#343434;cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:#343434;background-color:#f3f3f3;border:#e9dcbe;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#343434;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(52,52,52,.06),0 0 5px rgba(52,52,52,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:#8e8b82}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:#e9dcbe;border-bottom:2px solid rgb(174.75,165,142.5)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid rgb(174.75,165,142.5)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#343434;color:#fff}.btn--primary:visited{background-color:#343434;color:#fff}.btn--primary:hover{background-color:rgb(41.6,41.6,41.6);color:#fff}.btn--inverse{background-color:#fff;color:#3d4144;border:1px solid #e9dcbe}.btn--inverse:visited{background-color:#fff;color:#3d4144}.btn--inverse:hover{background-color:#ccc;color:#3d4144}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#3fa63f;color:#fff}.btn--success:visited{background-color:#3fa63f;color:#fff}.btn--success:hover{background-color:rgb(50.4,132.8,50.4);color:#fff}.btn--warning{background-color:#d67f05;color:#fff}.btn--warning:visited{background-color:#d67f05;color:#fff}.btn--warning:hover{background-color:rgb(171.2,101.6,4);color:#fff}.btn--danger{background-color:#ee5f5b;color:#fff}.btn--danger:visited{background-color:#ee5f5b;color:#fff}.btn--danger:hover{background-color:rgb(190.4,76,72.8);color:#fff}.btn--info{background-color:#3b9cba;color:#fff}.btn--info:visited{background-color:#3b9cba;color:#fff}.btn--info:hover{background-color:rgb(47.2,124.8,148.8);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:#343434;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(232.1,232.9,233.5);border-radius:4px;box-shadow:0 1px 1px rgba(188.5,192.5,195.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(169.65,173.25,175.95)}.notice a:hover{color:rgb(94.25,96.25,97.75)}blockquote.notice{border-inline-start-color:rgb(169.65,173.25,175.95)}.notice code{background-color:rgb(237.55,237.95,238.25)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:#343434;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(204.8,204.8,204.8);border-radius:4px;box-shadow:0 1px 1px rgba(52,52,52,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(46.8,46.8,46.8)}.notice--primary a:hover{color:#1a1a1a}blockquote.notice--primary{border-inline-start-color:rgb(46.8,46.8,46.8)}.notice--primary code{background-color:rgb(223.9,223.9,223.9)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:#343434;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(206.2,225.6,231.6);border-radius:4px;box-shadow:0 1px 1px rgba(59,156,186,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(53.1,140.4,167.4)}.notice--info a:hover{color:rgb(29.5,78,93)}blockquote.notice--info{border-inline-start-color:rgb(53.1,140.4,167.4)}.notice--info code{background-color:rgb(224.6,234.3,237.3)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:#343434;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(237.2,219.8,195.4);border-radius:4px;box-shadow:0 1px 1px rgba(214,127,5,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(192.6,114.3,4.5)}.notice--warning a:hover{color:rgb(107,63.5,2.5)}blockquote.notice--warning{border-inline-start-color:rgb(192.6,114.3,4.5)}.notice--warning code{background-color:rgb(240.1,231.4,219.2)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:#343434;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(207,227.6,207);border-radius:4px;box-shadow:0 1px 1px rgba(63,166,63,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(56.7,149.4,56.7)}.notice--success a:hover{color:rgb(31.5,83,31.5)}blockquote.notice--success{border-inline-start-color:rgb(56.7,149.4,56.7)}.notice--success code{background-color:rgb(225,235.3,225)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:#343434;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(242,213.4,212.6);border-radius:4px;box-shadow:0 1px 1px rgba(238,95,91,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(214.2,85.5,81.9)}.notice--danger a:hover{color:rgb(119,47.5,45.5)}blockquote.notice--danger{border-inline-start-color:rgb(214.2,85.5,81.9)}.notice--danger code{background-color:rgb(242.5,228.2,227.8)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid #e9dcbe;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:#8e8b82;border:1px solid rgb(174.75,165,142.5);border-radius:0}.pagination li a:hover{color:#272727}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#343434}.pagination li a.disabled{color:rgba(142,139,130,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:#8e8b82;border:1px solid rgb(174.75,165,142.5);border-radius:4px}.pagination--pager:hover{background-color:#8e8b82;color:#fff}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(142,139,130,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid #e9dcbe}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#f3f3f3}.greedy-nav a{display:block;margin:0 1rem;color:#343434;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:#343434}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#343434;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid #e9dcbe;border-radius:4px;background:#f3f3f3;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:#343434;background:rgb(214.4,214.4,214.4)}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#e9dcbe rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#f3f3f3 rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid #e9dcbe}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#7a8288;font-size:.75em;font-weight:bold;border:1px solid rgb(188.5,192.5,195.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#7a8288;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#7a8288;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid #e9dcbe}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#7a8288;background-color:#f3f3f3;border:1px solid #e9dcbe;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#343434;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(214.4,214.4,214.4);color:#3d4144}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:#8e8b82;font-weight:bold;line-height:1.5;border-bottom:1px solid #e9dcbe}.toc__menu a:hover{color:#343434}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:#8e8b82;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:#e9dcbe}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:#8e8b82}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#343434;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:#272727}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#343434;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#343434;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#231e18;color:#cabcb1;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#b4a490;border-inline-end:1px solid #b4a490;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#d7c8bc}.highlight .c{color:#b4a490}.highlight .err{color:#d35c5c}.highlight .k{color:#bb90e2}.highlight .l{color:#ca7f32}.highlight .n{color:#cabcb1}.highlight .o{color:#6eb958}.highlight .p{color:#cabcb1}.highlight .cm{color:#b4a490}.highlight .cp{color:#b4a490}.highlight .c1{color:#b4a490}.highlight .cs{color:#b4a490}.highlight .gd{color:#d35c5c}.highlight .ge{font-style:italic}.highlight .gh{color:#cabcb1;font-weight:bold}.highlight .gi{color:#b7ba53}.highlight .gp{color:#b4a490;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#6eb958;font-weight:bold}.highlight .kc{color:#bb90e2}.highlight .kd{color:#bb90e2}.highlight .kn{color:#6eb958}.highlight .kp{color:#bb90e2}.highlight .kr{color:#bb90e2}.highlight .kt{color:#e0ac16}.highlight .ld{color:#b7ba53}.highlight .m{color:#ca7f32}.highlight .s{color:#b7ba53}.highlight .na{color:#88a4d3}.highlight .nb{color:#cabcb1}.highlight .nc{color:#e0ac16}.highlight .no{color:#d35c5c}.highlight .nd{color:#6eb958}.highlight .ni{color:#cabcb1}.highlight .ne{color:#d35c5c}.highlight .nf{color:#88a4d3}.highlight .nl{color:#cabcb1}.highlight .nn{color:#e0ac16}.highlight .nx{color:#88a4d3}.highlight .py{color:#cabcb1}.highlight .nt{color:#6eb958}.highlight .nv{color:#d35c5c}.highlight .ow{color:#6eb958}.highlight .w{color:#cabcb1}.highlight .mf{color:#ca7f32}.highlight .mh{color:#ca7f32}.highlight .mi{color:#ca7f32}.highlight .mo{color:#ca7f32}.highlight .sb{color:#b7ba53}.highlight .sc{color:#cabcb1}.highlight .sd{color:#b4a490}.highlight .s2{color:#b7ba53}.highlight .se{color:#ca7f32}.highlight .sh{color:#b7ba53}.highlight .si{color:#ca7f32}.highlight .sx{color:#b7ba53}.highlight .sr{color:#b7ba53}.highlight .s1{color:#b7ba53}.highlight .ss{color:#b7ba53}.highlight .bp{color:#cabcb1}.highlight .vc{color:#d35c5c}.highlight .vg{color:#d35c5c}.highlight .vi{color:#d35c5c}.highlight .il{color:#ca7f32}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:#343434}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#343434;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#343434;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#f3f3f3;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:#272727}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid #e9dcbe;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid #e9dcbe}.footnote{color:rgb(155.25,161.25,165.75);text-decoration:none}.footnotes{color:rgb(155.25,161.25,165.75)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#7a8288;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#ee5f5b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:#343434;text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid #e9dcbe}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:#fafafa;border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid #e9dcbe}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:#8e8b82;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid rgb(174.75,165,142.5);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:#272727}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px #e9dcbe}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:#8e8b82}.taxonomy__count{color:#8e8b82}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid #e9dcbe}.back-to-top{display:block;clear:both;color:#8e8b82;font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid #e9dcbe;text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid #e9dcbe}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid #e9dcbe}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid #e9dcbe}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:#8e8b82;border-bottom:1px solid #e9dcbe}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid #e9dcbe}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid #e9dcbe}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid #e9dcbe;border-radius:4px;background:#f3f3f3;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#e9dcbe rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#f3f3f3 rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/css/skins/mint.css b/assets/css/skins/mint.css new file mode 100644 index 0000000..78f0e70 --- /dev/null +++ b/assets/css/skins/mint.css @@ -0,0 +1,6 @@ +.page__footer{color:#fff !important}.page__footer-follow .social-icons i,.page__footer-follow .social-icons .svg-inline--fa{color:inherit}/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #11999e;outline:5px auto #11999e;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#f3f6f6;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:#11999e}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:#40514e;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid #40514e}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted #40514e}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #11999e}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:rgb(52.7,168.3,172.55)}a:hover{color:rgb(12.75,114.75,118.5);outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid rgb(207.25,211.5,210.75)}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:#40514e;font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:rgb(12.75,114.75,118.5)}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(241.7,242.5,243.1)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:#40514e;border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:#40514e;cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:#40514e;background-color:#f3f6f6;border:rgb(207.25,211.5,210.75);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#11999e;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(64,81,78,.06),0 0 5px rgba(17,153,158,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:#40514e}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:rgb(207.25,211.5,210.75);border-bottom:2px solid rgb(155.4375,158.625,158.0625)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid rgb(155.4375,158.625,158.0625)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#11999e;color:#fff}.btn--primary:visited{background-color:#11999e;color:#fff}.btn--primary:hover{background-color:rgb(13.6,122.4,126.4);color:#fff}.btn--inverse{background-color:#fff;color:#3d4144;border:1px solid rgb(207.25,211.5,210.75)}.btn--inverse:visited{background-color:#fff;color:#3d4144}.btn--inverse:hover{background-color:#ccc;color:#3d4144}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#3fa63f;color:#fff}.btn--success:visited{background-color:#3fa63f;color:#fff}.btn--success:hover{background-color:rgb(50.4,132.8,50.4);color:#fff}.btn--warning{background-color:#d67f05;color:#fff}.btn--warning:visited{background-color:#d67f05;color:#fff}.btn--warning:hover{background-color:rgb(171.2,101.6,4);color:#fff}.btn--danger{background-color:#ee5f5b;color:#fff}.btn--danger:visited{background-color:#ee5f5b;color:#fff}.btn--danger:hover{background-color:rgb(190.4,76,72.8);color:#fff}.btn--info{background-color:#3b9cba;color:#fff}.btn--info:visited{background-color:#3b9cba;color:#fff}.btn--info:hover{background-color:rgb(47.2,124.8,148.8);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:#40514e;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(232.1,235.3,235.9);border-radius:4px;box-shadow:0 1px 1px rgba(188.5,192.5,195.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(169.65,173.25,175.95)}.notice a:hover{color:rgb(94.25,96.25,97.75)}blockquote.notice{border-inline-start-color:rgb(169.65,173.25,175.95)}.notice code{background-color:rgb(237.55,240.65,240.95)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:#40514e;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(197.8,227.4,228.4);border-radius:4px;box-shadow:0 1px 1px rgba(17,153,158,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(15.3,137.7,142.2)}.notice--primary a:hover{color:rgb(8.5,76.5,79)}blockquote.notice--primary{border-inline-start-color:rgb(15.3,137.7,142.2)}.notice--primary code{background-color:rgb(220.4,236.7,237.2)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:#40514e;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(206.2,228,234);border-radius:4px;box-shadow:0 1px 1px rgba(59,156,186,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(53.1,140.4,167.4)}.notice--info a:hover{color:rgb(29.5,78,93)}blockquote.notice--info{border-inline-start-color:rgb(53.1,140.4,167.4)}.notice--info code{background-color:rgb(224.6,237,240)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:#40514e;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(237.2,222.2,197.8);border-radius:4px;box-shadow:0 1px 1px rgba(214,127,5,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(192.6,114.3,4.5)}.notice--warning a:hover{color:rgb(107,63.5,2.5)}blockquote.notice--warning{border-inline-start-color:rgb(192.6,114.3,4.5)}.notice--warning code{background-color:rgb(240.1,234.1,221.9)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:#40514e;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(207,230,209.4);border-radius:4px;box-shadow:0 1px 1px rgba(63,166,63,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(56.7,149.4,56.7)}.notice--success a:hover{color:rgb(31.5,83,31.5)}blockquote.notice--success{border-inline-start-color:rgb(56.7,149.4,56.7)}.notice--success code{background-color:rgb(225,238,227.7)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:#40514e;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(242,215.8,215);border-radius:4px;box-shadow:0 1px 1px rgba(238,95,91,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(214.2,85.5,81.9)}.notice--danger a:hover{color:rgb(119,47.5,45.5)}blockquote.notice--danger{border-inline-start-color:rgb(214.2,85.5,81.9)}.notice--danger code{background-color:rgb(242.5,230.9,230.5)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid rgb(207.25,211.5,210.75);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:#40514e;border:1px solid rgb(155.4375,158.625,158.0625);border-radius:0}.pagination li a:hover{color:rgb(12.75,114.75,118.5)}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#11999e}.pagination li a.disabled{color:rgba(64,81,78,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:#40514e;border:1px solid rgb(155.4375,158.625,158.0625);border-radius:4px}.pagination--pager:hover{background-color:#40514e;color:#fff}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(64,81,78,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid rgb(207.25,211.5,210.75)}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#f3f6f6}.greedy-nav a{display:block;margin:0 1rem;color:#40514e;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:#40514e}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#11999e;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid rgb(207.25,211.5,210.75);border-radius:4px;background:#f3f6f6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:#40514e;background:rgb(216.8,220.2,219.6)}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(207.25,211.5,210.75) rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#f3f6f6 rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid rgb(207.25,211.5,210.75)}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#7a8288;font-size:.75em;font-weight:bold;border:1px solid rgb(188.5,192.5,195.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#7a8288;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#7a8288;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid rgb(207.25,211.5,210.75)}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#7a8288;background-color:#f3f6f6;border:1px solid rgb(207.25,211.5,210.75);border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#11999e;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(207.4,234.6,235.6);color:#3d4144}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:#40514e;font-weight:bold;line-height:1.5;border-bottom:1px solid rgb(207.25,211.5,210.75)}.toc__menu a:hover{color:#40514e}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:#40514e;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:#30e3ca}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:#40514e}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#11999e;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:rgb(12.75,114.75,118.5)}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#11999e;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#11999e;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#263238;color:#eff;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#b2ccd6;border-inline-end:1px solid #b2ccd6;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#eff}.highlight .c{color:#b2ccd6}.highlight .err{color:#f07178}.highlight .k{color:#c792ea}.highlight .l{color:#f78c6c}.highlight .n{color:#eff}.highlight .o{color:#89ddff}.highlight .p{color:#eff}.highlight .cm{color:#b2ccd6}.highlight .cp{color:#b2ccd6}.highlight .c1{color:#b2ccd6}.highlight .cs{color:#b2ccd6}.highlight .gd{color:#f07178}.highlight .ge{font-style:italic}.highlight .gh{color:#eff;font-weight:bold}.highlight .gi{color:#c3e88d}.highlight .gp{color:#b2ccd6;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#89ddff;font-weight:bold}.highlight .kc{color:#c792ea}.highlight .kd{color:#c792ea}.highlight .kn{color:#89ddff}.highlight .kp{color:#c792ea}.highlight .kr{color:#c792ea}.highlight .kt{color:#ffcb6b}.highlight .ld{color:#c3e88d}.highlight .m{color:#f78c6c}.highlight .s{color:#c3e88d}.highlight .na{color:#82aaff}.highlight .nb{color:#eff}.highlight .nc{color:#ffcb6b}.highlight .no{color:#f07178}.highlight .nd{color:#89ddff}.highlight .ni{color:#eff}.highlight .ne{color:#f07178}.highlight .nf{color:#82aaff}.highlight .nl{color:#eff}.highlight .nn{color:#ffcb6b}.highlight .nx{color:#82aaff}.highlight .py{color:#eff}.highlight .nt{color:#89ddff}.highlight .nv{color:#f07178}.highlight .ow{color:#89ddff}.highlight .w{color:#eff}.highlight .mf{color:#f78c6c}.highlight .mh{color:#f78c6c}.highlight .mi{color:#f78c6c}.highlight .mo{color:#f78c6c}.highlight .sb{color:#c3e88d}.highlight .sc{color:#eff}.highlight .sd{color:#b2ccd6}.highlight .s2{color:#c3e88d}.highlight .se{color:#f78c6c}.highlight .sh{color:#c3e88d}.highlight .si{color:#f78c6c}.highlight .sx{color:#c3e88d}.highlight .sr{color:#c3e88d}.highlight .s1{color:#c3e88d}.highlight .ss{color:#c3e88d}.highlight .bp{color:#eff}.highlight .vc{color:#f07178}.highlight .vg{color:#f07178}.highlight .vi{color:#f07178}.highlight .il{color:#f78c6c}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:#40514e}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#11999e;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#11999e;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#f3f6f6;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:rgb(12.75,114.75,118.5)}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid rgb(207.25,211.5,210.75);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid rgb(207.25,211.5,210.75)}.footnote{color:rgb(155.25,161.25,165.75);text-decoration:none}.footnotes{color:rgb(155.25,161.25,165.75)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#7a8288;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#ee5f5b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:#40514e;text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid rgb(207.25,211.5,210.75)}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:#fafafa;border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid rgb(207.25,211.5,210.75)}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:#40514e;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid rgb(155.4375,158.625,158.0625);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:rgb(12.75,114.75,118.5)}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px rgb(207.25,211.5,210.75)}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:#40514e}.taxonomy__count{color:#40514e}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid rgb(207.25,211.5,210.75)}.back-to-top{display:block;clear:both;color:#40514e;font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid rgb(207.25,211.5,210.75);text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid rgb(207.25,211.5,210.75)}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid rgb(207.25,211.5,210.75)}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid rgb(207.25,211.5,210.75)}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:#40514e;border-bottom:1px solid rgb(207.25,211.5,210.75)}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid rgb(207.25,211.5,210.75)}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid rgb(207.25,211.5,210.75)}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid rgb(207.25,211.5,210.75);border-radius:4px;background:#f3f6f6;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(207.25,211.5,210.75) rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#f3f6f6 rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/css/skins/neon.css b/assets/css/skins/neon.css new file mode 100644 index 0000000..ddfd1ea --- /dev/null +++ b/assets/css/skins/neon.css @@ -0,0 +1,6 @@ +.author__urls.social-icons i,.author__urls.social-icons .svg-inline--fa,.page__footer-follow .social-icons i,.page__footer-follow .social-icons .svg-inline--fa{color:inherit}.pagination--pager{color:#fff6fb;background-color:#f21368;border-color:rgba(0,0,0,0)}.pagination--pager:visited{color:#fff6fb}.ais-search-box .ais-search-box--input{background-color:rgb(17,13.6,13.6)}/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #f21368;outline:5px auto #f21368;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#141010;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:#f21368}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:#fff6fb;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid #fff6fb}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted #fff6fb}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #f21368}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:rgb(181.5,14.25,78)}a:hover{color:rgb(245.25,78,141.75);outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid rgb(67,63.8,63.8)}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:rgb(255,247.8,251.8);font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:rgb(245.25,78,141.75)}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(17,13.6,13.6)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:#fff6fb;border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:#fff6fb;cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:#fff6fb;background-color:#141010;border:rgb(67,63.8,63.8);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#f21368;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(255,246,251,.06),0 0 5px rgba(242,19,104,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:rgb(255,247.8,251.8)}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:rgb(67,63.8,63.8);border-bottom:2px solid rgb(50.25,47.85,47.85)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid rgb(50.25,47.85,47.85)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#f21368;color:#fff}.btn--primary:visited{background-color:#f21368;color:#fff}.btn--primary:hover{background-color:rgb(193.6,15.2,83.2);color:#fff}.btn--inverse{background-color:#fff;color:#3d4144;border:1px solid rgb(67,63.8,63.8)}.btn--inverse:visited{background-color:#fff;color:#3d4144}.btn--inverse:hover{background-color:#ccc;color:#3d4144}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#3fa63f;color:#fff}.btn--success:visited{background-color:#3fa63f;color:#fff}.btn--success:hover{background-color:rgb(50.4,132.8,50.4);color:#fff}.btn--warning{background-color:#d67f05;color:#fff}.btn--warning:visited{background-color:#d67f05;color:#fff}.btn--warning:hover{background-color:rgb(171.2,101.6,4);color:#fff}.btn--danger{background-color:#ee5f5b;color:#fff}.btn--danger:visited{background-color:#ee5f5b;color:#fff}.btn--danger:hover{background-color:rgb(190.4,76,72.8);color:#fff}.btn--info{background-color:#3b9cba;color:#fff}.btn--info:visited{background-color:#3b9cba;color:#fff}.btn--info:hover{background-color:rgb(47.2,124.8,148.8);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:#fff6fb;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(36.85,33.65,33.95);border-radius:4px;box-shadow:0 1px 1px rgba(188.5,192.5,195.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(169.65,173.25,175.95)}.notice a:hover{color:rgb(94.25,96.25,97.75)}blockquote.notice{border-inline-start-color:rgb(169.65,173.25,175.95)}.notice code{background-color:rgb(28.425,24.825,24.975)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:#fff6fb;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(42.2,16.3,24.8);border-radius:4px;box-shadow:0 1px 1px rgba(242,19,104,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(217.8,17.1,93.6)}.notice--primary a:hover{color:rgb(121,9.5,52)}blockquote.notice--primary{border-inline-start-color:rgb(217.8,17.1,93.6)}.notice--primary code{background-color:rgb(31.1,16.15,20.4)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:#fff6fb;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(23.9,30,33);border-radius:4px;box-shadow:0 1px 1px rgba(59,156,186,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(53.1,140.4,167.4)}.notice--info a:hover{color:rgb(29.5,78,93)}blockquote.notice--info{border-inline-start-color:rgb(53.1,140.4,167.4)}.notice--info code{background-color:rgb(21.95,23,24.5)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:#fff6fb;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(39.4,27.1,14.9);border-radius:4px;box-shadow:0 1px 1px rgba(214,127,5,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(192.6,114.3,4.5)}.notice--warning a:hover{color:rgb(107,63.5,2.5)}blockquote.notice--warning{border-inline-start-color:rgb(192.6,114.3,4.5)}.notice--warning code{background-color:rgb(29.7,21.55,15.45)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:#fff6fb;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(24.3,31,20.7);border-radius:4px;box-shadow:0 1px 1px rgba(63,166,63,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(56.7,149.4,56.7)}.notice--success a:hover{color:rgb(31.5,83,31.5)}blockquote.notice--success{border-inline-start-color:rgb(56.7,149.4,56.7)}.notice--success code{background-color:rgb(22.15,23.5,18.35)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:#fff6fb;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(41.8,23.9,23.5);border-radius:4px;box-shadow:0 1px 1px rgba(238,95,91,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(214.2,85.5,81.9)}.notice--danger a:hover{color:rgb(119,47.5,45.5)}blockquote.notice--danger{border-inline-start-color:rgb(214.2,85.5,81.9)}.notice--danger code{background-color:rgb(30.9,19.95,19.75)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid rgb(67,63.8,63.8);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:rgb(255,247.8,251.8);border:1px solid rgb(50.25,47.85,47.85);border-radius:0}.pagination li a:hover{color:rgb(245.25,78,141.75)}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#f21368}.pagination li a.disabled{color:rgba(255,247.8,251.8,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:rgb(255,247.8,251.8);border:1px solid rgb(50.25,47.85,47.85);border-radius:4px}.pagination--pager:hover{background-color:rgb(255,247.8,251.8);color:#3d4144}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(255,247.8,251.8,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid rgb(67,63.8,63.8)}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#141010}.greedy-nav a{display:block;margin:0 1rem;color:#fff6fb;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:rgb(204,196.8,200.8)}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#f21368;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid rgb(67,63.8,63.8);border-radius:4px;background:#141010;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:rgb(204,196.8,200.8);background:rgb(14,11.2,11.2)}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(67,63.8,63.8) rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#141010 rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid rgb(67,63.8,63.8)}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#7a8288;font-size:.75em;font-weight:bold;border:1px solid rgb(188.5,192.5,195.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#7a8288;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#7a8288;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid rgb(67,63.8,63.8)}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#7a8288;background-color:#141010;border:1px solid rgb(67,63.8,63.8);border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#f21368;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(252.4,207.8,224.8);color:#3d4144}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:rgb(255,247.8,251.8);font-weight:bold;line-height:1.5;border-bottom:1px solid rgb(67,63.8,63.8)}.toc__menu a:hover{color:#fff6fb}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:rgb(255,247.8,251.8);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:rgb(24.2,1.9,10.4)}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:rgb(255,247.8,251.8)}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#f21368;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:rgb(181.5,14.25,78)}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#f21368;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#f21368;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#fff;color:#101010;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#000;border-inline-end:1px solid #000;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#151515}.highlight .c{color:#000}.highlight .err{color:#ff0086}.highlight .k{color:#ad00a1}.highlight .l{color:#fd8900}.highlight .n{color:#101010}.highlight .o{color:#1faaaa}.highlight .p{color:#101010}.highlight .cm{color:#000}.highlight .cp{color:#000}.highlight .c1{color:#000}.highlight .cs{color:#000}.highlight .gd{color:#ff0086}.highlight .ge{font-style:italic}.highlight .gh{color:#101010;font-weight:bold}.highlight .gi{color:#00c918}.highlight .gp{color:#000;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#1faaaa;font-weight:bold}.highlight .kc{color:#ad00a1}.highlight .kd{color:#ad00a1}.highlight .kn{color:#1faaaa}.highlight .kp{color:#ad00a1}.highlight .kr{color:#ad00a1}.highlight .kt{color:#aba800}.highlight .ld{color:#00c918}.highlight .m{color:#fd8900}.highlight .s{color:#00c918}.highlight .na{color:#3777e6}.highlight .nb{color:#101010}.highlight .nc{color:#aba800}.highlight .no{color:#ff0086}.highlight .nd{color:#1faaaa}.highlight .ni{color:#101010}.highlight .ne{color:#ff0086}.highlight .nf{color:#3777e6}.highlight .nl{color:#101010}.highlight .nn{color:#aba800}.highlight .nx{color:#3777e6}.highlight .py{color:#101010}.highlight .nt{color:#1faaaa}.highlight .nv{color:#ff0086}.highlight .ow{color:#1faaaa}.highlight .w{color:#101010}.highlight .mf{color:#fd8900}.highlight .mh{color:#fd8900}.highlight .mi{color:#fd8900}.highlight .mo{color:#fd8900}.highlight .sb{color:#00c918}.highlight .sc{color:#101010}.highlight .sd{color:#000}.highlight .s2{color:#00c918}.highlight .se{color:#fd8900}.highlight .sh{color:#00c918}.highlight .si{color:#fd8900}.highlight .sx{color:#00c918}.highlight .sr{color:#00c918}.highlight .s1{color:#00c918}.highlight .ss{color:#00c918}.highlight .bp{color:#101010}.highlight .vc{color:#ff0086}.highlight .vg{color:#ff0086}.highlight .vi{color:#ff0086}.highlight .il{color:#fd8900}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:#fff6fb}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#f21368;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#f21368;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#141010;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:rgb(181.5,14.25,78)}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid rgb(67,63.8,63.8);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid rgb(67,63.8,63.8)}.footnote{color:rgb(155.25,161.25,165.75);text-decoration:none}.footnotes{color:rgb(155.25,161.25,165.75)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#7a8288;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#ee5f5b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:#fff6fb;text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid rgb(67,63.8,63.8)}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:rgb(17,13.6,13.6);border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid rgb(67,63.8,63.8)}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:rgb(255,247.8,251.8);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid rgb(50.25,47.85,47.85);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:rgb(245.25,78,141.75)}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px rgb(67,63.8,63.8)}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:rgb(255,247.8,251.8)}.taxonomy__count{color:rgb(255,247.8,251.8)}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid rgb(67,63.8,63.8)}.back-to-top{display:block;clear:both;color:rgb(255,247.8,251.8);font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid rgb(67,63.8,63.8);text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid rgb(67,63.8,63.8)}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid rgb(67,63.8,63.8)}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid rgb(67,63.8,63.8)}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:rgb(255,247.8,251.8);border-bottom:1px solid rgb(67,63.8,63.8)}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid rgb(67,63.8,63.8)}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid rgb(67,63.8,63.8)}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid rgb(67,63.8,63.8);border-radius:4px;background:#141010;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(67,63.8,63.8) rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#141010 rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/css/skins/plum.css b/assets/css/skins/plum.css new file mode 100644 index 0000000..35f745d --- /dev/null +++ b/assets/css/skins/plum.css @@ -0,0 +1,6 @@ +.author__urls.social-icons i,.author__urls.social-icons .svg-inline--fa,.page__footer-follow .social-icons i,.page__footer-follow .social-icons .svg-inline--fa{color:inherit}.page__content a,.page__content a:visited{color:inherit}.pagination--pager{color:#fffd86;background-color:#c327ab;border-color:rgba(0,0,0,0)}.pagination--pager:visited{color:#fffd86}.ais-search-box .ais-search-box--input{background-color:rgb(69.7,17,101.15)}/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #c327ab;outline:5px auto #c327ab;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#521477;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:#c327ab}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:#fffd86;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid #fffd86}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted #fffd86}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #c327ab}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:rgb(146.25,29.25,128.25)}a:hover{color:#d25dc0;outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid rgb(116.6,67,146.2)}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:rgb(255,253.4,158.2);font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:#d25dc0}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(69.7,17,101.15)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:#fffd86;border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:#fffd86;cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:#fffd86;background-color:#521477;border:rgb(116.6,67,146.2);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#c327ab;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(255,253,134,.06),0 0 5px rgba(195,39,171,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:rgb(255,253.4,158.2)}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:rgb(116.6,67,146.2);border-bottom:2px solid rgb(87.45,50.25,109.65)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid rgb(87.45,50.25,109.65)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#c327ab;color:#fff}.btn--primary:visited{background-color:#c327ab;color:#fff}.btn--primary:hover{background-color:rgb(156,31.2,136.8);color:#fff}.btn--inverse{background-color:#fff;color:#3d4144;border:1px solid rgb(116.6,67,146.2)}.btn--inverse:visited{background-color:#fff;color:#3d4144}.btn--inverse:hover{background-color:#ccc;color:#3d4144}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#3fa63f;color:#fff}.btn--success:visited{background-color:#3fa63f;color:#fff}.btn--success:hover{background-color:rgb(50.4,132.8,50.4);color:#fff}.btn--warning{background-color:#d67f05;color:#fff}.btn--warning:visited{background-color:#d67f05;color:#fff}.btn--warning:hover{background-color:rgb(171.2,101.6,4);color:#fff}.btn--danger{background-color:#ee5f5b;color:#fff}.btn--danger:visited{background-color:#ee5f5b;color:#fff}.btn--danger:hover{background-color:rgb(190.4,76,72.8);color:#fff}.btn--info{background-color:#3b9cba;color:#fff}.btn--info:visited{background-color:#3b9cba;color:#fff}.btn--info:hover{background-color:rgb(47.2,124.8,148.8);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:#fffd86;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(113.95,71.75,141.95);border-radius:4px;box-shadow:0 1px 1px rgba(188.5,192.5,195.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(169.65,173.25,175.95)}.notice a:hover{color:rgb(94.25,96.25,97.75)}blockquote.notice{border-inline-start-color:rgb(169.65,173.25,175.95)}.notice code{background-color:rgb(103.3,54.5,134.3)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:#fffd86;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(115.9,25.7,134.6);border-radius:4px;box-shadow:0 1px 1px rgba(195,39,171,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(175.5,35.1,153.9)}.notice--primary a:hover{color:rgb(97.5,19.5,85.5)}blockquote.notice--primary{border-inline-start-color:rgb(175.5,35.1,153.9)}.notice--primary code{background-color:rgb(104.6,23.8,129.4)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:#fffd86;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(75.1,60.8,139.1);border-radius:4px;box-shadow:0 1px 1px rgba(59,156,186,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(53.1,140.4,167.4)}.notice--info a:hover{color:rgb(29.5,78,93)}blockquote.notice--info{border-inline-start-color:rgb(53.1,140.4,167.4)}.notice--info code{background-color:rgb(77.4,47.2,132.4)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:#fffd86;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(121.6,52.1,84.8);border-radius:4px;box-shadow:0 1px 1px rgba(214,127,5,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(192.6,114.3,4.5)}.notice--warning a:hover{color:rgb(107,63.5,2.5)}blockquote.notice--warning{border-inline-start-color:rgb(192.6,114.3,4.5)}.notice--warning code{background-color:rgb(108.4,41.4,96.2)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:#fffd86;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(76.3,63.8,102.2);border-radius:4px;box-shadow:0 1px 1px rgba(63,166,63,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(56.7,149.4,56.7)}.notice--success a:hover{color:rgb(31.5,83,31.5)}blockquote.notice--success{border-inline-start-color:rgb(56.7,149.4,56.7)}.notice--success code{background-color:rgb(78.2,49.2,107.8)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:#fffd86;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(128.8,42.5,110.6);border-radius:4px;box-shadow:0 1px 1px rgba(238,95,91,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(214.2,85.5,81.9)}.notice--danger a:hover{color:rgb(119,47.5,45.5)}blockquote.notice--danger{border-inline-start-color:rgb(214.2,85.5,81.9)}.notice--danger code{background-color:rgb(113.2,35,113.4)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid rgb(116.6,67,146.2);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:rgb(255,253.4,158.2);border:1px solid rgb(87.45,50.25,109.65);border-radius:0}.pagination li a:hover{color:#d25dc0}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#c327ab}.pagination li a.disabled{color:rgba(255,253.4,158.2,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:rgb(255,253.4,158.2);border:1px solid rgb(87.45,50.25,109.65);border-radius:4px}.pagination--pager:hover{background-color:rgb(255,253.4,158.2);color:#3d4144}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(255,253.4,158.2,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid rgb(116.6,67,146.2)}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#521477}.greedy-nav a{display:block;margin:0 1rem;color:#fffd86;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:rgb(204,202.4,107.2)}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#c327ab;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid rgb(116.6,67,146.2);border-radius:4px;background:#521477;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:rgb(204,202.4,107.2);background:rgb(57.4,14,83.3)}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(116.6,67,146.2) rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#521477 rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid rgb(116.6,67,146.2)}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#7a8288;font-size:.75em;font-weight:bold;border:1px solid rgb(188.5,192.5,195.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#7a8288;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#7a8288;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid rgb(116.6,67,146.2)}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#7a8288;background-color:#521477;border:1px solid rgb(116.6,67,146.2);border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#c327ab;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(243,211.8,238.2);color:#3d4144}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:rgb(255,253.4,158.2);font-weight:bold;line-height:1.5;border-bottom:1px solid rgb(116.6,67,146.2)}.toc__menu a:hover{color:#fffd86}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:rgb(255,253.4,158.2);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:rgb(61.5,15,89.25)}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:rgb(255,253.4,158.2)}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#c327ab;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:rgb(146.25,29.25,128.25)}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#c327ab;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#c327ab;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#fff;color:#101010;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#000;border-inline-end:1px solid #000;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#151515}.highlight .c{color:#000}.highlight .err{color:#ff0086}.highlight .k{color:#ad00a1}.highlight .l{color:#fd8900}.highlight .n{color:#101010}.highlight .o{color:#1faaaa}.highlight .p{color:#101010}.highlight .cm{color:#000}.highlight .cp{color:#000}.highlight .c1{color:#000}.highlight .cs{color:#000}.highlight .gd{color:#ff0086}.highlight .ge{font-style:italic}.highlight .gh{color:#101010;font-weight:bold}.highlight .gi{color:#00c918}.highlight .gp{color:#000;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#1faaaa;font-weight:bold}.highlight .kc{color:#ad00a1}.highlight .kd{color:#ad00a1}.highlight .kn{color:#1faaaa}.highlight .kp{color:#ad00a1}.highlight .kr{color:#ad00a1}.highlight .kt{color:#aba800}.highlight .ld{color:#00c918}.highlight .m{color:#fd8900}.highlight .s{color:#00c918}.highlight .na{color:#3777e6}.highlight .nb{color:#101010}.highlight .nc{color:#aba800}.highlight .no{color:#ff0086}.highlight .nd{color:#1faaaa}.highlight .ni{color:#101010}.highlight .ne{color:#ff0086}.highlight .nf{color:#3777e6}.highlight .nl{color:#101010}.highlight .nn{color:#aba800}.highlight .nx{color:#3777e6}.highlight .py{color:#101010}.highlight .nt{color:#1faaaa}.highlight .nv{color:#ff0086}.highlight .ow{color:#1faaaa}.highlight .w{color:#101010}.highlight .mf{color:#fd8900}.highlight .mh{color:#fd8900}.highlight .mi{color:#fd8900}.highlight .mo{color:#fd8900}.highlight .sb{color:#00c918}.highlight .sc{color:#101010}.highlight .sd{color:#000}.highlight .s2{color:#00c918}.highlight .se{color:#fd8900}.highlight .sh{color:#00c918}.highlight .si{color:#fd8900}.highlight .sx{color:#00c918}.highlight .sr{color:#00c918}.highlight .s1{color:#00c918}.highlight .ss{color:#00c918}.highlight .bp{color:#101010}.highlight .vc{color:#ff0086}.highlight .vg{color:#ff0086}.highlight .vi{color:#ff0086}.highlight .il{color:#fd8900}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:#fffd86}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#c327ab;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#c327ab;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#521477;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:rgb(146.25,29.25,128.25)}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid rgb(116.6,67,146.2);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid rgb(116.6,67,146.2)}.footnote{color:rgb(155.25,161.25,165.75);text-decoration:none}.footnotes{color:rgb(155.25,161.25,165.75)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#7a8288;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#ee5f5b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:#fffd86;text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid rgb(116.6,67,146.2)}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:rgb(69.7,17,101.15);border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid rgb(116.6,67,146.2)}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:rgb(255,253.4,158.2);font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid rgb(87.45,50.25,109.65);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:#d25dc0}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px rgb(116.6,67,146.2)}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:rgb(255,253.4,158.2)}.taxonomy__count{color:rgb(255,253.4,158.2)}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid rgb(116.6,67,146.2)}.back-to-top{display:block;clear:both;color:rgb(255,253.4,158.2);font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid rgb(116.6,67,146.2);text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid rgb(116.6,67,146.2)}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid rgb(116.6,67,146.2)}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid rgb(116.6,67,146.2)}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:rgb(255,253.4,158.2);border-bottom:1px solid rgb(116.6,67,146.2)}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid rgb(116.6,67,146.2)}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid rgb(116.6,67,146.2)}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid rgb(116.6,67,146.2);border-radius:4px;background:#521477;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(116.6,67,146.2) rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#521477 rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/css/skins/sunrise.css b/assets/css/skins/sunrise.css new file mode 100644 index 0000000..a7ef303 --- /dev/null +++ b/assets/css/skins/sunrise.css @@ -0,0 +1,6 @@ +.author__urls.social-icons i,.author__urls.social-icons .svg-inline--fa,.page__footer-follow .social-icons i,.page__footer-follow .social-icons .svg-inline--fa{color:inherit}/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */.mfp-counter{font-family:Georgia,Times,serif}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#000;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:1;filter:alpha(opacity=100);padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Georgia,Times,serif}.mfp-close:hover,.mfp-close:focus{opacity:1;filter:alpha(opacity=100)}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#fff}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:1;filter:alpha(opacity=100);margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1;filter:alpha(opacity=100)}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-figure figcaption{margin-top:0;margin-bottom:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}button:focus,a:focus{outline:thin dotted #fc3a52;outline:5px auto #fc3a52;outline-offset:-2px}*{box-sizing:border-box}html{box-sizing:border-box;background-color:#e8d5b7;font-size:16px}@media(min-width: 48em){html{font-size:18px}}@media(min-width: 64em){html{font-size:20px}}@media(min-width: 80em){html{font-size:22px}}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}::-moz-selection{color:#fff;background:#000}::selection{color:#fff;background:#000}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none}a{color:rgb(226.8,52.2,73.8)}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;width:auto\9 ;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}label,select,button,input[type=button],input[type=reset],input[type=submit],input[type=radio],input[type=checkbox]{cursor:pointer}input[type=search]{box-sizing:border-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}html{position:relative;min-height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:1.5}body.overflow--hidden{overflow:hidden}h1,h2,h3,h4,h5,h6{margin:2em 0 .5em;line-height:1.2;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}h1{margin-top:0;font-size:1.563em}h2{font-size:1.25em}h3{font-size:1.125em}h4{font-size:1.0625em}h5{font-size:1.03125em}h6{font-size:1em}small,.small{font-size:.75em}p{margin-bottom:1.3em}u,ins{text-decoration:none;border-bottom:1px solid #000}u a,ins a{color:inherit}del a{color:inherit}p,pre,blockquote,ul,ol,dl,figure,table,fieldset{orphans:3;widows:3}abbr[title],abbr[data-original-title]{text-decoration:none;cursor:help;border-bottom:1px dotted #000}blockquote{margin-block:2em;margin-inline-end:1em;padding-inline:1em;font-style:italic;border-inline-start:.25em solid #fc3a52}blockquote cite{font-style:italic}blockquote cite::before{content:"—";padding-inline-end:5px}a:visited{color:rgb(170.1,39.15,55.35)}a:hover{color:rgb(233.85,102.9,119.1);outline:0}tt,code,kbd,samp,pre{font-family:Monaco,Consolas,"Lucida Console",monospace}pre{overflow-x:auto}hr{display:block;margin:1em 0;border:0;border-top:1px solid rgb(185.6,170.4,146.4)}ul li,ol li{margin-bottom:.5em}li ul,li ol{margin-top:.5em}figure{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:start;align-items:flex-start;flex-wrap:wrap;margin:2em 0}figure img,figure iframe,figure .fluid-width-video-wrapper{margin-bottom:1em}figure img{width:100%;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figure>a{display:block}@media(min-width: 37.5em){figure.half>a,figure.half>img{width:calc(50% - .5em)}}figure.half figcaption{width:100%}@media(min-width: 37.5em){figure.third>a,figure.third>img{width:calc(33.3333% - .5em)}}figure.third figcaption{width:100%}figcaption{margin-bottom:.5em;color:#0e2431;font-family:Georgia,Times,serif;font-size:.75em}figcaption a{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}figcaption a:hover{color:rgb(233.85,102.9,119.1)}svg:not(:root){overflow:hidden}nav ul{margin:0;padding:0}nav li{list-style:none}nav a{text-decoration:none}nav ul li,nav ol li{margin-bottom:0}nav li ul,nav li ol{margin-top:0}b,i,strong,em,blockquote,p,q,span,figure,img,h1,h2,header,input,a,tr,td,form button,input[type=submit],.btn,.highlight,.archive__item-teaser{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}form{margin-bottom:5px;padding:1em;background-color:rgb(235.45,219.3,193.8)}form fieldset{margin-bottom:5px;padding:0;border-width:0}form legend{display:block;width:100%;margin-bottom:10px;margin-inline-start:-7px;padding:0;color:#000;border:0;white-space:normal}form p{margin-bottom:2.5px}form ul{list-style-type:none;margin:0 0 5px 0;padding:0}form br{display:none}label,input,button,select,textarea{vertical-align:baseline}input,button,select,textarea{box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}label{display:block;margin-bottom:.25em;color:#000;cursor:pointer}label small{font-size:.75em}label input,label textarea,label select{display:block}input,textarea,select{display:inline-block;width:100%;padding:.25em;margin-bottom:.5em;color:#000;background-color:#e8d5b7;border:rgb(185.6,170.4,146.4);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.input-mini{width:60px}.input-small{width:90px}input[type=image],input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;line-height:normal;cursor:pointer;border-radius:0;border:0 \9 ;box-shadow:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=image]{border:0}input[type=file]{width:auto;padding:initial;line-height:initial;border:initial;background-color:rgba(0,0,0,0);background-color:initial;box-shadow:none}input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;cursor:pointer}select{width:auto;background-color:#fff}select[multiple],select[size]{height:auto}textarea{resize:vertical;height:auto;overflow:auto;vertical-align:top}input[type=hidden]{display:none}.form{position:relative}.radio,.checkbox{padding-inline-start:18px;font-weight:normal}.radio input[type=radio],.checkbox input[type=checkbox]{float:inline-start;margin-inline-start:-18px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-inline-start:10px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{opacity:.5;cursor:not-allowed}input:focus,textarea:focus{border-color:#fc3a52;outline:0;outline:thin dotted \9 ;box-shadow:inset 0 1px 3px rgba(0,0,0,.06),0 0 5px rgba(252,58,82,.7)}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus,select:focus{box-shadow:none}.help-block,.help-inline{color:#0e2431}.help-block{display:block;margin-bottom:1em;line-height:1em}.help-inline{display:inline-block;vertical-align:middle;padding-inline-start:5px}.form-group{margin-bottom:5px;padding:0;border-width:0}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;margin-bottom:0}.form-inline label{display:inline-block}.form-inline .radio,.form-inline .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form-search input,.form-search textarea,.form-search select{display:inline-block;margin-bottom:0}.form-search .search-query{padding-inline:14px;margin-bottom:0;border-radius:14px}.form-search label{display:inline-block}.form-search .radio,.form-search .checkbox,.form-inline .radio{padding-inline-start:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox]{float:inline-start;margin-inline-start:0;margin-inline-end:3px}.form--loading::before{content:""}.form--loading .form__spinner{display:block}.form::before{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%;background-color:hsla(0,0%,100%,.7);z-index:10}.form__spinner{display:none;position:absolute;top:50%;inset-inline-start:50%;z-index:11}table{display:block;margin-bottom:1em;width:100%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;border-collapse:collapse;overflow-x:auto}table+table{margin-top:1em}thead{background-color:rgb(185.6,170.4,146.4);border-bottom:2px solid rgb(139.2,127.8,109.8)}th{padding:.5em;font-weight:bold;text-align:start}td{padding:.5em;border-bottom:1px solid rgb(139.2,127.8,109.8)}tr,td,th{vertical-align:middle}@-webkit-keyframes intro{0%{opacity:0}100%{opacity:1}}@keyframes intro{0%{opacity:0}100%{opacity:1}}.btn{display:inline-block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;cursor:pointer}.btn .icon{margin-inline-end:.5em}.btn .icon+.hidden{margin-inline-start:-0.5em}.btn--primary{background-color:#fc3a52;color:#fff}.btn--primary:visited{background-color:#fc3a52;color:#fff}.btn--primary:hover{background-color:rgb(201.6,46.4,65.6);color:#fff}.btn--inverse{background-color:#fff;color:#0e2431;border:1px solid rgb(185.6,170.4,146.4)}.btn--inverse:visited{background-color:#fff;color:#0e2431}.btn--inverse:hover{background-color:#ccc;color:#0e2431}.btn--light-outline{background-color:rgba(0,0,0,0);color:#fff;border:1px solid #fff}.btn--light-outline:visited{background-color:rgba(0,0,0,0);color:#fff}.btn--light-outline:hover{background-color:rgba(0,0,0,.2);color:#fff}.btn--success{background-color:#3fa63f;color:#fff}.btn--success:visited{background-color:#3fa63f;color:#fff}.btn--success:hover{background-color:rgb(50.4,132.8,50.4);color:#fff}.btn--warning{background-color:#d67f05;color:#fff}.btn--warning:visited{background-color:#d67f05;color:#fff}.btn--warning:hover{background-color:rgb(171.2,101.6,4);color:#fff}.btn--danger{background-color:#ee5f5b;color:#fff}.btn--danger:visited{background-color:#ee5f5b;color:#fff}.btn--danger:hover{background-color:rgb(190.4,76,72.8);color:#fff}.btn--info{background-color:#3b9cba;color:#fff}.btn--info:visited{background-color:#3b9cba;color:#fff}.btn--info:hover{background-color:rgb(47.2,124.8,148.8);color:#fff}.btn--bluesky{background-color:#1083fe;color:#fff}.btn--bluesky:visited{background-color:#1083fe;color:#fff}.btn--bluesky:hover{background-color:rgb(12.8,104.8,203.2);color:#fff}.btn--facebook{background-color:#3b5998;color:#fff}.btn--facebook:visited{background-color:#3b5998;color:#fff}.btn--facebook:hover{background-color:rgb(47.2,71.2,121.6);color:#fff}.btn--linkedin{background-color:#007bb6;color:#fff}.btn--linkedin:visited{background-color:#007bb6;color:#fff}.btn--linkedin:hover{background-color:rgb(0,98.4,145.6);color:#fff}.btn--mastodon{background-color:#2b90d9;color:#fff}.btn--mastodon:visited{background-color:#2b90d9;color:#fff}.btn--mastodon:hover{background-color:rgb(34.4,115.2,173.6);color:#fff}.btn--twitter{background-color:#55acee;color:#fff}.btn--twitter:visited{background-color:#55acee;color:#fff}.btn--twitter:hover{background-color:rgb(68,137.6,190.4);color:#fff}.btn--x{background-color:#0f1419;color:#fff}.btn--x:visited{background-color:#0f1419;color:#fff}.btn--x:hover{background-color:#0c1014;color:#fff}.btn--block{display:block;width:100%}.btn--block+.btn--block{margin-top:.25em}.btn--disabled{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.btn--x-large{font-size:1.25em}.btn--large{font-size:1em}.btn--small{font-size:.6875em}.notice{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(221.125,207.875,186.125);border-radius:4px;box-shadow:0 1px 1px rgba(188.5,192.5,195.5,.25)}.notice h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice h4{margin-bottom:0;font-size:1em}.notice p:last-child{margin-bottom:0 !important}.notice h4+p{margin-top:0;padding-top:0}.notice a{color:rgb(169.65,173.25,175.95)}.notice a:hover{color:rgb(94.25,96.25,97.75)}blockquote.notice{border-inline-start-color:rgb(169.65,173.25,175.95)}.notice code{background-color:rgb(227.65,210.95,184.25)}.notice pre code{background-color:inherit}.notice ul:last-child{margin-bottom:0}.notice--primary{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(237,174.25,157.75);border-radius:4px;box-shadow:0 1px 1px rgba(252,58,82,.25)}.notice--primary h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--primary h4{margin-bottom:0;font-size:1em}.notice--primary p:last-child{margin-bottom:0 !important}.notice--primary h4+p{margin-top:0;padding-top:0}.notice--primary a{color:rgb(226.8,52.2,73.8)}.notice--primary a:hover{color:#7e1d29}blockquote.notice--primary{border-inline-start-color:rgb(226.8,52.2,73.8)}.notice--primary code{background-color:rgb(234,197.5,172.9)}.notice--primary pre code{background-color:inherit}.notice--primary ul:last-child{margin-bottom:0}.notice--info{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(188.75,198.75,183.75);border-radius:4px;box-shadow:0 1px 1px rgba(59,156,186,.25)}.notice--info h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--info h4{margin-bottom:0;font-size:1em}.notice--info p:last-child{margin-bottom:0 !important}.notice--info h4+p{margin-top:0;padding-top:0}.notice--info a{color:rgb(53.1,140.4,167.4)}.notice--info a:hover{color:rgb(29.5,78,93)}blockquote.notice--info{border-inline-start-color:rgb(53.1,140.4,167.4)}.notice--info code{background-color:rgb(214.7,207.3,183.3)}.notice--info pre code{background-color:inherit}.notice--info ul:last-child{margin-bottom:0}.notice--warning{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(227.5,191.5,138.5);border-radius:4px;box-shadow:0 1px 1px rgba(214,127,5,.25)}.notice--warning h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--warning h4{margin-bottom:0;font-size:1em}.notice--warning p:last-child{margin-bottom:0 !important}.notice--warning h4+p{margin-top:0;padding-top:0}.notice--warning a{color:rgb(192.6,114.3,4.5)}.notice--warning a:hover{color:rgb(107,63.5,2.5)}blockquote.notice--warning{border-inline-start-color:rgb(192.6,114.3,4.5)}.notice--warning code{background-color:rgb(230.2,204.4,165.2)}.notice--warning pre code{background-color:inherit}.notice--warning ul:last-child{margin-bottom:0}.notice--success{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(189.75,201.25,153);border-radius:4px;box-shadow:0 1px 1px rgba(63,166,63,.25)}.notice--success h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--success h4{margin-bottom:0;font-size:1em}.notice--success p:last-child{margin-bottom:0 !important}.notice--success h4+p{margin-top:0;padding-top:0}.notice--success a{color:rgb(56.7,149.4,56.7)}.notice--success a:hover{color:rgb(31.5,83,31.5)}blockquote.notice--success{border-inline-start-color:rgb(56.7,149.4,56.7)}.notice--success code{background-color:rgb(215.1,208.3,171)}.notice--success pre code{background-color:inherit}.notice--success ul:last-child{margin-bottom:0}.notice--danger{margin:2em 0 !important;padding:1em;color:#000;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em !important;text-indent:initial;background-color:rgb(233.5,183.5,160);border-radius:4px;box-shadow:0 1px 1px rgba(238,95,91,.25)}.notice--danger h4{margin-top:0 !important;margin-bottom:.75em;line-height:inherit}.page__content .notice--danger h4{margin-bottom:0;font-size:1em}.notice--danger p:last-child{margin-bottom:0 !important}.notice--danger h4+p{margin-top:0;padding-top:0}.notice--danger a{color:rgb(214.2,85.5,81.9)}.notice--danger a:hover{color:rgb(119,47.5,45.5)}blockquote.notice--danger{border-inline-start-color:rgb(214.2,85.5,81.9)}.notice--danger code{background-color:rgb(232.6,201.2,173.8)}.notice--danger pre code{background-color:inherit}.notice--danger ul:last-child{margin-bottom:0}.masthead{position:relative;border-bottom:1px solid rgb(185.6,170.4,146.4);-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s;z-index:20}.masthead__inner-wrap{clear:both}.masthead__inner-wrap::after{clear:both;content:"";display:table}.masthead__inner-wrap{margin-inline:auto;padding:1em;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}@media(min-width: 80em){.masthead__inner-wrap{max-width:1280px}}.masthead__inner-wrap nav{z-index:10}.masthead__inner-wrap a{text-decoration:none}.site-logo img{max-height:2rem}.site-title{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;font-weight:bold}.site-subtitle{display:block;font-size:.625em}.masthead__menu{float:inline-start;margin-inline:0;width:100%;clear:both}.masthead__menu .site-nav{margin-inline-start:0}@media(min-width: 37.5em){.masthead__menu .site-nav{float:inline-end}}.masthead__menu ul{margin:0;padding:0;clear:both;list-style-type:none}.masthead__menu-item{display:block;list-style-type:none;white-space:nowrap}.masthead__menu-item--lg{padding-inline-end:2em;font-weight:700}.breadcrumbs{clear:both}.breadcrumbs::after{clear:both;content:"";display:table}.breadcrumbs{margin:0 auto;max-width:100%;padding-inline:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.3s;animation-delay:.3s}@media(min-width: 80em){.breadcrumbs{max-width:1280px}}.breadcrumbs ol{padding:0;list-style:none;font-size:.75em}@media(min-width: 64em){.breadcrumbs ol{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.breadcrumbs ol{width:calc(100% - 300px)}}.breadcrumbs li{display:inline}.breadcrumbs .current{font-weight:bold}.pagination{clear:both}.pagination::after{clear:both;content:"";display:table}.pagination{float:inline-start;margin-top:1em;padding-top:1em;width:100%}.pagination ul{margin:0;padding:0;list-style-type:none;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.pagination li{display:block;float:inline-start;margin-inline-start:-1px}.pagination li a{display:block;margin-bottom:.25em;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:14px;font-weight:bold;line-height:1.5;text-align:center;text-decoration:none;color:#0e2431;border:1px solid rgb(139.2,127.8,109.8);border-radius:0}.pagination li a:hover{color:rgb(233.85,102.9,119.1)}.pagination li a.current,.pagination li a.current.disabled{color:#fff;background:#fc3a52}.pagination li a.disabled{color:rgba(14,36,49,.5);pointer-events:none;cursor:not-allowed}.pagination li:first-child{margin-inline-start:0}.pagination li:first-child a{border-start-start-radius:4px;border-end-start-radius:4px}.pagination li:last-child a{border-start-end-radius:4px;border-end-end-radius:4px}.pagination--pager{display:block;padding:1em 2em;float:inline-start;width:50%;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold;text-align:center;text-decoration:none;color:#0e2431;border:1px solid rgb(139.2,127.8,109.8);border-radius:4px}.pagination--pager:hover{background-color:#0e2431;color:#fff}.pagination--pager:first-child{border-start-end-radius:0;border-end-end-radius:0}.pagination--pager:last-child{margin-inline-start:-1px;border-start-start-radius:0;border-end-start-radius:0}.pagination--pager.disabled{color:rgba(14,36,49,.5);pointer-events:none;cursor:not-allowed}.page__content+.pagination,.page__meta+.pagination,.comment__date+.pagination,.page__share+.pagination,.page__comments+.pagination{margin-top:2em;padding-top:2em;border-top:1px solid rgb(185.6,170.4,146.4)}.greedy-nav{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:2em;background:#e8d5b7}.greedy-nav a{display:block;margin:0 1rem;color:#000;text-decoration:none;-webkit-transition:none;transition:none}.greedy-nav a:hover{color:#000}.greedy-nav a.site-logo{margin-inline-start:0;margin-inline-end:.5rem}.greedy-nav a.site-title{margin-inline-start:0}.greedy-nav img{-webkit-transition:none;transition:none}.greedy-nav__toggle{-ms-flex-item-align:center;align-self:center;height:2rem;border:0;outline:none;background-color:rgba(0,0,0,0);cursor:pointer}.greedy-nav .visible-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.greedy-nav .visible-links li{-webkit-box-flex:0;-ms-flex:none;flex:none}.greedy-nav .visible-links a{position:relative}.greedy-nav .visible-links a:before{content:"";position:absolute;inset-inline-start:0;bottom:0;height:4px;background:#fc3a52;width:100%;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scaleX(0) translate3d(0, 0, 0);transform:scaleX(0) translate3d(0, 0, 0)}.greedy-nav .visible-links a:hover:before{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.greedy-nav .hidden-links{position:absolute;top:100%;inset-inline-end:0;margin-top:15px;padding:5px;border:1px solid rgb(185.6,170.4,146.4);border-radius:4px;background:#e8d5b7;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.greedy-nav .hidden-links.hidden{display:none}.greedy-nav .hidden-links a{margin:0;padding:10px 20px;font-size:1em}.greedy-nav .hidden-links a:hover{color:#000;background:rgb(162.4,149.1,128.1)}.greedy-nav .hidden-links::before{content:"";position:absolute;top:-11px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(185.6,170.4,146.4) rgba(0,0,0,0);display:block;z-index:0}.greedy-nav .hidden-links::after{content:"";position:absolute;top:-10px;inset-inline-end:10px;width:0;border-style:solid;border-width:0 10px 10px;border-color:#e8d5b7 rgba(0,0,0,0);display:block;z-index:1}.greedy-nav .hidden-links li{display:block;border-bottom:1px solid rgb(185.6,170.4,146.4)}.greedy-nav .hidden-links li:last-child{border-bottom:none}.no-js .greedy-nav .visible-links{-ms-flex-wrap:wrap;flex-wrap:wrap;overflow:visible}.nav__list{margin-bottom:1.5em}.nav__list input[type=checkbox],.nav__list label{display:none}@media(max-width: 63.9375em){.nav__list label{position:relative;display:inline-block;padding:.5em 2.5em .5em 1em;color:#7a8288;font-size:.75em;font-weight:bold;border:1px solid rgb(188.5,192.5,195.5);border-radius:4px;z-index:20;-webkit-transition:.2s ease-out;transition:.2s ease-out;cursor:pointer}.nav__list label::before,.nav__list label::after{content:"";position:absolute;inset-inline-end:1em;top:1.25em;width:.75em;height:.125em;line-height:1;background-color:#7a8288;-webkit-transition:.2s ease-out;transition:.2s ease-out}.nav__list label:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list label:hover{color:#fff;border-color:#7a8288;background-color:#333}.nav__list label:hover:before,.nav__list label:hover:after{background-color:#fff}.nav__list input:checked+label{color:#fff;background-color:#333}.nav__list input:checked+label:before,.nav__list input:checked+label:after{background-color:#fff}.nav__list label:hover:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.nav__list input:checked+label:hover:after{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.nav__list ul{margin-bottom:1em}.nav__list a{display:block;padding:.25em 0}}@media(max-width: 63.9375em)and (min-width: 64em){.nav__list a{padding-top:.125em;padding-bottom:.125em}}@media(max-width: 63.9375em){.nav__list a:hover{text-decoration:underline}}.nav__list .nav__items{margin:0;font-size:1.25rem}.nav__list .nav__items a{color:inherit}.nav__list .nav__items .active{margin-inline-start:-0.5em;padding-inline:.5em;font-weight:bold}@media(max-width: 63.9375em){.nav__list .nav__items{position:relative;max-height:0;opacity:0%;overflow:hidden;z-index:10;-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out;-webkit-transform:translate(0, 10%);-ms-transform:translate(0, 10%);transform:translate(0, 10%)}}@media(max-width: 63.9375em){.nav__list input:checked~.nav__items{-webkit-transition:.5s ease-in-out;transition:.5s ease-in-out;max-height:9999px;overflow:visible;opacity:1;margin-top:1em;-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.nav__title{margin:0;padding:.5rem .75rem;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em;font-weight:bold}.nav__sub-title{display:block;margin:.5rem 0;padding:.25rem 0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;font-weight:bold;text-transform:uppercase;border-bottom:1px solid rgb(185.6,170.4,146.4)}.toc{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";color:#7a8288;background-color:#e8d5b7;border:1px solid rgb(185.6,170.4,146.4);border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.125);box-shadow:0 1px 1px rgba(0,0,0,.125)}.toc .nav__title{color:#fff;font-size:.75em;background:#fc3a52;border-start-start-radius:4px;border-start-end-radius:4px}.toc .active a{background-color:rgb(254.4,215.6,220.4);color:#0e2431}.toc__menu{margin:0;padding:0;width:100%;list-style:none;font-size:.75em}@media(min-width: 64em){.toc__menu{font-size:.6875em}}.toc__menu a{display:block;padding:.25rem .75rem;color:#0e2431;font-weight:bold;line-height:1.5;border-bottom:1px solid rgb(185.6,170.4,146.4)}.toc__menu a:hover{color:#000}.toc__menu li ul>li a{padding-inline-start:1.25rem;font-weight:normal}.toc__menu li ul li ul>li a{padding-inline-start:1.75rem}.toc__menu li ul li ul li ul>li a{padding-inline-start:2.25rem}.toc__menu li ul li ul li ul li ul>li a{padding-inline-start:2.75rem}.toc__menu li ul li ul li ul li ul li ul>li a{padding-inline-start:3.25rem}.page__footer{clear:both}.page__footer::after{clear:both;content:"";display:table}.page__footer{float:inline-start;margin-inline:0;width:100%;margin-top:3em;color:#0e2431;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.45s;animation-delay:.45s;background-color:#f9b248}.page__footer footer{clear:both}.page__footer footer::after{clear:both;content:"";display:table}.page__footer footer{margin-inline:auto;margin-top:2em;max-width:100%;padding:0 1em 2em}@media(min-width: 80em){.page__footer footer{max-width:1280px}}.page__footer a{color:inherit;text-decoration:none}.page__footer a:hover{text-decoration:underline}.page__footer .fas,.page__footer .fab,.page__footer .far,.page__footer .fal{color:#0e2431}.page__footer-copyright{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.6875em}.page__footer-follow ul{margin:0;padding:0;list-style-type:none}.page__footer-follow li{display:inline-block;padding-top:5px;padding-bottom:5px;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;text-transform:uppercase}.page__footer-follow li+li::before{content:"";padding-inline-end:5px}.page__footer-follow a{padding-inline-end:10px;font-weight:bold}.page__footer-follow .social-icons a{white-space:nowrap}.layout--search .archive__item-teaser{margin-bottom:.25em}.search__toggle{margin-inline:1rem;height:2rem;border:0;outline:none;color:#fc3a52;background-color:rgba(0,0,0,0);cursor:pointer;-webkit-transition:.2s;transition:.2s}.search__toggle:hover{color:rgb(189,43.5,61.5)}.search-icon{width:100%;height:100%}.search-content{display:none;visibility:hidden;padding-top:1em;padding-bottom:1em}.search-content__inner-wrap{width:100%;margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){.search-content__inner-wrap{max-width:1280px}}.search-content__form{background-color:rgba(0,0,0,0)}.search-content .search-input{display:block;margin-bottom:0;padding:0;border:none;outline:none;box-shadow:none;background-color:rgba(0,0,0,0);font-size:1.563em}@media(min-width: 64em){.search-content .search-input{font-size:1.953em}}@media(min-width: 80em){.search-content .search-input{font-size:2.441em}}.search-content.is--visible{display:block;visibility:visible}.search-content.is--visible::after{content:"";display:block}.search-content .results__found{margin-top:.5em;font-size:.75em}.search-content .archive__item{margin-bottom:2em}@media(min-width: 64em){.search-content .archive__item{width:75%}}@media(min-width: 80em){.search-content .archive__item{width:50%}}.search-content .archive__item-title{margin-top:0}.search-content .archive__item-excerpt{margin-bottom:0}.ais-search-box{max-width:100% !important;margin-bottom:2em}.archive__item-title .ais-Highlight{color:#fc3a52;font-style:normal;text-decoration:underline}.archive__item-excerpt .ais-Highlight{color:#fc3a52;font-style:normal;font-weight:bold}div.highlighter-rouge,figure.highlight{position:relative;margin-bottom:1em;background:#1d1f21;color:#c5c8c6;font-family:Monaco,Consolas,"Lucida Console",monospace;font-size:.75em;line-height:1.8;border-radius:4px}[dir=rtl] div.highlighter-rouge,[dir=rtl] figure.highlight{direction:ltr;text-align:start}div.highlighter-rouge>pre,div.highlighter-rouge pre.highlight,figure.highlight>pre,figure.highlight pre.highlight{margin:0;padding:1em}.highlight table{margin-bottom:0;font-size:1em;border:0}.highlight table td{padding:0;width:calc(100% - 1em);border:0}.highlight table td.gutter,.highlight table td.rouge-gutter{padding-inline-end:1em;width:1em;color:#b4b7b4;border-inline-end:1px solid #b4b7b4;text-align:end}.highlight table td.code,.highlight table td.rouge-code{padding-inline-start:1em}.highlight table pre{margin:0}.highlight pre{width:100%}.highlight .hll{background-color:#e0e0e0}.highlight .c{color:#b4b7b4}.highlight .err{color:#c66}.highlight .k{color:#b294bb}.highlight .l{color:#de935f}.highlight .n{color:#c5c8c6}.highlight .o{color:#8abeb7}.highlight .p{color:#c5c8c6}.highlight .cm{color:#b4b7b4}.highlight .cp{color:#b4b7b4}.highlight .c1{color:#b4b7b4}.highlight .cs{color:#b4b7b4}.highlight .gd{color:#c66}.highlight .ge{font-style:italic}.highlight .gh{color:#c5c8c6;font-weight:bold}.highlight .gi{color:#b5bd68}.highlight .gp{color:#b4b7b4;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#8abeb7;font-weight:bold}.highlight .kc{color:#b294bb}.highlight .kd{color:#b294bb}.highlight .kn{color:#8abeb7}.highlight .kp{color:#b294bb}.highlight .kr{color:#b294bb}.highlight .kt{color:#f0c674}.highlight .ld{color:#b5bd68}.highlight .m{color:#de935f}.highlight .s{color:#b5bd68}.highlight .na{color:#81a2be}.highlight .nb{color:#c5c8c6}.highlight .nc{color:#f0c674}.highlight .no{color:#c66}.highlight .nd{color:#8abeb7}.highlight .ni{color:#c5c8c6}.highlight .ne{color:#c66}.highlight .nf{color:#81a2be}.highlight .nl{color:#c5c8c6}.highlight .nn{color:#f0c674}.highlight .nx{color:#81a2be}.highlight .py{color:#c5c8c6}.highlight .nt{color:#8abeb7}.highlight .nv{color:#c66}.highlight .ow{color:#8abeb7}.highlight .w{color:#c5c8c6}.highlight .mf{color:#de935f}.highlight .mh{color:#de935f}.highlight .mi{color:#de935f}.highlight .mo{color:#de935f}.highlight .sb{color:#b5bd68}.highlight .sc{color:#c5c8c6}.highlight .sd{color:#b4b7b4}.highlight .s2{color:#b5bd68}.highlight .se{color:#de935f}.highlight .sh{color:#b5bd68}.highlight .si{color:#de935f}.highlight .sx{color:#b5bd68}.highlight .sr{color:#b5bd68}.highlight .s1{color:#b5bd68}.highlight .ss{color:#b5bd68}.highlight .bp{color:#c5c8c6}.highlight .vc{color:#c66}.highlight .vg{color:#c66}.highlight .vi{color:#c66}.highlight .il{color:#de935f}.gist th,.gist td{border-bottom:0}.hidden,.is--hidden{display:none;visibility:hidden}.load{display:none}.transparent{opacity:0}.visually-hidden,.screen-reader-text,.screen-reader-text span,.screen-reader-shortcut,.sr-only,.sr-only-focusable:not(:focus){position:absolute !important;clip:rect(0, 0, 0, 0);height:1px !important;width:1px !important;padding:0 !important;border:0 !important;margin:-1px;overflow:hidden;white-space:nowrap}body:hover .visually-hidden a,body:hover .visually-hidden input,body:hover .visually-hidden button{display:none !important}.screen-reader-text:focus,.screen-reader-shortcut:focus{clip:auto !important;height:auto !important;width:auto !important;display:block;font-size:1em;font-weight:bold;padding:15px 23px 14px;background:#fff;z-index:100000;text-decoration:none;box-shadow:0 0 2px 2px rgba(0,0,0,.6)}.skip-link{position:fixed;z-index:20;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";white-space:nowrap}.skip-link li{height:0;width:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.text-end{text-align:end}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.task-list{padding:0}.task-list li{list-style-type:none}.task-list .task-list-item-checkbox{margin-inline-end:.5em;opacity:1}.task-list .task-list{margin-inline-start:1em}.cf{clear:both}.wrapper{margin-inline:auto;width:100%}.align-left{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-left{float:left;margin-right:1em}}.align-right{display:block;margin-inline:auto}@media(min-width: 37.5em){.align-right{float:right;margin-left:1em}}.align-center{display:block;margin-inline:auto}@media(min-width: 64em){.full{margin-inline-end:-20.3389830508% !important}}.icon{display:inline-block;fill:currentColor;width:1em;height:1.1em;line-height:1;position:relative;top:-0.1em;vertical-align:middle}.social-icons .fas,.social-icons .fab,.social-icons .far,.social-icons .fal{color:#000}.social-icons .fa-behance,.social-icons .fa-behance-square{color:#1769ff}.social-icons .fa-bitbucket{color:#205081}.social-icons .fa-dribbble,.social-icons .fa-dribbble-square{color:#ea4c89}.social-icons .fa-facebook,.social-icons .fa-facebook-square,.social-icons .fa-facebook-f{color:#3b5998}.social-icons .fa-flickr{color:#ff0084}.social-icons .fa-foursquare{color:#0072b1}.social-icons .fa-github,.social-icons .fa-github-alt,.social-icons .fa-github-square{color:#171516}.social-icons .fa-gitlab{color:#e24329}.social-icons .fa-instagram{color:#517fa4}.social-icons .fa-keybase{color:#ef7639}.social-icons .fa-lastfm,.social-icons .fa-lastfm-square{color:#d51007}.social-icons .fa-linkedin,.social-icons .fa-linkedin-in{color:#007bb6}.social-icons .fa-mastodon,.social-icons .fa-mastodon-square{color:#2b90d9}.social-icons .fa-pinterest,.social-icons .fa-pinterest-p,.social-icons .fa-pinterest-square{color:#cb2027}.social-icons .fa-reddit{color:#ff4500}.social-icons .fa-rss,.social-icons .fa-rss-square{color:#fa9b39}.social-icons .fa-soundcloud{color:#f30}.social-icons .fa-stack-exchange,.social-icons .fa-stack-overflow{color:#fe7a15}.social-icons .fa-tumblr,.social-icons .fa-tumblr-square{color:#32506d}.social-icons .fa-twitter,.social-icons .fa-twitter-square{color:#55acee}.social-icons .fa-x-twitter,.social-icons .fa-square-x-twitter{color:#0f1419}.social-icons .fa-vimeo,.social-icons .fa-vimeo-square,.social-icons .fa-vimeo-v{color:#1ab7ea}.social-icons .fa-vine{color:#00bf8f}.social-icons .fa-xing,.social-icons .fa-xing-square{color:#006567}.social-icons .fa-youtube{color:#b00}.navicon{position:relative;width:1.5rem;height:.25rem;background:#fc3a52;margin:auto;-webkit-transition:.3s;transition:.3s}.navicon::before,.navicon::after{content:"";position:absolute;inset-inline-start:0;width:1.5rem;height:.25rem;background:#fc3a52;-webkit-transition:.3s;transition:.3s}.navicon:before{top:-0.5rem}.navicon:after{bottom:-0.5rem}.close .navicon{background:rgba(0,0,0,0)}.close .navicon:before,.close .navicon:after{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;top:0;width:1.5rem}.close .navicon:before{-webkit-transform:rotate3d(0, 0, 1, 45deg);transform:rotate3d(0, 0, 1, 45deg)}.close .navicon:after{-webkit-transform:rotate3d(0, 0, 1, -45deg);transform:rotate3d(0, 0, 1, -45deg)}@supports(pointer-events: none){.greedy-nav__toggle:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;opacity:0;background-color:#e8d5b7;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:none}}.greedy-nav__toggle.close:before{opacity:.9;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;pointer-events:auto}.greedy-nav__toggle:hover .navicon,.greedy-nav__toggle:hover .navicon:before,.greedy-nav__toggle:hover .navicon:after{background:rgb(189,43.5,61.5)}.greedy-nav__toggle:hover.close .navicon{background:rgba(0,0,0,0)}@media(min-width: 64em){.sticky{clear:both}.sticky::after{clear:both;content:"";display:table}.sticky{position:-webkit-sticky;position:sticky;top:2em}.sticky>*{display:block}}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.show-modal{overflow:hidden;position:relative}.show-modal::before{position:absolute;content:"";top:0;inset-inline-start:0;width:100%;height:100%;z-index:999;background-color:hsla(0,0%,100%,.85)}.show-modal .modal{display:block}.modal{display:none;position:fixed;width:300px;top:50%;inset-inline-start:50%;margin-inline-start:-150px;margin-top:-150px;min-height:0;z-index:9999;background:#fff;border:1px solid rgb(185.6,170.4,146.4);border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.125)}.modal__title{margin:0;padding:.5em 1em}.modal__supporting-text{padding:0 1em .5em 1em}.modal__actions{padding:.5em 1em;border-top:1px solid rgb(185.6,170.4,146.4)}.footnote{color:rgb(155.25,161.25,165.75);text-decoration:none}.footnotes{color:rgb(155.25,161.25,165.75)}.footnotes ol,.footnotes li,.footnotes p{margin-bottom:0;font-size:.75em}a.reversefootnote{color:#7a8288;text-decoration:none}a.reversefootnote:hover{text-decoration:underline}.required{color:#ee5f5b;font-weight:bold}.gsc-control-cse table,.gsc-control-cse tr,.gsc-control-cse td{border:0}.responsive-video-container{position:relative;margin-bottom:1em;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%}.responsive-video-container iframe,.responsive-video-container object,.responsive-video-container embed{position:absolute;top:0;inset-inline-start:0;width:100%;height:100%}:-webkit-full-screen-ancestor .masthead,:-webkit-full-screen-ancestor .page__footer{position:static}.clipboard-helper{font-size:12pt !important;border:0 !important;padding:0 !important;margin:0 !important;outline:none !important;position:absolute}pre.highlight .clipboard-copy-button{color:#ffffca}pre .clipboard-copy-button{display:block;position:absolute;top:.6em;inset-inline-end:.5em;width:1.8em;height:1.5em;z-index:1;background:none;border:none;outline:none;border-radius:.1em;padding:.2em .5em;opacity:.4;transition:color .25s linear -0.25s,opacity .25s linear}pre .clipboard-copy-button::before{content:"";position:absolute;inset:0;z-index:2}pre .clipboard-copy-button i{position:absolute;top:.25em;inset-inline-end:.25em}pre .clipboard-copy-button i.copied{opacity:0}pre .clipboard-copy-button.copied i{opacity:0}pre .clipboard-copy-button.copied i.copied{opacity:1}.no-copy pre .clipboard-copy-button{display:none}pre:hover .clipboard-copy-button{opacity:1}#main{clear:both}#main::after{clear:both;content:"";display:table}#main{margin-inline:auto;padding-inline:1em;-webkit-animation:intro .3s both;animation:intro .3s both;max-width:100%;-webkit-animation-delay:.15s;animation-delay:.15s}@media(min-width: 80em){#main{max-width:1280px}}body{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:100vh;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.initial-content,.search-content{flex:1 0 auto}@media(min-width: 64em){.page{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.page{width:calc(100% - 300px);padding-inline-end:300px}}.page .page__inner-wrap{float:inline-start;margin-top:1em;margin-inline:0;width:100%;clear:both}.page .page__inner-wrap .page__content,.page .page__inner-wrap .page__meta,.page .page__inner-wrap .comment__date,.page .page__inner-wrap .page__share{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both}.page__title{margin-top:0;line-height:1}.page__title a{color:#000;text-decoration:none}.page__title+.page__meta,.page__title+.comment__date{margin-top:-0.5em}.page__lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1.25em}.page__content h2{padding-bottom:.5em;border-bottom:1px solid rgb(185.6,170.4,146.4)}.page__content h1 .header-link,.page__content h2 .header-link,.page__content h3 .header-link,.page__content h4 .header-link,.page__content h5 .header-link,.page__content h6 .header-link{position:relative;inset-inline-start:.5em;opacity:0;font-size:.8em;-webkit-transition:opacity .2s ease-in-out .1s;-moz-transition:opacity .2s ease-in-out .1s;-o-transition:opacity .2s ease-in-out .1s;transition:opacity .2s ease-in-out .1s}.page__content h1:hover .header-link,.page__content h2:hover .header-link,.page__content h3:hover .header-link,.page__content h4:hover .header-link,.page__content h5:hover .header-link,.page__content h6:hover .header-link{opacity:1}.page__content p,.page__content li,.page__content dl{font-size:1em}.page__content p{margin:0 0 1.3em}.page__content a:not(.btn):hover{text-decoration:underline}.page__content a:not(.btn):hover img{box-shadow:0 0 10px rgba(0,0,0,.25)}.page__content :not(pre)>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:rgb(236.6,221.4,197.4);border-radius:4px}.page__content :not(pre)>code::before,.page__content :not(pre)>code::after{letter-spacing:-0.2em;content:" "}.page__content dt{margin-top:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-weight:bold}.page__content dd{margin-inline-start:1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__content .small{font-size:.75em}.page__content blockquote+.small{margin-top:-1.5em;padding-inline-start:1.25rem}.page__hero{position:relative;margin-bottom:2em;clear:both}.page__hero::after{clear:both;content:"";display:table}.page__hero{-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay{position:relative;margin-bottom:2em;padding:3em 0;clear:both}.page__hero--overlay::after{clear:both;content:"";display:table}.page__hero--overlay{background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.page__hero--overlay a{color:#fff}.page__hero--overlay .wrapper{padding-inline:1em}@media(min-width: 80em){.page__hero--overlay .wrapper{max-width:1280px}}.page__hero--overlay .page__title,.page__hero--overlay .page__meta,.page__hero--overlay .comment__date,.page__hero--overlay .page__lead,.page__hero--overlay .btn{color:#fff;text-shadow:1px 1px 4px rgba(0,0,0,.5)}.page__hero--overlay .page__lead{max-width:768px}.page__hero--overlay .page__title{font-size:1.953em}@media(min-width: 37.5em){.page__hero--overlay .page__title{font-size:2.441em}}.page__hero-image{width:100%;height:auto;-ms-interpolation-mode:bicubic}.page__hero-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.6875em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.page__hero-caption{padding:5px 10px}}.page__hero-caption a{color:#fff;text-decoration:none}.page__share{margin-top:2em;padding-top:1em;border-top:1px solid rgb(185.6,170.4,146.4)}@media(max-width: 37.5em){.page__share .btn span{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}}.page__share-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta,.comment__date{margin-top:2em;color:#0e2431;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em}.page__meta p,.comment__date p{margin:0}.page__meta a,.comment__date a{color:inherit}.page__meta-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}.page__meta-sep::before{content:"•";padding-inline:.5em}.page__taxonomy .sep{display:none}.page__taxonomy strong{margin-inline-end:10px}.page__taxonomy-item{display:inline-block;margin-inline-end:5px;margin-bottom:8px;padding:5px 10px;text-decoration:none;border:1px solid rgb(139.2,127.8,109.8);border-radius:4px}.page__taxonomy-item:hover{text-decoration:none;color:rgb(233.85,102.9,119.1)}.taxonomy__section{margin-bottom:2em;padding-bottom:1em}.taxonomy__section:not(:last-child){border-bottom:solid 1px rgb(185.6,170.4,146.4)}.taxonomy__section .archive__item-title{margin-top:0}.taxonomy__section .archive__subtitle{clear:both;border:0}.taxonomy__section+.taxonomy__section{margin-top:2em}.taxonomy__title{margin-bottom:.5em;color:#0e2431}.taxonomy__count{color:#0e2431}.taxonomy__index{display:grid;grid-column-gap:2em;grid-template-columns:repeat(2, 1fr);margin:1.414em 0;padding:0;font-size:.75em;list-style:none}@media(min-width: 64em){.taxonomy__index{grid-template-columns:repeat(3, 1fr)}}.taxonomy__index a{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.25em 0;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;color:inherit;text-decoration:none;border-bottom:1px solid rgb(185.6,170.4,146.4)}.back-to-top{display:block;clear:both;color:#0e2431;font-size:.6em;text-transform:uppercase;text-align:end;text-decoration:none}.page__comments{float:inline-start;margin-inline:0;width:100%;clear:both}.page__comments-title{margin-top:2rem;margin-bottom:10px;padding-top:2rem;font-size:.75em;border-top:1px solid rgb(185.6,170.4,146.4);text-transform:uppercase}.page__comments-form{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.page__comments-form.disabled input,.page__comments-form.disabled button,.page__comments-form.disabled textarea,.page__comments-form.disabled label{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);box-shadow:none;opacity:.65}.comment{clear:both}.comment::after{clear:both;content:"";display:table}.comment{margin:1em 0}.comment:not(:last-child){border-bottom:1px solid rgb(185.6,170.4,146.4)}.comment__avatar-wrapper{float:inline-start;width:60px;height:60px}@media(min-width: 64em){.comment__avatar-wrapper{width:100px;height:100px}}.comment__avatar{width:40px;height:40px;border-radius:50%}@media(min-width: 64em){.comment__avatar{width:80px;height:80px;padding:5px;border:1px solid rgb(185.6,170.4,146.4)}}.comment__content-wrapper{float:inline-end;width:calc(100% - 60px)}@media(min-width: 64em){.comment__content-wrapper{width:calc(100% - 100px)}}.comment__author{margin:0}.comment__author a{text-decoration:none}.comment__date{margin:0}.comment__date a{text-decoration:none}.page__related{clear:both}.page__related::after{clear:both;content:"";display:table}.page__related{float:inline-start;margin-top:2em;padding-top:1em;border-top:1px solid rgb(185.6,170.4,146.4)}@media(min-width: 64em){.page__related{float:inline-end;width:calc(100% - 200px)}}@media(min-width: 80em){.page__related{width:calc(100% - 300px)}}.page__related a{color:inherit;text-decoration:none}.page__related-title{margin-bottom:10px;font-size:.75em;text-transform:uppercase}@media(min-width: 64em){.wide .page,.wide .page__related{padding-inline-end:0}}@media(min-width: 80em){.wide .page,.wide .page__related{padding-inline-end:0}}.archive{margin-top:1em;margin-bottom:2em}@media(min-width: 64em){.archive{float:inline-end;width:calc(100% - 200px);padding-inline-end:200px}}@media(min-width: 80em){.archive{width:calc(100% - 300px);padding-inline-end:300px}}.archive__item{position:relative}.archive__item a{position:relative;z-index:10}.archive__item a[rel=permalink]{position:static}.archive__subtitle{margin:1.414em 0 .5em;padding-bottom:.5em;font-size:1em;color:#0e2431;border-bottom:1px solid rgb(185.6,170.4,146.4)}.archive__subtitle+.list__item .archive__item-title{margin-top:.5em}.archive__item-title{margin-bottom:.25em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";line-height:initial;overflow:hidden;text-overflow:ellipsis}.archive__item-title a[rel=permalink]::before{content:"";position:absolute;inset:0}.archive__item-title a+a{opacity:.5}.page__content .archive__item-title{margin-top:1em;border-bottom:none}.archive__item-excerpt{margin-top:0;font-size:.75em}.archive__item-excerpt+p{text-indent:0}.archive__item-excerpt a{position:relative}.archive__item-teaser{position:relative;border-radius:4px;overflow:hidden}.archive__item-teaser img{width:100%}.archive__item-caption{position:absolute;bottom:0;inset-inline-end:0;margin:0 auto;padding:2px 5px;color:#fff;font-family:Georgia,Times,serif;font-size:.625em;background:#000;text-align:end;z-index:5;opacity:.5;border-radius:4px 0 0 0}@media(min-width: 64em){.archive__item-caption{padding:5px 10px}}.archive__item-caption a{color:#fff;text-decoration:none}.list__item .page__meta,.list__item .comment__date{margin:0 0 4px;font-size:.6em}@media(min-width: 64em){.archive .grid__wrapper{margin-inline-end:-200px}}@media(min-width: 80em){.archive .grid__wrapper{margin-inline-end:-300px}}.grid__item{margin-bottom:2em}@media(min-width: 37.5em){.grid__item{float:inline-start;width:48.9795918367%}.grid__item:nth-child(2n+1){clear:both;margin-inline-start:0}.grid__item:nth-child(2n+2){clear:none;margin-inline-start:2.0408163265%}}@media(min-width: 48em){.grid__item{margin-inline:0;width:23.7288135593%}.grid__item:nth-child(2n+1){clear:none}.grid__item:nth-child(4n+1){clear:both}.grid__item:nth-child(4n+2){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+3){clear:none;margin-inline-start:1.6949152542%}.grid__item:nth-child(4n+4){clear:none;margin-inline-start:1.6949152542%}}.grid__item .page__meta,.grid__item .comment__date{margin:0 0 4px;font-size:.6em}.grid__item .page__meta-sep{display:block}.grid__item .page__meta-sep::before{display:none}.grid__item .archive__item-title{margin-top:.5em;font-size:1em}.grid__item .archive__item-excerpt{display:none}@media(min-width: 48em){.grid__item .archive__item-excerpt{display:block;font-size:.75em}}@media(min-width: 37.5em){.grid__item .archive__item-teaser{max-height:200px}}@media(min-width: 48em){.grid__item .archive__item-teaser{max-height:120px}}.feature__wrapper{clear:both}.feature__wrapper::after{clear:both;content:"";display:table}.feature__wrapper{margin-bottom:2em;border-bottom:1px solid rgb(185.6,170.4,146.4)}.feature__wrapper .archive__item-title{margin-bottom:0}.feature__item{position:relative;margin-bottom:2em;font-size:1.125em}@media(min-width: 37.5em){.feature__item{float:inline-start;margin-bottom:0;width:32.2033898305%}.feature__item:nth-child(3n+1){clear:both;margin-inline-start:0}.feature__item:nth-child(3n+2){clear:none;margin-inline-start:1.6949152542%}.feature__item:nth-child(3n+3){clear:none;margin-inline-start:1.6949152542%}.feature__item .feature__item-teaser{max-height:200px;overflow:hidden}}.feature__item .archive__item-body{padding-inline:1.6949152542%}.feature__item a.btn::before{content:"";position:absolute;inset:0}.feature__item--left,.feature__item--right{position:relative;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--left a.btn::before,.feature__item--right a.btn::before{content:"";position:absolute;inset:0}.feature__item--left .archive__item-teaser,.feature__item--right .archive__item-teaser{margin-bottom:2em}.feature__item--left{float:inline-start}.feature__item--left .archive__item{float:inline-start}@media(min-width: 37.5em){.feature__item--left .archive__item-teaser{float:inline-start;width:40.6779661017%}.feature__item--left .archive__item-body{float:inline-end;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--right{float:inline-end}.feature__item--right .archive__item{float:inline-end}@media(min-width: 37.5em){.feature__item--right{text-align:end}.feature__item--right .archive__item-teaser{float:inline-end;width:40.6779661017%}.feature__item--right .archive__item-body{float:inline-start;width:57.6271186441%;padding-inline-start:1.6949152542%;padding-inline-end:1.6949152542%}}.feature__item--center{position:relative;float:inline-start;margin-inline:0;width:100%;clear:both;font-size:1.125em}.feature__item--center .archive__item{float:inline-start;width:100%}.feature__item--center .archive__item-teaser{margin-bottom:2em}.feature__item--center a.btn::before{content:"";position:absolute;inset:0}@media(min-width: 37.5em){.feature__item--center{text-align:center}.feature__item--center .archive__item-teaser{margin:0 auto;width:40.6779661017%}.feature__item--center .archive__item-body{margin:0 auto;width:57.6271186441%}}.archive .feature__wrapper .archive__item-title{margin-top:.25em;font-size:1em}.archive .feature__item,.archive .feature__item--left,.archive .feature__item--center,.archive .feature__item--right{font-size:1em}@media(min-width: 64em){.wide .archive{padding-inline-end:0}}@media(min-width: 80em){.wide .archive{padding-inline-end:0}}.layout--single .feature__wrapper{display:inline-block}.sidebar{clear:both}.sidebar::after{clear:both;content:"";display:table}@media(min-width: 64em){.sidebar{float:inline-start;width:calc(200px - 1em);opacity:.75;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.sidebar:hover{opacity:1}.sidebar.sticky{overflow-y:auto;max-height:calc(100vh - 2em - 2em)}}@media(min-width: 80em){.sidebar{width:calc(300px - 1em)}}.sidebar>*{margin-top:1em;margin-bottom:1em}.sidebar h2,.sidebar h3,.sidebar h4,.sidebar h5,.sidebar h6{margin-bottom:0;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}.sidebar p,.sidebar li{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:.75em;line-height:1.5}.sidebar img{width:100%}.sidebar img.emoji{width:20px;height:20px}.sidebar__right{margin-bottom:1em}@media(min-width: 64em){.sidebar__right{position:absolute;top:0;inset-inline-end:0;width:200px;margin-inline-end:-200px;padding-inline-start:1em;z-index:10}.sidebar__right.sticky{clear:both}.sidebar__right.sticky::after{clear:both;content:"";display:table}.sidebar__right.sticky{position:-webkit-sticky;position:sticky;top:2em;float:inline-end}.sidebar__right.sticky .toc .toc__menu{overflow-y:auto;max-height:calc(100vh - 7em)}}@media(min-width: 80em){.sidebar__right{width:300px;margin-inline-end:-300px}}@media(min-width: 64em){.splash .sidebar__right{position:relative;float:inline-end;margin-inline-end:0}}@media(min-width: 80em){.splash .sidebar__right{margin-inline-end:0}}.author__avatar{display:table-cell;vertical-align:top;width:36px;height:36px}@media(min-width: 64em){.author__avatar{display:block;width:auto;height:auto}}.author__avatar img{max-width:110px;border-radius:50%}@media(min-width: 64em){.author__avatar img{padding:5px;border:1px solid rgb(185.6,170.4,146.4)}}.author__content{display:table-cell;vertical-align:top;padding-inline:15px 25px;line-height:1}@media(min-width: 64em){.author__content{display:block;width:100%;padding-inline:0}}.author__content a{color:inherit;text-decoration:none}.author__name{margin:0}@media(min-width: 64em){.author__name{margin-top:10px;margin-bottom:10px}}.sidebar .author__name{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";font-size:1em}.author__bio{margin:0}@media(min-width: 64em){.author__bio{margin-top:10px;margin-bottom:20px}}.author__urls-wrapper{position:relative;display:table-cell;vertical-align:middle;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";z-index:20;cursor:pointer}.author__urls-wrapper li:last-child a{margin-bottom:0}.author__urls-wrapper .author__urls span.label{padding-inline-start:5px}@media(min-width: 64em){.author__urls-wrapper{display:block}}.author__urls-wrapper button{position:relative;margin-bottom:0}@supports(pointer-events: none){.author__urls-wrapper button:before{content:"";position:fixed;top:0;inset-inline-start:0;width:100%;height:100%;pointer-events:none}}.author__urls-wrapper button.open:before{pointer-events:auto}@media(min-width: 64em){.author__urls-wrapper button{display:none}}.author__urls{display:none;position:absolute;inset-inline-end:0;margin-top:15px;padding:10px;list-style-type:none;border:1px solid rgb(185.6,170.4,146.4);border-radius:4px;background:#e8d5b7;box-shadow:0 2px 4px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);cursor:default}.author__urls.is--visible{display:block}@media(min-width: 64em){.author__urls{display:block;position:relative;margin:0;padding:0;border:0;background:rgba(0,0,0,0);box-shadow:none}}.author__urls::before{display:block;content:"";position:absolute;top:-11px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:rgb(185.6,170.4,146.4) rgba(0,0,0,0);z-index:0}@media(min-width: 64em){.author__urls::before{display:none}}.author__urls:after{display:block;content:"";position:absolute;top:-10px;inset-inline-start:calc(50% - 10px);width:0;border-style:solid;border-width:0 10px 10px;border-color:#e8d5b7 rgba(0,0,0,0);z-index:1}@media(min-width: 64em){.author__urls:after{display:none}}.author__urls ul{padding:10px;list-style-type:none}.author__urls li{white-space:nowrap}.author__urls a{display:block;margin-bottom:5px;padding-block:2px;padding-inline-end:5px;color:inherit;font-size:1em;text-decoration:none}.author__urls a:hover{text-decoration:underline}.wide .sidebar__right{margin-bottom:1em}@media(min-width: 64em){.wide .sidebar__right{position:initial;top:initial;inset-inline-end:initial;width:initial;margin-inline-end:initial;padding-inline-start:initial;z-index:initial}.wide .sidebar__right.sticky{float:none}}@media(min-width: 80em){.wide .sidebar__right{width:initial;margin-inline-end:initial}}@media print{[hidden]{display:none}*{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html{margin:0;padding:0;min-height:auto !important;font-size:16px}body{margin:0 auto;background:#fff !important;color:#000 !important;font-size:1rem;line-height:1.5;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3,h4,h5,h6{color:#000;line-height:1.2;margin-bottom:.75rem;margin-top:0}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}a,a:visited{color:#000;text-decoration:underline;word-wrap:break-word}table{border-collapse:collapse}thead{display:table-header-group}table,th,td{border-bottom:1px solid #000}td,th{padding:8px 16px}img{border:0;display:block;max-width:100% !important;vertical-align:middle}hr{border:0;border-bottom:2px solid #bbb;height:0;margin:2.25rem 0;padding:0}dt{font-weight:bold}dd{margin:0;margin-bottom:.75rem}abbr[title],acronym[title]{border:0;text-decoration:none}table,blockquote,pre,code,figure,li,hr,ul,ol,a,tr{page-break-inside:avoid}h2,h3,h4,p,a{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-inside:avoid}h1+p,h2+p,h3+p{page-break-before:avoid}img{page-break-after:auto;page-break-before:auto;page-break-inside:avoid}pre{white-space:pre-wrap !important;word-wrap:break-word}a[href^="http://"]:after,a[href^="https://"]:after,a[href^="ftp://"]:after{content:" (" attr(href) ")";font-size:80%}abbr[title]:after,acronym[title]:after{content:" (" attr(title) ")"}#main{max-width:100%}.page{margin:0;padding:0;width:100%}.page-break,.page-break-before{page-break-before:always}.page-break-after{page-break-after:always}.no-print{display:none}a.no-reformat:after{content:""}abbr[title].no-reformat:after,acronym[title].no-reformat:after{content:""}.page__hero-caption{color:#000 !important;background:#fff !important;opacity:1}.page__hero-caption a{color:#000 !important}.masthead,.toc,.page__share,.page__related,.pagination,.ads,.page__footer,.page__comments-form,.author__avatar,.author__content,.author__urls-wrapper,.nav__list,.sidebar,.adsbygoogle{display:none !important;height:1px !important}}blockquote{margin-inline:0;font-style:normal}*{overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.notice ul:first-child{margin-top:0}.task-list-item label{display:inline}.m0{margin:0 !important} \ No newline at end of file diff --git a/assets/img/docs/authlib-injector/image.png b/assets/img/docs/authlib-injector/image.png new file mode 100644 index 0000000..654a69e Binary files /dev/null and b/assets/img/docs/authlib-injector/image.png differ diff --git a/assets/img/docs/auto-installing/AutoInstaller_ModAutoAdding.png b/assets/img/docs/auto-installing/AutoInstaller_ModAutoAdding.png new file mode 100644 index 0000000..4bc7bc9 Binary files /dev/null and b/assets/img/docs/auto-installing/AutoInstaller_ModAutoAdding.png differ diff --git a/assets/img/docs/auto-installing/AutoInstaller_ModLoader.png b/assets/img/docs/auto-installing/AutoInstaller_ModLoader.png new file mode 100644 index 0000000..709782f Binary files /dev/null and b/assets/img/docs/auto-installing/AutoInstaller_ModLoader.png differ diff --git a/assets/img/docs/auto-installing/AutoInstaller_ModManualAdding.png b/assets/img/docs/auto-installing/AutoInstaller_ModManualAdding.png new file mode 100644 index 0000000..cd7dbf4 Binary files /dev/null and b/assets/img/docs/auto-installing/AutoInstaller_ModManualAdding.png differ diff --git a/assets/img/docs/auto-installing/Auto_Install_Page.png b/assets/img/docs/auto-installing/Auto_Install_Page.png new file mode 100644 index 0000000..4fbec2f Binary files /dev/null and b/assets/img/docs/auto-installing/Auto_Install_Page.png differ diff --git a/assets/img/docs/auto-installing/Crash_Report_Page.png b/assets/img/docs/auto-installing/Crash_Report_Page.png new file mode 100644 index 0000000..09b3414 Binary files /dev/null and b/assets/img/docs/auto-installing/Crash_Report_Page.png differ diff --git a/assets/img/docs/auto-installing/Working_Directory.png b/assets/img/docs/auto-installing/Working_Directory.png new file mode 100644 index 0000000..2f89188 Binary files /dev/null and b/assets/img/docs/auto-installing/Working_Directory.png differ diff --git a/assets/img/docs/auto-installing/chicken.png b/assets/img/docs/auto-installing/chicken.png new file mode 100644 index 0000000..e724a52 Binary files /dev/null and b/assets/img/docs/auto-installing/chicken.png differ diff --git a/assets/img/docs/auto-installing/cleanroom.png b/assets/img/docs/auto-installing/cleanroom.png new file mode 100644 index 0000000..cda6dc0 Binary files /dev/null and b/assets/img/docs/auto-installing/cleanroom.png differ diff --git a/assets/img/docs/auto-installing/fabric.png b/assets/img/docs/auto-installing/fabric.png new file mode 100644 index 0000000..aa2b87f Binary files /dev/null and b/assets/img/docs/auto-installing/fabric.png differ diff --git a/assets/img/docs/auto-installing/forge.png b/assets/img/docs/auto-installing/forge.png new file mode 100644 index 0000000..a1d89f3 Binary files /dev/null and b/assets/img/docs/auto-installing/forge.png differ diff --git a/assets/img/docs/auto-installing/neoforge.png b/assets/img/docs/auto-installing/neoforge.png new file mode 100644 index 0000000..7d46d39 Binary files /dev/null and b/assets/img/docs/auto-installing/neoforge.png differ diff --git a/assets/img/docs/auto-installing/quilt.png b/assets/img/docs/auto-installing/quilt.png new file mode 100644 index 0000000..9b29c33 Binary files /dev/null and b/assets/img/docs/auto-installing/quilt.png differ diff --git a/assets/img/docs/error-handbook/image.png b/assets/img/docs/error-handbook/image.png new file mode 100644 index 0000000..8df985c Binary files /dev/null and b/assets/img/docs/error-handbook/image.png differ diff --git a/assets/img/docs/fabric_and_optifine_install/1.gif b/assets/img/docs/fabric_and_optifine_install/1.gif new file mode 100644 index 0000000..2eaeac1 Binary files /dev/null and b/assets/img/docs/fabric_and_optifine_install/1.gif differ diff --git a/assets/img/docs/fabric_and_optifine_install/11.gif b/assets/img/docs/fabric_and_optifine_install/11.gif new file mode 100644 index 0000000..9a092b8 Binary files /dev/null and b/assets/img/docs/fabric_and_optifine_install/11.gif differ diff --git a/assets/img/docs/fabric_and_optifine_install/2.png b/assets/img/docs/fabric_and_optifine_install/2.png new file mode 100644 index 0000000..6cc8dd3 Binary files /dev/null and b/assets/img/docs/fabric_and_optifine_install/2.png differ diff --git a/assets/img/docs/fabric_and_optifine_install/5.png b/assets/img/docs/fabric_and_optifine_install/5.png new file mode 100644 index 0000000..ab9f390 Binary files /dev/null and b/assets/img/docs/fabric_and_optifine_install/5.png differ diff --git a/assets/img/docs/fabric_and_optifine_install/6.png b/assets/img/docs/fabric_and_optifine_install/6.png new file mode 100644 index 0000000..d6031a9 Binary files /dev/null and b/assets/img/docs/fabric_and_optifine_install/6.png differ diff --git a/assets/img/docs/fabric_and_optifine_install/7.png b/assets/img/docs/fabric_and_optifine_install/7.png new file mode 100644 index 0000000..2f2e060 Binary files /dev/null and b/assets/img/docs/fabric_and_optifine_install/7.png differ diff --git a/assets/img/docs/fabric_and_optifine_install/8.png b/assets/img/docs/fabric_and_optifine_install/8.png new file mode 100644 index 0000000..9b58d88 Binary files /dev/null and b/assets/img/docs/fabric_and_optifine_install/8.png differ diff --git a/assets/img/docs/fabric_and_optifine_install/9.png b/assets/img/docs/fabric_and_optifine_install/9.png new file mode 100644 index 0000000..6069ba5 Binary files /dev/null and b/assets/img/docs/fabric_and_optifine_install/9.png differ diff --git a/assets/img/docs/faq/img1.png b/assets/img/docs/faq/img1.png new file mode 100644 index 0000000..238ff68 Binary files /dev/null and b/assets/img/docs/faq/img1.png differ diff --git a/assets/img/docs/faq/img2.png b/assets/img/docs/faq/img2.png new file mode 100644 index 0000000..66b99e9 Binary files /dev/null and b/assets/img/docs/faq/img2.png differ diff --git a/assets/img/docs/faq/img3.png b/assets/img/docs/faq/img3.png new file mode 100644 index 0000000..8edc13e Binary files /dev/null and b/assets/img/docs/faq/img3.png differ diff --git a/assets/img/docs/faq/img4.png b/assets/img/docs/faq/img4.png new file mode 100644 index 0000000..0df284a Binary files /dev/null and b/assets/img/docs/faq/img4.png differ diff --git a/assets/img/docs/faq/img5.jpg b/assets/img/docs/faq/img5.jpg new file mode 100644 index 0000000..e6e010a Binary files /dev/null and b/assets/img/docs/faq/img5.jpg differ diff --git a/assets/img/docs/groups/button-1.png b/assets/img/docs/groups/button-1.png new file mode 100644 index 0000000..2b1a275 Binary files /dev/null and b/assets/img/docs/groups/button-1.png differ diff --git a/assets/img/docs/groups/button-2.png b/assets/img/docs/groups/button-2.png new file mode 100644 index 0000000..87a4cbf Binary files /dev/null and b/assets/img/docs/groups/button-2.png differ diff --git a/assets/img/docs/groups/crash.png b/assets/img/docs/groups/crash.png new file mode 100644 index 0000000..23848f0 Binary files /dev/null and b/assets/img/docs/groups/crash.png differ diff --git a/assets/img/docs/groups/group-1.png b/assets/img/docs/groups/group-1.png new file mode 100644 index 0000000..8eb8462 Binary files /dev/null and b/assets/img/docs/groups/group-1.png differ diff --git a/assets/img/docs/groups/group-10.png b/assets/img/docs/groups/group-10.png new file mode 100644 index 0000000..006df1b Binary files /dev/null and b/assets/img/docs/groups/group-10.png differ diff --git a/assets/img/docs/groups/group-2.png b/assets/img/docs/groups/group-2.png new file mode 100644 index 0000000..f1e6592 Binary files /dev/null and b/assets/img/docs/groups/group-2.png differ diff --git a/assets/img/docs/groups/group-3.png b/assets/img/docs/groups/group-3.png new file mode 100644 index 0000000..5808b6e Binary files /dev/null and b/assets/img/docs/groups/group-3.png differ diff --git a/assets/img/docs/groups/group-4.png b/assets/img/docs/groups/group-4.png new file mode 100644 index 0000000..304501c Binary files /dev/null and b/assets/img/docs/groups/group-4.png differ diff --git a/assets/img/docs/groups/group-5.png b/assets/img/docs/groups/group-5.png new file mode 100644 index 0000000..d0d5a3b Binary files /dev/null and b/assets/img/docs/groups/group-5.png differ diff --git a/assets/img/docs/groups/group-6.png b/assets/img/docs/groups/group-6.png new file mode 100644 index 0000000..ce60301 Binary files /dev/null and b/assets/img/docs/groups/group-6.png differ diff --git a/assets/img/docs/groups/group-7.png b/assets/img/docs/groups/group-7.png new file mode 100644 index 0000000..358b8bd Binary files /dev/null and b/assets/img/docs/groups/group-7.png differ diff --git a/assets/img/docs/groups/group-8.png b/assets/img/docs/groups/group-8.png new file mode 100644 index 0000000..a03048a Binary files /dev/null and b/assets/img/docs/groups/group-8.png differ diff --git a/assets/img/docs/groups/group-9.png b/assets/img/docs/groups/group-9.png new file mode 100644 index 0000000..b0f6d0a Binary files /dev/null and b/assets/img/docs/groups/group-9.png differ diff --git a/assets/img/docs/isolation/img1.png b/assets/img/docs/isolation/img1.png new file mode 100644 index 0000000..66bf9dc Binary files /dev/null and b/assets/img/docs/isolation/img1.png differ diff --git a/assets/img/docs/isolation/img2.png b/assets/img/docs/isolation/img2.png new file mode 100644 index 0000000..bb55b16 Binary files /dev/null and b/assets/img/docs/isolation/img2.png differ diff --git a/assets/img/docs/isolation/img3.png b/assets/img/docs/isolation/img3.png new file mode 100644 index 0000000..083ce7c Binary files /dev/null and b/assets/img/docs/isolation/img3.png differ diff --git a/assets/img/docs/java-download-pages/macos-arm64-1.gif b/assets/img/docs/java-download-pages/macos-arm64-1.gif new file mode 100644 index 0000000..ffb5d81 Binary files /dev/null and b/assets/img/docs/java-download-pages/macos-arm64-1.gif differ diff --git a/assets/img/docs/java-download-pages/macos-x86_64-1.gif b/assets/img/docs/java-download-pages/macos-x86_64-1.gif new file mode 100644 index 0000000..c55710c Binary files /dev/null and b/assets/img/docs/java-download-pages/macos-x86_64-1.gif differ diff --git a/assets/img/docs/java-download-pages/windows-x86-1.gif b/assets/img/docs/java-download-pages/windows-x86-1.gif new file mode 100644 index 0000000..fa1111d Binary files /dev/null and b/assets/img/docs/java-download-pages/windows-x86-1.gif differ diff --git a/assets/img/docs/java-download-pages/windows-x86-2.gif b/assets/img/docs/java-download-pages/windows-x86-2.gif new file mode 100644 index 0000000..ae4ca26 Binary files /dev/null and b/assets/img/docs/java-download-pages/windows-x86-2.gif differ diff --git a/assets/img/docs/java-download-pages/windows-x86-3.gif b/assets/img/docs/java-download-pages/windows-x86-3.gif new file mode 100644 index 0000000..4087ec4 Binary files /dev/null and b/assets/img/docs/java-download-pages/windows-x86-3.gif differ diff --git a/assets/img/docs/java-download-pages/windows-x86_64-1.gif b/assets/img/docs/java-download-pages/windows-x86_64-1.gif new file mode 100644 index 0000000..7a1797c Binary files /dev/null and b/assets/img/docs/java-download-pages/windows-x86_64-1.gif differ diff --git a/assets/img/docs/java-download-pages/windows-x86_64-2.gif b/assets/img/docs/java-download-pages/windows-x86_64-2.gif new file mode 100644 index 0000000..b0aac5e Binary files /dev/null and b/assets/img/docs/java-download-pages/windows-x86_64-2.gif differ diff --git a/assets/img/docs/launcher/gui-features/global.png b/assets/img/docs/launcher/gui-features/global.png new file mode 100644 index 0000000..27037e0 Binary files /dev/null and b/assets/img/docs/launcher/gui-features/global.png differ diff --git a/assets/img/docs/launcher/gui-features/home-launch.png b/assets/img/docs/launcher/gui-features/home-launch.png new file mode 100644 index 0000000..52f4e57 Binary files /dev/null and b/assets/img/docs/launcher/gui-features/home-launch.png differ diff --git a/assets/img/docs/launcher/gui-features/home-sidebar.png b/assets/img/docs/launcher/gui-features/home-sidebar.png new file mode 100644 index 0000000..208354f Binary files /dev/null and b/assets/img/docs/launcher/gui-features/home-sidebar.png differ diff --git a/assets/img/docs/launcher/gui-features/home-tip.png b/assets/img/docs/launcher/gui-features/home-tip.png new file mode 100644 index 0000000..3096244 Binary files /dev/null and b/assets/img/docs/launcher/gui-features/home-tip.png differ diff --git a/assets/img/docs/launcher/gui-features/home-update.png b/assets/img/docs/launcher/gui-features/home-update.png new file mode 100644 index 0000000..3edf20d Binary files /dev/null and b/assets/img/docs/launcher/gui-features/home-update.png differ diff --git a/assets/img/docs/launcher/gui-features/home.png b/assets/img/docs/launcher/gui-features/home.png new file mode 100644 index 0000000..fab649f Binary files /dev/null and b/assets/img/docs/launcher/gui-features/home.png differ diff --git a/assets/img/docs/launcher/gui-features/settings-global.png b/assets/img/docs/launcher/gui-features/settings-global.png new file mode 100644 index 0000000..93ec5c1 Binary files /dev/null and b/assets/img/docs/launcher/gui-features/settings-global.png differ diff --git a/assets/img/docs/launcher/gui-features/settings.png b/assets/img/docs/launcher/gui-features/settings.png new file mode 100644 index 0000000..afa9320 Binary files /dev/null and b/assets/img/docs/launcher/gui-features/settings.png differ diff --git a/assets/img/docs/launcher/gui-features/topbar.png b/assets/img/docs/launcher/gui-features/topbar.png new file mode 100644 index 0000000..5038a1f Binary files /dev/null and b/assets/img/docs/launcher/gui-features/topbar.png differ diff --git a/assets/img/docs/modpack-in-java/1-1.png b/assets/img/docs/modpack-in-java/1-1.png new file mode 100644 index 0000000..6c63335 Binary files /dev/null and b/assets/img/docs/modpack-in-java/1-1.png differ diff --git a/assets/img/docs/modpack-in-java/2-1.png b/assets/img/docs/modpack-in-java/2-1.png new file mode 100644 index 0000000..7aeea87 Binary files /dev/null and b/assets/img/docs/modpack-in-java/2-1.png differ diff --git a/assets/img/docs/modpack-in-java/2-2.png b/assets/img/docs/modpack-in-java/2-2.png new file mode 100644 index 0000000..9bfbbce Binary files /dev/null and b/assets/img/docs/modpack-in-java/2-2.png differ diff --git a/assets/img/docs/modpack-in-java/2-3.png b/assets/img/docs/modpack-in-java/2-3.png new file mode 100644 index 0000000..77d207b Binary files /dev/null and b/assets/img/docs/modpack-in-java/2-3.png differ diff --git a/assets/img/docs/modpack-in-java/2-4.png b/assets/img/docs/modpack-in-java/2-4.png new file mode 100644 index 0000000..6bf5653 Binary files /dev/null and b/assets/img/docs/modpack-in-java/2-4.png differ diff --git a/assets/img/docs/modpack-in-java/2-5.png b/assets/img/docs/modpack-in-java/2-5.png new file mode 100644 index 0000000..863bdcb Binary files /dev/null and b/assets/img/docs/modpack-in-java/2-5.png differ diff --git a/assets/img/docs/modpack-in-java/2-6.png b/assets/img/docs/modpack-in-java/2-6.png new file mode 100644 index 0000000..eea682f Binary files /dev/null and b/assets/img/docs/modpack-in-java/2-6.png differ diff --git a/assets/img/docs/modpack-in-java/2-7.png b/assets/img/docs/modpack-in-java/2-7.png new file mode 100644 index 0000000..5701f0a Binary files /dev/null and b/assets/img/docs/modpack-in-java/2-7.png differ diff --git a/assets/img/docs/multiplayer-help/cover.jpg b/assets/img/docs/multiplayer-help/cover.jpg new file mode 100644 index 0000000..adc3d77 Binary files /dev/null and b/assets/img/docs/multiplayer-help/cover.jpg differ diff --git a/assets/img/docs/offline-skin/img1_1.png b/assets/img/docs/offline-skin/img1_1.png new file mode 100644 index 0000000..03be9e7 Binary files /dev/null and b/assets/img/docs/offline-skin/img1_1.png differ diff --git a/assets/img/docs/offline-skin/img1_2.png b/assets/img/docs/offline-skin/img1_2.png new file mode 100644 index 0000000..193dfad Binary files /dev/null and b/assets/img/docs/offline-skin/img1_2.png differ diff --git a/assets/img/docs/offline-skin/img2.png b/assets/img/docs/offline-skin/img2.png new file mode 100644 index 0000000..349df0d Binary files /dev/null and b/assets/img/docs/offline-skin/img2.png differ diff --git a/assets/img/docs/offline-skin/img3_1.png b/assets/img/docs/offline-skin/img3_1.png new file mode 100644 index 0000000..0740213 Binary files /dev/null and b/assets/img/docs/offline-skin/img3_1.png differ diff --git a/assets/img/docs/offline-skin/img3_2.png b/assets/img/docs/offline-skin/img3_2.png new file mode 100644 index 0000000..3f18405 Binary files /dev/null and b/assets/img/docs/offline-skin/img3_2.png differ diff --git a/assets/img/docs/offline-skin/img3_3.png b/assets/img/docs/offline-skin/img3_3.png new file mode 100644 index 0000000..8e80c90 Binary files /dev/null and b/assets/img/docs/offline-skin/img3_3.png differ diff --git a/assets/img/docs/offline-skin/img4_1.png b/assets/img/docs/offline-skin/img4_1.png new file mode 100644 index 0000000..cc816d5 Binary files /dev/null and b/assets/img/docs/offline-skin/img4_1.png differ diff --git a/assets/img/docs/offline-skin/img4_2.png b/assets/img/docs/offline-skin/img4_2.png new file mode 100644 index 0000000..04b3489 Binary files /dev/null and b/assets/img/docs/offline-skin/img4_2.png differ diff --git a/assets/img/docs/offline-skin/img4_3.png b/assets/img/docs/offline-skin/img4_3.png new file mode 100644 index 0000000..fd32521 Binary files /dev/null and b/assets/img/docs/offline-skin/img4_3.png differ diff --git a/assets/img/docs/serverpack/img1.png b/assets/img/docs/serverpack/img1.png new file mode 100644 index 0000000..df6218a Binary files /dev/null and b/assets/img/docs/serverpack/img1.png differ diff --git a/assets/img/docs/serverpack/img2.png b/assets/img/docs/serverpack/img2.png new file mode 100644 index 0000000..c59b7e8 Binary files /dev/null and b/assets/img/docs/serverpack/img2.png differ diff --git a/assets/img/docs/serverpack/img3.png b/assets/img/docs/serverpack/img3.png new file mode 100644 index 0000000..421178a Binary files /dev/null and b/assets/img/docs/serverpack/img3.png differ diff --git a/assets/img/docs/serverpack/img4.png b/assets/img/docs/serverpack/img4.png new file mode 100644 index 0000000..eccbfe7 Binary files /dev/null and b/assets/img/docs/serverpack/img4.png differ diff --git a/assets/img/docs/serverpack/img5.png b/assets/img/docs/serverpack/img5.png new file mode 100644 index 0000000..8df31c2 Binary files /dev/null and b/assets/img/docs/serverpack/img5.png differ diff --git a/assets/img/docs/serverpack/img6.png b/assets/img/docs/serverpack/img6.png new file mode 100644 index 0000000..974794c Binary files /dev/null and b/assets/img/docs/serverpack/img6.png differ diff --git a/assets/img/docs/serverpack2/2.1.jpg b/assets/img/docs/serverpack2/2.1.jpg new file mode 100644 index 0000000..0b1d30b Binary files /dev/null and b/assets/img/docs/serverpack2/2.1.jpg differ diff --git a/assets/img/docs/serverpack2/2.2.jpg b/assets/img/docs/serverpack2/2.2.jpg new file mode 100644 index 0000000..4486255 Binary files /dev/null and b/assets/img/docs/serverpack2/2.2.jpg differ diff --git a/assets/img/docs/serverpack2/2.3.jpg b/assets/img/docs/serverpack2/2.3.jpg new file mode 100644 index 0000000..474285a Binary files /dev/null and b/assets/img/docs/serverpack2/2.3.jpg differ diff --git a/assets/img/docs/serverpack2/2.4.jpg b/assets/img/docs/serverpack2/2.4.jpg new file mode 100644 index 0000000..2122fc2 Binary files /dev/null and b/assets/img/docs/serverpack2/2.4.jpg differ diff --git a/assets/img/docs/serverpack2/2.5.jpg b/assets/img/docs/serverpack2/2.5.jpg new file mode 100644 index 0000000..1f340da Binary files /dev/null and b/assets/img/docs/serverpack2/2.5.jpg differ diff --git a/assets/img/docs/serverpack2/2.6.jpg b/assets/img/docs/serverpack2/2.6.jpg new file mode 100644 index 0000000..56df564 Binary files /dev/null and b/assets/img/docs/serverpack2/2.6.jpg differ diff --git a/assets/img/docs/serverpack2/2.7.jpg b/assets/img/docs/serverpack2/2.7.jpg new file mode 100644 index 0000000..e6ed4f1 Binary files /dev/null and b/assets/img/docs/serverpack2/2.7.jpg differ diff --git a/assets/img/docs/serverpack2/2.8.jpg b/assets/img/docs/serverpack2/2.8.jpg new file mode 100644 index 0000000..4be4d84 Binary files /dev/null and b/assets/img/docs/serverpack2/2.8.jpg differ diff --git a/assets/img/docs/serverpack2/3.1.jpg b/assets/img/docs/serverpack2/3.1.jpg new file mode 100644 index 0000000..18fa96e Binary files /dev/null and b/assets/img/docs/serverpack2/3.1.jpg differ diff --git a/assets/img/docs/serverpack2/3.2.jpg b/assets/img/docs/serverpack2/3.2.jpg new file mode 100644 index 0000000..b9751aa Binary files /dev/null and b/assets/img/docs/serverpack2/3.2.jpg differ diff --git a/assets/img/docs/serverpack2/4.1.jpg b/assets/img/docs/serverpack2/4.1.jpg new file mode 100644 index 0000000..aaba4e8 Binary files /dev/null and b/assets/img/docs/serverpack2/4.1.jpg differ diff --git a/assets/img/docs/serverpack2/4.2.jpg b/assets/img/docs/serverpack2/4.2.jpg new file mode 100644 index 0000000..91c31c3 Binary files /dev/null and b/assets/img/docs/serverpack2/4.2.jpg differ diff --git a/assets/img/docs/serverpack2/5.1.jpg b/assets/img/docs/serverpack2/5.1.jpg new file mode 100644 index 0000000..320483b Binary files /dev/null and b/assets/img/docs/serverpack2/5.1.jpg differ diff --git a/assets/img/docs/serverpack2/5.2.jpg b/assets/img/docs/serverpack2/5.2.jpg new file mode 100644 index 0000000..abbbef3 Binary files /dev/null and b/assets/img/docs/serverpack2/5.2.jpg differ diff --git a/assets/img/docs/shader/change_path.png b/assets/img/docs/shader/change_path.png new file mode 100644 index 0000000..9015939 Binary files /dev/null and b/assets/img/docs/shader/change_path.png differ diff --git a/assets/img/docs/shader/game_dir.png b/assets/img/docs/shader/game_dir.png new file mode 100644 index 0000000..d5822bb Binary files /dev/null and b/assets/img/docs/shader/game_dir.png differ diff --git a/assets/img/docs/shader/install_auto-16338577874692.png b/assets/img/docs/shader/install_auto-16338577874692.png new file mode 100644 index 0000000..3ba2800 Binary files /dev/null and b/assets/img/docs/shader/install_auto-16338577874692.png differ diff --git a/assets/img/docs/shader/install_auto.png b/assets/img/docs/shader/install_auto.png new file mode 100644 index 0000000..3ba2800 Binary files /dev/null and b/assets/img/docs/shader/install_auto.png differ diff --git a/assets/img/docs/shader/iris.png b/assets/img/docs/shader/iris.png new file mode 100644 index 0000000..6c1d223 Binary files /dev/null and b/assets/img/docs/shader/iris.png differ diff --git a/assets/img/docs/shader/oculus.png b/assets/img/docs/shader/oculus.png new file mode 100644 index 0000000..7b523a4 Binary files /dev/null and b/assets/img/docs/shader/oculus.png differ diff --git a/assets/img/docs/shader/optifine_compatibility.png b/assets/img/docs/shader/optifine_compatibility.png new file mode 100644 index 0000000..a966580 Binary files /dev/null and b/assets/img/docs/shader/optifine_compatibility.png differ diff --git a/assets/img/docs/shader/optifine_install.png b/assets/img/docs/shader/optifine_install.png new file mode 100644 index 0000000..b9db646 Binary files /dev/null and b/assets/img/docs/shader/optifine_install.png differ diff --git a/assets/img/docs/shader/select_optifine-16338577687881.png b/assets/img/docs/shader/select_optifine-16338577687881.png new file mode 100644 index 0000000..05c8125 Binary files /dev/null and b/assets/img/docs/shader/select_optifine-16338577687881.png differ diff --git a/assets/img/docs/shader/select_optifine.png b/assets/img/docs/shader/select_optifine.png new file mode 100644 index 0000000..05c8125 Binary files /dev/null and b/assets/img/docs/shader/select_optifine.png differ diff --git a/assets/img/docs/shader/shaders_setting.png b/assets/img/docs/shader/shaders_setting.png new file mode 100644 index 0000000..694b3e5 Binary files /dev/null and b/assets/img/docs/shader/shaders_setting.png differ diff --git a/assets/img/docs/use-password-login-microsoft-account/1.png b/assets/img/docs/use-password-login-microsoft-account/1.png new file mode 100644 index 0000000..8133aa5 Binary files /dev/null and b/assets/img/docs/use-password-login-microsoft-account/1.png differ diff --git a/assets/img/docs/use-password-login-microsoft-account/2.png b/assets/img/docs/use-password-login-microsoft-account/2.png new file mode 100644 index 0000000..970cd2c Binary files /dev/null and b/assets/img/docs/use-password-login-microsoft-account/2.png differ diff --git a/assets/img/docs/use-password-login-microsoft-account/3.png b/assets/img/docs/use-password-login-microsoft-account/3.png new file mode 100644 index 0000000..2a2d226 Binary files /dev/null and b/assets/img/docs/use-password-login-microsoft-account/3.png differ diff --git a/assets/img/docs/use-password-login-microsoft-account/4.png b/assets/img/docs/use-password-login-microsoft-account/4.png new file mode 100644 index 0000000..c9811ba Binary files /dev/null and b/assets/img/docs/use-password-login-microsoft-account/4.png differ diff --git a/assets/img/hmcl.png b/assets/img/hmcl.png new file mode 100644 index 0000000..71b6d32 Binary files /dev/null and b/assets/img/hmcl.png differ diff --git a/assets/img/hmcl/自动管理所有驱动器分页文件大小.webp b/assets/img/hmcl/自动管理所有驱动器分页文件大小.webp new file mode 100644 index 0000000..9fa2e09 Binary files /dev/null and b/assets/img/hmcl/自动管理所有驱动器分页文件大小.webp differ diff --git a/assets/js/_main.js b/assets/js/_main.js new file mode 100644 index 0000000..a9159ff --- /dev/null +++ b/assets/js/_main.js @@ -0,0 +1,234 @@ +/* ========================================================================== + jQuery plugin settings and other scripts + ========================================================================== */ + +$(document).ready(function () { + // FitVids init + $("#main").fitVids(); + + // Follow menu drop down + $(".author__urls-wrapper button").on("click", function () { + $(".author__urls").toggleClass("is--visible"); + $(".author__urls-wrapper").find("button").toggleClass("open"); + }); + + // Close search screen with Esc key + $(document).keyup(function (e) { + if (e.keyCode === 27) { + if ($(".initial-content").hasClass("is--hidden")) { + $(".search-content").toggleClass("is--visible"); + $(".initial-content").toggleClass("is--hidden"); + } + } + }); + + // Search toggle + $(".search__toggle").on("click", function () { + $(".search-content").toggleClass("is--visible"); + $(".initial-content").toggleClass("is--hidden"); + // set focus on input + setTimeout(function () { + $(".search-content input").focus(); + }, 400); + }); + + // Smooth scrolling + var scroll = new SmoothScroll('a[href*="#"]', { + offset: 20, + speed: 400, + speedAsDuration: true, + durationMax: 500, + }); + + // Gumshoe scroll spy init + if ($("nav.toc").length > 0) { + var spy = new Gumshoe("nav.toc a", { + // Active classes + navClass: "active", // applied to the nav list item + contentClass: "active", // applied to the content + + // Nested navigation + nested: false, // if true, add classes to parents of active link + nestedClass: "active", // applied to the parent items + + // Offset & reflow + offset: 20, // how far from the top of the page to activate a content area + reflow: true, // if true, listen for reflows + + // Event support + events: true, // if true, emit custom events + }); + } + + // Auto scroll sticky ToC with content + const scrollTocToContent = function (event) { + var target = event.target; + var scrollOptions = { behavior: "auto", block: "nearest", inline: "start" }; + + var tocElement = document.querySelector("aside.sidebar__right.sticky"); + if (!tocElement) return; + if (window.getComputedStyle(tocElement).position !== "sticky") return; + + if (target.parentElement.classList.contains("toc__menu") && target == target.parentElement.firstElementChild) { + // Scroll to top instead + document.querySelector("nav.toc header").scrollIntoView(scrollOptions); + } else { + target.scrollIntoView(scrollOptions); + } + }; + + // Has issues on Firefox, whitelist Chrome for now + if (!!window.chrome) { + document.addEventListener("gumshoeActivate", scrollTocToContent); + } + + // add lightbox class to all image links + $( + "a[href$='.jpg'],a[href$='.jpeg'],a[href$='.JPG'],a[href$='.png'],a[href$='.gif'],a[href$='.webp']" + ).has("> img").addClass("image-popup"); + + // Magnific-Popup options + $(".image-popup").magnificPopup({ + // disableOn: function() { + // if( $(window).width() < 500 ) { + // return false; + // } + // return true; + // }, + type: "image", + tLoading: "Loading image #%curr%...", + gallery: { + enabled: true, + navigateByImgClick: true, + preload: [0, 1], // Will preload 0 - before current, and 1 after the current image + }, + image: { + tError: 'Image #%curr% could not be loaded.', + }, + removalDelay: 500, // Delay in milliseconds before popup is removed + // Class that is added to body when popup is open. + // make it unique to apply your CSS animations just to this exact popup + mainClass: "mfp-zoom-in", + callbacks: { + beforeOpen: function () { + // just a hack that adds mfp-anim class to markup + this.st.image.markup = this.st.image.markup.replace( + "mfp-figure", + "mfp-figure mfp-with-anim" + ); + }, + }, + closeOnContentClick: true, + midClick: true, // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source. + }); + + // Add anchors for headings + (function () { + var pageContentElement = document.querySelector(".page__content"); + if (!pageContentElement) return; + + pageContentElement + .querySelectorAll("h1, h2, h3, h4, h5, h6") + .forEach(function (element) { + var id = element.getAttribute("id"); + if (id) { + var anchor = document.createElement("a"); + anchor.className = "header-link"; + anchor.href = "#" + id; + anchor.innerHTML = + 'Permalink'; + anchor.title = "Permalink"; + element.appendChild(anchor); + } + }); + })(); + + // Add copy button for
 blocks
+  var copyText = function (text) {
+    if (document.queryCommandEnabled("copy") && navigator.clipboard) {
+      navigator.clipboard.writeText(text).then(
+        () => true,
+        () => console.error("Failed to copy text to clipboard: " + text)
+      );
+      return true;
+    } else {
+      var isRTL = document.documentElement.getAttribute("dir") === "rtl";
+
+      var textarea = document.createElement("textarea");
+      textarea.className = "clipboard-helper";
+      textarea.style[isRTL ? "right" : "left"] = "-9999px";
+      // Move element to the same position vertically
+      var yPosition = window.pageYOffset || document.documentElement.scrollTop;
+      textarea.style.top = yPosition + "px";
+
+      textarea.setAttribute("readonly", "");
+      textarea.value = text;
+      document.body.appendChild(textarea);
+
+      var success = true;
+      try {
+        textarea.select();
+        success = document.execCommand("copy");
+      } catch (e) {
+        success = false;
+      }
+      textarea.parentNode.removeChild(textarea);
+      return success;
+    }
+  };
+
+  var copyButtonEventListener = function (event) {
+    var thisButton = event.target;
+
+    // Locate the  element
+    var codeBlock = thisButton.nextElementSibling;
+    while (codeBlock && codeBlock.tagName.toLowerCase() !== "code") {
+      codeBlock = codeBlock.nextElementSibling;
+    }
+    if (!codeBlock) {
+      // No  found - wtf?
+      console.warn(thisButton);
+      throw new Error("No code block found for this button.");
+    }
+
+    // Skip line numbers if present (i.e. {% highlight lineno %})
+    var realCodeBlock = codeBlock.querySelector("td.code, td.rouge-code");
+    if (realCodeBlock) {
+      codeBlock = realCodeBlock;
+    }
+    var result = copyText(codeBlock.innerText);
+    // Restore the focus to the button
+    thisButton.focus();
+    if (result) {
+      if (thisButton.interval !== null) {
+        clearInterval(thisButton.interval);
+      }
+      thisButton.classList.add('copied');
+      thisButton.interval = setTimeout(function () {
+        thisButton.classList.remove('copied');
+        clearInterval(thisButton.interval);
+        thisButton.interval = null;
+      }, 1500);
+    }
+    return result;
+  };
+
+  if (window.enable_copy_code_button) {
+    document
+      .querySelectorAll(".page__content pre.highlight > code")
+      .forEach(function (element, index, parentList) {
+        // Locate the 
 element
+        var container = element.parentElement;
+        // Sanity check - don't add an extra button if there's already one
+        if (container.firstElementChild.tagName.toLowerCase() !== "code") {
+          return;
+        }
+        var copyButton = document.createElement("button");
+        copyButton.title = "Copy to clipboard";
+        copyButton.className = "clipboard-copy-button";
+        copyButton.innerHTML = 'Copy code';
+        copyButton.addEventListener("click", copyButtonEventListener);
+        container.prepend(copyButton);
+      });
+  }
+});
diff --git a/assets/js/lunr/lunr-en.js b/assets/js/lunr/lunr-en.js
new file mode 100644
index 0000000..725aeb6
--- /dev/null
+++ b/assets/js/lunr/lunr-en.js
@@ -0,0 +1,69 @@
+var idx = lunr(function () {
+  this.field('title')
+  this.field('excerpt')
+  this.field('categories')
+  this.field('tags')
+  this.ref('id')
+
+  this.pipeline.remove(lunr.trimmer)
+
+  for (var item in store) {
+    this.add({
+      title: store[item].title,
+      excerpt: store[item].excerpt,
+      categories: store[item].categories,
+      tags: store[item].tags,
+      id: item
+    })
+  }
+});
+
+$(document).ready(function() {
+  $('input#search').on('keyup', function () {
+    var resultdiv = $('#results');
+    var query = $(this).val().toLowerCase();
+    var result =
+      idx.query(function (q) {
+        query.split(lunr.tokenizer.separator).forEach(function (term) {
+          q.term(term, { boost: 100 })
+          if(query.lastIndexOf(" ") != query.length-1){
+            q.term(term, {  usePipeline: false, wildcard: lunr.Query.wildcard.TRAILING, boost: 10 })
+          }
+          if (term != ""){
+            q.term(term, {  usePipeline: false, editDistance: 1, boost: 1 })
+          }
+        })
+      });
+    resultdiv.empty();
+    resultdiv.prepend('

'+result.length+' 条记录匹配

'); + for (var item in result) { + var ref = result[item].ref; + if(store[ref].teaser){ + var searchitem = + '
'+ + '
'+ + '

'+ + ''+store[ref].title+''+ + '

'+ + '
'+ + ''+ + '
'+ + '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ + '
'+ + '
'; + } + else{ + var searchitem = + '
'+ + '
'+ + '

'+ + ''+store[ref].title+''+ + '

'+ + '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ + '
'+ + '
'; + } + resultdiv.append(searchitem); + } + }); +}); diff --git a/assets/js/lunr/lunr-gr.js b/assets/js/lunr/lunr-gr.js new file mode 100644 index 0000000..ec1b097 --- /dev/null +++ b/assets/js/lunr/lunr-gr.js @@ -0,0 +1,522 @@ +step1list = new Array(); +step1list["ΦΑΓΙΑ"] = "ΦΑ"; +step1list["ΦΑΓΙΟΥ"] = "ΦΑ"; +step1list["ΦΑΓΙΩΝ"] = "ΦΑ"; +step1list["ΣΚΑΓΙΑ"] = "ΣΚΑ"; +step1list["ΣΚΑΓΙΟΥ"] = "ΣΚΑ"; +step1list["ΣΚΑΓΙΩΝ"] = "ΣΚΑ"; +step1list["ΟΛΟΓΙΟΥ"] = "ΟΛΟ"; +step1list["ΟΛΟΓΙΑ"] = "ΟΛΟ"; +step1list["ΟΛΟΓΙΩΝ"] = "ΟΛΟ"; +step1list["ΣΟΓΙΟΥ"] = "ΣΟ"; +step1list["ΣΟΓΙΑ"] = "ΣΟ"; +step1list["ΣΟΓΙΩΝ"] = "ΣΟ"; +step1list["ΤΑΤΟΓΙΑ"] = "ΤΑΤΟ"; +step1list["ΤΑΤΟΓΙΟΥ"] = "ΤΑΤΟ"; +step1list["ΤΑΤΟΓΙΩΝ"] = "ΤΑΤΟ"; +step1list["ΚΡΕΑΣ"] = "ΚΡΕ"; +step1list["ΚΡΕΑΤΟΣ"] = "ΚΡΕ"; +step1list["ΚΡΕΑΤΑ"] = "ΚΡΕ"; +step1list["ΚΡΕΑΤΩΝ"] = "ΚΡΕ"; +step1list["ΠΕΡΑΣ"] = "ΠΕΡ"; +step1list["ΠΕΡΑΤΟΣ"] = "ΠΕΡ"; +step1list["ΠΕΡΑΤΑ"] = "ΠΕΡ"; +step1list["ΠΕΡΑΤΩΝ"] = "ΠΕΡ"; +step1list["ΤΕΡΑΣ"] = "ΤΕΡ"; +step1list["ΤΕΡΑΤΟΣ"] = "ΤΕΡ"; +step1list["ΤΕΡΑΤΑ"] = "ΤΕΡ"; +step1list["ΤΕΡΑΤΩΝ"] = "ΤΕΡ"; +step1list["ΦΩΣ"] = "ΦΩ"; +step1list["ΦΩΤΟΣ"] = "ΦΩ"; +step1list["ΦΩΤΑ"] = "ΦΩ"; +step1list["ΦΩΤΩΝ"] = "ΦΩ"; +step1list["ΚΑΘΕΣΤΩΣ"] = "ΚΑΘΕΣΤ"; +step1list["ΚΑΘΕΣΤΩΤΟΣ"] = "ΚΑΘΕΣΤ"; +step1list["ΚΑΘΕΣΤΩΤΑ"] = "ΚΑΘΕΣΤ"; +step1list["ΚΑΘΕΣΤΩΤΩΝ"] = "ΚΑΘΕΣΤ"; +step1list["ΓΕΓΟΝΟΣ"] = "ΓΕΓΟΝ"; +step1list["ΓΕΓΟΝΟΤΟΣ"] = "ΓΕΓΟΝ"; +step1list["ΓΕΓΟΝΟΤΑ"] = "ΓΕΓΟΝ"; +step1list["ΓΕΓΟΝΟΤΩΝ"] = "ΓΕΓΟΝ"; + +v = "[ΑΕΗΙΟΥΩ]"; +v2 = "[ΑΕΗΙΟΩ]" + +function stemWord(w) { + var stem; + var suffix; + var firstch; + var origword = w; + test1 = new Boolean(true); + + if(w.length < 4) { + return w; + } + + var re; + var re2; + var re3; + var re4; + + re = /(.*)(ΦΑΓΙΑ|ΦΑΓΙΟΥ|ΦΑΓΙΩΝ|ΣΚΑΓΙΑ|ΣΚΑΓΙΟΥ|ΣΚΑΓΙΩΝ|ΟΛΟΓΙΟΥ|ΟΛΟΓΙΑ|ΟΛΟΓΙΩΝ|ΣΟΓΙΟΥ|ΣΟΓΙΑ|ΣΟΓΙΩΝ|ΤΑΤΟΓΙΑ|ΤΑΤΟΓΙΟΥ|ΤΑΤΟΓΙΩΝ|ΚΡΕΑΣ|ΚΡΕΑΤΟΣ|ΚΡΕΑΤΑ|ΚΡΕΑΤΩΝ|ΠΕΡΑΣ|ΠΕΡΑΤΟΣ|ΠΕΡΑΤΑ|ΠΕΡΑΤΩΝ|ΤΕΡΑΣ|ΤΕΡΑΤΟΣ|ΤΕΡΑΤΑ|ΤΕΡΑΤΩΝ|ΦΩΣ|ΦΩΤΟΣ|ΦΩΤΑ|ΦΩΤΩΝ|ΚΑΘΕΣΤΩΣ|ΚΑΘΕΣΤΩΤΟΣ|ΚΑΘΕΣΤΩΤΑ|ΚΑΘΕΣΤΩΤΩΝ|ΓΕΓΟΝΟΣ|ΓΕΓΟΝΟΤΟΣ|ΓΕΓΟΝΟΤΑ|ΓΕΓΟΝΟΤΩΝ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + w = stem + step1list[suffix]; + test1 = false; + } + + re = /^(.+?)(ΑΔΕΣ|ΑΔΩΝ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + + reg1 = /(ΟΚ|ΜΑΜ|ΜΑΝ|ΜΠΑΜΠ|ΠΑΤΕΡ|ΓΙΑΓΙ|ΝΤΑΝΤ|ΚΥΡ|ΘΕΙ|ΠΕΘΕΡ)$/; + + if(!(reg1.test(w))) { + w = w + "ΑΔ"; + } + } + + re2 = /^(.+?)(ΕΔΕΣ|ΕΔΩΝ)$/; + + if(re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + w = stem; + + exept2 = /(ΟΠ|ΙΠ|ΕΜΠ|ΥΠ|ΓΗΠ|ΔΑΠ|ΚΡΑΣΠ|ΜΙΛ)$/; + + if(exept2.test(w)) { + w = w + "ΕΔ"; + } + } + + re3 = /^(.+?)(ΟΥΔΕΣ|ΟΥΔΩΝ)$/; + + if(re3.test(w)) { + var fp = re3.exec(w); + stem = fp[1]; + w = stem; + + exept3 = /(ΑΡΚ|ΚΑΛΙΑΚ|ΠΕΤΑΛ|ΛΙΧ|ΠΛΕΞ|ΣΚ|Σ|ΦΛ|ΦΡ|ΒΕΛ|ΛΟΥΛ|ΧΝ|ΣΠ|ΤΡΑΓ|ΦΕ)$/; + + if(exept3.test(w)) { + w = w + "ΟΥΔ"; + } + } + + re4 = /^(.+?)(ΕΩΣ|ΕΩΝ)$/; + + if(re4.test(w)) { + var fp = re4.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept4 = /^(Θ|Δ|ΕΛ|ΓΑΛ|Ν|Π|ΙΔ|ΠΑΡ)$/; + + if(exept4.test(w)) { + w = w + "Ε"; + } + } + + re = /^(.+?)(ΙΑ|ΙΟΥ|ΙΩΝ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + re2 = new RegExp(v + "$"); + test1 = false; + + if(re2.test(w)) { + w = stem + "Ι"; + } + } + + re = /^(.+?)(ΙΚΑ|ΙΚΟ|ΙΚΟΥ|ΙΚΩΝ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + re2 = new RegExp(v + "$"); + exept5 = /^(ΑΛ|ΑΔ|ΕΝΔ|ΑΜΑΝ|ΑΜΜΟΧΑΛ|ΗΘ|ΑΝΗΘ|ΑΝΤΙΔ|ΦΥΣ|ΒΡΩΜ|ΓΕΡ|ΕΞΩΔ|ΚΑΛΠ|ΚΑΛΛΙΝ|ΚΑΤΑΔ|ΜΟΥΛ|ΜΠΑΝ|ΜΠΑΓΙΑΤ|ΜΠΟΛ|ΜΠΟΣ|ΝΙΤ|ΞΙΚ|ΣΥΝΟΜΗΛ|ΠΕΤΣ|ΠΙΤΣ|ΠΙΚΑΝΤ|ΠΛΙΑΤΣ|ΠΟΣΤΕΛΝ|ΠΡΩΤΟΔ|ΣΕΡΤ|ΣΥΝΑΔ|ΤΣΑΜ|ΥΠΟΔ|ΦΙΛΟΝ|ΦΥΛΟΔ|ΧΑΣ)$/; + + if((exept5.test(w)) || (re2.test(w))) { + w = w + "ΙΚ"; + } + } + + re = /^(.+?)(ΑΜΕ)$/; + re2 = /^(.+?)(ΑΓΑΜΕ|ΗΣΑΜΕ|ΟΥΣΑΜΕ|ΗΚΑΜΕ|ΗΘΗΚΑΜΕ)$/; + if(w == "ΑΓΑΜΕ") { + w = "ΑΓΑΜ"; + } + + if(re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + } + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept6 = /^(ΑΝΑΠ|ΑΠΟΘ|ΑΠΟΚ|ΑΠΟΣΤ|ΒΟΥΒ|ΞΕΘ|ΟΥΛ|ΠΕΘ|ΠΙΚΡ|ΠΟΤ|ΣΙΧ|Χ)$/; + + if(exept6.test(w)) { + w = w + "ΑΜ"; + } + } + + re2 = /^(.+?)(ΑΝΕ)$/; + re3 = /^(.+?)(ΑΓΑΝΕ|ΗΣΑΝΕ|ΟΥΣΑΝΕ|ΙΟΝΤΑΝΕ|ΙΟΤΑΝΕ|ΙΟΥΝΤΑΝΕ|ΟΝΤΑΝΕ|ΟΤΑΝΕ|ΟΥΝΤΑΝΕ|ΗΚΑΝΕ|ΗΘΗΚΑΝΕ)$/; + + if(re3.test(w)) { + var fp = re3.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + re3 = /^(ΤΡ|ΤΣ)$/; + + if(re3.test(w)) { + w = w + "ΑΓΑΝ"; + } + } + + if(re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + re2 = new RegExp(v2 + "$"); + exept7 = /^(ΒΕΤΕΡ|ΒΟΥΛΚ|ΒΡΑΧΜ|Γ|ΔΡΑΔΟΥΜ|Θ|ΚΑΛΠΟΥΖ|ΚΑΣΤΕΛ|ΚΟΡΜΟΡ|ΛΑΟΠΛ|ΜΩΑΜΕΘ|Μ|ΜΟΥΣΟΥΛΜ|Ν|ΟΥΛ|Π|ΠΕΛΕΚ|ΠΛ|ΠΟΛΙΣ|ΠΟΡΤΟΛ|ΣΑΡΑΚΑΤΣ|ΣΟΥΛΤ|ΤΣΑΡΛΑΤ|ΟΡΦ|ΤΣΙΓΓ|ΤΣΟΠ|ΦΩΤΟΣΤΕΦ|Χ|ΨΥΧΟΠΛ|ΑΓ|ΟΡΦ|ΓΑΛ|ΓΕΡ|ΔΕΚ|ΔΙΠΛ|ΑΜΕΡΙΚΑΝ|ΟΥΡ|ΠΙΘ|ΠΟΥΡΙΤ|Σ|ΖΩΝΤ|ΙΚ|ΚΑΣΤ|ΚΟΠ|ΛΙΧ|ΛΟΥΘΗΡ|ΜΑΙΝΤ|ΜΕΛ|ΣΙΓ|ΣΠ|ΣΤΕΓ|ΤΡΑΓ|ΤΣΑΓ|Φ|ΕΡ|ΑΔΑΠ|ΑΘΙΓΓ|ΑΜΗΧ|ΑΝΙΚ|ΑΝΟΡΓ|ΑΠΗΓ|ΑΠΙΘ|ΑΤΣΙΓΓ|ΒΑΣ|ΒΑΣΚ|ΒΑΘΥΓΑΛ|ΒΙΟΜΗΧ|ΒΡΑΧΥΚ|ΔΙΑΤ|ΔΙΑΦ|ΕΝΟΡΓ|ΘΥΣ|ΚΑΠΝΟΒΙΟΜΗΧ|ΚΑΤΑΓΑΛ|ΚΛΙΒ|ΚΟΙΛΑΡΦ|ΛΙΒ|ΜΕΓΛΟΒΙΟΜΗΧ|ΜΙΚΡΟΒΙΟΜΗΧ|ΝΤΑΒ|ΞΗΡΟΚΛΙΒ|ΟΛΙΓΟΔΑΜ|ΟΛΟΓΑΛ|ΠΕΝΤΑΡΦ|ΠΕΡΗΦ|ΠΕΡΙΤΡ|ΠΛΑΤ|ΠΟΛΥΔΑΠ|ΠΟΛΥΜΗΧ|ΣΤΕΦ|ΤΑΒ|ΤΕΤ|ΥΠΕΡΗΦ|ΥΠΟΚΟΠ|ΧΑΜΗΛΟΔΑΠ|ΨΗΛΟΤΑΒ)$/; + + if((re2.test(w)) || (exept7.test(w))) { + w = w + "ΑΝ"; + } + } + + re3 = /^(.+?)(ΕΤΕ)$/; + re4 = /^(.+?)(ΗΣΕΤΕ)$/; + + if(re4.test(w)) { + var fp = re4.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + } + + if(re3.test(w)) { + var fp = re3.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + re3 = new RegExp(v2 + "$"); + exept8 = /(ΟΔ|ΑΙΡ|ΦΟΡ|ΤΑΘ|ΔΙΑΘ|ΣΧ|ΕΝΔ|ΕΥΡ|ΤΙΘ|ΥΠΕΡΘ|ΡΑΘ|ΕΝΘ|ΡΟΘ|ΣΘ|ΠΥΡ|ΑΙΝ|ΣΥΝΔ|ΣΥΝ|ΣΥΝΘ|ΧΩΡ|ΠΟΝ|ΒΡ|ΚΑΘ|ΕΥΘ|ΕΚΘ|ΝΕΤ|ΡΟΝ|ΑΡΚ|ΒΑΡ|ΒΟΛ|ΩΦΕΛ)$/; + exept9 = /^(ΑΒΑΡ|ΒΕΝ|ΕΝΑΡ|ΑΒΡ|ΑΔ|ΑΘ|ΑΝ|ΑΠΛ|ΒΑΡΟΝ|ΝΤΡ|ΣΚ|ΚΟΠ|ΜΠΟΡ|ΝΙΦ|ΠΑΓ|ΠΑΡΑΚΑΛ|ΣΕΡΠ|ΣΚΕΛ|ΣΥΡΦ|ΤΟΚ|Υ|Δ|ΕΜ|ΘΑΡΡ|Θ)$/; + + if((re3.test(w)) || (exept8.test(w)) || (exept9.test(w))) { + w = w + "ΕΤ"; + } + } + + re = /^(.+?)(ΟΝΤΑΣ|ΩΝΤΑΣ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept10 = /^(ΑΡΧ)$/; + exept11 = /(ΚΡΕ)$/; + if(exept10.test(w)) { + w = w + "ΟΝΤ"; + } + if(exept11.test(w)) { + w = w + "ΩΝΤ"; + } + } + + re = /^(.+?)(ΟΜΑΣΤΕ|ΙΟΜΑΣΤΕ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept11 = /^(ΟΝ)$/; + + if(exept11.test(w)) { + w = w + "ΟΜΑΣΤ"; + } + } + + re = /^(.+?)(ΕΣΤΕ)$/; + re2 = /^(.+?)(ΙΕΣΤΕ)$/; + + if(re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + re2 = /^(Π|ΑΠ|ΣΥΜΠ|ΑΣΥΜΠ|ΑΚΑΤΑΠ|ΑΜΕΤΑΜΦ)$/; + + if(re2.test(w)) { + w = w + "ΙΕΣΤ"; + } + } + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept12 = /^(ΑΛ|ΑΡ|ΕΚΤΕΛ|Ζ|Μ|Ξ|ΠΑΡΑΚΑΛ|ΑΡ|ΠΡΟ|ΝΙΣ)$/; + + if(exept12.test(w)) { + w = w + "ΕΣΤ"; + } + } + + re = /^(.+?)(ΗΚΑ|ΗΚΕΣ|ΗΚΕ)$/; + re2 = /^(.+?)(ΗΘΗΚΑ|ΗΘΗΚΕΣ|ΗΘΗΚΕ)$/; + + if(re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + } + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept13 = /(ΣΚΩΛ|ΣΚΟΥΛ|ΝΑΡΘ|ΣΦ|ΟΘ|ΠΙΘ)$/; + exept14 = /^(ΔΙΑΘ|Θ|ΠΑΡΑΚΑΤΑΘ|ΠΡΟΣΘ|ΣΥΝΘ|)$/; + + if((exept13.test(w)) || (exept14.test(w))) { + w = w + "ΗΚ"; + } + } + + re = /^(.+?)(ΟΥΣΑ|ΟΥΣΕΣ|ΟΥΣΕ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept15 = /^(ΦΑΡΜΑΚ|ΧΑΔ|ΑΓΚ|ΑΝΑΡΡ|ΒΡΟΜ|ΕΚΛΙΠ|ΛΑΜΠΙΔ|ΛΕΧ|Μ|ΠΑΤ|Ρ|Λ|ΜΕΔ|ΜΕΣΑΖ|ΥΠΟΤΕΙΝ|ΑΜ|ΑΙΘ|ΑΝΗΚ|ΔΕΣΠΟΖ|ΕΝΔΙΑΦΕΡ|ΔΕ|ΔΕΥΤΕΡΕΥ|ΚΑΘΑΡΕΥ|ΠΛΕ|ΤΣΑ)$/; + exept16 = /(ΠΟΔΑΡ|ΒΛΕΠ|ΠΑΝΤΑΧ|ΦΡΥΔ|ΜΑΝΤΙΛ|ΜΑΛΛ|ΚΥΜΑΤ|ΛΑΧ|ΛΗΓ|ΦΑΓ|ΟΜ|ΠΡΩΤ)$/; + + if((exept15.test(w)) || (exept16.test(w))) { + w = w + "ΟΥΣ"; + } + } + + re = /^(.+?)(ΑΓΑ|ΑΓΕΣ|ΑΓΕ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept17 = /^(ΨΟΦ|ΝΑΥΛΟΧ)$/; + exept20 = /(ΚΟΛΛ)$/; + exept18 = /^(ΑΒΑΣΤ|ΠΟΛΥΦ|ΑΔΗΦ|ΠΑΜΦ|Ρ|ΑΣΠ|ΑΦ|ΑΜΑΛ|ΑΜΑΛΛΙ|ΑΝΥΣΤ|ΑΠΕΡ|ΑΣΠΑΡ|ΑΧΑΡ|ΔΕΡΒΕΝ|ΔΡΟΣΟΠ|ΞΕΦ|ΝΕΟΠ|ΝΟΜΟΤ|ΟΛΟΠ|ΟΜΟΤ|ΠΡΟΣΤ|ΠΡΟΣΩΠΟΠ|ΣΥΜΠ|ΣΥΝΤ|Τ|ΥΠΟΤ|ΧΑΡ|ΑΕΙΠ|ΑΙΜΟΣΤ|ΑΝΥΠ|ΑΠΟΤ|ΑΡΤΙΠ|ΔΙΑΤ|ΕΝ|ΕΠΙΤ|ΚΡΟΚΑΛΟΠ|ΣΙΔΗΡΟΠ|Λ|ΝΑΥ|ΟΥΛΑΜ|ΟΥΡ|Π|ΤΡ|Μ)$/; + exept19 = /(ΟΦ|ΠΕΛ|ΧΟΡΤ|ΛΛ|ΣΦ|ΡΠ|ΦΡ|ΠΡ|ΛΟΧ|ΣΜΗΝ)$/; + + if(((exept18.test(w)) || (exept19.test(w))) && !((exept17.test(w)) || (exept20.test(w)))) { + w = w + "ΑΓ"; + } + } + + re = /^(.+?)(ΗΣΕ|ΗΣΟΥ|ΗΣΑ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept21 = /^(Ν|ΧΕΡΣΟΝ|ΔΩΔΕΚΑΝ|ΕΡΗΜΟΝ|ΜΕΓΑΛΟΝ|ΕΠΤΑΝ)$/; + + if(exept21.test(w)) { + w = w + "ΗΣ"; + } + } + + re = /^(.+?)(ΗΣΤΕ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept22 = /^(ΑΣΒ|ΣΒ|ΑΧΡ|ΧΡ|ΑΠΛ|ΑΕΙΜΝ|ΔΥΣΧΡ|ΕΥΧΡ|ΚΟΙΝΟΧΡ|ΠΑΛΙΜΨ)$/; + + if(exept22.test(w)) { + w = w + "ΗΣΤ"; + } + } + + re = /^(.+?)(ΟΥΝΕ|ΗΣΟΥΝΕ|ΗΘΟΥΝΕ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept23 = /^(Ν|Ρ|ΣΠΙ|ΣΤΡΑΒΟΜΟΥΤΣ|ΚΑΚΟΜΟΥΤΣ|ΕΞΩΝ)$/; + + if(exept23.test(w)) { + w = w + "ΟΥΝ"; + } + } + + re = /^(.+?)(ΟΥΜΕ|ΗΣΟΥΜΕ|ΗΘΟΥΜΕ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + test1 = false; + + exept24 = /^(ΠΑΡΑΣΟΥΣ|Φ|Χ|ΩΡΙΟΠΛ|ΑΖ|ΑΛΛΟΣΟΥΣ|ΑΣΟΥΣ)$/; + + if(exept24.test(w)) { + w = w + "ΟΥΜ"; + } + } + + re = /^(.+?)(ΜΑΤΑ|ΜΑΤΩΝ|ΜΑΤΟΣ)$/; + re2 = /^(.+?)(Α|ΑΓΑΤΕ|ΑΓΑΝ|ΑΕΙ|ΑΜΑΙ|ΑΝ|ΑΣ|ΑΣΑΙ|ΑΤΑΙ|ΑΩ|Ε|ΕΙ|ΕΙΣ|ΕΙΤΕ|ΕΣΑΙ|ΕΣ|ΕΤΑΙ|Ι|ΙΕΜΑΙ|ΙΕΜΑΣΤΕ|ΙΕΤΑΙ|ΙΕΣΑΙ|ΙΕΣΑΣΤΕ|ΙΟΜΑΣΤΑΝ|ΙΟΜΟΥΝ|ΙΟΜΟΥΝΑ|ΙΟΝΤΑΝ|ΙΟΝΤΟΥΣΑΝ|ΙΟΣΑΣΤΑΝ|ΙΟΣΑΣΤΕ|ΙΟΣΟΥΝ|ΙΟΣΟΥΝΑ|ΙΟΤΑΝ|ΙΟΥΜΑ|ΙΟΥΜΑΣΤΕ|ΙΟΥΝΤΑΙ|ΙΟΥΝΤΑΝ|Η|ΗΔΕΣ|ΗΔΩΝ|ΗΘΕΙ|ΗΘΕΙΣ|ΗΘΕΙΤΕ|ΗΘΗΚΑΤΕ|ΗΘΗΚΑΝ|ΗΘΟΥΝ|ΗΘΩ|ΗΚΑΤΕ|ΗΚΑΝ|ΗΣ|ΗΣΑΝ|ΗΣΑΤΕ|ΗΣΕΙ|ΗΣΕΣ|ΗΣΟΥΝ|ΗΣΩ|Ο|ΟΙ|ΟΜΑΙ|ΟΜΑΣΤΑΝ|ΟΜΟΥΝ|ΟΜΟΥΝΑ|ΟΝΤΑΙ|ΟΝΤΑΝ|ΟΝΤΟΥΣΑΝ|ΟΣ|ΟΣΑΣΤΑΝ|ΟΣΑΣΤΕ|ΟΣΟΥΝ|ΟΣΟΥΝΑ|ΟΤΑΝ|ΟΥ|ΟΥΜΑΙ|ΟΥΜΑΣΤΕ|ΟΥΝ|ΟΥΝΤΑΙ|ΟΥΝΤΑΝ|ΟΥΣ|ΟΥΣΑΝ|ΟΥΣΑΤΕ|Υ|ΥΣ|Ω|ΩΝ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem + "ΜΑ"; + } + + if((re2.test(w)) && (test1)) { + var fp = re2.exec(w); + stem = fp[1]; + w = stem; + + } + + re = /^(.+?)(ΕΣΤΕΡ|ΕΣΤΑΤ|ΟΤΕΡ|ΟΤΑΤ|ΥΤΕΡ|ΥΤΑΤ|ΩΤΕΡ|ΩΤΑΤ)$/; + + if(re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem; + } + + return w; +}; + +var greekStemmer = function (token) { + return token.update(function (word) { + return stemWord(word); + }) +} + +var idx = lunr(function () { + this.field('title') + this.field('excerpt') + this.field('categories') + this.field('tags') + this.ref('id') + + this.pipeline.remove(lunr.trimmer) + this.pipeline.add(greekStemmer) + this.pipeline.remove(lunr.stemmer) + + for (var item in store) { + this.add({ + title: store[item].title, + excerpt: store[item].excerpt, + categories: store[item].categories, + tags: store[item].tags, + id: item + }) + } +}); + +$(document).ready(function() { + $('input#search').on('keyup', function () { + var resultdiv = $('#results'); + var query = $(this).val().toLowerCase(); + var result = + idx.query(function (q) { + query.split(lunr.tokenizer.separator).forEach(function (term) { + q.term(term, { boost: 100 }) + if(query.lastIndexOf(" ") != query.length-1){ + q.term(term, { usePipeline: false, wildcard: lunr.Query.wildcard.TRAILING, boost: 10 }) + } + if (term != ""){ + q.term(term, { usePipeline: false, editDistance: 1, boost: 1 }) + } + }) + }); + resultdiv.empty(); + resultdiv.prepend('

'+result.length+' 条记录匹配

'); + for (var item in result) { + var ref = result[item].ref; + if(store[ref].teaser){ + var searchitem = + '
'+ + '
'+ + '

'+ + ''+store[ref].title+''+ + '

'+ + '
'+ + ''+ + '
'+ + '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ + '
'+ + '
'; + } + else{ + var searchitem = + '
'+ + '
'+ + '

'+ + ''+store[ref].title+''+ + '

'+ + '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ + '
'+ + '
'; + } + resultdiv.append(searchitem); + } + }); +}); diff --git a/assets/js/lunr/lunr-store.js b/assets/js/lunr/lunr-store.js new file mode 100644 index 0000000..b28b757 --- /dev/null +++ b/assets/js/lunr/lunr-store.js @@ -0,0 +1,1489 @@ +var store = [{ + "title": "开发版更新日志", + "excerpt":" Changelogs are written in Chinese. ","categories": [], + "tags": [], + "url": "/changelog/dev.html", + "teaser": null + },{ + "title": "稳定版更新日志", + "excerpt":" Changelogs are written in Chinese. ","categories": [], + "tags": [], + "url": "/changelog/stable.html", + "teaser": null + },{ + "title": "3.10.0.315", + "excerpt":"详细版本介绍 (Bilibili) GP-4932: 在主页右键点击账户按钮时弹出快速切换账户菜单 (by zimzaza4) GP-5011: 在 JFXCustomColorPickerDialog 中使用 HEX 作为默认 Tab (by Glavo) GP-5019: 使用子标题注解“提前预览 HMCL 版本”选项 (by neveler) GP-5019: 使用子标题显示“重启后生效”提示 (by neveler) GP-4927: 在 macOS 平台上导出启动脚本时支持导出 .command 文件 (by WhatDamon) GP-4872: 添加快速进入世界功能 (by mineDiamond) GP-5008: 优化反馈页面 (by Glavo) GP-5035: 在所有平台上将 : 视为文件名中的非法字符 (by 辞庐) GP-5016: 在刷新 ModListPage...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.10/3.10.0.315.html", + "teaser": null + },{ + "title": "3.10.0.317", + "excerpt":"详细版本介绍 (Bilibili) GP-4289: 在添加游戏目录页面选择目录时自动填写名称 (by Dime,辞庐,Glavo) GP-4794: 优化微软登录页面 (by 辞庐,3gf8jv4dv) GP-4882: 取消 FXUtils#onClicked 的连点限制 (by 辞庐) GP-5043: 修复导出整合包界面以及 NBT 文件查看界面样式 (by Calboot) GP-5046: 禁用游戏日志窗口的平滑滚动效果 (by Glavo) GP-5052: 优化列表的平滑滚动效果 (by Glavo) GP-5054: 优化账户选择弹窗在列表为空时的表现 (by mineDiamond) GP-5056: 优化列表性能 (by Glavo) GP-5057: 更新“没有游戏实例”标签的颜色 (by Glavo) GP-5060: 优化非主窗口中对话框的效果 (by 辞庐) GP-5062: 更新 NBT 标签图标...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.10/3.10.0.317.html", + "teaser": null + },{ + "title": "3.10.0.318", + "excerpt":"详细版本介绍 (Bilibili) GP-4823: 优化世界管理界面和世界信息界面 (by mineDiamond, 3gf8jv4dv) GP-4832: 支持更新部分模组 (by ZZZank) GP-4929: 将陶瓦联机更新至 0.4.1 (by Burning_TNT) GP-5026: 限制访问 Modrinth/CurseForge 时的并发数 (by Burning_TNT) GP-5133: 修复第三方构建下禁用账户刷新的 tooltip 展示不支持的超链接标签的问题 (by Wulian233, 3gf8jv4dv) GP-5137: 允许重命名实例时使用原名 (by mineDiamond) GP-5143, GP-5168: 优化对获取账号信息时发生 SSL 异常的处理 (by Xirren, 3gf8jv4dv) GP-5146: 使用 kala-compress 读取模组元数据 (by Glavo) GP-5150: 调整平滑滚动的截止速度 (by...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.10/3.10.0.318.html", + "teaser": null + },{ + "title": "3.10.0.319", + "excerpt":"详细版本介绍 (Bilibili) GP-5208: 惰性初始化 JFXRippler 属性 (by Glavo) GP-5211: 优化下载页面图标缓存功能 (by Glavo) GP-5221: 更新 ToolbarListPageSkin 以使用 JFXListView 展示节点 (by Glavo) GP-5223: 重构 JavaManagementPage 以使用 ListCell 展示元素 (by Glavo) GP-5224: 重构 WorldListPage 以使用 ListCell 展示元素 (by Glavo) 错误修复: GP-5203: 修复实例列表不显示实例名的问题 (by Xirren) GP-5220: 修复 CurseForge 源无法搜索到内容的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.10/3.10.0.319.html", + "teaser": null + },{ + "title": "3.11.0.321", + "excerpt":"详细版本介绍 (Bilibili) GP-4792: 优化 Fabric API / Quilt API 安装提示 (by 辞庐, 3gf8jv4dv) GP-5029: 优化检查模组更新功能 (by Burning_TNT) GP-5090: 支持自动安装 Legacy Fabric (by 辞庐) GP-5172: 支持通过拖动标题栏退出最大化 (by neveler) GP-5196: 使用 Forge/Quilt 加载器时模组管理页面应当扫描子文件夹 (by Wulian233) GP-5198: 将世界管理界面“生成启动脚本”按钮折叠到二级菜单 (by Glavo) GP-5239: 下载页面图标尚未加载时应当将图像更新为空白 (by Glavo) GP-5250: Modrinth 默认不获取更新日志 (by Calboot) GP-5251: 修复自动安装界面卡片上按钮无法点击的问题 (by 神奇的赵二...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.11/3.11.0.321.html", + "teaser": null + },{ + "title": "3.11.0.322", + "excerpt":"详细版本介绍 (Bilibili) GP-4733: 导出日志时允许重名文件 (by Glavo) GP-5245: 修复主页公告阴影被裁切的问题 (by 辞庐) GP-5270: 在陶瓦联机页面添加切换账号菜单 (by Glavo) GP-5279: 更新下载页面条目样式 (by Glavo) GP-5283, GP-5319: 优化深色模式支持 (by Glavo) GP-5292: 更新文本输入框的右键菜单样式 (by 辞庐) GP-5296: 扫描模组子目录时忽略 .connector 文件夹 (by 辞庐) GP-5304: 取消游戏下载页面中高版本游戏对 Windows 7 的不兼容提示 (by 辞庐) 错误修复: GP-5284: 修复部分列表页面出现横向滚动条的问题 (by Glavo) GP-5299: 修复添加认证服务器对话框非 CJK 语言下宽度异常的问题 (by...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.11/3.11.0.322.html", + "teaser": null + },{ + "title": "3.11.0.323", + "excerpt":"详细版本介绍 (Bilibili) GP-5390: 将 TwelveMonkeys 更新至 3.13.0 (by Glavo) GP-5391: 将 XZ for Java 更新至 1.11 (by Glavo) GP-5392: 将 Gradle Shadow 插件更新至 9.3.1 (by Glavo) GP-5385: 优化 ComponentList (by Glavo) GP-4975: 调整渲染器名称 (by Chen Meng) GP-5337: 使用 LineSelectButton 代替 JFXComboBox (by Glavo) GP-5215: 优化世界管理与世界信息页面 (by mineDiamond, 3gf8jv4dv, Glavo) GP-5272:...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.11/3.11.0.323.html", + "teaser": null + },{ + "title": "3.11.0.325", + "excerpt":"详细版本介绍 (Bilibili) GP-5395, GP-5408, GP-5416, GP-5446: 统一列表卡片样式 (by Glavo) GP-5422: 优化日志窗口无日志行的背景色 (by 辞庐) GP-5405: 统一加载指示器大小 (by 辞庐) GP-5406: 统一实例管理页面子页面刷新时的样式 (by 辞庐) GP-5426: 导出运行栈时附加 -e 和 -l 参数 (by 辞庐) GP-5456: 优化工具栏按钮图标 (by Glavo) GP-5465, GP-5474: 优化下载页面条目中标签的展示方式 (by Glavo) GP-5481: 优化设置页面检查更新设置项的样式 (by Glavo) GP-5467: 自动展开 NBT 查看器中部分子标签 (by Calboot) GP-5417: 更新文言文...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.11/3.11.0.325.html", + "teaser": null + },{ + "title": "3.11.0.326", + "excerpt":"详细版本介绍 (Bilibili) GP-5504: 更新陶瓦联机至 0.4.2 (by Glavo) GP-5462: 未安装实例时点击主页“开始游戏”按钮不选择不支持当前平台的版本 (by 辞庐, Glavo) 错误修复: GP-5369: 修复在 ZIP 文件中遇到重名目录条目时读取失败的问题 (by NoClassDefFoundError) GP-5507: 修复陶瓦联机页面“导出联机日志”按钮内边距异常的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.11/3.11.0.326.html", + "teaser": null + },{ + "title": "3.12.0.327", + "excerpt":"详细版本介绍 (Bilibili) GP-5330, GP-5531, GP-5538: 更新微软账户登录流程 (by 辞庐, Glavo) GP-5368: 阻止在颜色选择器中输入非法颜色信息 (by Damon Lu) GP-5527: 增加弹窗图标内容间距 (by 辞庐) GP-5524: 将指向 MCEdit 的链接替换为 Minecraft Wiki 的教程页面 (by 3gf8jv4dv) GP-5394: 使 Java 下载页面可以同时下载多个 Java (by NoClassDefFoundError) 错误修复: GP-5508: 修复部分请求头中 Accept-Language 字段包含 Java 版本的问题 (by Glavo) GP-5520: 修复下载游戏版本列表点击左侧图标无法触发水波纹效果及光标没有变成手型的问题 (by 辞庐) GP-5522: 修复安装卡片部分区域点击无法触发水波纹效果的问题 (by...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.12/3.12.0.327.html", + "teaser": null + },{ + "title": "3.12.0.328", + "excerpt":"详细版本介绍 (Bilibili) GP-5242: 支持在实例列表搜索实例 (by 辞庐) GP-5514: 为“渲染器”添加描述 (by Damon Lu) GP-5521: 优化下载页面条目水波纹样式 (by 辞庐) GP-5539: 解析 Yggdrasil 服务器地址时遵循服务器重定向 (by Glavo) GP-5552: 支持新版本世界指定资源包位置 (by mineDiamond) GP-5583: 支持在 FreeBSD x86-64、Linux Arm64、Linux RISC-V64 平台上启动 Minecraft 26.1-snapshot-8 或更高版本 (by Glavo) GP-5585: 修复下载源失效时刷新版本列表不会回退到备用下载源的问题 (by Glavo) GP-5586: 优化无法补全 JavaFX 时的报错信息 (by Glavo) GP-5546, GP-5559, GP-5560,...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.12/3.12.0.328.html", + "teaser": null + },{ + "title": "3.12.0.330", + "excerpt":"详细版本介绍 (Bilibili) GP-5030: 重新启用 MCIM 加速 (by Glavo) GP-5359: 修复语言为文言时下载游戏的选择模组加载器页面的版本号未本地化的问题 (by Wulian233) GP-5458, GP-5463: 下载界面简介不滚动 (by Calboot) GP-5554: 向图标添加圆角 (by Dime) GP-5603: 下载任务在重试前添加等待延迟 (by Glavo) GP-5610: 优化设备代码流登录流程 (by Glavo) GP-5622: 更新 Copyright 年份 (by 3gf8jv4dv) GP-5624: 更新对 Linux LoongArch64 平台的支持 (by Glavo) GP-5638: 切换实例隔离设置后自动刷新其他子页面 (by 辞庐) GP-5652: 在世界管理页面中不展示 zip 格式的世界...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.12/3.12.0.330.html", + "teaser": null + },{ + "title": "3.12.0.331", + "excerpt":"详细版本介绍 (Bilibili) GP-5731: 将 Gradle 更新至 9.4.0 (by 辞庐) GP-5717: 将 JetBrains Java Annotations 更新至 26.1.0 (by Glavo) GP-5675: 支持解析 Minecraft 26.1-snapshot-6 新版本存档数据 (by mineDiamond) GP-5690: 优化 FileSelector 按钮样式 (by 辞庐) GP-5697: 将 BAT 脚本命令长度限制增加至 32767 (by 辞庐) GP-5698: 优化安装实例时自动补全模组加载器名称 (by 辞庐) GP-5707: 优化 LineSelectButton 弹出菜单配色 (by 辞庐) GP-5716: 向滚动条添加圆角...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.12/3.12.0.331.html", + "teaser": null + },{ + "title": "3.12.0.332", + "excerpt":"详细版本介绍 (Bilibili) GP-5773: 更新模组数据 (by Glavo) GP-4706: 添加”关闭启动时的更新弹窗”选项 (by An5w1r, Glavo) GP-5620: 更新关于页面的许可证信息 (by 3gf8jv4dv) GP-5769: 当背景自定义路径是文件夹时随机在文件夹中选取图片作为背景 (by 辞庐) GP-5664: 优化删除垃圾桶图标 (by 辞庐) GP-5663: 调整导出游戏运行栈加载指示器大小 (by 辞庐) 错误修复: GP-5728: 修复“从互联网下载整合包”选项对话框可能会意外被关闭的问题 (by Glavo) GP-5765: 修复 26.1-pre-1 版本号无法归一化的问题 (by mineDiamond) GP-5772: 修复显示器 125% 缩放时弹出菜单内容模糊的问题 (by 辞庐) GP-5776: 修复颜色选择器中“自定义颜色”对话框初始值不会与当前颜色同步的问题 (by Damon Lu) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.12/3.12.0.332.html", + "teaser": null + },{ + "title": "3.2.114", + "excerpt":" 修复导入整合包时的乱码问题 更新 authlib-injector 从 Cursemeta 上下载 Curse 上被删除的 Mod 文件 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.114.html", + "teaser": null + },{ + "title": "3.2.115", + "excerpt":" 修复安装游戏后不显示游戏的问题 修复下载资源文件时潜在的崩溃问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.115.html", + "teaser": null + },{ + "title": "3.2.116", + "excerpt":" 在缓存目录无效时自动更改设置 在安装游戏失败时删除不完全的游戏 自动检测整合包、游戏存档、数据包的编码以增强兼容性 在更新整合包时进行游戏文件的备份 添加打开存档文件夹的菜单 添加刷新模组列表的按钮 支持拖拽游戏存档压缩包到游戏界面以便安装游戏存档 修复皮肤图片文件损坏时导致的崩溃问题 修复配置文件格式不正确时导致的崩溃问题 修复 Curse 整合包更新失败的问题 修复自动更新弹出气泡的界面错乱问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.116.html", + "teaser": null + },{ + "title": "3.2.117", + "excerpt":" 提醒用户在修改版本独立选项时需要注意游戏文件的转移 修复 Java 10 上 UI 错位的问题 修复游戏认证服务器列表的渲染问题 修复启动 Curse 整合包时尝试下载被禁用的模组的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.117.html", + "teaser": null + },{ + "title": "3.2.119", + "excerpt":" 添加提示部分版本的 Forge 和 LiteLoader 不兼容的问题 在模组管理面板添加加载进度条 支持整合包拖拽到主页面打开安装向导 支持新版 MultiMC 整合包的导入 删除在版本管理页面中的删除游戏和重命名按钮 加载游戏存档过程更加流畅 在登录对话框中添加注册链接 修复标题栏中没有显示返回主页按钮的问题 修复保存设置时的潜在问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.119.html", + "teaser": null + },{ + "title": "3.2.120", + "excerpt":" 修复打开版本管理时的崩溃 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.120.html", + "teaser": null + },{ + "title": "3.2.121", + "excerpt":" 支持 Forge 1.13 的自动安装 安装游戏时更新资源文件 启动时下载缺失的 Minecraft 本体文件 支持自动检测整合包自带的 Java 运行时 更新 authlib-injector 下载库文件失败时提供更友好的提示 重构正版登录 修复启动按钮无法根据背景颜色更改字体颜色的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.121.html", + "teaser": null + },{ + "title": "3.2.123", + "excerpt":" 启动前检查是否是 Java 8~10 模组管理面板支持多选 下载库文件失败时提供更友好的提示 只从 BMCLAPI 获取 Forge 列表 添加 BMCLAPI 赞助信息 修复头像不显示头盔层的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.123.html", + "teaser": null + },{ + "title": "3.2.124", + "excerpt":" 修复无法正版登录的问题 修复 mods 不是文件夹时无法安装模组的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.124.html", + "teaser": null + },{ + "title": "3.2.126", + "excerpt":" 重构任务执行器 修复填写账号时崩溃的问题 修复添加账号面板中认证服务器列表显示不正确的问题 修复刷新版本列表时的卡顿问题 修复无法刷新 Forge 列表的问题 修复 Forge 1.13 安装问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.126.html", + "teaser": null + },{ + "title": "3.2.127", + "excerpt":" 禁止用户同时安装 Forge 1.13.2 和 OptiFine ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.127.html", + "teaser": null + },{ + "title": "3.2.129", + "excerpt":" 在未安装 Mod API 的情况下禁用模组管理面板 为自动安装中的 Forge、LiteLoader、OptiFine 添加更新按钮 忽略游戏存档名中的颜色转移符 隐藏游戏版本不匹配的游戏存档 允许数据包列表页面多选 修复无法下载安装 Forge 的问题 修复下载失败后无法删除游戏版本的问题 修复设置页面下方有大面积空白区域的问题 回滚 JFoenix 组件库以修复一些 UI 的细节问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.129.html", + "teaser": null + },{ + "title": "3.2.130", + "excerpt":" 添加对 Fabric 模组的管理支持 将游戏依赖的动态链接库解压到 .minecraft 中而不是系统临时文件夹 在遇到 SocketTimeoutException 时弹窗提示用户超时 在遇到 404 时提示用户找不到文件而不是 IOException 在 HMCL 本体不完整时提示用户而不是崩溃 在启动器更新时显示更新日志 禁止导出 1.13.2 游戏整合包 修复删除游戏版本时消息框重复显示的问题 修复删除模组时可能出现的 NullPointerException 修复尝试更新 OptiFine 时却没有可用版本时导致的崩溃 修复刷新数据包列表时崩溃的问题 修复不能导入 Fabric 官方网站提供的 MultiMC 整合包的问题 修复启动器皮肤预览异常的问题 修复 macOS 无法安装 1.13.2 Forge 的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.130.html", + "teaser": null + },{ + "title": "3.2.132", + "excerpt":" 添加 Fabric 自动安装 添加西班牙语 支持导出 MultiMC 整合包 修复无法下载 Curse 模组的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.132.html", + "teaser": null + },{ + "title": "3.2.133", + "excerpt":" 新安装的游戏支持修改游戏版本 支持在打开启动器后的主页面按回车键启动游戏 支持游戏列表内点击列表项进入游戏设置,右键列表项打开游戏管理菜单 修复 OptiFine 自动安装(需要重新安装 OptiFine 生效) 修复无法从本地安装 OptiFine 的问题 修复同时安装 Forge 和 OptiFine 自动安装失败的问题 不再强制使用 java.exe ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.133.html", + "teaser": null + },{ + "title": "3.2.134", + "excerpt":" 修复了某些情况下无法安装 1.12.2 及以下版本的 Forge 的问题 修复输入某些错误的 Java 路径时导致的崩溃 修复了浏览 Mod 列表时可能出现的崩溃问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.134.html", + "teaser": null + },{ + "title": "3.2.135", + "excerpt":" 添加 authlib-injectors.json,允许服主将添加账号页面更改为默认添加指定服务器的 Authlib Injector 账户 访问 https://www.huangyuhui.net/index.php/2019/09/09/109/ 以查看添加方法 检查安装游戏时输入的名称是否符合 Windows 系统需求 修复导出整合包导入时无法安装 1.13 Forge 和 OptiFine 的问题 修复部分情况下无法下载 Forge 安装包的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.135.html", + "teaser": null + },{ + "title": "3.2.136", + "excerpt":" 修复 tryCacheLibrary 可能导致崩溃的问题 修复无法安装 1.14.4 及 1.15 快照的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.136.html", + "teaser": null + },{ + "title": "3.2.137", + "excerpt":" 更新了英语和俄语翻译 修复了一些导致启动器崩溃的问题 修复了无法识别 Java 12 的问题 修复了无法下载 Curse 整合包模组的问题 修复了下载 Curse 整合包失败后删除了对应版本的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.137.html", + "teaser": null + },{ + "title": "3.2.138", + "excerpt":" 添加服务器自动更新整合包,允许服务器远程更新游戏客户端 允许直接从给定链接下载整合包并安装 日志窗口允许关闭自动滚动 更新了英语翻译 修复了部分情况下可能导致崩溃的问题 修复了无法获取使用 authlib-injectors.json 添加的服务器的服务器名称的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.138.html", + "teaser": null + },{ + "title": "3.2.139", + "excerpt":" 修复服务器整合包下载时可能丢失文件的问题 修复读取 authlib-injectors.json 时对链接格式要求过严的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.139.html", + "teaser": null + },{ + "title": "3.2.143", + "excerpt":" 修复关闭 JVM 检查时仍然会检查 java.exe 是否合法的问题 修复下载服务端整合包没有对链接转义而无法下载的问题 修复下载游戏时可能出现的 “HTTP 302” 错误 导出整合包时将剔除所有日志文件和 CustomSkinLoader 的缓存 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.143.html", + "teaser": null + },{ + "title": "3.2.144", + "excerpt":" 修复导入 HMCL 整合包时无法安装 Forge 的问题 修复无法下载 Curse 整合包部分 Mod(如潘马斯)的问题 修复下载 Curse 整合包 Mod 失败后会删除整合包的问题 修复无法启动使用 Vivecraft 安装器新安装的游戏的问题 修复启动 1.15 时不会停止等待的问题 修复 Windows 下导出启动脚本对双引号的错误转义 修复部分正版账号登录 1.7.10 会导致游戏崩溃的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.144.html", + "teaser": null + },{ + "title": "3.2.145", + "excerpt":" 修复无法取消下载的问题 添加 MCBBS 下载源 在资源索引文件不合法时尝试重新下载 修复切换游戏版本后启动失败的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.145.html", + "teaser": null + },{ + "title": "3.2.146", + "excerpt":" 改进部分错误提示 更新繁体中文语言文件 修复重复下载游戏依赖文件的问题 修复原版游戏用熔炉图标标识的问题 修复取消登录时导致启动器崩溃的问题 修复无法取消启动过程和安装过程的问题 修复无法正常更新 authlib-injector 的问题 修复在缺失资源索引文件时无法启动游戏的问题 现官方下载源下载 Forge 时依赖文件不再强制从 BMCLAPI 下载 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.146.html", + "teaser": null + },{ + "title": "3.2.147", + "excerpt":" 修复正版登录失败的问题 修复无法正常显示错误信息的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.147.html", + "teaser": null + },{ + "title": "3.2.148", + "excerpt":" 更新 Fabric 的 BMCLAPI 和 MCBBS 下载源支持 更新繁体中文语言文件 当 Curse 整合包部分 Mod 因服务器上文件不存在而下载失败时不删除游戏 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.148.html", + "teaser": null + },{ + "title": "3.2.149", + "excerpt":" 在主界面账户栏添加鼠标悬浮提示以查看完整游戏名 在主界面账户栏添加鼠标滚轮便捷切换游戏账户 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.149.html", + "teaser": null + },{ + "title": "3.2.150", + "excerpt":" 加快界面动画速度 改善游戏下载速度 添加清理缓存文件夹按钮 修改安装游戏向导的界面 在启动游戏、安装游戏等界面显示总下载速度 在资源索引文件为空时自动重新下载资源文件 在当前下载源下载失败后自动重试其他下载源 在删除 Mod、世界、数据包时弹出删除确认提示 在启动游戏、安装游戏等界面显示明确的安装步骤 在游戏崩溃后的第二次启动时自动检查资源和支持库文件是否完整 修复启动器崩溃时可能再次崩溃的问题 修复部分整合包无法修改启动时游戏窗口大小的问题 修复在 Curse 整合包安装部分成功时删除游戏的问题 修复从 MCBBS 下载源下载文件可能会下载到空文件的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.150.html", + "teaser": null + },{ + "title": "3.2.151", + "excerpt":" 修复 3.2.150 部分游戏启动失败的问题 修改 Mod、数据包页面的界面样式 修复终止游戏后启动器不会停止等待的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.2/3.2.151.html", + "teaser": null + },{ + "title": "3.3.152", + "excerpt":" 调整界面样式 修改默认下载源为 MCBBS 允许在启动游戏按钮上滑动鼠标滚轮切换游戏 显示资源和 Curse Mod 下载总进度 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.152.html", + "teaser": null + },{ + "title": "3.3.153", + "excerpt":" 调整界面样式 提升自动安装功能与其他启动器的兼容性 修复快速切换游戏时可能导致的一些问题 支持调整启动器窗口大小 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.153.html", + "teaser": null + },{ + "title": "3.3.154", + "excerpt":" 修复 3.3.153 导致的启动失败问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.154.html", + "teaser": null + },{ + "title": "3.3.155", + "excerpt":" 修复 3.3.154 导致的启动失败问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.155.html", + "teaser": null + },{ + "title": "3.3.156", + "excerpt":" 修复 3.3.155 导致的启动失败问题 在修改游戏版本时要求重新安装相关库 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.156.html", + "teaser": null + },{ + "title": "3.3.157", + "excerpt":" 更新俄语翻译 在游戏设置页面添加重命名等只能在游戏列表操作的功能 在自动安装页面可以删除已选择安装的第三方库 添加复制游戏实例功能 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.157.html", + "teaser": null + },{ + "title": "3.3.158", + "excerpt":" 调整界面细节 修复游戏安装失败时提示安装完成的问题 在自动安装 Forge、OptiFine 等库时若下载失败,自动重试其他下载源 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.158.html", + "teaser": null + },{ + "title": "3.3.159", + "excerpt":" 调整界面细节 在日志窗口添加导出游戏日志功能 修复复制游戏实例后的新游戏无效的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.159.html", + "teaser": null + },{ + "title": "3.3.160", + "excerpt":" 主界面标题栏透明 游戏崩溃后弹出的日志窗口直接显示游戏崩溃报告(而不是游戏日志) 修复游戏崩溃后弹出的日志窗口无法显示日志的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.160.html", + "teaser": null + },{ + "title": "3.3.161", + "excerpt":" 调整界面细节 修复无法安装 Forge 1.12.2 2852 的问题 提升与 ServerSync 的兼容性 安装游戏向导内可直接切换下载源,而不需要返回启动器设置页面 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.161.html", + "teaser": null + },{ + "title": "3.3.162", + "excerpt":" 修复无法下载资源文件的问题 修复无法同时安装 Forge 1.12.2 2852 和 OptiFine 的问题 加强对支持库文件完整/损坏的检查能力 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.162.html", + "teaser": null + },{ + "title": "3.3.163", + "excerpt":" 修复日志窗口无法清除日志的问题 检查下载的 Fabric 安装包是否完整,避免 MCBBS 源带来的错误 启动提示内存过大时允许停止启动 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.163.html", + "teaser": null + },{ + "title": "3.3.164", + "excerpt":" 更新俄语翻译 修复在“在游戏启动后关闭启动器”启用时游戏无法启动的问题 修复弹出对话框时无法拖动窗口的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.164.html", + "teaser": null + },{ + "title": "3.3.165", + "excerpt":" 修复无法自动更新的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.165.html", + "teaser": null + },{ + "title": "3.3.166", + "excerpt":" 修复进入游戏设置后无法重命名部分游戏版本的问题 修复 Curse 整合包下载时遗漏 Mod 的问题 修复部分情况下弹框消失的问题 在 OptiFine 库缺失时可以自动补全 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.166.html", + "teaser": null + },{ + "title": "3.3.168", + "excerpt":" 将主界面的版本列表弹框的滚动条改为黑色 修复某些情况下启动游戏时,提示 NullPointerException 的问题 允许使用在启动器同目录下的 authlib-injector.jar 文件 修复刷新下载列表时可能提示 ConcurrentModificationException 的问题 修复重命名被依赖的版本后,会破坏其他依赖这个版本的版本的问题 更正重命名版本时,输入不合法的新名字后的错误提示 修复在自定义游戏运行目录时,输入不合法的路径会导致崩溃的问题 修复在输入特定错误的 authlib-injector 服务器地址时会导致启动器崩溃的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.168.html", + "teaser": null + },{ + "title": "3.3.169", + "excerpt":" 修复 1.12.2 同时安装 Forge, OptiFine 时无法进入游戏存档的问题 修复服务器自动更新整合包更新时可能会出现 AccessDeniedException 的问题 现在会记住启动器上次使用的窗口大小 游戏设置页面也可以安装游戏、添加整合包和刷新版本列表 游戏设置页面可以修改默认启动游戏版本 使用外置登录账户时,主页面的账户将显示认证服务器名称 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.169.html", + "teaser": null + },{ + "title": "3.3.170", + "excerpt":" 修复部分情况下崩溃的问题 支持同时安装 Minecraft 1.14.4 及以上版本的 Forge 和 OptiFine ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.170.html", + "teaser": null + },{ + "title": "3.3.172", + "excerpt":" 添加窗口阴影 添加为正版账号上传皮肤的功能 现在会校验资源索引文件的完整性 现在启动器代理设置对启动后的游戏有效 自动安装页面将提示不兼容的第三方库,比如 Forge 和 Fabric 不兼容 添加启动器的 JVM 参数 -Dhmcl.font.override=fontfamily 以允许 Linux 用户更换字体以解决白屏问题 修复无法安装 Curse 整合包的问题 修复下载资源文件时不能自动切换下载源的问题 修复 1.5.2 及以下版本不能下载资源文件的问题 修复 1.5.2 及以下版本安装 Forge 后启动失败的问题 修复不能在 Java 17 下载 Forge 和自动更新的问题 修复整合包配置丢失后整合包游戏版本不能修改配置的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.172.html", + "teaser": null + },{ + "title": "3.3.173", + "excerpt":" 修复启动 Minecraft 1.0 时不会停止等待游戏启动的问题 更新游戏整合包后会显示新的版本号 修复更新整合包下载地址不能使用在线下载自动更新整合包的问题 修复首次打开整合包会弹出 3 个新建账户窗口的问题 配置文件会优先选择启动器同目录而不是工作目录 修复运行在 Java 12+ 时列表和下拉菜单不能正常显示的问题 修复鼠标指针不正常的问题 修复添加外置登录的正版账号后会与普通正版账号冲突的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.173.html", + "teaser": null + },{ + "title": "3.3.174", + "excerpt":" 允许第三方修改 HMCL 的 BMCLAPI 下载源,从而支持第三方下载源 自动设置游戏的默认语言为中文 修复因为线程过多导致在 macOS 系统上运行崩溃的问题 修复重命名游戏版本点击移动窗口而不是移动光标的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.174.html", + "teaser": null + },{ + "title": "3.3.175", + "excerpt":" 修复部分情况误修改 options.txt 的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.175.html", + "teaser": null + },{ + "title": "3.3.176", + "excerpt":" 支持微软正版账户登录 支持 Authlib-injector 账户上传皮肤 支持 Authlib-injector 服务器用邮箱以外的账户登录 尝试修复在游戏启动后启动器直接关闭时导致游戏卡死的问题 修复启动器设置 HTTP 代理后,游戏无法访问网络的问题 修复下载支持库文件失败时启动器崩溃的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.176.html", + "teaser": null + },{ + "title": "3.3.177", + "excerpt":" 修复下载失败导致游戏无法启动的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.177.html", + "teaser": null + },{ + "title": "3.3.178", + "excerpt":" 修复不能检测 20w45a+ 以上游戏的版本号 修复同时只有一个文件在下载的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.178.html", + "teaser": null + },{ + "title": "3.3.179", + "excerpt":" 修复微软账号在设置了皮肤之后不能登录的问题 修复不能显示微软账号皮肤的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.179.html", + "teaser": null + },{ + "title": "3.3.180", + "excerpt":" 支持我的世界中文论坛整合包标准 修复下载失败的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.180.html", + "teaser": null + },{ + "title": "3.3.181", + "excerpt":" 微软登录页添加加载进度条 修复整合包导出页无法点击下一步的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.181.html", + "teaser": null + },{ + "title": "3.3.183", + "excerpt":" 修复服务端自动更新整合包不能更新游戏、Forge 版本的问题 兼容 Java11+,在 Java 11+ 上运行时会自动下载 JavaFX 修复不能识别部分数据包的问题 刷新账户时将显示进度条 上传皮肤时自动检测 Steve、Alex 模型 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.183.html", + "teaser": null + },{ + "title": "3.3.184", + "excerpt":" 修复 macOS 下启动器图标和 Finder 相同的问题,仅在 Java 9+ 生效 修复与 Java 16 的兼容性问题 允许在导出的整合包内包含启动器程序 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.184.html", + "teaser": null + },{ + "title": "3.3.186", + "excerpt":" 解决 Java 16 下部分 mod 不能正常运行的问题 修复对系统平台的识别错误导致部分平台不能正确下载 JavaFX 的问题 启动 Minecraft 1.17 时自动下载官方提供的 Java 16 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.186.html", + "teaser": null + },{ + "title": "3.3.188", + "excerpt":" 自定义本地库路径,允许 M1 设备运行 ARM 版本的 Minecraft 自动检测系统内安装的 OpenJDK,包括 Liberica/Microsoft/Zulu/AdoptOpenJDK 修复 exe 版本不能正常下载 JavaFX 的问题 修复 Windows 下打开使用 Unicode UTF-8 提供全球语言支持选项后启动器无法打开的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.188.html", + "teaser": null + },{ + "title": "3.3.189", + "excerpt":" 支持使用 Fabric 作为 Mod 加载器的 CurseForge 整合包 修复尝试下载 Java16 时只有确定没有取消按钮的问题 修复下载 Java16 时取消下载过程后启动器崩溃的问题 自动选择新添加的 Authlib-injector 服务器 修复安装整合包时可能崩溃的问题 压缩了启动器本体文件大小 修复 MCBBS 整合包实现不符合规范的问题 允许在 Minecraft 自定义参数内使用 ${game_directory} 等占位符 支持官方启动器为 Minecraft 启动参数提供的一些占位符 允许在 Java 自定义参数内覆盖启动器默认提供的启动参数,而不需要再禁止启动器生成默认参数 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.189.html", + "teaser": null + },{ + "title": "3.3.192", + "excerpt":" 支持 1.17 Forge 的自动安装与游戏启动 修复不能正常启动 Minecraft 1.5 及以下版本的问题(需要手动删除 options.txt) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.192.html", + "teaser": null + },{ + "title": "3.3.194", + "excerpt":" 支持 CurseForge 整合包和 Mod 下载 改进版本管理和游戏设置的界面 修复不能启动 BakaXL 安装后的游戏的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.194.html", + "teaser": null + },{ + "title": "3.3.195", + "excerpt":" 添加查看模组详细介绍及打开其官方页面的功能 Mod 下载列表会按照发布时间排序 修复 Mod 下载页面存在空白区域的问题 修复操作账户时崩溃的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.195.html", + "teaser": null + },{ + "title": "3.3.196", + "excerpt":" 修复进入 Mod 下载页面时崩溃的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.196.html", + "teaser": null + },{ + "title": "3.3.197", + "excerpt":" 修复不能启动 Forge 1.17.1-37.0.29 及以上版本的问题 修复英文语言设置下版本管理页面的标题错误的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.197.html", + "teaser": null + },{ + "title": "3.3.199", + "excerpt":" 在整合包下载页按回车也可以发起搜索 支持我的世界中文论坛整合包规范第二版,兼容 CurseForge 整合包格式,允许导入 MultiMC 重新设计关于页面 修改创建账号页面 新增赞助列表页面 修复微软登录页可能白屏的问题 修复微软登录很快过期的问题 修复错误检测 Forge 版本号以至于不能导出正确的整合包的问题 修复在主页按多次回车键会重复启动游戏的问题 修复安装整合包时没有检查名字是否符合 Windows 文件名规范的问题 修复 Forge 安装器部分内容仍需从官方源下载的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.199.html", + "teaser": null + },{ + "title": "3.3.200", + "excerpt":" 修复微软登录超时后崩溃的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.200.html", + "teaser": null + },{ + "title": "3.3.201", + "excerpt":" 添加帮助页面 添加修改游戏进程优先级的功能 任意页面按 ESC 键可返回上一页 支持自动选择游戏内存大小 添加 Linux 下使用系统 GLFW 及 OpenAL 的功能 添加自动选择下载源的功能 允许修改默认的下载并发数 添加单独的下载页面,额外支持资源包和存档的下载功能 更换默认背景图 调整界面外观 支持自动安装 Fabric-API(该功能尚未完成,需要在 Java 虚拟机参数中添加 -Dfabric.development 方能使用) 修复微软登录成功页乱码的问题 修复微软账号年龄不满 18 岁显示的错误信息不易于阅读等问题 修复不能启动 PCL 安装的部分游戏的问题 修复不能启动 Fabric 安装器安装的 1.18 版本的问题 修复模组下载页面没有按时间排序的问题 修复 Java 11 以上滚动条的样式问题 修复部分 Linux 发行版下不能打开微软登录页面的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.3/3.3.201.html", + "teaser": null + },{ + "title": "3.4.202", + "excerpt":"更新至 JavaFX 17,额外支持 Mac M1 设备下自动下载 JavaFX Authlib-Injector 认证服务器管理页面移动至账户管理页侧边栏 支持修改离线账户的 UUID Mod 管理页面和下载页面尽可能显示 Mod 的中文名称 Mod 下载页面允许中文搜索 Mod 下载页面允许选择搜索 CurseForge 或者 Modrinth Mod 下载页面允许查看 Mod 的 MC 百科页面与 MCBBS 页面 Mod 下载页面允许选择要安装到的目标游戏版本 下载页面首页修改为游戏安装页,而不是 Mod 下载页 自动安装 Fabric-API 至新游戏的 Mod 目录 微软登录时无法自动打开浏览器时允许手动复制链接 修复微软登录时提示 NullPointerException 或者部分情况下的无法连接认证服务器的问题 修复安装新游戏失败的问题 修复自动选择内存大小后内存大小过小的问题 修复返回主页卡死的问题 修复 Mod 下载页无法显示...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.202.html", + "teaser": null + },{ + "title": "3.4.203", + "excerpt":" 添加多人联机,由于处于试验阶段,如果出现问题请反馈 调整界面外观 背景路径支持网络链接 允许修改启动器字体 添加崩溃分析报告窗口,尽量分析崩溃信息,而不是直接打开日志窗口 Mod 下载页面按游戏版本分类 Mod 下载页面显示前置 Mod EXE 版本优先选择独立显卡 打开不检查游戏完整性选项时,同时不检查服务端自动更新整合包的更新 修复点击 Mod 列表页 Mod 文件夹按钮后不能打开正确文件夹的问题 修复下载 Mod 时无法取消的问题 修复不能正确识别 MCBBS V2 整合包的问题 修复 PATH 格式不正确时导致启动器崩溃的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.203.html", + "teaser": null + },{ + "title": "3.4.205", + "excerpt":"添加联机房间准入功能,房主同意后玩家才能加入房间 添加联机房间管理功能,可以查看已经在房间中的玩家 添加联机 Token 设置和中继模式 联机时不再需要正版登录,但玩家必须在多人游戏页面直连 HMCL 多人联机房间 添加修改离线账户皮肤的功能,允许使用本地图片和 LittleSkin 等皮肤站 添加自动选择 Java 选项,省去提示用户需要更改 Java 版本的步骤 添加模组批量更新功能 修改页面跳转动画 支持导入由玩家手动打包的包含 .minecraft 文件夹的整合包 Fabric Mod 崩溃时提示 Mod 冲突或缺失前置 Mod 原因 在全局游戏设置中提示当前版本正在使用游戏独立设置,以避免玩家在错误的地方修改设置 支持 1.17 下 OptiFine 与 Forge 同时安装 修复由于 Java 损坏导致无法检测 Java 版本时,启动游戏卡死的问题 修复 Mojang 账号和 Authlib-Injector 账号登录时卡死,看不到密码框的问题 修复 Mojang 账号和 Authlib-Injector...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.205.html", + "teaser": null + },{ + "title": "3.4.206", + "excerpt":" 联机: 更新 cato 至 1.0.c,支持 macOS M1 芯片设备 联机: 网络测试改用快速测试方法 联机: 添加加入申请选项,默认不再需要房主手动同意加入申请 联机: 在需要房主手动同意加入申请时,提供 30 秒超时,超时后自动拒绝申请 在调试选项下和本地目录设置下显示警告信息 离线账户皮肤选择本地文件时,允许修改人物模型为 Slim 启用标题栏透明选项时,标题栏背景色调为半透明 现启动器更新通道将与启动器本身发布为开发版或稳定版绑定,避免玩家使用开发版时因为忘记调整更新通道,不能收到后续开发版更新推送 修改页面跳转动画 修复游戏崩溃报告页面崩溃的问题 修复进入联机页面时没有下载 cato 的问题 修复离线账户皮肤选择 Blessing Skin 时,网址末尾添加斜杠会无法加载皮肤的问题 修复复制游戏实例时崩溃的问题 修复点击反馈页面空白处弹出反馈详细信息页面的问题 修复批量更新模组时,将 Forge Mod 更新为 Fabric Mod 的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.206.html", + "teaser": null + },{ + "title": "3.4.207", + "excerpt":" 在杀毒软件删除 cato 时,弹出警告提示,而不是崩溃启动器 资源包下载页面添加版本选择 微软账号登录时被服务器要求重新手动登录时弹出登录提示框而不是登录失败 修复运行在 32 位 Java 上时不能正确提示游戏不应使用 32 位 Java 运行的问题 修复模组页、游戏下载页等页面标签错乱的问题 修复游戏崩溃报告窗口不显示内存和 Java 版本的问题 修复联机加入房间失败时将连接无法建立显示为被房主踢出的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.207.html", + "teaser": null + },{ + "title": "3.4.208", + "excerpt":" 运行环境缺少 JavaFX 时,直接开始下载而不是等待用户选择下载源 修复联机断联的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.208.html", + "teaser": null + },{ + "title": "3.4.209", + "excerpt":"不再翻译 id 为 examplemod 的 Mod 名称以避免歧义 如果在 macOS/Windows ARM 设备上使用 HMCL,HMCL 会优先使用 x86 的 JDK 运行游戏 提供更多预设的游戏版本图标以供设置 完善显卡驱动问题提示语 完善 Linux 用户因使用 Java9+ 版本导致游戏崩溃的提示语 导出游戏启动脚本时,可以导出 PowerShell 格式的脚本 支持游戏需要 Java 8 时提示并下载 Java 8 下载 Mod 时,可以自定义文件名称 添加透明背景选项 添加日语翻译 更新俄语翻译 兼容 TLauncher 游戏客户端 联机: 修复使用 32 位 Java 时提示多人联机不支持当前平台的问题 联机: 修复...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.209.html", + "teaser": null + },{ + "title": "3.4.210", + "excerpt":" 提示下载 Java 时,额外提供手动下载链接 更新 cato 至 1.1.0 修复部分页面进入时崩溃的问题 修复设置系统环境变量 classpath 后游戏无法启动的问题 修复删除所有游戏文件夹配置项后崩溃的问题 修复删除游戏版本后不退出游戏设置页面的问题 修复重命名游戏版本后游戏设置页面未刷新的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.210.html", + "teaser": null + },{ + "title": "3.4.211", + "excerpt":" 修复 Log4j 远程代码执行漏洞 修复解压 zip 文件时丢失文件属性的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.211.html", + "teaser": null + },{ + "title": "3.4.212", + "excerpt":" 修复 Log4j 远程代码执行漏洞 修复取消启动警告框后,启动游戏进度框不退出的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.4/3.4.212.html", + "teaser": null + },{ + "title": "3.5.0.213", + "excerpt":" 修复 Log4j 远程代码执行漏洞 更新 cato 至 1.2.0 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.0.213.html", + "teaser": null + },{ + "title": "3.5.0.214", + "excerpt":" 重命名某个游戏版本后,该游戏版本将会被选中为当前游戏版本 修复 cato 选项名称错误的问题 修复 1.17/1.18 Forge 客户端不能启动的问题 修复在定制离线帐户皮肤后,导出的游戏脚本不能正常启动游戏的问题 修复 Mod 下载页面加载失败后点击刷新页面提示无反应的问题 修复游戏崩溃分析窗口内显示了不知道是什么库的版本号的问题 修复 Fabric-API 下载不完整的问题 修复 Fabric-API 列表中存在与游戏版本不匹配的版本的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.0.214.html", + "teaser": null + },{ + "title": "3.5.2.216", + "excerpt":" 修复在包含等于号的路径下运行时无法正确加载漏洞修复工具的问题 修复 Mod 下载页选择 Modrinth 源时,排序选项不可用的问题 修复下载游戏向导中,在某些情况下加载了错误的 Fabric API 列表的问题 修复启动游戏时,如果 Java 版本不正确,某些情况下会导致启动器崩溃的问题 修复某些情况下不能更新游戏版本为 Minecraft 1.18 所安装的 Forge 修复多人联机页面在快速点击打开房间时导致启动器崩溃的问题 修复删除离线帐户使用的本地皮肤文件后游戏不能启动的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.2.216.html", + "teaser": null + },{ + "title": "3.5.3.219", + "excerpt":" 支持整合包下载页使用中文搜索 支持下载安装 Modrinth 整合包 修复在语言为英文时仍翻译 Mod 名称的问题 修复离线模式帐户无法使用 LittleSkin 皮肤站的问题 修复下载 Mod 和整合包时,没有显示下载进度的问题 修复在 macOS 和 Linux 系统下不能打开模组文件路径的问题 修复部分情况下因 Zip 包编码无法检测,以致无法安装整合包的问题 修复无法启动包含 LabyMod 的游戏的问题 在系统内没有检测到 Java 时,自动尝试安装 Java,而不只提示用户手动安装 更新 cato 网站链接 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.3.219.html", + "teaser": null + },{ + "title": "3.5.3.220", + "excerpt":" 修复 CurseForge 整合包无法下载安装的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.3.220.html", + "teaser": null + },{ + "title": "3.5.3.221", + "excerpt":" 支持在文件管理器中显示文件,或者在 Linux 中直接打开父目录。 默认开启“自动选择合适的 Java” 修复部分 UI 问题 修复更换资源类别后不更新列表的问题 修复无法获取前置模组信息 更新翻译 修复整合包的 mcmod 网址不正确问题 修复无法将 mrpack 文件拖拽至主页面安装整合包的问题 在 JDK 安装不完整时提醒重新安装 修改微软账户上传皮肤链接 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.3.221.html", + "teaser": null + },{ + "title": "3.5.3.222", + "excerpt":" 修复翻译错误 适配 Apple Silicon Mac 与龙芯平台 修复不会自动补全缺失的 OptiFine 文件的问题 更新官方下载源链接 修复 OptiFine 自动安装后启动崩溃的问题 微软账户相关调整 添加世界信息界面(允许玩家在启动器内查看更详细的世界信息以及调整一些基本设置) 修复使用 Java 9+ 编译时的错误 修复资源搜索获取信息失败相关问题 添加 Quilt 自动安装 回滚 HMCLauncher.exe ,减少杀毒软件报毒 为非 x86 平台提供开箱即用的启动支持 更新自动安装页面 修复在创建账户页面下认证服务器未知的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.3.222.html", + "teaser": null + },{ + "title": "3.5.3.223", + "excerpt":" 在启动游戏时刷新账户失败时提示重试登录 修复在授权过期时不会显示重新登录对话框 微软登录相关优化 修复通过自动安装更新游戏时的崩溃 支持 Github Action 的构建产物微软登录 更多平台的原生适配 修复在找不到合适的 Java 时启动时卡住的问题 支持在 linux-loongarch64_ow 上自动下载 JavaFX 更新翻译 添加 sh 二进制文件支持 修复 Modrinth 整合包安装 更新多人联机 日志分析器显示相关优化 修复 Modrinth 格式的 Quilt 整合包安装错误 修复 Modrinth 模组包解析错误 Quilt 自动安装相关调整 修复下载 Java 链接错误 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.3.223.html", + "teaser": null + },{ + "title": "3.5.3.227", + "excerpt":" 多人联机功能暂时下线维护详情 修复中文路径下启动 <= 1.12.2 的版本没有声音的问题 修复 提示弹窗 的文本显示问题 更新相关翻译 优化未存在可用的 Java 环境启动 HMCL 时的提示 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.3.227.html", + "teaser": null + },{ + "title": "3.5.3.228", + "excerpt":"优化启动器资源占用 优化游戏 JVM 参数,改善游戏性能 优化高分辨率屏幕上图标的显示效果 优化微软账户登录相关提示 支持 Gif 格式背景图 在微软账户登录弹窗中添加 忘记密码 按钮 添加关于离线账户命名的提示 更新整合包、模组、资源包、世界搜索中页面游戏版本与类别标签 错误修复: 修复下载页卡顿的问题 修复自动下载 Java 相关问题 修复使用 Java 18+ 运行 Minecraft 时日志乱码的问题 修复更新模组时可能崩溃的问题 修复重复回滚 Mod 更新导致启动器崩溃的问题 修复无法正确处理带有 Quilt 的 MultiMC 整合包的问题 修复 Quilt 版本选择页未显示 Quilt 图标的问题 修复 Mcbbs 整合包中 JVM 参数覆盖版本设置的问题 修复使用 Java 8 运行时启动器标题显示 @develop@ 的问题...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.3.228.html", + "teaser": null + },{ + "title": "3.5.3.229", + "excerpt":"更新整合包、模组、资源包、世界搜索中页面游戏版本标签,并修改类别的顺序 优化自动内存分配 弃用 FXML,能够便于调试修改、优化资源占用和优化启动速度 将 Little skin 更改为可选的登录选项 启动时检查 HMCL 是否在临时路径中 修改一些提示 优化 Mod 列表加载速度 优化对 Java 兼容性问题的检测 更新全部图标,改善了高分屏上图标的显示质量 在更新整合包中包含的 Mod 时弹出警告 支持导出更多崩溃日志 更新反馈页面 减小 JAR 文件体积 向非官方构建添加提示 x86-64 平台上不自动选择 32 位 Java 建议 Forge 用户使用官方推荐版本的 Java 启动游戏 默认在用户文件夹中存储账户信息,并添加 便携账户 和 全局账户 按钮切换 优化日志分析 添加模组列表搜索 新添加 JVM 选项 hmcl.home,允许用户自行指定 HMCL_DIRECTORY...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.3.229.html", + "teaser": null + },{ + "title": "3.5.3.230", + "excerpt":" Quilt 相关功能完善 默认将搜索排序修改为“热度” 更新语言文件 减小 JAR 文件体积 优化性能,轻微降低内存占用 不将默认的日志行数保存到配置中,使其导出崩溃日志中的 minecraft.log 不会受其行数限制 错误修复: 修复 GIF 动图加载占用主线程的问题 修复一些崩溃问题 修复下载源选择框过长的问题 修复添加冗余 G1 参数的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.3.230.html", + "teaser": null + },{ + "title": "3.5.4.232", + "excerpt":" 添加环境变量设置 添加渲染器设置 将版本高级设置拆分至单独页面中 在 Linux 上支持 MESA_LOADER_DRIVER_OVERRIDE 环境变量,适配 Zink 驱动程序 错误修复: 修复日志分析窗口的渲染问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.4.232.html", + "teaser": null + },{ + "title": "3.5.4.234", + "excerpt":"拒绝在被 Fractureiser 病毒感染的设备上启动 HMCL(若检测到将会提示并退出,详情) 检测 HMCL 是否处于 macOS 上的 App Translocation(macOS 使用了 App Translocation 机制,可能会自动将 HMCL 移动至 /private/var/folders 中的临时文件夹内,导致用户关闭 HMCL 后游戏数据和设置丢失) 添加 Linux RISC-V 64 平台支持 日志分析窗口中显示物理内存大小 更新 Minecraft 购买链接 添加删除游戏资源文件按钮 优化 SSL 异常报错信息 添加更多日志分析规则 更新搜索版本号 更新游戏版本号检测性能 添加隐藏测试版提示开关 更新翻译 错误修复: 修复在 Minecraft 1.20 不能正常使用游戏内聊天功能的问题 修复在 Windows on ARM 平台上的启动问题 修复使用系统...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.4.234.html", + "teaser": null + },{ + "title": "3.5.5.235", + "excerpt":"完善 Quilt 支持 添加了对 NeoForge 的支持 打开启动器时会验证 JavaFX 完整性 放弃 EXE 版本与 Windows XP 的兼容性,如果需要可以使用 JAR 版本(当前版本的 EXE 版本并未放弃,在不久的将来会构建不支持 Windows XP 的 HMCLauncher 并分发。如果是从旧版本通过启动器更新升级到最新版本,则 HMCLauncher 并不会被覆盖修改,仍然支持 Windows XP) 支持从 Modrinth 更新模组,会比对 CurseForge 和 Modrinth 取最新版本 支持在模组管理和模组搜索中显示所支持的模组加载器 支持日志窗口中的复制操作,选中要复制的行,按 Ctrl+C 即可 日志窗口默认显示行数调整至 1000 添加光影包文件夹和日志文件夹打开按钮 在离线账户创建时对不合法的账户名做出警告 游戏安装界面现在会隐藏不可用的模组加载器 现在系统 GLFW 和系统 OpenAL 也可在 Windows...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.5.235.html", + "teaser": null + },{ + "title": "3.5.5.236", + "excerpt":"GP-2836: 更新启动器发布页至官网,而不是 MCBBS GP-2700: 优化游戏版本比较规则,现在模组下载界面能够正常排序 Minecraft 正式版、快照版或其他版本了 GP-2805: 默认开启自动选择并发数 GC-9361719、GC-420d77d、GP-2839: 移除 MCBBS 的下载源和鸣谢文本,介于其下载源已不再可用 GP-2801: 添加部分 CurseForge 的分类翻译文本 GP-2742: 支持在游戏崩溃提示界面显示 Fabric Loader 给出的警告信息 GP-2813: 当日志中含有部分常见报错信息时,即使进程退出代码为 0 也显示游戏崩溃提示界面 GP-2828: 支持检测 Forge 模组重复导致的游戏崩溃 GP-2834: 支持检测 Forge 安装不完整导致的游戏崩溃 GP-2785: 支持检测 JVM 堆内存不足导致的游戏崩溃 GP-2790: 支持检测 Forge 与高版本 Java 不兼容导致的游戏崩溃 GP-2760: 更新对 Linux RISC-V 64 系统的支持...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.5.236.html", + "teaser": null + },{ + "title": "3.5.5.237", + "excerpt":"错误修复: GP-2840: 修复 Linux RISC-V 64 平台的支持 GP-2846: 修复使用 Java 19+ 启动游戏时,游戏 JVM 字符编码参数错误导致控制台乱码的问题 GP-2857: 修复搜索页面搜索结果为空,即总页面为 0 时点击最后一页按钮会跳转到不存在的页面导致无法正常使用的问题,现在会自动禁用该按钮 GP-2858: 修复 Windows 下自定义命令中使用 $INST_DIR 等带有反斜杠的内容会错误触发转义导致路径错误的问题 GP-2859: 修复启动器在版本 JSON 缺失 Patches 信息时无法获得游戏版本,导致游戏启动参数重复、管理版本表现不正确等问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.5.237.html", + "teaser": null + },{ + "title": "3.5.5.238", + "excerpt":" GP-2864: 改善在非 Windows 平台任务栏图标的质量 错误修复: GP-2859: 修复 Forge 和 NeoForge 安装失败的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.5.238.html", + "teaser": null + },{ + "title": "3.5.6.240", + "excerpt":" GP-2862: 默认不进行降级更新(手动切换更新源时依然会正常提示) GP-2888: 移除设置 - 赞助页面 GP-2889: 删除 Mojang 登录支持 GP-2897: 主界面移除联机大厅按钮,添加引导用户进入官方 QQ 群的按钮 GP-2886: 自动下载 Java 支持下载 Java 21 错误修复: GP-2869: 修复下载 Java 不会尝试备用下载源的问题 GP-2871: 修复导出启动脚本时无法正确处理“游戏启动前执行命令”和“游戏结束后执行命令”的问题,现在会预解析命令 GP-2881: 修复无法安装带有 NeoForge 的 Modrinth 整合包的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.6.240.html", + "teaser": null + },{ + "title": "3.5.6.241", + "excerpt":" GP-2904、GP-2915: 更新语言文件,使表达更精确 GP-2905: 更改语言选项添加重启后生效的提示 GP-2916: 在 CurseForge 下载源中搜索时始终会按照模组标题与关键词的相似性排序 GP-2885: 在 Linux 系统上且处于未知桌面环境时,禁用删除至回收站功能 错误修复: GP-2908 [重要]: 修复微软账户登录失败的问题 GP-2804: 修复游戏非正常退出提示界面文字编码显示错误的问题 GP-2906: 修复未初始化 FileDownloadProvider 的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.6.241.html", + "teaser": null + },{ + "title": "3.5.6.242", + "excerpt":" GP-2917: 不再尝试下载 .pack.xz 文件 GP-2921: 当系统属性 java.net.useSystemProxies 被设置为 false 时不再使用系统代理 GP-2856: 当加载网络背景图片超时时回退至默认背景,解决启动时卡死的问题 GP-2912: 当下载失败时,打印重定向链至日志 错误修复 GP-2919: 修复 Minecraft 1.6 之前的版本没有声音的问题 GP-2920: 修复了在 CurseForge 下载源中使用中文搜索无法呈现结果的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.6.242.html", + "teaser": null + },{ + "title": "3.5.6.243", + "excerpt":" GP-2929: Modrinth 翻译文本将在缺失时显示原内容 错误修复: GP-2939: 修复游戏启动时包装命令会被添加两次的问题的问题 GP-2936: 修复无法读取远古版本版本号的问题 GP-2933: 修复高版本变更离线皮肤可能不生效的问题 GP-2928: 修复自动更新整合包导出页面教程链接错误问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.6.243.html", + "teaser": null + },{ + "title": "3.5.7.244", + "excerpt":" GP-2942: 支持更多格式的版本图标 GP-2943: 添加更多默认皮肤,目前已与最新 Minecraft 保持一致 GP-2948: 优化了启动时加载语言文件的性能 错误修复: GP-2948: 修复模组下载界面展示“损坏的模组”时,语言始终为系统默认,无法跟随 HMCL 配置文件的问题 GP-2521: 添加外置登录时,应该请求并显示当前语言的外置登录服务端名称,而不是默认英文名称 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.7.244.html", + "teaser": null + },{ + "title": "3.5.7.245", + "excerpt":" GP-2950: 未设置字体时会尝试从当前路径寻找 font.ttf 或 font.otf 并加载为默认字体 GP-2953: 清理残余 MCBBS 相关内容 GP-2951: 重新实现日志记录,保留最近 20 次启动的日志文件,退出时会压缩日志,并优化日志性能表现 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.7.245.html", + "teaser": null + },{ + "title": "3.5.7.246", + "excerpt":" GP-2797: 添加更多日志分析规则 GP-2958: 重新加入对 MCBBS 的鸣谢 错误修复: GP-2986 [重要]: 修复微软账户登录失败的问题 GP-2980: 修复整合包下载失败提示窗标题未正确格式化的问题 GP-2984: 修复日志文件夹不存在时无法将日志写入文件的问题 GP-2989: 修复导入部分整合包失败的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.7.246.html", + "teaser": null + },{ + "title": "3.5.7.247", + "excerpt":" GP-2990: 更新指向 XZ 主页的链接 GP-3017: 在 Linux 系统上删除文件至回收站增加对 Cinnamon 桌面环境的支持 GP-3042: 对日志中 Someone is closing me! 不做检测(这是正常退出的提示) GP-3045: 支持自动安装 Java 21 GP-3035: 在 macOS 环境下支持查找 Homebrew 安装的 Java GP-3031: 适配新版本 NeoForge 模组,修复部分模组无法被正确识别的问题 错误修复: GP-2994: 修复自动安装界面 NeoForge 图标在高分辨率屏幕上会很模糊的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.7.247.html", + "teaser": null + },{ + "title": "3.5.8.248", + "excerpt":" GP-3023: 特定游戏设置 - 自动安装 中禁止升级或卸载由其他启动器安装的游戏组件 GP-3089: 优化 下载 - 模组 中模组版本推荐逻辑 GP-3097: 更新 Linux ARM64 支持 GP-3092: 移除 KOOK 入口 错误修复: GP-3023: 修复 1.20.4 版本 Forge 和 OptiFine 同时安装的情况下游戏无法启动的问题 GP-3027: 修复低版本游戏在开启版本隔离后没有声音的问题 GP-3028: 修复 全局游戏设置 - 版本隔离 中错误展示路径的问题 GP-3081: 修复启动器退出时卡死的问题 GP-3082: 修复整合包 NeoForge 版本识别不正确的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.8.248.html", + "teaser": null + },{ + "title": "3.5.8.249", + "excerpt":" GP-3113 [重要]: 修复无法启动部分 Forge 版本的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.8.249.html", + "teaser": null + },{ + "title": "3.5.8.250", + "excerpt":"GP-3121、GP-3194 [重要]: 微软登录界面对 Xbox 400 错误给予提示 GP-3197: 优化对 Linux RISC-V 64、FreeBSD x86-64 平台的支持 GP-3058: 支持解析更多游戏版本号 GP-3181: 支持使用 HMCL_FONT 环境变量指定字体 错误修复: GP-2838: 修复本地模组查看信息时标签错误的问题 GP-3066: 修复 CurseForge 搜索 API 对翻页总量计算不正确的问题;修复 下载 - 模组 切换下载源时不刷新页面的问题 GP-3114: 修复模组详情中即使无此游戏版本,仍会出现对应版本下拉栏的问题 GP-3117: 修复自动安装选项卡重新选择版本按钮消失的问题;修复 下载 - 游戏 选择游戏版本后窗口标题重复的问题;修复无法启动官方启动器安装的 1.21 的问题 GP-3126: 修复无法正确读取微软账户 Token 过期时间的问题 GP-3128: 修复 1.21 NeoForge...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.8.250.html", + "teaser": null + },{ + "title": "3.5.8.251", + "excerpt":" GP-3201 [重要]: 修复 HMCL 在 Java 8 上运行时游戏安装界面卡片布局的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.8.251.html", + "teaser": null + },{ + "title": "3.5.9.252", + "excerpt":" GP-3251、GP-3259: 支持从官方源下载 Forge 错误修复: GP-3224: 修复部分游戏版本无法正常安装的问题 GP-3227: 修复模组详情页图标显示问题 GP-3260: 修复部分 CurseForge 翻译缺失的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.252.html", + "teaser": null + },{ + "title": "3.5.9.254", + "excerpt":" GP-3256: 选择要安装的 Forge 版本时显示版本发布时间 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.254.html", + "teaser": null + },{ + "title": "3.5.9.255", + "excerpt":" GP-3233: 在 Linux/FreeBSD 平台打开日志、模组等位置时会选中该文件 GP-3274: 优化日志窗口 GP-3062: 支持从 SDKMAN! 默认目录查找可用 Java 路径 GP-3271: 隐藏版本管理的 Fabric API 和 QSL/QFAPI 自动安装选项 GP-3306: 模组等资源版本图标会根据标签自动调整样式 错误修复: GP-3142: 修复日志窗口错误地将 authlib-injector 日志识别为 ERROR 类型 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.255.html", + "teaser": null + },{ + "title": "3.5.9.257", + "excerpt":"GP-2988: 添加 Java 管理页面,优化查找、下载、自动选择 Java 等功能 (BV1WvCUY4EwK) GP-3262: 优化模组下载页面按钮的翻译文本 GP-3313: 启动时不再检测 Fractureiser 病毒 GP-3280: 在删除账户和认证服务器时弹出确认提示 GP-3314: 优化 Linux/FreeBSD 平台上显示的系统信息 GP-3282: 发现更新弹窗添加取消按钮 GP-3321: 移除对 WebView 的依赖,使用 Jsoup 解析并渲染 HTML GP-3088: 隐藏整合包安装页面上的整合包文件位置 GP-3278: 调换游戏管理侧边栏上“自动安装”和“模组管理”的顺序 GP-3237: 设置页面添加打开启动器日志文件夹按钮 GP-3264: 在 Linux LoongArch64 平台支持 Minecraft 1.20.2+ GP-3234: 在安装新游戏版本页面的默认游戏版本名称中包含已选择的加载器名称 GP-3221: 模组管理搜索操作更改为文本更新后触发 GP-3325: 更新关于页面 错误修复: GP-3324: 修复对话框标题和按钮未使用用户字体的问题...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.257.html", + "teaser": null + },{ + "title": "3.5.9.258", + "excerpt":" GP-3342, GP-3369, GP-3371: 优化 Java 下载功能 GP-3363: 支持下载 IBM Semeru Runtime (OpenJ9) GP-3375: 支持微软账户上传皮肤 GP-3032: 检查模组更新界面加入全选/取消全选复选框 GP-3347: 当整合包没有描述时,隐藏查看整合包描述按钮 GP-3373: 更新模组下载页游戏版本列表至 1.21.3 GP-3364: 将自动下载的 JavaFX 版本提升至 17.0.13 GP-3287: 优化文本描述 错误修复: GP-3352: 修复无法安装 zip 格式的 Java 安装包的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.258.html", + "teaser": null + },{ + "title": "3.5.9.259", + "excerpt":" GP-3378: 优化首页公告,添加隐藏按钮 优化文本描述 错误修复: GP-3379: 修复部分按钮无法用键盘触发的问题 GP-3380: 修复部分控件响应鼠标任意按钮点击的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.259.html", + "teaser": null + },{ + "title": "3.5.9.260", + "excerpt":" GP-3232: 支持在模组管理页面通过右键单击模组查看模组详情 GP-3396、GP-3397、GP-3406: 优化账户列表页面按钮图标 GP-3424: 调整字体选择组合框的默认宽度 GP-3427: 更新 EXE 图标 优化文本描述 错误修复: GP-3392: 修复微软账户登录对话框中“忘记密码”链接 GP-3421: 修复打开游戏设置页时启动器崩溃的问题 GP-3422: 修复模组下载对话框中点击前置模组时,对话框不会关闭的问题 GP-3423: 修复对话框按钮自行移动的问题 GP-3425: 修复 HMCLauncher 无法正确识别 Windows on Arm 平台的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.260.html", + "teaser": null + },{ + "title": "3.5.9.261", + "excerpt":" GP-3428: 优化文本描述 错误修复: GP-3430: 修复使用高版本 Java 启动低版本游戏时提示对话框中的文本错误 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.261.html", + "teaser": null + },{ + "title": "3.5.9.262", + "excerpt":"错误修复: GP-3308: 修复启动时自动补全 Modrinth 整合包中已禁用模组的问题 GP-3434: 修复为游戏 1.20.5+Forge 自动选择 Java 17 的问题 GP-3437: 修复“关于”页面编码错误的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.262.html", + "teaser": null + },{ + "title": "3.5.9.263", + "excerpt":" GP-3435: 在游戏下载列表中添加 Minecraft Wiki 链接 GP-3450: 使最小化按钮居中 优化文本描述 错误修复: GP-3030: 修复导入 MultiMC 整合包时 JVM 参数未移除引号的问题 GP-3439: 修复 Minecraft 1.20.2+Forge 默认图标错误的问题 GP-3444: 修复检查模组更新失败对话框未翻译的问题 GP-3451: 修复下载整合包失败时对话框标题过长的问题 GP-3461: 修复 macOS 上点击按钮时虚拟机崩溃的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.5/3.5.9.263.html", + "teaser": null + },{ + "title": "3.6.11.264", + "excerpt":" GP-3457: 实验性支持 WebP 格式的背景图片 GP-3476: 在 Linux RISC-V 平台添加 banshanjdk-8 的下载地址 错误修复: GP-3470: 修复无法读取部分 Forge 模组信息的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.264.html", + "teaser": null + },{ + "title": "3.6.11.265", + "excerpt":" GP-3458: 降低窗口阴影质量以改善性能 GP-3484: 更新模组下载页游戏版本列表至 1.21.4 错误修复: GP-3490: 修复 OAuth 登录时轮询过于频繁的问题 GP-3464: 修复在更新日志界面无法拖动启动器窗口的问题 GP-3503: 使用 Zink 渲染器时禁用 DRI3 GC-5fd52bb: 皮肤缓存不再保存到 .minecraft 目录 GC-d5408c3: 版本特定游戏设置从全局设置复制 GC-81b3911: 修复按 ESC 键时文本框内的值没有保存的问题 GC-260f4b6: 修复输入对话框中 ESC 键不起作用的问题 GC-7d12ef6: 修复内存滑块提示被设备内存进度条覆盖的问题 GC-78e15d1: 修复游戏设置中内存没有实时刷新的问题 GC-6f53da1: 完善模组下载界面 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.265.html", + "teaser": null + },{ + "title": "3.6.11.266", + "excerpt":" GP-3517: 游戏下载页面添加搜索功能 GP-3244: 安装新游戏/整合包时检查版本名称是否包含非 ASCII 字符 GP-3523: 模组列表页中按下 ESC 键时取消选中 GP-3536: 优化对 Linux RISC-V 64 平台的支持 优化文本描述 错误修复 GP-3252: 修复无法补全部分第三方 Minecraft 客户端游戏资源的问题 GC-56d20a5, GC-397edae: 修复 Linux 平台调整窗口大小的问题 GP-3531: 修复在 FreeBSD x86-64 平台未正确替换 LWJGL 本地库的问题 GP-3541: 修复安装 MultiMC 整合包后没有设置图标的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.266.html", + "teaser": null + },{ + "title": "3.6.11.267", + "excerpt":" GP-3601: 更新模组数据 GP-3603: 支持临时隐藏预览版提示 GP-3610: 统一软件内日期时间格式 优化软件文案 错误修复 GP-3549: 修复 macOS 平台 HMCLauncher.sh 不会显示 Java 下载页面的问题 GP-3594: Java 下载对话框中切换包类型时不应重置版本字段 GP-3598: 修复使用自定义字体时未正确设置字重的问题 GP-3602: 修复使用系统 GLFW/OpenAL 时无法启动部分游戏版本的问题 GC-ecafc9d: 修复安装新游戏页面中组件框的高度问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.267.html", + "teaser": null + },{ + "title": "3.6.11.268", + "excerpt":" GP-3613: 优化软件内日期时间格式 GP-3605: 添加 NeoForge 的 BMCLAPI 代理支持 错误修复 GP-3612: 修复语言设置中英语选项名称错误的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.268.html", + "teaser": null + },{ + "title": "3.6.11.269", + "excerpt":" GP-3619: 在启动器日志中记录处理器型号(仅 Windows) GP-3620: 修改整合包下载对话框内“安装到当前版本”按钮的文本为“安装整合包”,修正对话框标题 GP-3621: 点击安装整合包时无条件关闭整合包下载对话框 GP-3625: 允许用户在「下载 → 游戏」页面搜索时调整搜索范围 GP-3629: 删除全局游戏设置页面的离线账户更换皮肤提示 GP-3628: 在版本的游戏设置中添加“复制全局游戏设置”选项 优化软件文案/翻译 错误修复: GP-3618: 修复无法识别 Intel64 架构的问题 GP-3626: 修复离线账户选择 Steve/Alex 皮肤时模型错误的问题 GP-3622: 修复在非官方支持的平台上 Minecraft 1.21 与 Sodium 不兼容的问题 GP-3638: 修复 NeoForge 版本识别错误的问题 GP-3645: 修复在 macOS 平台无法找到通过 DMG 安装的 Java 的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.269.html", + "teaser": null + },{ + "title": "3.6.11.270", + "excerpt":"版本介绍:cv40898336 GP-3650: 点击账户卡片空白处时切换账户 GP-3442: 添加打开启动器时的窗口动画 GP-3652: 添加关闭启动器时的窗口动画 GP-3657: 添加最小化和还原启动器窗口的动画 GP-3655: 启用高帧率动画 GP-3663: 启动时尝试从 HMCL_DIRECTORY 中加载字体 GP-3665, GP-3673: 支持在世界详情页面、Java 安装页面和整合包详情对话框中双击复制信息 GP-3666, GP-3677: 禁止标题栏按钮获取焦点 GP-3668, GP-3680: 优化动画效果 优化软件文案,修订翻译 错误修复: GP-3623: 修复离线账户皮肤对话框「本地皮肤图片文件」部分选项文字被覆盖的问题 GP-3651: 当微软账户 Token 过期时应当刷新账户 GP-3653: 修复无法打开空 mca/mcr 文件的问题 GP-3654: 修复标题过长时窗口异常的问题 GP-3676: 修复对话框关闭动画缺失的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.270.html", + "teaser": null + },{ + "title": "3.6.11.271", + "excerpt":"版本介绍:cv40935564 GP-3689: 在世界管理界面显示世界图标 GP-3675: 更新 Microsoft 应用商店链接 GP-3700: 重新限制动画帧率至 60fps GP-3701: 在 DDE 上禁用自绘窗口动画 GP-3695: 优化离线登录对话框 GP-3687: 更新全部图标至 Material Symbols GP-3711: 优化世界管理界面,新增备份世界页面 优化软件文案,修订翻译 错误修复: GP-3708: 修复更改游戏 Java 时路径显示错误的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.271.html", + "teaser": null + },{ + "title": "3.6.11.272", + "excerpt":"版本介绍:cv41026311 GP-3717: 显示对话框时隐藏焦点 GP-3723: 在游戏崩溃界面添加滚动条 GP-3729: 为更新日志对话框添加平滑滚动 GP-3730: 为世界信息页面和版本高级设置页面背景添加半透明遮罩 GP-3736: 优化账户信息卡片的显示效果 GP-3714: 优化软件文案,修订翻译 错误修复: GP-3722: 修复备份文件路径被错误地设置为源世界路径的问题 GP-3733: 删除更新日志对话框中多余的换行符 GP-3735: 修复在 Modrinth 上获取模组版本时未正确处理 404 响应的问题 ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.272.html", + "teaser": null + },{ + "title": "3.6.11.273", + "excerpt":"版本介绍:cv41100626 GP-3432: 优化滚动页面时的性能 (by Glavo) GP-3747: 在日志中记录编码信息 (by Glavo) GP-3749, GP-3750: 消除使用 Java 24 运行 HMCL 时控制台中的弃用警告 (by Glavo) GP-3755: 更新 macOS Dock 栏图标 (by Shulker) 错误修复: GP-3752: 修复取消导出整合包时弹出报错对话框的问题 (by Glavo) GP-3759: 修复无法解析部分 Java 版本号的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.11.273.html", + "teaser": null + },{ + "title": "3.6.12.274", + "excerpt":"详细版本介绍:cv41243757 GP-3247: 支持下载部分特殊版本 (by zkitefly) GP-3674: 更新链接为 Metadata 中的常量,优化代码可维护性 (by zkitefly) GP-3744: 更新模组下载页游戏版本列表至 1.21.5 GP-3781: 优化对 25w14craftmine 愚人节快照的支持 (by Glavo) GP-3734: 折叠高级设置中不适用于当前系统的选项 (by Wulian233) GP-3685: 优化软件文案,修订翻译 (by 3gf8jv4dv) 错误修复: GP-3762: 修复离线账户皮肤 cslApi 为 null 时启动器崩溃的问题 (by Glavo) GP-3769: 修复离线账户切换模型时左侧 3D 预览不会即时更新的问题 (by Burning_TNT) GP-3770: 修复 Windows 平台部分语言编码下无法打开 Minecraft 中文 Wiki...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.12.274.html", + "teaser": null + },{ + "title": "3.6.12.275", + "excerpt":"详细版本介绍:cv41320419 GP-3080: 反序列化账户信息时优先将数字解析为 Long (by zly2006) GP-3481: 使用 Kala Compress 替代 commons-compress (by Glavo) GP-3799: 优化下载列表中特殊版本的版本号 (by zkitefly) GP-3800: 优化整合包导出类型选择界面 (by Wulian233) GP-3819: 将 mesa-loader-windows 更新至 25.0.3 (by Glavo) 错误修复: GP-3768: 修复模组下载界面无法正常翻页,以及类别会在切换下载源时出错的问题 (by Burning_TNT) GP-3772: 修复模组管理内“安装到当前版本”与“下载到本地文件夹”实际效果相同的问题 (by Burning_TNT) GP-3776: 修复 LiteLoader 下载相关问题 (by Burning_TNT) GP-3806: 修复 RISC-V 平台游戏识别 CPU 名称出错的问题...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.12.275.html", + "teaser": null + },{ + "title": "3.6.12.276", + "excerpt":"详细版本介绍:cv41401127 GP-3834: 将 Gson 更新至 2.13.0 (by Glavo) GP-3835: 将 jsoup 更新至 1.19.1 (by Glavo) GP-3822: 统一导出和导入整合包页面样式 (by 辞庐) GP-3823: 默认限制境外地区使用离线账户功能 (by Glavo) GP-3824: 优化默认 JVM 参数 (by Glavo) GP-3830: 将模组/整合包/资源包的默认下载源调整为 Modrinth (by Burning_TNT) 错误修复: GP-3826: 修复无法正常解析 NeoForge 愚人节版本的问题 (by Burning_TNT) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.12.276.html", + "teaser": null + },{ + "title": "3.6.12.278", + "excerpt":"详细版本介绍:cv41495241 GP-3840: 将 HMCLauncher 拆分至独立项目 (by Glavo) GP-3857: 将 Gradle 更新至 8.14 (by Glavo) GP-3854: 右键主页“启动游戏”按钮时展开版本列表菜单 (by Glavo) GP-3853: 优化离线账户名称中包含非 ASCII 字符时的提示 (by Glavo) 优化软件文案,修订翻译(by 3gf8jv4dv) 错误修复: GP-3856: 修复导出过长日志时可能发生 OutOfMemoryError 的问题 (by Glavo) GP-3863: 修复游戏崩溃分析窗口乱码的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.12.278.html", + "teaser": null + },{ + "title": "3.6.12.279", + "excerpt":"详细版本介绍:cv41864476 GP-3927: 将 JavaFX 更新至 17.0.15/24.0.1 (by Glavo) GP-3953: 更新 HMCLauncher for Windows 至 3.6.0.2 (by Glavo) GP-3860: 添加 XBox 封禁相关提示 (by 辞庐) GP-3875: 使用工作路径下的 .hmcl 文件夹存放所有配置文件 (by Glavo) GP-3876: 优化代理设置功能 (by Glavo) GP-3878: 将 OS X 重命名为 macOS (by Glavo) GP-3890: 在 Windows 平台使用 JNA 调用本机 API (by Glavo)...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.12.279.html", + "teaser": null + },{ + "title": "3.6.12.280", + "excerpt":"详细版本介绍:cv41943291 GP-3979: 更新 HMCLauncher for Windows 至 3.6.0.3 (by Glavo) GP-3547: 重构 MultiMC 整合包兼容功能 (by Burning_TNT) GP-3929: 使用独立线程保存设置 (by Glavo) GP-3978: 优化原理图管理功能 (by Glavo) GP-3981: 忽略与版本 JSON 指定的 Java 相冲突的 Java 检测规则 (by Glavo) 优化软件文案,修订翻译 (by 3gf8jv4dv) 错误修复: GP-3968: 修复 Java 管理页面中无法添加 IKVM 的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.12.280.html", + "teaser": null + },{ + "title": "3.6.12.281", + "excerpt":"详细版本介绍:cv42015225 GP-3992: 更新 HMCLauncher for Windows 至 3.6.0.4 (by Glavo) GP-2794: 支持下载光影 (by Burning_TNT) GP-3836: 自动安装页面隐藏 mcbbs 项 (by 辞庐) GP-3974: 更新日志中仅显示本次更新内容 (by Wulian233) GP-3991: 创建世界管理页面 (by Glavo) (BV1LrMCzXERZ) GP-4003: 解析 MultiMC 整合包中未声明但在依赖链上的组件 (by Burning_TNT) GP-4004: 更新加入群组链接至 B 站专栏 (by Glavo) 优化软件文案,修订翻译 (by 3gf8jv4dv) 错误修复: GP-3995: 修复 Controller 未能读取 JAVA_VERSION_TIP...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.12.281.html", + "teaser": null + },{ + "title": "3.6.12.282", + "excerpt":"详细版本介绍:cv42087635 GP-4011: 更新模组下载页游戏版本列表至 1.21.6 (by 3gf8jv4dv) 错误修复: GP-4007: 修复光影下载页面中标签名称未翻译的问题 (by Glavo) GP-4009: 修复 macOS 上无法读取 CPU 信息的问题 (by Glavo) GP-4015: 修复代码中的拼写错误 (by kfatyuip) GP-4016: 修复 MultiMC 整合包中包含相同标识符的库时无法导入的问题 (by Burning_TNT) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.12.282.html", + "teaser": null + },{ + "title": "3.6.12.283", + "excerpt":"详细版本介绍:cv42221199 GP-4035: 更新模组下载页游戏版本列表至 1.21.7 (by Glavo) GP-4032: 使用 Java 8 运行时禁止更新 (by Glavo) GP-4040: 更新模组数据 (by Glavo) 优化软件文案,修订翻译 (by 3gf8jv4dv) 错误修复: 修复部分 Linux 环境中未正确选择默认字体的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.12.283.html", + "teaser": null + },{ + "title": "3.6.14.286", + "excerpt":"详细版本介绍:cv42361009 GP-4086: 更新 HMCLauncher for Windows 至 3.6.0.6 (by Glavo) 错误修复: GP-4065: 修复添加游戏文件夹页面缺少灰色背景的问题 (by 辞庐) GP-4069: 修复使用 JavaFX 25 EA 启动时下载界面布局错位的问题 (by Glavo) GP-4074: 修复 Windows 平台无法使用部分中文字体的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.14.286.html", + "teaser": null + },{ + "title": "3.6.15.287", + "excerpt":"详细版本介绍:cv42465621 GP-4078: 使用 Java 11 构建 HMCL (by Glavo) GP-4113: 更新 HMCLauncher for Windows 至 3.7.0.0 (by Glavo) GP-4085: 更新模组下载页游戏版本列表至 1.21.8 (by Glavo) GP-4118: 添加字体抗锯齿算法设置选项 (by Glavo) GP-4095, GP-4120: 更换 unlisted-versions-of-minecraft 镜像源 (by zkitefly, 8Mi_Yile) GP-3690: 优化软件文案,修订翻译 (by 3gf8jv4dv) 错误修复: GP-4096: 修复无法使用部分日志字体的问题 (by Glavo) GP-4097: 修复 InstallersPage 意外地显示滚动条的问题 (by Glavo)...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.15.287.html", + "teaser": null + },{ + "title": "3.6.15.288", + "excerpt":"详细版本介绍:cv42545461 GP-4168: 将 Gradle 更新至 9.0.0 (by Glavo) GP-4064: 优化主页公告关闭按钮 (by 辞庐) GP-4088: 当离线账户名称超过 16 字符时弹出警告 (by ShulkerSakura) GP-4142: 扫描 Java 时忽略 %ProgramFiles%\\Common Files\\Oracle\\Java 中的 Java (by Glavo) GP-4145: 在 Windows 平台优先使用注册表检测 GPU (by Glavo) GP-4148: 当系统设置中禁用动画效果时关闭动画 (需要 JavaFX 22+) (by Glavo) GP-4160: 缺少 Microsoft OAuth App ID 时禁用微软账户的刷新选项 (by...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.15.288.html", + "teaser": null + },{ + "title": "3.6.15.290", + "excerpt":"详细版本介绍:cv42726031 GP-3205: 支持设置背景的不透明度 (by 吞云) GP-3230: 模组管理页面支持根据更多数据搜索模组 (by zkitefly) GP-3716: 支持导出 Modrinth 整合包 (by zkitefly) GP-4051: 导出启动日志时额外导出近五次启动的日志 (by zkitefly) GP-4141, GP-4264: 优化游戏下载页面 (by Glavo) GP-4181: 统一转义 URI 中的特殊字符 (by Glavo) GP-4184: 支持纯色背景 (by Glavo) GP-4201: 为弹窗文本添加平滑滚动 (by 辞庐) GP-4203: 智能选择 popup 弹出位置 (by ENC_Euphony) GP-4205, GP-4210: 支持 APNG 动图 (by...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.15.290.html", + "teaser": null + },{ + "title": "3.6.16.291", + "excerpt":"详细版本介绍:cv42815084 GP-4274: 更新 chunkbase 种子地图链接 (by Wulian233) GP-4275: 基于实际屏幕分辨率添加游戏窗口分辨率选项 (by Wulian233) GP-4276: 优化版本号排序规则 (by Glavo) GP-4282: 支持解析 Indev 版本号 (by Glavo) GP-4285, GP-4292, GP-4297, GP-4301, GP-4306, GP-4310: 优化 TaskListPane (by Glavo) GP-4293: 在 macOS 上禁止最大化和全屏模式 (by Glavo) GP-4323: HintPane 使用新版 Bootstrap 调色盘 (by 辞庐) GP-4329: 将 URI 中的错误代理对编码为 U+FFFD (by...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.16.291.html", + "teaser": null + },{ + "title": "3.6.16.292", + "excerpt":"详细版本介绍:cv42887511 添加文言文翻译 (by Glavo, Andypsl8, Wulian233) (BV1vNh9zqEEP) GP-4346: 添加乌克兰语翻译 (by BANSAFAn) GP-4294: 游戏崩溃窗口中增加对拍照的提醒 (by YuChuXi) GP-4311: 使用 Java 11 打开启动器时显示弃用警告 (by Glavo) GP-4338: 不对回环地址应用代理 (by Glavo) GP-4340: 增加 TaskListPane 中任务条目之间的间距 (by Glavo) GP-4341: 更严格地检测文件名合法性 (by Glavo) GP-4342: 导出启动器日志时解压旧日志 (by Burning_TNT) GP-4349: 启动游戏时隐藏 GameAssetDownloadTask (by Glavo) GP-4353: 优化自动切换游戏语言功能 (by Glavo) 错误修复:...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.16.292.html", + "teaser": null + },{ + "title": "3.6.16.293", + "excerpt":"详细版本介绍: cv42962968 GP-4272: 支持自动安装 Cleanroom (by 辞庐, zkitefly) GP-4370: 优化 Linux/FreeBSD 平台的默认中文字体查询机制 (by Glavo) GP-4372: 优化 Minecraft Wiki 跳转功能 (by Glavo) GP-4376: 将「版本」重命名为「实例」(by 3gf8jv4dv) GP-4379: 增强本地化支持 (by Glavo) GP-4387: 优化文言文翻译 (by dovisutu, 物灵, Bei Dou, 繁繁芙芙, Kaohaaa, 365KW, Andypsl8, Au0727, threwd, vinds476283) GP-4388: 更新 microsoft_auth.html (by Glavo) GP-4394: 重构 Config...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.16.293.html", + "teaser": null + },{ + "title": "3.6.17.294", + "excerpt":"详细版本介绍: cv43036782 GP-4452: 使用 Java 17 构建 HMCL (by Glavo) GP-4415: 序列化不透明的 Color 时省略 Alpha 通道的值 (by Glavo) GP-4413: 文言时间使用古代时辰格式 (by Glavo) GP-4439: 更新模组和整合包数据 (by Glavo) GP-4414: 检测到配置文件由高版本启动器创建时禁止保存配置文件 (by Glavo) GP-4455: 优化对于 ISO 639-3 语言代码的支持 (by Glavo) GP-4467: 在标签文本溢出时使用 Tooltip 显示完整文本 (需要 JavaFX 23+) (by Glavo) 错误修复: GP-4437: 修复 backgroundType...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.17.294.html", + "teaser": null + },{ + "title": "3.6.17.296", + "excerpt":"详细版本介绍: cv43101143 GP-4454: 将默认 JavaFX 版本更新至 21.0.8/25 (by Glavo) GP-4490: 将 Gson 更新至 2.13.2 (by Glavo) GP-4263: 世界管理页面新增删除世界功能 (by Wulian233) GP-4474: 主页下载选项卡的 Tooltip 中添加光影下载相关说明 (by Wulian233) GP-4487: 在未启用 JIT 或硬件渲染加速的环境中启动时弹出提示 (by Glavo) GP-4462: 缓存文件时遵循 Cache-Control 标头的配置 (by Glavo) GP-4502: 从 java.io.File 迁移至 NIO (by Glavo) GP-4506: 使用 Java 25 启动游戏时默认开启压缩对象头...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.17.296.html", + "teaser": null + },{ + "title": "3.6.18.297", + "excerpt":"详细版本介绍: cv43205532 GP-4520: 将 Gradle 更新至 9.1.0 (by Glavo) GP-4549: 将 JNA 更新至 5.18.0 (by Glavo) GP-4509: 支持在“实例管理”按钮上通过滚动滚轮切换游戏实例 (by Glavo) GP-4525: 优化本地化支持 (by Glavo) GP-4527: 支持颠倒的英语 (by Glavo) GP-4532: 将 boot.properties 翻译至西班牙语 (by 3gf8jv4dv) GP-4546: 重构 FetchTask 以使用 HttpClient 和虚拟线程 (by Glavo) 优化软件文案,修订翻译 (by 3gf8jv4dv) 错误修复: GP-4296: 修复切换下载源后需要重启启动器才会生效的问题 (by Glavo)...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.6/3.6.18.297.html", + "teaser": null + },{ + "title": "3.7.0.300", + "excerpt":"详细版本介绍: cv43252149 GP-4215: 在启动器中内置 Terracotta | 陶瓦联机 (by Burning_TNT) Terracotta | 陶瓦联机 是第三方提供的开源免费联机工具,基于 EasyTier 开源项目开发。 我们基于该工具为所有用户免费提供开箱即用的联机功能。 详情请参见这篇文章: HMCL x Terracotta | 陶瓦联机全面开放 GP-4566: 更新模组下载页游戏版本列表至 1.21.9 (by 3gf8jv4dv) GP-3229: 优化模组管理布局 (by zkitefly) GP-4521: 支持通过环境变量控制 UI 缩放比例 (by Glavo) GP-4577: 优化对颠倒的英语的支持 (by Glavo) GP-4592: 更新中文(文言)环境中其他语言名称的译法 (by 3gf8jv4dv) 错误修复: GP-4568: 修复在短时间内连续点击“行按钮”只会更改一次状态的问题 (by 辞庐)...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.7/3.7.0.300.html", + "teaser": null + },{ + "title": "3.7.0.301", + "excerpt":"详细版本介绍: cv43345643 GP-4608: 更新陶瓦联机至 0.3.10 (by Burning_TNT) GP-4617: 更新 authlib-injector 至 1.2.6 (by 辞庐) GP-4626: 更新模组下载页游戏版本列表至 1.21.10 (by Glavo) GP-4621, GP-4636, GP-4638, GP-4659: 优化模组管理页面 (by Glavo) GP-4641, GP-4652, GP-4654, GP-4658: 支持读取更多模组的元数据 (by Glavo) GP-3231: 优先使用模组名称匹配模组翻译 (by Zkitefly) GP-4601: 在全局设置中储存是否曾向用户展示过陶瓦联机用户须知 (by Burning_TNT) GP-4609: 隐藏空的陶瓦联机玩家列表 (by Burning_TNT) GP-4611: 更新陶瓦联机时显示反馈收集表 (by Burning_TNT) GP-4622:...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.7/3.7.0.301.html", + "teaser": null + },{ + "title": "3.7.0.302", + "excerpt":"详细版本介绍: cv43370363 错误修复: GP-4665: 排序模组时忽略文件名大小写 (by Glavo) GP-4674: 修复不在场景中的按钮尝试取消自身焦点时触发 NPE 的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.7/3.7.0.302.html", + "teaser": null + },{ + "title": "3.8.0.303", + "excerpt":"详细版本介绍: cv43416106 GP-4681: 将 HMCLauncher 更新至 3.7.0.1 (by Glavo) GP-4682: 将陶瓦联机更新至 0.3.10 (by Burning_TNT) GP-4688: 调整陶瓦联机界面左侧按钮 (by Glavo) GP-4686: 优化陶瓦联机用户须知对话框 (by Glavo) GP-4695: 删除 VersionPage.Skin 中未使用的 BorderPane (by Glavo) GP-4694: 优化 Task 的资源占用 (by Glavo) GP-4687: 优化陶瓦联机的复制邀请码功能 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.8/3.8.0.303.html", + "teaser": null + },{ + "title": "3.8.0.304", + "excerpt":"详细版本介绍: cv43498590 GP-4675: 通过解析 IANA 语言子标签注册表增强本地化功能 (by Glavo) GP-4700: 当且仅当用户位于中国大陆地区时尝试从镜像源下载陶瓦联机 (by Burning_TNT) GP-4705: 在陶瓦联机界面的启动游戏按钮中显示当前实例名称 (by Glavo) GP-4703: 优化更新日志展示功能 (by Glavo) GP-4709: 本地化下载速度显示 (by Glavo) GP-4712: 优化软件文案,修订翻译 (by 3gf8jv4dv) GP-4697: 优化没有可启动的游戏时的提示 (by Glavo) GP-4696: 在外部链接按钮上安装 Tooltip (by neveler) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.8/3.8.0.304.html", + "teaser": null + },{ + "title": "3.8.0.305", + "excerpt":"详细版本介绍: cv43527381 GP-4724: Bump Terracotta to 0.3.12 (by Burning_TNT) GP-4698: 在被打包为 macOS App 时不设置 macOS Dock 栏图标 (by YiZhiMCQiu) GP-4727: 将官方群组入口重新移动到主界面 (by Glavo) 错误修复: GP-4721: 修复 JFXListViewSkin 创建大量平台线程的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.8/3.8.0.305.html", + "teaser": null + },{ + "title": "3.8.0.306", + "excerpt":"详细版本介绍: cv43585405 GP-4723: 将陶瓦联机更新至 0.3.13 (by Burning_TNT) GP-4742: 更新 Chunkbase 种子地图链接 (by Wulian233) GP-4735: 在不支持的平台上打开陶瓦联机页面时弹出提示 (by Glavo) GP-4734: 调整模组管理页面“模组文件夹”按钮的文本 (by 3gf8jv4dv) GP-4743: 优化检查更新日志的方式 (by Glavo) GP-4749: 恢复对 JavaFX 14 的兼容性 (by Glavo) 错误修复: GP-4736: 修复 FreeBSD x86-64 平台上错误地将所有版本视作未经测试的版本的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.8/3.8.0.306.html", + "teaser": null + },{ + "title": "3.8.0.307", + "excerpt":"详细版本介绍: cv43667929 GP-4770: 更新模组数据 (2025-11-07) (by Glavo) GP-4767: 添加对 25w45a_unobfuscated 的支持 (by Glavo) GP-4760: 从注册表中读取 Windows 版本信息 (by Glavo) GP-4540: 删除实例失败时弹出对话框 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/dev/3.8/3.8.0.307.html", + "teaser": null + },{ + "title": "3.8.0.310", + "excerpt":"详细版本介绍: cv43826997 GP-4780, GP-4790, GP-4803, GP-4815: 优化界面动画效果 (by Glavo) GP-4829: 添加对 1.21.11-pre1/2_unobfuscated 的支持 (by mineDiamond) GP-4796: 将 Gradle 更新至 9.2.0 (by Glavo) GP-4798: 将 jsoup 更新至 1.21.2 (by Glavo) GP-4799: 将 JNA 更新至 5.18.1 (by Glavo) GP-4838: 将陶瓦联机更新至 0.3.14 (by Burning_TNT) GP-4782: 添加对 25w46a_unobfuscated 的支持 (by Glavo) GP-4779: 预加载页面以减少动画卡顿 (by...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.8/3.8.0.310.html", + "teaser": null + },{ + "title": "3.9.0.311", + "excerpt":"详细版本介绍: cv43951420 GP-4835: 更新至 Material Design 3 颜色系统 (by Glavo) GP-4837: 实验性支持阿拉伯语 (by Hommam-Prom) GP-4845: 更新 AMD 显卡信息数据 (by 辞庐) GP-4865: 使用 JFXColorPicker 代替 ColorPicker (by Glavo) GP-4856: 优化下载源选择逻辑 (by Glavo) GP-4788: 优化模组下载对话框文本翻译 (by 3gf8jv4dv) GP-4886: 优化对 Linux MIPS64el 平台的支持 (by Glavo) GP-4870: 添加对 1.21.11-pre3_unobfuscated 的支持 (by mineDiamond) GP-4869: 在陶瓦联机页面向非中国内地用户添加提示框...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.9/3.9.0.311.html", + "teaser": null + },{ + "title": "3.9.0.313", + "excerpt":"详细版本介绍: cv44304232 GP-4992: 将 authlib-injector 更新至 1.2.7 (by Burning_TNT) GP-4144: 添加输出游戏调试日志选项 (by 辞庐) GP-4475: 添加资源包管理功能 (by 辞庐) GP-4899, GP-4903, GP-4912, GP-4910, GP-4947, GP-4943, GP-4948, GP-4952, GP-4953: 优化深色模式支持 (by Glavo, Wulian233) GP-4915: 在 HintPane 提示框中为图标和文本添加间距 (by neveler) GP-4917: 适配 Minecraft 新版本号规则 (by Glavo) GP-4911, GP-4963: 添加对 1.21.11_unobfuscated 及其预发布版的支持 (by mineDiamond) GP-4854:...","categories": [], + "tags": [], + "url": "/changelogs/dev/3.9/3.9.0.313.html", + "teaser": null + },{ + "title": "3.10.1", + "excerpt":"详细版本介绍 (Bilibili) 启动器 GP-4289: 在添加游戏目录页面选择目录时自动填写名称 (by Dime, 辞庐, Glavo) GP-4882: 取消部分控件的连点限制 (by 辞庐) GP-5024: 使用副标题显示重启生效提示 (by neveler) GP-5032: 优化文本输入对话框体验 (by mineDiamond) GP-5035: 在非 Windows 平台也将文件名中的 : 视为非法字符 (by 辞庐) GP-5056: 优化列表滚动时的性能 (by Glavo) GP-5060: 优化独立窗口中对话框的样式 (by 辞庐) GP-5062: 更新 NBT 标签图标 (by mineDiamond) GP-5077: 优化设置页面内边距 (by neveler) GP-5082: 更新关于页面的版权年份至 2026...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.10/3.10.1.html", + "teaser": null + },{ + "title": "3.10.2", + "excerpt":"详细版本介绍 (Bilibili) 世界管理 GP-5198: 将世界管理界面“生成启动脚本”按钮折叠到二级菜单 (by Glavo) 错误修复 GP-5239: 修复下载页面滚动时图标未及时更新的问题 (by Glavo) GP-5243: 修复实例列表中可能意外出现水平滚动条的问题 (by OrzMiku) GP-5251: 修复自动安装界面卡片上按钮无法点击的问题 (by OrzMiku) GP-5257: 修复 Cleanroom 本地安装完成后会删除安装器的问题 (by 辞庐) GP-5261: 修复下载页面选择游戏版本对话框包含 _unobfuscated 版本的问题 (by Glavo) GP-5262: 修复使用 GIF 背景时调整背景不透明度导致启动器崩溃的问题 (by Glavo) GP-5267: 修复 Unzipper 解压空 zip 文件时抛出异常的问题 (by Glavo) GP-5305: 修复返回页面时可能卡进空白页面的问题 (by 辞庐)...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.10/3.10.2.html", + "teaser": null + },{ + "title": "3.10.3", + "excerpt":"详细版本介绍 (Bilibili) 联机 GP-5504: 修复陶瓦联机无法正常使用的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.10/3.10.3.html", + "teaser": null + },{ + "title": "3.10.4", + "excerpt":"详细版本介绍 (Bilibili) 错误修复 GP-5265: 修复未正确为游戏设置 java.net.useSystemProxies JVM 参数的问题 (by Xirren) GP-5508: 修复部分请求头中 Accept-Language 字段包含 Java 版本的问题 (by Glavo) GP-5550: 修复安装整合包时任务弹窗可能空白的问题 (by 辞庐) GP-5585: 修复下载源失效时刷新版本列表不会回退到备用下载源的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.10/3.10.4.html", + "teaser": null + },{ + "title": "3.11.1", + "excerpt":"详细版本介绍 (Bilibili) 启动器 GP-5391: 将 XZ for Java 更新至 1.11 (by Glavo) GP-5390: 将 TwelveMonkeys 更新至 3.13.0 (by Glavo) GP-5392: 将 Gradle Shadow 插件更新至 9.3.1 (by Glavo) GP-4733: 导出日志时允许重名文件 (by Glavo) GP-5172: 支持通过拖动标题栏退出最大化 (by neveler) GP-5259, GP-5272: 优化非法路径检查 (by 辞庐) GP-5273: 优化游戏代理参数设置 (by Glavo) GP-5274: 对 Java 26 默认启用压缩对象头 (by...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.11/3.11.1.html", + "teaser": null + },{ + "title": "3.11.2", + "excerpt":"详细版本介绍 (Bilibili) 账户 GP-5610: 优化设备代码流登录流程 (by Glavo) 错误修复 GP-5550: 修复安装整合包时任务弹窗可能空白的问题 (by 辞庐) GP-5549: 修复微软登录报错的超链接显示 (by Xirren) GP-5584: 修复打开登录微软对话框时加载指示器一闪而过的问题 (by 辞庐) GP-5585, GP-5602: 修复下载源失效时刷新版本列表不会回退到备用下载源的问题 (by Glavo) GP-5575: 修复无法使用授权代码流登录微软账户的问题 (by 辞庐) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.11/3.11.2.html", + "teaser": null + },{ + "title": "3.2.130", + "excerpt":"启动器 在启动器更新时显示更新日志 启动前检查是否是 Java 8~10 https://www.huangyuhui.net/index.php/2019/01/27/83/支持整合包自带 Java 运时 在缓存目录无效时自动更改设置 在登录对话框中添加注册链接 将游戏依赖的动态链接库解压到 .minecraft 中而不是系统临时文件夹 更新 authlib-injector 自动安装 只从 BMCLAPI 获取 Forge、OptiFine 列表 添加 BMCLAPI 赞助信息 支持 Forge 1.13 的自动安装 支持 Forge、LiteLoader、OptiFine 的手动更新 添加提示部分版本的 Forge 和 LiteLoader 不兼容的问题 下载库文件失败时提供更友好的提示 安装游戏时更新资源文件 启动时下载缺失的 Minecraft 本体文件 在安装游戏失败时删除不完全的游戏 游戏管理 支持对 Fabric 模组的管理 支持数据包列表页面、模组管理面板多选 添加刷新模组列表的按钮 在未安装 Mod...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.2/3.2.130.html", + "teaser": null + },{ + "title": "3.2.139", + "excerpt":"启动器 添加西班牙语,更新英语、俄语翻译 主页面按回车键启动游戏 游戏列表内点击列表项进入游戏设置,右键列表项打开游戏管理菜单 不再强制使用 java.exe 日志窗口允许关闭自动滚动 避免安装游戏时输入的游戏名称不符合 Windows 系统要求 修复输入某些错误的 Java 路径时崩溃的问题 修复浏览 Mod 列表可能出现的崩溃问题 修复无法识别 Java 12、13 的问题 自动安装 添加 Fabric 自动安装 新安装的游戏可以修改游戏版本 修复 OptiFine 自动安装 修复同时安装 Forge 和 OptiFine 自动安装失败的问题 修复某些情况下无法安装 1.12.2 及以下版本的 Forge 的问题 修复导出整合包导入时无法安装 1.13 Forge 和 OptiFine 的问题 修复部分情况下无法下载 Forge 安装包的问题 修复无法安装 1.14 和...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.2/3.2.139.html", + "teaser": null + },{ + "title": "3.2.149", + "excerpt":"启动器 改进部分错误提示 更新繁体中文语言文件 在主界面账户栏添加鼠标滚轮便捷切换游戏账户 在主界面账户栏添加鼠标悬浮提示以查看完整游戏名 修复原版游戏用熔炉图标标识的问题 修复无法取消启动过程和安装过程的问题 修复无法启动使用 Vivecraft 安装器新安装的游戏的问题 修复启动 1.15 时不会停止等待的问题 修复 Windows 下导出启动脚本对双引号的错误转义 修复部分正版账号登录 1.7.10 会导致游戏崩溃的问题 修复关闭 JVM 检查时仍然会检查 java.exe 是否合法的问题 修复使用 BMCLAPI 不能下载 authlib-injector 和加载游戏列表的问题 自动安装 添加 MCBBS 下载源 在资源索引文件不合法时尝试重新下载 添加 Fabric 的 BMCLAPI 和 MCBBS 下载源支持 现官方下载源下载 Forge 时依赖文件不再强制从 BMCLAPI 下载 修复重复下载游戏依赖文件的问题 整合包 导出整合包时将剔除所有日志文件和 CustomSkinLoader...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.2/3.2.149.html", + "teaser": null + },{ + "title": "3.3.172", + "excerpt":"启动器 修改界面 更新俄语翻译 改善游戏下载速度 添加复制游戏实例功能 添加清理缓存文件夹按钮 修改默认下载源为 MCBBS 提升与 ServerSync 的兼容性 添加为正版账号上传皮肤的功能 支持调整并记住启动器窗口大小 在日志窗口添加导出游戏日志功能 现在会校验资源索引文件的完整性 现在启动器代理设置对启动后的游戏有效 在启动游戏、安装游戏等界面显示总下载速度 游戏崩溃后显示游戏崩溃报告而不是游戏日志 允许在启动游戏按钮上滑动鼠标滚轮切换游戏 在删除 Mod、世界、数据包时弹出删除确认提示 允许使用在启动器同目录下的 authlib-injector.jar 文件 在游戏崩溃后的第二次启动时自动检查资源和支持库文件是否完整 添加启动器的 JVM 参数 -Dhmcl.font.override=fontfamily 以允许 Linux 用户更换字体以解决白屏问题 修复部分整合包无法修改启动时游戏窗口大小的问题 修复终止游戏后启动器不会停止等待的问题 修复 1.5.2 及以下版本不能下载资源文件的问题 修复某些情况下启动游戏时,启动器会崩溃的问题 修复进入游戏设置后无法重命名部分游戏版本的问题 修复不能在 Java 17 下载 Forge 和自动更新的问题 修复重命名版本时,输入不合法的新名字后的错误提示 修复重命名被依赖的版本后,会破坏其他依赖这个版本的版本的问题 修复在自定义游戏运行目录时,输入不合法的路径会导致崩溃的问题 修复在输入特定错误的 authlib-injector...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.3/3.3.172.html", + "teaser": null + },{ + "title": "3.3.188", + "excerpt":"启动器 修改界面 更新俄语翻译 改善游戏下载速度 添加复制游戏实例功能 支持微软正版账户登录 自动设置游戏的默认语言为中文 兼容 Java11+,在 Java 11+ 上运行时会自动下载 JavaFX 配置文件会优先选择启动器同目录而不是工作目录 支持 Authlib-injector 账户上传皮肤 支持 Authlib-injector 服务器用邮箱以外的账户登录 上传皮肤时自动检测 Steve、Alex 模型 刷新账户时将显示进度条 自定义本地库路径,允许 M1 设备运行 ARM 版本的 Minecraft 启动 Minecraft 1.17 时自动下载官方提供的 Java 16 允许第三方修改 HMCL 的 BMCLAPI 下载源,从而支持第三方下载源 自动检测系统内安装的 OpenJDK,包括 Liberica/Microsoft/Zulu/AdoptOpenJDK 修复启动 Minecraft 1.0 时不会停止等待游戏启动的问题 修复首次打开整合包会弹出 3...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.3/3.3.188.html", + "teaser": null + },{ + "title": "3.5.3", + "excerpt":"启动器 支持多人联机 自动选择新添加的 Authlib-injector 服务器 添加修改离线账户皮肤的功能,允许使用本地图片和 LittleSkin 等皮肤站 自动检测系统内安装的 OpenJDK,包括 Liberica/Microsoft/Zulu/AdoptOpenJDK 允许修改启动器字体 游戏崩溃时提供崩溃分析报告 添加帮助页面 更换默认背景图 修复微软登录页可能白屏的问题 任意页面按 ESC 键可返回上一页 修复启动器打开时提示找不到 DST ROOT CA X3 证书的问题 修复对系统平台的识别错误导致部分平台不能正确下载 JavaFX 的问题 修复 Log4j 远程代码执行漏洞 游戏启动 支持官方启动器为 Minecraft 启动参数提供的一些占位符 兼容 TLauncher 游戏客户端 如果在 macOS/Windows ARM 设备上使用 HMCL,HMCL 会优先使用 x86 的 JDK 运行游戏 解决 Java...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.5/3.5.3.html", + "teaser": null + },{ + "title": "3.5.4", + "excerpt":"启动器 多人联机功能暂时下线维护 详情 不再支持添加 Mojang 账户 迁移至微软账户 默认在用户文件夹中存储账户信息,提高安全性 优化性能与资源占用,解决卡顿问题 优化文本提示 优化自动内存分配功能 优化游戏 JVM 参数,改善游戏性能 优化自动选择 Java 功能 优化自动下载 Java 功能 优化微软账户登录功能 支持 Gif 格式背景图 优化高分辨率屏幕上图标的显示效果 更新反馈页面 默认加入 Little Skin 登录选项 为 Linux 提供 sh 格式构建 新添加 JVM 选项 -Dhmcl.home,允许用户自行指定 HMCL_DIRECTORY 下载 支持整合包下载页使用中文搜索 支持下载安装 Modrinth 整合包 支持 Quilt 自动安装 默认将搜索排序修改为“热度” 游戏设置...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.5/3.5.4.html", + "teaser": null + },{ + "title": "3.5.5", + "excerpt":"启动器 拒绝在被 Fractureiser 病毒感染的设备上启动 HMCL(若检测到将会提示并退出,详情) 检测 HMCL 是否处于 macOS 上的 App Translocation(macOS 使用了 App Translocation 机制,可能会自动将 HMCL 移动至 /private/var/folders 中的临时文件夹内,导致用户关闭 HMCL 后游戏数据和设置丢失) 日志分析窗口中显示物理内存大小 更新 Minecraft 购买链接 优化 SSL 异常报错信息 添加更多日志分析规则 更新游戏版本号检测性能 添加隐藏测试版提示开关 在 Linux 上支持 MESA_LOADER_DRIVER_OVERRIDE 环境变量,适配 Zink 驱动程序 更新翻译 下载 更新搜索版本号 游戏设置 添加删除游戏资源文件按钮 将版本高级设置拆分至单独页面中 添加环境变量设置 添加渲染器设置 跨平台 添加 Linux...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.5/3.5.5.html", + "teaser": null + },{ + "title": "3.5.6", + "excerpt":"GP-2864: 改善在非 Windows 平台任务栏图标的质量 GP-2859: 修复 Forge 和 NeoForge 安装失败的问题 GP-2840: 修复 Linux RISC-V 64 平台的支持 GP-2846: 修复使用 Java 19+ 启动游戏时,游戏 JVM 字符编码参数错误导致控制台乱码的问题 GP-2857: 修复搜索页面搜索结果为空,即总页面为 0 时点击最后一页按钮会跳转到不存在的页面导致无法正常使用的问题,现在会自动禁用该按钮 GP-2858: 修复 Windows 下自定义命令中使用 $INST_DIR 等带有反斜杠的内容会错误触发转义导致路径错误的问题 GP-2859: 修复启动器在版本 JSON 缺失 Patches 信息时无法获得游戏版本,导致游戏启动参数重复、管理版本表现不正确等问题 GP-2836: 更新启动器发布页至官网,而不是 MCBBS GP-2700: 优化游戏版本比较规则,现在模组下载界面能够正常排序 Minecraft 正式版、快照版或其他版本了 GP-2805: 默认开启自动选择并发数 GC-9361719、GC-420d77d、GP-2839: 移除...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.5/3.5.6.html", + "teaser": null + },{ + "title": "3.5.7", + "excerpt":"启动器 GP-2929、GP-2904、GP-2915: 更新翻译 GP-2905: 更改语言选项添加重启后生效的提示 GP-2885: 在 Linux 系统上且处于未知桌面环境时,禁用删除至回收站功能 GP-2889: 删除 Mojang 登录支持 GP-2897: 主界面移除联机大厅按钮,添加引导用户进入官方 QQ 群的按钮 GP-2888: 移除设置 - 赞助页面 GP-2862: 默认不进行降级更新(手动切换更新源时依然会正常提示) 下载 GP-2921: 允许使用系统属性禁用系统代理 GP-2917: 不再尝试下载 .pack.xz 文件 GP-2921: 当系统属性 java.net.useSystemProxies 被设置为 false 时不再使用系统代理 GP-2912: 当下载失败时,打印重定向链至日志 GP-2916: 在 CurseForge 下载源中搜索时始终会按照模组标题与关键词的相似性排序 GP-2886: 自动下载 Java 支持下载 Java 21 外观 GP-2856:...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.5/3.5.7.html", + "teaser": null + },{ + "title": "3.5.8", + "excerpt":" 启动器 GP-2947: 更新模组和整合包翻译信息 GP-2951: 优化了启动器长期运行后的性能表现 GP-2942: 游戏版本的图标现在支持 JPG、GIF 等格式 GP-2950: 启动器启动后,将自动加载同目录下的 font.ttf 或 font.otf 下载 GP-2958: 还原对 MCBBS 的鸣谢。谢谢你,MCBBS! GP-3031: 适配新版本 NeoForge 模组,修复部分模组无法被正确识别的问题 GP-3045: 支持自动安装 Java 21 错误修复 GP-2943: 修复了高版本启动器内皮肤预览与游戏内真实皮肤不匹配的问题 GP-2986: 修复了微软登录部分情况下会错误提示“没有购买记录”的问题 GP-2989: 修复部分情况下,整合包导入会失败的问题 GP-2994: 修复自动安装界面 NeoForge 图标在高分辨率屏幕上会很模糊的问题 ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.5/3.5.8.html", + "teaser": null + },{ + "title": "3.5.9", + "excerpt":"启动器 GP-3121、GP-3194: 微软登录界面对 Xbox 400 错误给予提示 GP-3097: 更新 Linux ARM64 支持 GP-3197: 优化对 Linux RISC-V 64、FreeBSD x86-64 平台的支持 GP-3058: 支持解析更多游戏版本号 GP-3092: 移除 KOOK 入口 下载 GP-3023: 特定游戏设置 - 自动安装 中禁止升级或卸载由其他启动器安装的游戏组件 GP-3089、GP-3114: 优化 下载 - 模组 中模组版本推荐逻辑 外观 GP-3181: 支持使用 HMCL_FONT 环境变量指定字体 错误修复 GP-2838: 修复本地模组查看信息时标签错误的问题 GP-3023: 修复 1.20.4 版本 Forge 和...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.5/3.5.9.html", + "teaser": null + },{ + "title": "3.6.11", + "excerpt":"启动器 GP-3233: 在 Linux/FreeBSD 平台打开日志、模组等位置时会选中该文件 GP-3274: 优化日志窗口 GP-2988: 添加 Java 管理页面,优化查找、下载、自动选择 Java 等功能 (BV1WvCUY4EwK) GP-3280: 在删除账户和认证服务器时弹出确认提示 GP-3314: 优化 Linux/FreeBSD 平台上显示的系统信息 GP-3282: 发现更新弹窗添加取消按钮 GP-3237: 设置页面添加打开启动器日志文件夹按钮 GP-3264: 在 Linux LoongArch64 平台支持 Minecraft 1.20.2+ GP-3234: 在安装新游戏版本页面的默认游戏版本名称中包含已选择的加载器名称 GP-3221: 模组管理搜索操作更改为文本更新后触发 GP-3375: 支持微软账户上传皮肤 GP-3032: 检查模组更新界面加入全选/取消全选复选框 GP-3373: 更新模组下载页游戏版本列表至 1.21.3 GP-3232: 支持在模组管理页面通过右键单击模组查看模组详情 GP-3427: 更新 EXE 图标 GP-3435: 在游戏下载列表中添加...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.6/3.6.11.html", + "teaser": null + },{ + "title": "3.6.12", + "excerpt":"版本介绍:cv41174209 启动器 GP-3457: 实验性支持 WebP 格式的背景图片 GP-3523: 模组列表页中按下 ESC 键时取消选中 GP-3601: 更新模组数据 GP-3603: 支持临时隐藏预览版提示 GP-3610, GP-3613: 统一并优化软件内日期时间格式 GP-3619: 在启动器日志中记录处理器型号(仅 Windows) GP-3620: 修改整合包下载对话框内「安装到当前版本」按钮的文本为「安装整合包」,修正对话框标题 GP-3621: 点击安装整合包时无条件关闭整合包下载对话框 GP-3629: 删除全局游戏设置页面的离线账户更换皮肤提示 GP-3628: 在版本的游戏设置中添加「复制全局游戏设置」选项 GP-3650: 点击账户卡片空白处时切换账户 GP-3653: 优化 NBT 查看器,修复无法打开空 mca/mcr 文件的问题 GP-3663: 启动时尝试从 HMCL_DIRECTORY 中加载字体 GP-3665, GP-3673: 支持双击复制世界信息、安装 Java 页面信息、模组详情对话框信息 GP-3689: 在世界管理界面显示世界图标 GP-3675: 更新 Microsoft...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.6/3.6.12.html", + "teaser": null + },{ + "title": "3.6.14", + "excerpt":"版本介绍: cv42290390 启动器 GP-3938: 使用 Java 8 打开启动器时弹出弃用警告 (by Glavo) GP-4032: 使用 Java 8 运行时禁止更新 (by Glavo) GP-3854: 右键主页“启动游戏”按钮时展开版本列表菜单 (by Glavo) GP-3875: 使用工作路径下的 .hmcl 文件夹存放所有配置文件 (by Glavo) GP-3914: 启动时在日志中记录用户设备的 CPU 信息 (by Glavo) GP-3893: 启动时在日志中记录用户设备的 GPU 信息 (by Glavo) GP-3974: 更新日志中仅显示本次更新内容 (by Wulian233) GP-4040: 更新模组数据 (by Glavo) 游戏管理 GP-3734: 折叠高级设置中不适用于当前系统的选项...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.6/3.6.14.html", + "teaser": null + },{ + "title": "3.6.15", + "excerpt":" 下载 GP-4085: 更新模组下载页游戏版本列表至 1.21.8 (by Glavo) 错误修复 GP-4086: 修复安装 Oracle JDK 后可能无法使用启动器的问题 (by Glavo) GP-4096: 修复无法使用部分日志字体的问题 (by Glavo) GP-4097: 修复 InstallersPage 可能意外地显示滚动条的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.6/3.6.15.html", + "teaser": null + },{ + "title": "3.6.16", + "excerpt":" 启动器 GP-4262: 更新 AMD 显卡信息 (by Glavo) GP-4274: 更新 chunkbase 种子地图链接 (by Wulian233) 错误修复: GP-4174: 修复无法从 BMCLAPI 下载部分 NeoForge 所需文件的问题 (by 辞庐) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.6/3.6.16.html", + "teaser": null + },{ + "title": "3.6.17", + "excerpt":"版本介绍: cv43005407 启动器 GP-4422: 弃用 Java 11 支持 (by Glavo) GP-4164: 支持通过环境变量强制使用 GPU 渲染和控制动画帧率 (by Glavo) GP-4179: 在 ./.hmcl/java 中搜索 Java (by Glavo) GP-4365: 修复首次打开子页面时切换动画丢失的问题 (by Glavo) GP-4439: 更新模组和整合包数据 (by Glavo) GP-4414: 检测到配置文件由高版本启动器创建时禁止保存配置文件 (by Glavo) 游戏管理 GP-4224: 支持在 Windows 7/8/8.1 上使用软渲染器 (by Glavo) 下载 GP-4170: 模组下载列表翻页后自动回到顶部 (by 辞庐) GP-4171: 支持加载...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.6/3.6.17.html", + "teaser": null + },{ + "title": "3.6.18", + "excerpt":"版本介绍: cv43162536 游戏管理 GP-4515: 优化 Java 自动选择规则 (by Glavo) 错误修复 GP-4508: 修复使用 JavaFX 25 时游戏下载界面布局错误的问题 (by Glavo) GP-4465: 修复启用代理身份认证且未设置密码时启动器崩溃的问题 (by Glavo) GP-4466: 修复滚动切换游戏实例/账户功能 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.6/3.6.18.html", + "teaser": null + },{ + "title": "3.6.20", + "excerpt":"版本介绍: cv43348716 启动器 GP-4223: 在“设置 > 通用”添加“提前预览 HMCL 版本”选项 (by Glavo) 详情请见完整更新日志: cv43348716 GP-4088: 当离线账户名称超过 16 字符时弹出警告 (by ShulkerSakura) 下载 GP-4120: 更新 unlisted-versions-of-minecraft 镜像源地址 (by 8Mi_Yile) GP-4626: 更新模组下载页游戏版本列表至 1.21.10 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.6/3.6.20.html", + "teaser": null + },{ + "title": "3.7.1", + "excerpt":"详细版本介绍: cv43400451 启动器 GP-4452: 将最低 Java 版本提升至 Java 17 (by Glavo) GP-4454: 将默认 JavaFX 版本更新至 21.0.8/25 (by Glavo) GP-4439: 更新模组和整合包数据 (by Glavo) GP-4064: 优化主页公告关闭按钮 (by 辞庐) GP-4145: 在 Windows 平台优先使用注册表探测 GPU (by Glavo) GP-4163: 通过主页右下角弹出菜单切换版本后隐藏菜单 (by Glavo) GP-4142: 忽略 %ProgramFiles%\\Common Files\\Oracle\\Java 中的 Java (by Glavo) GP-4180: 支持搜索不包含 release 文件的 Java...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.7/3.7.1.html", + "teaser": null + },{ + "title": "3.7.2", + "excerpt":"详细版本介绍: cv43439723 GP-4682: 将陶瓦联机更新至 0.3.10 (by Burning_TNT) GP-4688: 调整陶瓦联机界面左侧按钮 (by Glavo) GP-4686: 优化陶瓦联机用户须知对话框 (by Glavo) GP-4687: 优化陶瓦联机的复制邀请码功能 (by Glavo) GP-4700: 当且仅当用户位于中国大陆地区时尝试从镜像源下载陶瓦联机 (by Burning_TNT) GP-4705: 在陶瓦联机界面的启动游戏按钮中显示当前实例名称 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.7/3.7.2.html", + "teaser": null + },{ + "title": "3.7.3", + "excerpt":"详细版本介绍: cv43540463 启动器 GP-4727: 将官方群组入口重新移动到主界面 (by Glavo) 联机 GP-4724: 将陶瓦联机更新至 0.3.12 (by Burning_TNT) 错误修复 GP-4721: 修复 JFXListViewSkin 创建大量平台线程的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.7/3.7.3.html", + "teaser": null + },{ + "title": "3.7.5", + "excerpt":"详细版本介绍: cv43648491 启动器 GP-4742: 更新 Chunkbase 种子地图链接 (by Wulian233) 联机 GP-4723: 将陶瓦联机更新至 0.3.13 (by Burning_TNT) GP-4735: 在不支持的平台上打开陶瓦联机页面时弹出提示 (by Glavo) 错误修复 GP-4736: 修复 FreeBSD x86-64 平台上错误的将所有版本视作未经测试的版本的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.7/3.7.5.html", + "teaser": null + },{ + "title": "3.7.6", + "excerpt":"详细版本介绍: cv43836292 下载 GP-4767: 添加对 25w45a_unobfuscated 的支持 (by Glavo) GP-4782: 添加对 25w46a_unobfuscated 的支持 (by Glavo) GP-4829: 添加对 1.21.11-pre1/2_unobfuscated 的支持 (by mineDiamond) GP-4841: 更新 HMCL 元数据链接 (by Glavo) 联机 GP-4816: 更新陶瓦联机用户须知 (by Glavo) GP-4838: 将陶瓦联机更新至 0.3.14 (by Burning_TNT) 错误修复 GP-4795: 修复初次打开部分页面时页面闪烁的问题 (by Glavo) GP-4808: 修复 Windows 下全局设置中本地库路径路径分隔符显示错误的问题 (by 辞庐) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.7/3.7.6.html", + "teaser": null + },{ + "title": "3.8.1", + "excerpt":"详细版本介绍: cv43836921 启动器 GP-4703, GP-4743: 优化更新日志展示功能 (by Glavo) GP-4696: 在外链按钮上添加 tooltip (by neveler) GP-4749: 恢复对 JavaFX 14 的兼容性 (by Glavo) GP-4760: 从注册表中读取 Windows 版本信息 (by Glavo) GP-4540: 删除实例失败时弹出对话框 (by Glavo) GP-4770: 更新模组数据 (by Glavo) GP-4776: 优化游戏实例默认图标 (by Glavo) GP-4672: 优化数据包管理功能 (by mineDiamond) GP-4612: 增强解析数据包/资源包元数据的能力 (by mineDiamond) GP-4826: 从首页打开子页面时打开默认标签页 (by Glavo)...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.8/3.8.1.html", + "teaser": null + },{ + "title": "3.8.2", + "excerpt":"详细版本介绍 (Bilibili) 启动器 GP-4886: 优化对 Linux MIPS64el 平台的支持 (by Glavo) GP-4917: 支持 Minecraft 新版本号规则 (by Glavo) 错误修复 GP-4850: 修复 FetchTask 未设置 User-Agent 的问题 (by Glavo) GP-4913: 修复游戏进程结束时点击日志窗口的“结束游戏进程”按钮会导致启动器无响应的问题 (by Glavo) GP-4981: 修复从 BMCLAPI 下载部分旧文件时校验失败的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.8/3.8.2.html", + "teaser": null + },{ + "title": "3.9.1", + "excerpt":"详细版本介绍 (Bilibili) 启动器 GP-4837: 实验性支持阿拉伯语 (by Hommam-Prom) GP-4911, GP-4963: 添加对 1.21.11_unobfuscated 及其预发布版的支持 (by mineDiamond) GP-4927: 在 macOS 平台上导出启动脚本时支持导出 .command 文件 (by WhatDamon) GP-5019: 使用子标题注解“提前预览 HMCL 版本”选项 (by neveler) GP-5008: 优化反馈页面 (by Glavo) 游戏设置 GP-4144: 添加输出游戏调试日志选项 (by 辞庐) 实例管理 GP-4475: 添加资源包管理功能 (by 辞庐) GP-4872: 添加快速进入世界功能 (by mineDiamond) 账户管理 GP-4932: 在主页右键点击账户按钮时弹出快速切换账户菜单 (by...","categories": [], + "tags": [], + "url": "/changelogs/stable/3.9/3.9.1.html", + "teaser": null + },{ + "title": "3.9.2", + "excerpt":"详细版本介绍 (Bilibili) 启动器 GP-5046: 禁用日志窗口的平滑滚动效果 (by Glavo) GP-5052: 优化列表的平滑滚动效果 (by Glavo) GP-5110: 更新 NeoForge 版本号规则 (by 辞庐) 错误修复 GP-5128: 修复使用 BMCLAPI 下载源时选择 Liteloader 版本时可能报错的问题 (by Wulian233) GP-5125: 修复未正确归类 NeoForge alpha 版本的问题 (by 辞庐) GP-5220: 修复 CurseForge 源无法搜索到内容的问题 (by Glavo) ","categories": [], + "tags": [], + "url": "/changelogs/stable/3.9/3.9.2.html", + "teaser": null + },{ + "title": "贡献指南", + "excerpt":"如果你认为你有能力为 HMCL 添加高质量的帮助文档,或希望修改错误,你可以到 https://github.com/HMCL-dev/HMCL-docs 仓库中发 Pull Request,或者提 Issue。 或者你可以进入我们的 Discord 或 HMCL 用户群 群以向 HMCL 反馈。 ","categories": [], + "tags": [], + "url": "/contribution.html", + "teaser": null + },{ + "title": "寻求帮助", + "excerpt":"QQ 群聊 Hello Minecraft! Launcher 的官方 QQ 群聊。 点击前往 Discord 频道 Hello Minecraft! Launcher 的官方 Discord 频道。 点击前往 ","categories": [], + "tags": [], + "url": "/help.html", + "teaser": null + },{ + "title": "加入 HMCL 报错崩溃交流群", + "excerpt":" 加入群聊前请注意 游戏非正常退出时,请点击左下角 按钮(不是 按钮),并完整发送生成的报错压缩包 遇到其他问题时,请详细说明情况并提供相关截图,以便我们提供帮助 使用整合包时,请说明具体的整合包名称与版本 请保持耐心,群管理和群友会协助解决问题。严禁辱骂、催促他人 禁止讨论政治、色情、违法、金钱交易等敏感内容,禁止人身攻击、造谣诽谤等行为 禁止刷屏、灌水、挑起争端、发泄情绪等影响群聊秩序的行为 禁止使用第三方插件发送特殊消息;禁止讨论多人游戏作弊工具 本群仅支持 HMCL 启动器相关问题。PCL 启动器用户请加入 978054335 群 请勿重复发送文件,如需重新获取关注,请引用之前发送的消息 因人数限制,已解决问题的用户会被移出群聊。如遇新问题可再次加入 本群仅处理游戏崩溃相关问题,其他话题请到其他群讨论 请等待 5 秒,请认真阅读注意事项 我已了解 如果你遇到了游戏非正常退出问题,欢迎加入报错崩溃交流群咨询解决方案:Minecraft 报错崩溃交流群 (666546887) 本群仅处理游戏报错崩溃问题,无关话题请前往其他群聊讨论。 由于加群人数过多,我们会移出问题已解决的用户。如果你在被移出后遇到了新的问题需要求助,你可以再次加群。 ","categories": [], + "tags": [], + "url": "/crash-support-group.html", + "teaser": null + },{ + "title": "加入 HMCL 用户群", + "excerpt":"欢迎所有 Minecraft 玩家加入 HMCL 用户群,入群请遵守以下群规: 禁止谈论政治相关、色情、违法犯罪、金钱往来等敏感内容,禁止辱骂、造谣诽谤、恶俗等行为,禁止讨论精神疾病、LGBT 等话题,请尊重每一个人; 禁止刷屏、倒垃圾、引战、宣泄个人情绪、刻意误导等破坏讨论环境的行为; 禁止上传 EXE 和 APK 文件; 禁止使用第三方模块/插件在群聊中发送特殊消息; 禁止讨论多人游戏中的作弊工具; 禁止发布与 Minecraft 无关的广告,可以适当宣传服务器、整合包等相关内容,同一内容每人每周最多宣传一次; 用户群交流主题为 Minecraft,请不要过多讨论其他游戏内容。 用户群 以下为闲聊群,欢迎所有用户加入(同时加入多个群聊会被踢出): HMCL 用户群 ① (633640264)(已满) HMCL 用户群 ② (203232161) HMCL 用户群 ③ (201034984)(已满) HMCL 用户群 ④ (533529045)(已满) HMCL 用户群 ⑤ (744304553) HMCL 用户群 ⑥ (282845310)(已满) HMCL 用户群 ⑦ (482624681)...","categories": [], + "tags": [], + "url": "/groups.html", + "teaser": null + },{ + "title": "各大问题集合", + "excerpt":"这是一个提供给新手或小白的阅读文档,旨在用最简单的方式帮你快速上手 HMCL 启动器和 Minecraft 游戏。如需深入了解某个主题,可点击文中提供的链接查看详细文档。 如何登录账户 你需要使用微软账户购买游戏才能游玩 Minecraft,或者使用离线账户/外置账户。 你可以在 Minecraft 官网 或 Xbox 商店 购买游戏。 完成购买后,在 HMCL 主界面左上角,点击「账户」,然后点击左侧的「微软账户」登录你的账户,或者点击「离线登录」创建一个离线账户。 如何下载游戏 使用 HMCL 下载 Minecraft 非常简单,只需几步即可完成。 如果你尚未安装任何实例(即未安装过任何游戏版本),可以直接点击 「开始游戏」。HMCL 会自动安装最新正式版 Minecraft 并启动游戏。 若想下载更多实例(首次下载也可以按此方式操作),请按以下步骤进行: 在主界面找到并点击左侧的「下载」按钮。 在下载页面,点击左侧顶部的「游戏」选项卡。这里会列出所有可用的游戏版本(版本号从上到下/由新到旧排序),选择一个你喜欢的版本。我们通常推荐最新的正式版。 点击右下角的「安装」按钮,HMCL 就会自动为你完成下载和安装。 现在回到主界面,点击右下角的 「启动游戏」 按钮,开始你的创造吧! 游戏玩法是什么 在等待游戏下载时,不妨先了解一下它的核心玩法。 作为一款沙盒游戏,简单的说,核心玩法就是 「破坏」 和 「创造」 。你可以自由地探索世界、收集资源、建造家园、挑战怪物…… 对于新手而言,下面这些官方中文 Wiki 链接是你的最佳起点: 新手入门必读:Minecraft Wiki 新手手册...","categories": [], + "tags": [], + "url": "/faq.html", + "teaser": null + },{ + "title": "下载 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"正在前往 Java 下载页面,请点击下载,然后等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。 没有前往?点击此处 You are going to the Java download page. Please click download after redirecting, then wait for the Java installer to finish downloading, finally open the installer and follow the prompts to install Java. No redirect? Click here ","categories": [], + "tags": [], + "url": "/downloads/java.html", + "teaser": null + },{ + "title": "下载适用于 Linux ARM32 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。 链接 或者你也可以根据教程来添加仓库到你的软件包管理器。 Click one of the following links to download Java, and then use the package or extract it manually to install Java. Link Or you can add the repository to the package manager according to the instruction. ","categories": [], + "tags": [], + "url": "/downloads/linux/arm32.html", + "teaser": null + },{ + "title": "下载适用于 Linux ARM64 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。 链接 或者你也可以根据教程来添加仓库到你的软件包管理器。 Click one of the following links to download Java, and then use the package or extract it manually to install Java. Link Or you can add the repository to the package manager according to the instruction. ","categories": [], + "tags": [], + "url": "/downloads/linux/arm64.html", + "teaser": null + },{ + "title": "下载适用于 Linux x86 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。 链接 或者你也可以根据教程来添加仓库到你的软件包管理器。 Click one of the following links to download Java, and then use the package or extract it manually to install Java. Link Or you can add the repository to the package manager according to the instruction. ","categories": [], + "tags": [], + "url": "/downloads/linux/x86.html", + "teaser": null + },{ + "title": "下载适用于 Linux x86_64 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。 链接 或者你也可以根据教程来添加仓库到你的软件包管理器。 Click one of the following links to download Java, and then use the package or extract it manually to install Java. Link Or you can add the repository to the package manager according to the instruction. ","categories": [], + "tags": [], + "url": "/downloads/linux/x86_64.html", + "teaser": null + },{ + "title": "下载适用于 macOS ARM64 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"正在前往 Java 下载页面,请向下滚动点击 DMG 安装包下载按钮,然后等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。 没有下载?点击此处开始下载 You are going to the Java download page. Please scroll down and click DMG download button, then wait for the Java installer to finish downloading, and finally open the installer and follow the prompts to install Java. No redirect? Click here...","categories": [], + "tags": [], + "url": "/downloads/macos/arm64.html", + "teaser": null + },{ + "title": "下载适用于 macOS x86_64 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"正在前往 Java 下载页面,请向下滚动点击 DMG 安装包下载按钮,然后等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。 没有下载?点击此处开始下载 You are going to the Java download page. Please scroll down and click DMG download button, then wait for the Java installer to finish downloading, and finally open the installer and follow the prompts to install Java. No redirect? Click here...","categories": [], + "tags": [], + "url": "/downloads/macos/x86_64.html", + "teaser": null + },{ + "title": "下载适用于 Windows on Arm 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"Java 安装包已开始下载,请等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。 没有下载?点击此处开始下载 无法下载?点击此处开始下载(备用) The Java installation package has started to download. Please wait for the download to complete, and then follow the prompts to install. No redirect? Click here to start downloading Can’t download? Click here to download (alternative) ","categories": [], + "tags": [], + "url": "/downloads/windows/arm64.html", + "teaser": null + },{ + "title": "下载适用于 Windows x86 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"正在前往 Java 下载页面,请向下滚动点击 MSI 安装包下载按钮,然后等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。 没有下载?点击此处开始下载 You are going to the Java download page. Please scroll down and click MSI download button, then wait for the Java installer to finish downloading, and finally open the installer and follow the prompts to install Java. No redirect? Click here...","categories": [], + "tags": [], + "url": "/downloads/windows/x86.html", + "teaser": null + },{ + "title": "下载适用于 Windows x86_64 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"Java 安装包已开始下载,请等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。 没有下载?点击此处开始下载 无法下载?点击此处开始下载(备用) The Java installation package has started to download. Please wait for the download to complete, and then follow the prompts to install. No redirect? Click here to start downloading Can’t download? Click here to download (alternative) ","categories": [], + "tags": [], + "url": "/downloads/windows/x86_64.html", + "teaser": null + },{ + "title": "下载 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"龙芯平台存在 “新世界” 和 “旧世界” 两个 ABI,不同 ABI 的 Java 暂时互不兼容。 请在终端中输入 uname -r 命令查看 Linux 内核版本: 如果你的内核版本为 5.10 或更高版本,请下载新世界 Java; 如果你的内核版本为 4.19,请下载旧世界 Java。 新世界 如果你正在使用新世界龙芯系统,请下载新世界 Java。 直接下载 (需自行安装):loongson25.1.5-fx-jdk25_36-linux-loongarch64-glibc2.34.tar.gz 通过包管理器安装: AOSC OS/Debian/Ubuntu: sudo apt install default-jre 注意:Deepin 软件源中的 Java 不包含 JIT 编译器,使用它启动游戏性能将极其糟糕。我们推荐 Deepin 用户直接下载 Java,而不是使用 APT 安装。 ArchLinux: sudo pacman -S...","categories": [], + "tags": [], + "url": "/downloads/linux/loongarch64.html", + "teaser": null + },{ + "title": "下载适用于 Linux RISC-V 64 的 HMCL 和 Minecraft 依赖的 Java", + "excerpt":"点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。 链接 或者你也可以根据教程来添加仓库到你的软件包管理器。 Click one of the following links to download Java, and then use the package or extract it manually to install Java. Link Or you can add the repository to the package manager according to the instruction. ","categories": [], + "tags": [], + "url": "/downloads/linux/riscv64.html", + "teaser": null + },{ + "title": "Hello Minecraft! Launcher 用户协议", + "excerpt":"欢迎使用黄鱼(以下简称“开发者”)提供的 Hello Minecraft! Launcher(以下简称“本软件”)软件与服务。 为了保障用户(或称“您”)的权益,特制定本用户协议书(以下简称本协议)。 请您在使用本软件前,详细阅读本协议的所有内容。开发者可能随时更新本协议,本协议一旦发生变动,开发者将会在相关页面上通告修改内容。 修改后的本协议一旦在页面上公布即有效代替原用户协议书。 请用户仔细阅读以下全部内容,当用户开始使用本软件时,则应视为用户已经详细阅读并同意本协议的全部内容,且同意遵守本协议的规定。 第一条 用户的义务 1.用户应自行配备上网的所需设备。 2.用户应自行负担上网所需支付的与此服务相关的电话、网络使用等费用。 3.用户应为其使用本软件产生的行为、事件、结果承担法律责任。 4.用户在本软件内所设置的用户名、头像等可以由用户自行设置,但是为了维护网络和谐,本软件内不允许出现包括但不限于涉及 种族/宗教、国家政治、国家领导人、淫秽/粗俗内容、诽谤/恐吓、宗教或宗教人物、工作人员、攻击性的、侮辱性的、可能引起误会地、违禁药品等内容的名称。 5.用户应遵守中华人民共和国相关法律法规(如果用户是中华人民共和国境外的使用者,还应遵守所属国家或地区的法律法规)。 用户应当自行承担其所发布的信息内容所涉及的法律责任。此外,用户不得发布下列任何内容: 1) 反对中华人民共和国宪法所确定的基本原则的; 2) 危害国家安全,泄露国家机密,颠覆国家政权,破坏国家统一的; 3) 损害国家荣誉和利益的; 4) 煽动民族仇恨、民族歧视,破坏民族团结的; 5) 破坏国家宗教政策,宣扬邪教和封建迷信的; 6) 散布谣言,扰乱社会秩序,破坏社会稳定的; 7) 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的; 8) 侮辱或者诽谤他人,侵害他人合法权益的; 9) 含有中华人民共和国法律、行政法规禁止的其他内容的。 如您发布上述任何内容,则开发者有权视情节严重程度,依据本协议及法律法规,对您做出包括但不限于终止服务等处理措施;情节严重的开发者将移交有关行政管理机关给予行政处罚,或者追究您的刑事责任。 除非法律允许或开发者书面许可,用户不得从事下列任何行为: 1) 不合法、不恰当地使用本软件及服务; 2) 采取任何可能影响本软件网络服务的非正常使用行为(包括但不限于损害、攻击服务器或使服务器过度负荷等); 3) 使用本软件的名称、商标或其他知识产权; 4) 删除本软件及其副本上关于著作权的信息。 第二条 服务的中断、中止、终止 对用户服务的中止与终止 1) 用户有发布违法信息、严重违背社会公德、以及其他违反法律禁止性规定的行为,开发者应终止对用户提供服务。...","categories": [], + "tags": [], + "url": "/eula/hmcl.html", + "teaser": null + },{ + "title": "Authlib-Injector 服务器设置指南", + "excerpt":"背景 使用 authlib-injector 认证的服主可以通过本教程提供的方法使 HMCL 默认在打开时弹窗要求创建对应认证服务器的账户。 方法 在 HMCL 启动器同级目录下创建 authlib-injectors.json 文件,此时文件夹目录结构如下图所示: (注意,请确保打包后的整合包不包含 hmcl.json 文件,否则无法生效。该文件默认为隐藏状态,需开启隐藏文件显示) authlib-injectors.json 文件的示例如下 { \"urls\": [ \"https://example.yggdrasil.yushi.moe/\" ] } ","categories": [], + "tags": [], + "url": "/launcher/authlib-injector.html", + "teaser": null + },{ + "title": "数据包制作指南", + "excerpt":"本指南只介绍如何制作一个 HMCL 可导入的数据包压缩包。 建议 始终建议你使用多数据包格式制作数据包压缩包,因为 HMCL 会删除重名的数据包,因此可以借此完成更新功能,只要直接导入新的多数据包格式的压缩包就可以完成更新你制作的数据包。 多数据包 如果你的数据包被分离成多个部分供玩家选择是否启用,或者需要自带资源包,那么你需要制作多数据包格式的压缩包。 多数据包文件(只能是一个 .zip 文件)格式例子如下: crafting++.zip \\ * datapacks |\\ | * block_sky_domain (一个合法的数据包) | * crafting_machine | * craftingpp | * tradepp | * utilitypp | * resources.zip (如果你的数据包需要附带材质) \\ * assets \\ * ... 其中,datapacks 下的文件格式和 .minecraft/saves/New World/datapacks 的一样,因此可直接手动打包你本地的 datapacks 文件夹,...","categories": [], + "tags": [], + "url": "/launcher/datapack.html", + "teaser": null + },{ + "title": "全局版本隔离", + "excerpt":"请注意该方法会改变默认的游戏文件结构。 使用方式 进入 hmcl 的 设置 在全局游戏设置中找到 版本隔离 并设置为 各实例独立 这时候 minecraft 的文件结构就会有所改变,如下方 .minecraft ├── asstes ├── libraries └── versions └── 1.16.5-optifine ├── 1.16.5-optifine.jar ├── saves ├── resourcepacks ├── logs ├── mods └── ... 并非在 .minecraft 文件夹中存储一切的 mod 和 资源包而是各版本的资源互相独立 这样你就可以在一个目录下,安装多个客户端 往后的使用 在做完版本隔离的设置后,hmcl 的快速打开各个游戏文件夹的功能就会显得十分好用。 善用该功能也可为你的磁盘剩下不少的空间,现在反思过来其实都差不多 ","categories": [], + "tags": [], + "url": "/launcher/isolation.html", + "teaser": null + },{ + "title": "光影", + "excerpt":"安装 OptiFine 方式一: 全新安装 当你在安装新的游戏客户端时候,会看到有个 OptiFine 的选项。 点开之后会看到有 3 个复选框,一般而言,正式版 会比 测试版 更加稳定。选择安装 正式版 ,如果没有 正式版 那么再考虑 测试版 。 选择完合适的版本之后就可以点击右下角的安装继续进行安装。 方式二: 修改/升级已安装版本 在对应的游戏版本管理页面,点击 自动安装 ,你会看到有个 OptiFine 的选项。 点开之后选择合适的版本然后等待安装完成即可。 目前,如果要在 Fabric 使用 OptiFine ,需要通过 方式四 安装。 方式三:官网安装 在 OptiFine 官网上下载合适版本的 OptiFine (下载完应为 OptiFine_<游戏版本>_<OptiFine版本>.jar ) 。 双击打开或者使用 java -jar 文件名 的方式打开,然后你就会看到这个界面。 选择自己游戏的...","categories": [], + "tags": [], + "url": "/launcher/shader.html", + "teaser": null + },{ + "title": "同时安装 Fabric & OptiFine", + "excerpt":"在 HMCL 的自动安装中,如果先选择了 Fabric 或 OptiFine ,HMCL 就会提示他们互不兼容。 但在本文档中,通过一些简单的操作就可以同时安装 Fabric & OptiFine 的客户端。 原理是安装 OptiFabric 这个 Fabric 模组,该模组的作用是采用官方的 OptiFine 并在运行时与 Fabric 兼容来实现这一点。 如果你使用 OptiFine 纯粹是为了提高性能、使用缩放按钮或动态照明,那么还有其他模组可以单独实现这些功能,具有更可靠的兼容性。 操作方法 1.先选择一个版本,并选择 Fabric ,并安装。 注:如果你想放置其他的 Fabric 模组,建议一并安装 Fabric API ,有些 Fabric 模组会依赖他。 2.获取并安装 OptiFabric 模组 & OptiFine 获取 1)获取 OptiFabric ,可以在他的 MC百科下载页面(推荐) CurseForge 页面 或在...","categories": [], + "tags": [], + "url": "/launcher/fabric_and_optifine_install.html", + "teaser": null + },{ + "title": "设置项详解", + "excerpt":"引言 本篇文章将从”全局游戏设置”, “通用”, “外观”与”下载”这几个维度, 详细的为您介绍HMCL设置中各个选项的作用, 对于一些能够”见名知意”的条目, 在本篇文章中不过多讨论. 约束与注意 本篇文章是在 HMCL-3.5.3.230 版本中编写的, 如果您使用的是旧版本, 请注意有些选项可能不存在. 全局游戏设置 这是 HMCL 中的第一个设置项, 也是最重要的设置项之一, 它决定了 HMCL 在启动游戏时的行为. Java路径 众所周知, Minecraft 是由 Java 编写的, 因此在启动游戏时 HMCL 需要知道 Java(JRE1) 的安装路径才能启动游戏. 由于 HMCL 本身就是一个 Java 程序, 一般能正常启动 HMCL 就能至少在计算机上找到一个 JRE. 但也会由于一些未知因素导致无法找到 JRE, 这时, 就需要手动指定 JRE 的安装路径. 我们先来讨论能够自动识别的情况: 在 HMCL...","categories": [], + "tags": [], + "url": "/launcher/set-item-details.html", + "teaser": null + },{ + "title": "使用密码登录微软账户", + "excerpt":"为什么使用密码登录 我们发现,某些账户在尝试通过非密码方式登录时,可能会遇到设备代码流授权问题,从而无法成功登录。而建议这些用户改用密码登录后,他们的登录成功率显著提高。 如何使用密码登录微软账户 在执行登录操作时,注意检查登录页面是否有“其他登录方式”的选项。一旦看到此选项,立即点击进行选择。 在登录页面,系统会询问您希望采用哪种登录方式。此时,需要选择“使用我的密码”,然后输入密码完成登录。 如果没有“使用我的密码”选项,或者忘记了密码,请看 下方教程 添加/更改密码 部分账户可能并未设置密码登录,或者忘记了密码,请按照以下步骤进行操作: 前往 添加/更改密码 页面; 在该页面按照指示添加密码即可。若忘记密码,可选择该页面“忘记密码了?”选项进行找回密码操作。 完成上述操作后再按照 上方教程 操作即可使用密码登录微软账户。 ","categories": [], + "tags": [], + "url": "/launcher/use-password-login-microsoft-account.html", + "teaser": null + },{ + "title": "JVM 选项与环境变量", + "excerpt":"JVM 选项 HMCL 提供了一些 JVM 选项用于调试目的。你可以通过在启动 HMCL 时添加这些参数来使用这些功能。 参数 描述 -Dhmcl.home=<path> 覆盖 HMCL 全局数据文件夹路径 -Dhmcl.dir=<path> 覆盖 HMCL 工作路径下的 .hmcl 文件夹路径 -Dhmcl.self_integrity_check.disable=true 禁用启动器更新时的本体完整性检查 -Dhmcl.bmclapi.override=<url> 自定义 BMCLAPI 的 API Root 地址(默认为 https://bmclapi2.bangbang93.com) -Dhmcl.font.override=<font family> 指定启动器使用的字族 -Dhmcl.version.override=<version> 手动指定启动器版本号 -Dhmcl.update_source.override=<url> 自定义 HMCL 更新源地址 -Dhmcl.authlibinjector.location=<path> 指定本地 authlib-injector 路径,不从网络下载 -Dhmcl.openjfx.repo=<maven repository url> 添加用于下载 OpenJFX 的自定义 Maven...","categories": [], + "tags": [], + "url": "/launcher/jvm-options-and-env.html", + "teaser": null + },{ + "title": "自动安装与模组下载简介", + "excerpt":"要为 Minecraft 安装模组,你首先需要安装一个“模组加载器”(例如 NeoForge 或 Fabric),然后再安装你想要的模组。HMCL 为这两个步骤都提供了强大的支持。 在安装前,最关键的一点是兼容性。请记住以下核心原则: 通常,你只能为单个游戏实例安装一种模组加载器。 你下载的模组,必须同时兼容你的游戏版本(如 1.20.4)和模组加载器(如 Fabric)。 简单来说,为游戏安装模组总共分三步,本指南将带你逐一完成: 开启版本隔离,为模组创建一个独立干净的环境。 安装模组加载器(如 Forge, Fabric)。 安装你喜欢的模组。 启用版本隔离 在安装模组之前,必须开启版本隔离以隔离为不同实例安装的模组: 在 HMCL 主界面,点击「设置」,在「全局游戏设置」选项卡中,找到「版本隔离」,点击「版本隔离」,选择「各实例独立」即可 更详细的介绍见 全局版本隔离 安装模组加载器 模组加载器简介 常见的模组加载器有以下几个: Forge,NeoForge,Fabric,Quilt,Cleanroom,LiteLoader 是 6 个常见的 Mod 加载器。 Fabric API,QSL/QFAPI 是两个随 Fabric 与 Quilt 的官方 API(实际是模组)。 兼容性: LiteLoader 和 Forge 是兼容的 (Forge 较新版本和 LiteLoader...","categories": [], + "tags": [], + "url": "/launcher/auto-installing.html", + "teaser": null + },{ + "title": "离线模式下更换皮肤", + "excerpt":"离线模式下更换皮肤 注意: 使用 Steve、Alex、本地皮肤图片文件: 可能无法加入多人联机,其他玩家可能看不到您的皮肤 使用 LittleSkin、Blessing Skin 服务器: 多人联机下和您使用 相同方式 的玩家可以看到您的皮肤, 其他玩家不可以 打开HMCL, 进入 账号列表 , 点击下图离线账号的【上传皮肤】红框处: 默认: 使用默认随机的皮肤显示 Steve: 使用Steve (史蒂夫) 皮肤显示 Alex: 使用Alex (艾利克斯) 皮肤显示 本地皮肤图片文件、LittleSkin、Blessing Skin 服务器: 请见下文↓ 本地皮肤图片文件 点击 本地皮肤图片文件 , 设置 皮肤/披风皮肤图片 路径, 点击 确认, 即可 LittleSkin 首先您需要一个LittleSkin的账号, 注册并登录 然后前往 角色管理, 查看您的角色名, 如果没有, 请点击...","categories": [], + "tags": [], + "url": "/launcher/offline-skin.html", + "teaser": null + },{ + "title": "界面功能介绍", + "excerpt":" 启动器界面整体由顶部工具栏和页面容器构成。 顶部工具栏 提示 用户可以通过双击工具栏在最大化与普通窗口状态之间切换。 此区域为全局显示,共分为左右两部分。其中左侧由返回按钮(仅在二级或多级页面显示)和标题构成,右侧由帮助按钮、最小化按钮和关闭按钮构成。 返回按钮:点击后返回上一页,仅在二级或多级页面上显示,首页不显示。 标题:通常用于显示页面名称,首页显示为启动器版本信息。 帮助按钮:点击后跳转至文档帮助页面。 最小化按钮:点击后最小化启动器。 关闭按钮:点击后关闭启动器。 首页 首页是启动器的起始页面,该页面由侧边导航栏、提示面板(仅限开发版和预览版)、更新面板(仅在存在可用更新时显示)和启动游戏面板构成。 侧边导航栏(首页) 此区域共分为三部分:账户分组、游戏分组及通用分组。 账户分组:该分组中包含一个列表项,该项会显示当前选定的账户头像、名称及账户类型,用户点击该项可进入账户列表页面;右键点击该项可呼出账户切换的快捷菜单。 提示 用户在该项上滚动鼠标滚轮可在不同账户之间进行快捷切换。 游戏分组:该分组中包含三个列表项,分别是:实例管理、实例列表及下载。 实例管理:该项会显示当前选定的游戏实例图标及名称。用户点击该项后进入实例管理页面;在该项上滚动鼠标滚轮可在不同游戏实例之间进行快捷切换。 实例列表:用户点击该项后进入实例列表页面,用于查看和管理游戏实例。 下载:用户点击该项后进入下载页面,用于下载游戏、整合包或者安装模组、资源包、光影或者世界。 通用分组:该分组中包含三个列表项,分别是:设置、多人联机及官方群组。 设置:用户点击该项后进入设置页面。 多人联机:用户点击该项后进入多人联机页面。 官方群组:用户点击该项后跳转至设置·反馈页。 提示面板 提示 用户可通过点击右上角关闭按钮隐藏该提示。 仅在开发版或预览版中显示,用于提示用户当前启动器不是稳定版本。 更新面板 仅在存在可用更新时显示,此区域用于启动器更新提示。 启动游戏面板 此区域共分为两部分:启动(开始)游戏按钮、切换实例菜单。 启动(开始)游戏按钮:若用户当前存在实例,点击后则会启动当前应用的游戏实例;若当前不存在游戏实例,点击后会自动下载最新正式版然后启动游戏。 切换实例菜单:点击显示快捷切换游戏实例列表菜单。 设置 该页面由侧边导航栏和页面容器构成。 侧边导航栏(设置) 此区域共分为四部分:全局游戏设置、Java 管理、启动器分组及帮助分组。 全局游戏设置:用户点击该项后进入全局游戏设置页面。 Java 管理:用户点击该项后进入 Java 管理页面。 启动器分组:该分组中包含三个列表项,分别是:通用、外观及下载。 帮助分组:该分组中包含三个列表项,分别是:帮助、反馈及关于。 设置-全局游戏设置 ","categories": [], + "tags": [], + "url": "/launcher/gui-features.html", + "teaser": null + },{ + "title": "服务端自动更新整合包制作教程", + "excerpt":"HMCL 允许服务器管理员借助服务端自动更新整合包来实现自动分发整合包更新,这将大大方便有需要频繁更新游戏客户端 Mod、配置等信息的服务器管理员。 HMCL 需要服务器管理员额外提供一个 HTTP 服务器(只需要能提供静态文件服务,比如 Apache 和 Nginx 皆可)来提供检查整合包更新并允许 HMCL 下载更新文件。 第一步:导出整合包 在 HMCL 中右键做好的客户端版本,选择导出整合包: 选择导出为服务器自动更新整合包: 填写整合包信息,整合包下载链接前缀如何填写请看下文 选择需要包含在整合包内的文件后将产生整合包压缩文件 第二步:导入整合包 接着创建一个全新的空文件夹,将启动器复制进去 运行启动器,并导入刚才导出的整合包,导入完成后,这个文件夹(这里叫“新整合包”)可以打包发给玩家。 第三步:部署整合包更新服务器 你可以借助 Apache、Nginx 等支持静态文件的 HTTP 服务器软件提供文件。首先,决定好整合包下载链接前缀,比如我希望 HMCL 从远程服务器的 http://www.site.com/modpack 目录下存放整合包的更新信息,则在之前导出整合包的整合包下载前缀中填写 http://www.site.com/modpack。 上图为导出的服务器自动更新整合包压缩文件的内容,你需要将这个整合包解压到 http://www.site.com/modpack 下。也就是说,从 http://www.site.com/modpack/server-manifest.json 这个链接下载下来的文件必须和上图中整合包压缩文件中的 server-manifest.json 文件一致,并且,http://www.site.com/modpack/overrides 是一个文件夹,里面存放了整合包文件,比如: 整合包压缩文件 test.zip/overrides/mods/Advancement_Book-1.12-1.0.3.jar 文件必须可以从 http://www.site.com/modpack/overrides/mods/Advancement_Book-1.12-1.0.3.jar 该目录下载下来,且文件内容一致。那么至此更新服务器就部署完成了。 第四步:更新整合包 如果你需要更新整合包,那么将新的整合包经过第一步导出新的整合包压缩文件,并解压到类似 http://www.site.com/modpack...","categories": [], + "tags": [], + "url": "/modpack/serverpack.html", + "teaser": null + },{ + "title": "配置客户端自动更新(宝塔面板)", + "excerpt":"备注 文章原作者:hy黑影 转载:Zkitfly 部分内容进行了稍作打磨 本教程转载自 https://www.mcbbs.net/thread-1103864-1-1.html 前言 我自己开设的服务器有很多不同的子服,每个子服的客户端版本呢都不相同,我又希望能整合到一个客户端里面;找了一圈发现那些辅助更新程序只能更新单个客户端版本,而且界面不太美观;甚至一度想自己开发启动器……… 这篇帖子的灵感来自于 HMCL 启动器的一个功能 导出服务器自动更新整合包,我觉得可以利用这个功能来代替一些自动更新的辅助程序。 整个功能的实现需要:一台有公网IP的服务器、一个客户端整合包、HMCL启动器;如果你都没有,那就换成RMB10元 本篇教程默认读者为 萌新,即没有接触过HTTP服务器,网络应用开发,不懂linux系统,惧怕控制台程序 教程 第一步-租服务器(▲如果你有公网IP的服务器,请跳过这一步) 百度搜索 腾讯云学生机 或 阿里云学生机 可以看到有10元/月 的套餐,如果是阿里云的话选轻量型应用服务器,腾讯云就只有一个套餐 系统请选择CentOS 8.0 64位,其他保持默认即可 再次确认是否是十元,是的话直接购买;不是的话可能是你已经买过学生套餐 第一次购买可能需要实名认证,按照提示操作即可,不需要担心安全问题,都是可靠的大公司 第二步-安装宝塔面板——CentOS 8.0系统 以腾讯云举例,阿里云同理 打开控制台面板,找到刚才租的学生机 选择重置密码 点击右侧登入按钮,按照说明填写你刚刚重置的密码;之后应该会看到类似这样的提示 不要慌,冷静。如果下面的部分教程失效请去宝塔面板官网,点击Linux->立即安装 回到控制台面板,我们需要开放一些通道让面板通过,选择安全组 点击修改规则,再点击添加规则 图1: 图2: 按照图中所写添加,想要安全的话按照图1,懒的话按照图2 回到那个黑黑的界面里输入 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh...","categories": [], + "tags": [], + "url": "/modpack/serverpack2.html", + "teaser": null + },{ + "title": "整合包自带 Java 教程", + "excerpt":"背景 想必有些服务器主为此头疼了许久。由于玩家的电脑环境多变,甚至可能仍然有安装着 Java 7 的电脑而无法启动 1.12.2 以上的游戏或者含有 Mod 的客户端。因此服务器主希望能在整合包中自带一个 Java 运行时(或者叫 JRE),从而取代电脑自带的 JVM。接下来本文将介绍两种方法。 名词解释 JRE Java Runtime Environment的缩写。通常可以认为是玩家所使用的 Java 下文所指代的 Java 和 JRE 均可以认为是此版本。 方法一:使用最新版本(推荐) EXE 版本 EXE 版本在 Windows 系统下打开会首先检查同级文件夹下的 jre-arm64、jre-x64 和 jre-x86 文件夹。 检查顺序从上到下依次是: jre-arm64 (ARM 64 位) jre-x64 (x86 64 位) jre-x86 (x86 32 位) 启动优先级如下: 如果玩家电脑的操作系统是x86...","categories": [], + "tags": [], + "url": "/modpack/bundled-java.html", + "teaser": null + },{ + "title": "配置客户端自动更新 (Nginx)", + "excerpt":"阅读本文前,请先阅读此文章 前置知识 阅读本文你需要具有以下知识储备: 掌握基础本的 linux 命令操作,比如 cd ls 等 拥有一个 linux 服务器(好像不算知识) Nginx 安装 这里很基础(但是坑比较多)略过,可以看以下参考文档。 https://zhuanlan.zhihu.com/p/515069497 新建静态资源文件夹 我为了省事直接在/根目录下新建了一个 MinecraftClientStatic 文件夹,以后需要作为静态资源的文件都丢这里面。 命令: # 到更目录 cd / # 新建文件夹 mkdir MinecraftClientStatic # 防止nginx无法访问,配置文件夹访问权限 chmod 777 MinecraftClientStatic # 进入文件夹 cd MinecraftClientStatic # 新建一个测试用的文件 touch helloMC.html # 给文件权限 chmod 777 helloMC.html # 编辑html内容 vim...","categories": [], + "tags": [], + "url": "/modpack/serverpack3.html", + "teaser": null + },{ + "title": "模组包报错排查手册", + "excerpt":"文件夹结构 首先我们需要先认识Minecraft的文件夹结构 如果你开启了 版本隔离 那么你的文件夹结构如下 .minecraft |*assets # 游戏资源文件夹,存放纹理、声音等资源 |*libraries # 依赖库文件夹,存放运行游戏所需的各种库 |*versions # 版本文件夹,包含所有已安装的Minecraft版本 \\1.16.5-optifine |1.16.5-optifine.jar # 该版本的主程序jar文件 |*saves # 存档文件夹,仅该版本可见 |*resourcepacks # 资源包文件夹,仅该版本可见 |*logs # 日志文件夹,仅该版本可见 |*mods # 模组文件夹,仅该版本可见 |*config # 配置文件夹,仅该版本可见 |*crash-reports # 崩溃报告文件夹,仅该版本可见 ... 如果你没有开启则是这样 .minecraft |*assets # 游戏资源文件夹,存放纹理、声音等资源 |*libraries # 依赖库文件夹,存放运行游戏所需的各种库 |*saves # 存档文件夹,所有版本共用 |*resourcepacks...","categories": [], + "tags": [], + "url": "/modpack/error-handbook.html", + "teaser": null + },{ + "title": "多人联机反馈", + "excerpt":"Terracotta | 陶瓦联机 提示 欢迎您填写反馈表单。 我们注意到了 EasyTier 项目。它提供了一种简单、安全、去中心化的异地组网方案,足以承载 Minecraft 的联机需求。 在 EasyTier 开发团队的帮助下,我们决定重新在启动器内提供联机服务。 如要体验陶瓦联机,请遵循以下步骤: 打开 HMCL,然后您可通过 HMCL 左下角 多人联机 入口体验 Terracotta | 陶瓦联机。 目前,HMCL、PCL CE 已实现最基本的互通支持。我们欢迎其他启动器接入 Scaffolding 协议实现更完整的互通功能。 为向尽可能多的玩家免费开放基本联机功能,陶瓦联机将极大程度上基于 P2P。 简单而言,陶瓦联机不会比市面上基于服务器中继的联机方案稳定,但其开销将远远低于其他联机方案。 需要特别提醒的是:联机功能不会更不能取代 Minecraft: Java Edition 服务器。 它的主要目标依然是让朋友之间能共同游玩,而不是长时间的对外开放。 最后,我想感谢一切参与到 EasyTier、Terracotta | 陶瓦联机开发和测试、为 EasyTier 提供打洞和中继服务器的社区志愿者。欢迎大家访问 easytier.cn 深入了解这一项目。 ","categories": [], + "tags": [], + "url": "/multiplayer/feedback.html", + "teaser": null + },{ + "title": "多人联机帮助", + "excerpt":"Terracotta | 陶瓦联机 ","categories": [], + "tags": [], + "url": "/multiplayer/help.html", + "teaser": null + },] diff --git a/assets/js/lunr/lunr.js b/assets/js/lunr/lunr.js new file mode 100644 index 0000000..6aa370f --- /dev/null +++ b/assets/js/lunr/lunr.js @@ -0,0 +1,3475 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ + +;(function(){ + +/** + * A convenience function for configuring and constructing + * a new lunr Index. + * + * A lunr.Builder instance is created and the pipeline setup + * with a trimmer, stop word filter and stemmer. + * + * This builder object is yielded to the configuration function + * that is passed as a parameter, allowing the list of fields + * and other builder parameters to be customised. + * + * All documents _must_ be added within the passed config function. + * + * @example + * var idx = lunr(function () { + * this.field('title') + * this.field('body') + * this.ref('id') + * + * documents.forEach(function (doc) { + * this.add(doc) + * }, this) + * }) + * + * @see {@link lunr.Builder} + * @see {@link lunr.Pipeline} + * @see {@link lunr.trimmer} + * @see {@link lunr.stopWordFilter} + * @see {@link lunr.stemmer} + * @namespace {function} lunr + */ +var lunr = function (config) { + var builder = new lunr.Builder + + builder.pipeline.add( + lunr.trimmer, + lunr.stopWordFilter, + lunr.stemmer + ) + + builder.searchPipeline.add( + lunr.stemmer + ) + + config.call(builder, builder) + return builder.build() +} + +lunr.version = "2.3.9" +/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A namespace containing utils for the rest of the lunr library + * @namespace lunr.utils + */ +lunr.utils = {} + +/** + * Print a warning message to the console. + * + * @param {String} message The message to be printed. + * @memberOf lunr.utils + * @function + */ +lunr.utils.warn = (function (global) { + /* eslint-disable no-console */ + return function (message) { + if (global.console && console.warn) { + console.warn(message) + } + } + /* eslint-enable no-console */ +})(this) + +/** + * Convert an object to a string. + * + * In the case of `null` and `undefined` the function returns + * the empty string, in all other cases the result of calling + * `toString` on the passed object is returned. + * + * @param {Any} obj The object to convert to a string. + * @return {String} string representation of the passed object. + * @memberOf lunr.utils + */ +lunr.utils.asString = function (obj) { + if (obj === void 0 || obj === null) { + return "" + } else { + return obj.toString() + } +} + +/** + * Clones an object. + * + * Will create a copy of an existing object such that any mutations + * on the copy cannot affect the original. + * + * Only shallow objects are supported, passing a nested object to this + * function will cause a TypeError. + * + * Objects with primitives, and arrays of primitives are supported. + * + * @param {Object} obj The object to clone. + * @return {Object} a clone of the passed object. + * @throws {TypeError} when a nested object is passed. + * @memberOf Utils + */ +lunr.utils.clone = function (obj) { + if (obj === null || obj === undefined) { + return obj + } + + var clone = Object.create(null), + keys = Object.keys(obj) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i], + val = obj[key] + + if (Array.isArray(val)) { + clone[key] = val.slice() + continue + } + + if (typeof val === 'string' || + typeof val === 'number' || + typeof val === 'boolean') { + clone[key] = val + continue + } + + throw new TypeError("clone is not deep and does not support nested objects") + } + + return clone +} +lunr.FieldRef = function (docRef, fieldName, stringValue) { + this.docRef = docRef + this.fieldName = fieldName + this._stringValue = stringValue +} + +lunr.FieldRef.joiner = "/" + +lunr.FieldRef.fromString = function (s) { + var n = s.indexOf(lunr.FieldRef.joiner) + + if (n === -1) { + throw "malformed field ref string" + } + + var fieldRef = s.slice(0, n), + docRef = s.slice(n + 1) + + return new lunr.FieldRef (docRef, fieldRef, s) +} + +lunr.FieldRef.prototype.toString = function () { + if (this._stringValue == undefined) { + this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef + } + + return this._stringValue +} +/*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A lunr set. + * + * @constructor + */ +lunr.Set = function (elements) { + this.elements = Object.create(null) + + if (elements) { + this.length = elements.length + + for (var i = 0; i < this.length; i++) { + this.elements[elements[i]] = true + } + } else { + this.length = 0 + } +} + +/** + * A complete set that contains all elements. + * + * @static + * @readonly + * @type {lunr.Set} + */ +lunr.Set.complete = { + intersect: function (other) { + return other + }, + + union: function () { + return this + }, + + contains: function () { + return true + } +} + +/** + * An empty set that contains no elements. + * + * @static + * @readonly + * @type {lunr.Set} + */ +lunr.Set.empty = { + intersect: function () { + return this + }, + + union: function (other) { + return other + }, + + contains: function () { + return false + } +} + +/** + * Returns true if this set contains the specified object. + * + * @param {object} object - Object whose presence in this set is to be tested. + * @returns {boolean} - True if this set contains the specified object. + */ +lunr.Set.prototype.contains = function (object) { + return !!this.elements[object] +} + +/** + * Returns a new set containing only the elements that are present in both + * this set and the specified set. + * + * @param {lunr.Set} other - set to intersect with this set. + * @returns {lunr.Set} a new set that is the intersection of this and the specified set. + */ + +lunr.Set.prototype.intersect = function (other) { + var a, b, elements, intersection = [] + + if (other === lunr.Set.complete) { + return this + } + + if (other === lunr.Set.empty) { + return other + } + + if (this.length < other.length) { + a = this + b = other + } else { + a = other + b = this + } + + elements = Object.keys(a.elements) + + for (var i = 0; i < elements.length; i++) { + var element = elements[i] + if (element in b.elements) { + intersection.push(element) + } + } + + return new lunr.Set (intersection) +} + +/** + * Returns a new set combining the elements of this and the specified set. + * + * @param {lunr.Set} other - set to union with this set. + * @return {lunr.Set} a new set that is the union of this and the specified set. + */ + +lunr.Set.prototype.union = function (other) { + if (other === lunr.Set.complete) { + return lunr.Set.complete + } + + if (other === lunr.Set.empty) { + return this + } + + return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements))) +} +/** + * A function to calculate the inverse document frequency for + * a posting. This is shared between the builder and the index + * + * @private + * @param {object} posting - The posting for a given term + * @param {number} documentCount - The total number of documents. + */ +lunr.idf = function (posting, documentCount) { + var documentsWithTerm = 0 + + for (var fieldName in posting) { + if (fieldName == '_index') continue // Ignore the term index, its not a field + documentsWithTerm += Object.keys(posting[fieldName]).length + } + + var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5) + + return Math.log(1 + Math.abs(x)) +} + +/** + * A token wraps a string representation of a token + * as it is passed through the text processing pipeline. + * + * @constructor + * @param {string} [str=''] - The string token being wrapped. + * @param {object} [metadata={}] - Metadata associated with this token. + */ +lunr.Token = function (str, metadata) { + this.str = str || "" + this.metadata = metadata || {} +} + +/** + * Returns the token string that is being wrapped by this object. + * + * @returns {string} + */ +lunr.Token.prototype.toString = function () { + return this.str +} + +/** + * A token update function is used when updating or optionally + * when cloning a token. + * + * @callback lunr.Token~updateFunction + * @param {string} str - The string representation of the token. + * @param {Object} metadata - All metadata associated with this token. + */ + +/** + * Applies the given function to the wrapped string token. + * + * @example + * token.update(function (str, metadata) { + * return str.toUpperCase() + * }) + * + * @param {lunr.Token~updateFunction} fn - A function to apply to the token string. + * @returns {lunr.Token} + */ +lunr.Token.prototype.update = function (fn) { + this.str = fn(this.str, this.metadata) + return this +} + +/** + * Creates a clone of this token. Optionally a function can be + * applied to the cloned token. + * + * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token. + * @returns {lunr.Token} + */ +lunr.Token.prototype.clone = function (fn) { + fn = fn || function (s) { return s } + return new lunr.Token (fn(this.str, this.metadata), this.metadata) +} +/*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A function for splitting a string into tokens ready to be inserted into + * the search index. Uses `lunr.tokenizer.separator` to split strings, change + * the value of this property to change how strings are split into tokens. + * + * This tokenizer will convert its parameter to a string by calling `toString` and + * then will split this string on the character in `lunr.tokenizer.separator`. + * Arrays will have their elements converted to strings and wrapped in a lunr.Token. + * + * Optional metadata can be passed to the tokenizer, this metadata will be cloned and + * added as metadata to every token that is created from the object to be tokenized. + * + * @static + * @param {?(string|object|object[])} obj - The object to convert into tokens + * @param {?object} metadata - Optional metadata to associate with every token + * @returns {lunr.Token[]} + * @see {@link lunr.Pipeline} + */ +lunr.tokenizer = function (obj, metadata) { + if (obj == null || obj == undefined) { + return [] + } + + if (Array.isArray(obj)) { + return obj.map(function (t) { + return new lunr.Token( + lunr.utils.asString(t).toLowerCase(), + lunr.utils.clone(metadata) + ) + }) + } + + var str = obj.toString().toLowerCase(), + len = str.length, + tokens = [] + + for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) { + var char = str.charAt(sliceEnd), + sliceLength = sliceEnd - sliceStart + + if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) { + + if (sliceLength > 0) { + var tokenMetadata = lunr.utils.clone(metadata) || {} + tokenMetadata["position"] = [sliceStart, sliceLength] + tokenMetadata["index"] = tokens.length + + tokens.push( + new lunr.Token ( + str.slice(sliceStart, sliceEnd), + tokenMetadata + ) + ) + } + + sliceStart = sliceEnd + 1 + } + + } + + return tokens +} + +/** + * The separator used to split a string into tokens. Override this property to change the behaviour of + * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens. + * + * @static + * @see lunr.tokenizer + */ +lunr.tokenizer.separator = /[\s\-]+/ +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.Pipelines maintain an ordered list of functions to be applied to all + * tokens in documents entering the search index and queries being ran against + * the index. + * + * An instance of lunr.Index created with the lunr shortcut will contain a + * pipeline with a stop word filter and an English language stemmer. Extra + * functions can be added before or after either of these functions or these + * default functions can be removed. + * + * When run the pipeline will call each function in turn, passing a token, the + * index of that token in the original list of all tokens and finally a list of + * all the original tokens. + * + * The output of functions in the pipeline will be passed to the next function + * in the pipeline. To exclude a token from entering the index the function + * should return undefined, the rest of the pipeline will not be called with + * this token. + * + * For serialisation of pipelines to work, all functions used in an instance of + * a pipeline should be registered with lunr.Pipeline. Registered functions can + * then be loaded. If trying to load a serialised pipeline that uses functions + * that are not registered an error will be thrown. + * + * If not planning on serialising the pipeline then registering pipeline functions + * is not necessary. + * + * @constructor + */ +lunr.Pipeline = function () { + this._stack = [] +} + +lunr.Pipeline.registeredFunctions = Object.create(null) + +/** + * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token + * string as well as all known metadata. A pipeline function can mutate the token string + * or mutate (or add) metadata for a given token. + * + * A pipeline function can indicate that the passed token should be discarded by returning + * null, undefined or an empty string. This token will not be passed to any downstream pipeline + * functions and will not be added to the index. + * + * Multiple tokens can be returned by returning an array of tokens. Each token will be passed + * to any downstream pipeline functions and all will returned tokens will be added to the index. + * + * Any number of pipeline functions may be chained together using a lunr.Pipeline. + * + * @interface lunr.PipelineFunction + * @param {lunr.Token} token - A token from the document being processed. + * @param {number} i - The index of this token in the complete list of tokens for this document/field. + * @param {lunr.Token[]} tokens - All tokens for this document/field. + * @returns {(?lunr.Token|lunr.Token[])} + */ + +/** + * Register a function with the pipeline. + * + * Functions that are used in the pipeline should be registered if the pipeline + * needs to be serialised, or a serialised pipeline needs to be loaded. + * + * Registering a function does not add it to a pipeline, functions must still be + * added to instances of the pipeline for them to be used when running a pipeline. + * + * @param {lunr.PipelineFunction} fn - The function to check for. + * @param {String} label - The label to register this function with + */ +lunr.Pipeline.registerFunction = function (fn, label) { + if (label in this.registeredFunctions) { + lunr.utils.warn('Overwriting existing registered function: ' + label) + } + + fn.label = label + lunr.Pipeline.registeredFunctions[fn.label] = fn +} + +/** + * Warns if the function is not registered as a Pipeline function. + * + * @param {lunr.PipelineFunction} fn - The function to check for. + * @private + */ +lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) { + var isRegistered = fn.label && (fn.label in this.registeredFunctions) + + if (!isRegistered) { + lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn) + } +} + +/** + * Loads a previously serialised pipeline. + * + * All functions to be loaded must already be registered with lunr.Pipeline. + * If any function from the serialised data has not been registered then an + * error will be thrown. + * + * @param {Object} serialised - The serialised pipeline to load. + * @returns {lunr.Pipeline} + */ +lunr.Pipeline.load = function (serialised) { + var pipeline = new lunr.Pipeline + + serialised.forEach(function (fnName) { + var fn = lunr.Pipeline.registeredFunctions[fnName] + + if (fn) { + pipeline.add(fn) + } else { + throw new Error('Cannot load unregistered function: ' + fnName) + } + }) + + return pipeline +} + +/** + * Adds new functions to the end of the pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline. + */ +lunr.Pipeline.prototype.add = function () { + var fns = Array.prototype.slice.call(arguments) + + fns.forEach(function (fn) { + lunr.Pipeline.warnIfFunctionNotRegistered(fn) + this._stack.push(fn) + }, this) +} + +/** + * Adds a single function after a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. + * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. + */ +lunr.Pipeline.prototype.after = function (existingFn, newFn) { + lunr.Pipeline.warnIfFunctionNotRegistered(newFn) + + var pos = this._stack.indexOf(existingFn) + if (pos == -1) { + throw new Error('Cannot find existingFn') + } + + pos = pos + 1 + this._stack.splice(pos, 0, newFn) +} + +/** + * Adds a single function before a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. + * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. + */ +lunr.Pipeline.prototype.before = function (existingFn, newFn) { + lunr.Pipeline.warnIfFunctionNotRegistered(newFn) + + var pos = this._stack.indexOf(existingFn) + if (pos == -1) { + throw new Error('Cannot find existingFn') + } + + this._stack.splice(pos, 0, newFn) +} + +/** + * Removes a function from the pipeline. + * + * @param {lunr.PipelineFunction} fn The function to remove from the pipeline. + */ +lunr.Pipeline.prototype.remove = function (fn) { + var pos = this._stack.indexOf(fn) + if (pos == -1) { + return + } + + this._stack.splice(pos, 1) +} + +/** + * Runs the current list of functions that make up the pipeline against the + * passed tokens. + * + * @param {Array} tokens The tokens to run through the pipeline. + * @returns {Array} + */ +lunr.Pipeline.prototype.run = function (tokens) { + var stackLength = this._stack.length + + for (var i = 0; i < stackLength; i++) { + var fn = this._stack[i] + var memo = [] + + for (var j = 0; j < tokens.length; j++) { + var result = fn(tokens[j], j, tokens) + + if (result === null || result === void 0 || result === '') continue + + if (Array.isArray(result)) { + for (var k = 0; k < result.length; k++) { + memo.push(result[k]) + } + } else { + memo.push(result) + } + } + + tokens = memo + } + + return tokens +} + +/** + * Convenience method for passing a string through a pipeline and getting + * strings out. This method takes care of wrapping the passed string in a + * token and mapping the resulting tokens back to strings. + * + * @param {string} str - The string to pass through the pipeline. + * @param {?object} metadata - Optional metadata to associate with the token + * passed to the pipeline. + * @returns {string[]} + */ +lunr.Pipeline.prototype.runString = function (str, metadata) { + var token = new lunr.Token (str, metadata) + + return this.run([token]).map(function (t) { + return t.toString() + }) +} + +/** + * Resets the pipeline by removing any existing processors. + * + */ +lunr.Pipeline.prototype.reset = function () { + this._stack = [] +} + +/** + * Returns a representation of the pipeline ready for serialisation. + * + * Logs a warning if the function has not been registered. + * + * @returns {Array} + */ +lunr.Pipeline.prototype.toJSON = function () { + return this._stack.map(function (fn) { + lunr.Pipeline.warnIfFunctionNotRegistered(fn) + + return fn.label + }) +} +/*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A vector is used to construct the vector space of documents and queries. These + * vectors support operations to determine the similarity between two documents or + * a document and a query. + * + * Normally no parameters are required for initializing a vector, but in the case of + * loading a previously dumped vector the raw elements can be provided to the constructor. + * + * For performance reasons vectors are implemented with a flat array, where an elements + * index is immediately followed by its value. E.g. [index, value, index, value]. This + * allows the underlying array to be as sparse as possible and still offer decent + * performance when being used for vector calculations. + * + * @constructor + * @param {Number[]} [elements] - The flat list of element index and element value pairs. + */ +lunr.Vector = function (elements) { + this._magnitude = 0 + this.elements = elements || [] +} + + +/** + * Calculates the position within the vector to insert a given index. + * + * This is used internally by insert and upsert. If there are duplicate indexes then + * the position is returned as if the value for that index were to be updated, but it + * is the callers responsibility to check whether there is a duplicate at that index + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @returns {Number} + */ +lunr.Vector.prototype.positionForIndex = function (index) { + // For an empty vector the tuple can be inserted at the beginning + if (this.elements.length == 0) { + return 0 + } + + var start = 0, + end = this.elements.length / 2, + sliceLength = end - start, + pivotPoint = Math.floor(sliceLength / 2), + pivotIndex = this.elements[pivotPoint * 2] + + while (sliceLength > 1) { + if (pivotIndex < index) { + start = pivotPoint + } + + if (pivotIndex > index) { + end = pivotPoint + } + + if (pivotIndex == index) { + break + } + + sliceLength = end - start + pivotPoint = start + Math.floor(sliceLength / 2) + pivotIndex = this.elements[pivotPoint * 2] + } + + if (pivotIndex == index) { + return pivotPoint * 2 + } + + if (pivotIndex > index) { + return pivotPoint * 2 + } + + if (pivotIndex < index) { + return (pivotPoint + 1) * 2 + } +} + +/** + * Inserts an element at an index within the vector. + * + * Does not allow duplicates, will throw an error if there is already an entry + * for this index. + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @param {Number} val - The value to be inserted into the vector. + */ +lunr.Vector.prototype.insert = function (insertIdx, val) { + this.upsert(insertIdx, val, function () { + throw "duplicate index" + }) +} + +/** + * Inserts or updates an existing index within the vector. + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @param {Number} val - The value to be inserted into the vector. + * @param {function} fn - A function that is called for updates, the existing value and the + * requested value are passed as arguments + */ +lunr.Vector.prototype.upsert = function (insertIdx, val, fn) { + this._magnitude = 0 + var position = this.positionForIndex(insertIdx) + + if (this.elements[position] == insertIdx) { + this.elements[position + 1] = fn(this.elements[position + 1], val) + } else { + this.elements.splice(position, 0, insertIdx, val) + } +} + +/** + * Calculates the magnitude of this vector. + * + * @returns {Number} + */ +lunr.Vector.prototype.magnitude = function () { + if (this._magnitude) return this._magnitude + + var sumOfSquares = 0, + elementsLength = this.elements.length + + for (var i = 1; i < elementsLength; i += 2) { + var val = this.elements[i] + sumOfSquares += val * val + } + + return this._magnitude = Math.sqrt(sumOfSquares) +} + +/** + * Calculates the dot product of this vector and another vector. + * + * @param {lunr.Vector} otherVector - The vector to compute the dot product with. + * @returns {Number} + */ +lunr.Vector.prototype.dot = function (otherVector) { + var dotProduct = 0, + a = this.elements, b = otherVector.elements, + aLen = a.length, bLen = b.length, + aVal = 0, bVal = 0, + i = 0, j = 0 + + while (i < aLen && j < bLen) { + aVal = a[i], bVal = b[j] + if (aVal < bVal) { + i += 2 + } else if (aVal > bVal) { + j += 2 + } else if (aVal == bVal) { + dotProduct += a[i + 1] * b[j + 1] + i += 2 + j += 2 + } + } + + return dotProduct +} + +/** + * Calculates the similarity between this vector and another vector. + * + * @param {lunr.Vector} otherVector - The other vector to calculate the + * similarity with. + * @returns {Number} + */ +lunr.Vector.prototype.similarity = function (otherVector) { + return this.dot(otherVector) / this.magnitude() || 0 +} + +/** + * Converts the vector to an array of the elements within the vector. + * + * @returns {Number[]} + */ +lunr.Vector.prototype.toArray = function () { + var output = new Array (this.elements.length / 2) + + for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) { + output[j] = this.elements[i] + } + + return output +} + +/** + * A JSON serializable representation of the vector. + * + * @returns {Number[]} + */ +lunr.Vector.prototype.toJSON = function () { + return this.elements +} +/* eslint-disable */ +/*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ + +/** + * lunr.stemmer is an english language stemmer, this is a JavaScript + * implementation of the PorterStemmer taken from http://tartarus.org/~martin + * + * @static + * @implements {lunr.PipelineFunction} + * @param {lunr.Token} token - The string to stem + * @returns {lunr.Token} + * @see {@link lunr.Pipeline} + * @function + */ +lunr.stemmer = (function(){ + var step2list = { + "ational" : "ate", + "tional" : "tion", + "enci" : "ence", + "anci" : "ance", + "izer" : "ize", + "bli" : "ble", + "alli" : "al", + "entli" : "ent", + "eli" : "e", + "ousli" : "ous", + "ization" : "ize", + "ation" : "ate", + "ator" : "ate", + "alism" : "al", + "iveness" : "ive", + "fulness" : "ful", + "ousness" : "ous", + "aliti" : "al", + "iviti" : "ive", + "biliti" : "ble", + "logi" : "log" + }, + + step3list = { + "icate" : "ic", + "ative" : "", + "alize" : "al", + "iciti" : "ic", + "ical" : "ic", + "ful" : "", + "ness" : "" + }, + + c = "[^aeiou]", // consonant + v = "[aeiouy]", // vowel + C = c + "[^aeiouy]*", // consonant sequence + V = v + "[aeiou]*", // vowel sequence + + mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0 + meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1 + mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1 + s_v = "^(" + C + ")?" + v; // vowel in stem + + var re_mgr0 = new RegExp(mgr0); + var re_mgr1 = new RegExp(mgr1); + var re_meq1 = new RegExp(meq1); + var re_s_v = new RegExp(s_v); + + var re_1a = /^(.+?)(ss|i)es$/; + var re2_1a = /^(.+?)([^s])s$/; + var re_1b = /^(.+?)eed$/; + var re2_1b = /^(.+?)(ed|ing)$/; + var re_1b_2 = /.$/; + var re2_1b_2 = /(at|bl|iz)$/; + var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$"); + var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + + var re_1c = /^(.+?[^aeiou])y$/; + var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + + var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + + var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + var re2_4 = /^(.+?)(s|t)(ion)$/; + + var re_5 = /^(.+?)e$/; + var re_5_1 = /ll$/; + var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + + var porterStemmer = function porterStemmer(w) { + var stem, + suffix, + firstch, + re, + re2, + re3, + re4; + + if (w.length < 3) { return w; } + + firstch = w.substr(0,1); + if (firstch == "y") { + w = firstch.toUpperCase() + w.substr(1); + } + + // Step 1a + re = re_1a + re2 = re2_1a; + + if (re.test(w)) { w = w.replace(re,"$1$2"); } + else if (re2.test(w)) { w = w.replace(re2,"$1$2"); } + + // Step 1b + re = re_1b; + re2 = re2_1b; + if (re.test(w)) { + var fp = re.exec(w); + re = re_mgr0; + if (re.test(fp[1])) { + re = re_1b_2; + w = w.replace(re,""); + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = re_s_v; + if (re2.test(stem)) { + w = stem; + re2 = re2_1b_2; + re3 = re3_1b_2; + re4 = re4_1b_2; + if (re2.test(w)) { w = w + "e"; } + else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); } + else if (re4.test(w)) { w = w + "e"; } + } + } + + // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say) + re = re_1c; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem + "i"; + } + + // Step 2 + re = re_2; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step2list[suffix]; + } + } + + // Step 3 + re = re_3; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step3list[suffix]; + } + } + + // Step 4 + re = re_4; + re2 = re2_4; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + if (re.test(stem)) { + w = stem; + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = re_mgr1; + if (re2.test(stem)) { + w = stem; + } + } + + // Step 5 + re = re_5; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + re2 = re_meq1; + re3 = re3_5; + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) { + w = stem; + } + } + + re = re_5_1; + re2 = re_mgr1; + if (re.test(w) && re2.test(w)) { + re = re_1b_2; + w = w.replace(re,""); + } + + // and turn initial Y back to y + + if (firstch == "y") { + w = firstch.toLowerCase() + w.substr(1); + } + + return w; + }; + + return function (token) { + return token.update(porterStemmer); + } +})(); + +lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer') +/*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.generateStopWordFilter builds a stopWordFilter function from the provided + * list of stop words. + * + * The built in lunr.stopWordFilter is built using this generator and can be used + * to generate custom stopWordFilters for applications or non English languages. + * + * @function + * @param {Array} token The token to pass through the filter + * @returns {lunr.PipelineFunction} + * @see lunr.Pipeline + * @see lunr.stopWordFilter + */ +lunr.generateStopWordFilter = function (stopWords) { + var words = stopWords.reduce(function (memo, stopWord) { + memo[stopWord] = stopWord + return memo + }, {}) + + return function (token) { + if (token && words[token.toString()] !== token.toString()) return token + } +} + +/** + * lunr.stopWordFilter is an English language stop word list filter, any words + * contained in the list will not be passed through the filter. + * + * This is intended to be used in the Pipeline. If the token does not pass the + * filter then undefined will be returned. + * + * @function + * @implements {lunr.PipelineFunction} + * @params {lunr.Token} token - A token to check for being a stop word. + * @returns {lunr.Token} + * @see {@link lunr.Pipeline} + */ +lunr.stopWordFilter = lunr.generateStopWordFilter([ + 'a', + 'able', + 'about', + 'across', + 'after', + 'all', + 'almost', + 'also', + 'am', + 'among', + 'an', + 'and', + 'any', + 'are', + 'as', + 'at', + 'be', + 'because', + 'been', + 'but', + 'by', + 'can', + 'cannot', + 'could', + 'dear', + 'did', + 'do', + 'does', + 'either', + 'else', + 'ever', + 'every', + 'for', + 'from', + 'get', + 'got', + 'had', + 'has', + 'have', + 'he', + 'her', + 'hers', + 'him', + 'his', + 'how', + 'however', + 'i', + 'if', + 'in', + 'into', + 'is', + 'it', + 'its', + 'just', + 'least', + 'let', + 'like', + 'likely', + 'may', + 'me', + 'might', + 'most', + 'must', + 'my', + 'neither', + 'no', + 'nor', + 'not', + 'of', + 'off', + 'often', + 'on', + 'only', + 'or', + 'other', + 'our', + 'own', + 'rather', + 'said', + 'say', + 'says', + 'she', + 'should', + 'since', + 'so', + 'some', + 'than', + 'that', + 'the', + 'their', + 'them', + 'then', + 'there', + 'these', + 'they', + 'this', + 'tis', + 'to', + 'too', + 'twas', + 'us', + 'wants', + 'was', + 'we', + 'were', + 'what', + 'when', + 'where', + 'which', + 'while', + 'who', + 'whom', + 'why', + 'will', + 'with', + 'would', + 'yet', + 'you', + 'your' +]) + +lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter') +/*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.trimmer is a pipeline function for trimming non word + * characters from the beginning and end of tokens before they + * enter the index. + * + * This implementation may not work correctly for non latin + * characters and should either be removed or adapted for use + * with languages with non-latin characters. + * + * @static + * @implements {lunr.PipelineFunction} + * @param {lunr.Token} token The token to pass through the filter + * @returns {lunr.Token} + * @see lunr.Pipeline + */ +lunr.trimmer = function (token) { + return token.update(function (s) { + return s.replace(/^\W+/, '').replace(/\W+$/, '') + }) +} + +lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer') +/*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A token set is used to store the unique list of all tokens + * within an index. Token sets are also used to represent an + * incoming query to the index, this query token set and index + * token set are then intersected to find which tokens to look + * up in the inverted index. + * + * A token set can hold multiple tokens, as in the case of the + * index token set, or it can hold a single token as in the + * case of a simple query token set. + * + * Additionally token sets are used to perform wildcard matching. + * Leading, contained and trailing wildcards are supported, and + * from this edit distance matching can also be provided. + * + * Token sets are implemented as a minimal finite state automata, + * where both common prefixes and suffixes are shared between tokens. + * This helps to reduce the space used for storing the token set. + * + * @constructor + */ +lunr.TokenSet = function () { + this.final = false + this.edges = {} + this.id = lunr.TokenSet._nextId + lunr.TokenSet._nextId += 1 +} + +/** + * Keeps track of the next, auto increment, identifier to assign + * to a new tokenSet. + * + * TokenSets require a unique identifier to be correctly minimised. + * + * @private + */ +lunr.TokenSet._nextId = 1 + +/** + * Creates a TokenSet instance from the given sorted array of words. + * + * @param {String[]} arr - A sorted array of strings to create the set from. + * @returns {lunr.TokenSet} + * @throws Will throw an error if the input array is not sorted. + */ +lunr.TokenSet.fromArray = function (arr) { + var builder = new lunr.TokenSet.Builder + + for (var i = 0, len = arr.length; i < len; i++) { + builder.insert(arr[i]) + } + + builder.finish() + return builder.root +} + +/** + * Creates a token set from a query clause. + * + * @private + * @param {Object} clause - A single clause from lunr.Query. + * @param {string} clause.term - The query clause term. + * @param {number} [clause.editDistance] - The optional edit distance for the term. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.fromClause = function (clause) { + if ('editDistance' in clause) { + return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance) + } else { + return lunr.TokenSet.fromString(clause.term) + } +} + +/** + * Creates a token set representing a single string with a specified + * edit distance. + * + * Insertions, deletions, substitutions and transpositions are each + * treated as an edit distance of 1. + * + * Increasing the allowed edit distance will have a dramatic impact + * on the performance of both creating and intersecting these TokenSets. + * It is advised to keep the edit distance less than 3. + * + * @param {string} str - The string to create the token set from. + * @param {number} editDistance - The allowed edit distance to match. + * @returns {lunr.Vector} + */ +lunr.TokenSet.fromFuzzyString = function (str, editDistance) { + var root = new lunr.TokenSet + + var stack = [{ + node: root, + editsRemaining: editDistance, + str: str + }] + + while (stack.length) { + var frame = stack.pop() + + // no edit + if (frame.str.length > 0) { + var char = frame.str.charAt(0), + noEditNode + + if (char in frame.node.edges) { + noEditNode = frame.node.edges[char] + } else { + noEditNode = new lunr.TokenSet + frame.node.edges[char] = noEditNode + } + + if (frame.str.length == 1) { + noEditNode.final = true + } + + stack.push({ + node: noEditNode, + editsRemaining: frame.editsRemaining, + str: frame.str.slice(1) + }) + } + + if (frame.editsRemaining == 0) { + continue + } + + // insertion + if ("*" in frame.node.edges) { + var insertionNode = frame.node.edges["*"] + } else { + var insertionNode = new lunr.TokenSet + frame.node.edges["*"] = insertionNode + } + + if (frame.str.length == 0) { + insertionNode.final = true + } + + stack.push({ + node: insertionNode, + editsRemaining: frame.editsRemaining - 1, + str: frame.str + }) + + // deletion + // can only do a deletion if we have enough edits remaining + // and if there are characters left to delete in the string + if (frame.str.length > 1) { + stack.push({ + node: frame.node, + editsRemaining: frame.editsRemaining - 1, + str: frame.str.slice(1) + }) + } + + // deletion + // just removing the last character from the str + if (frame.str.length == 1) { + frame.node.final = true + } + + // substitution + // can only do a substitution if we have enough edits remaining + // and if there are characters left to substitute + if (frame.str.length >= 1) { + if ("*" in frame.node.edges) { + var substitutionNode = frame.node.edges["*"] + } else { + var substitutionNode = new lunr.TokenSet + frame.node.edges["*"] = substitutionNode + } + + if (frame.str.length == 1) { + substitutionNode.final = true + } + + stack.push({ + node: substitutionNode, + editsRemaining: frame.editsRemaining - 1, + str: frame.str.slice(1) + }) + } + + // transposition + // can only do a transposition if there are edits remaining + // and there are enough characters to transpose + if (frame.str.length > 1) { + var charA = frame.str.charAt(0), + charB = frame.str.charAt(1), + transposeNode + + if (charB in frame.node.edges) { + transposeNode = frame.node.edges[charB] + } else { + transposeNode = new lunr.TokenSet + frame.node.edges[charB] = transposeNode + } + + if (frame.str.length == 1) { + transposeNode.final = true + } + + stack.push({ + node: transposeNode, + editsRemaining: frame.editsRemaining - 1, + str: charA + frame.str.slice(2) + }) + } + } + + return root +} + +/** + * Creates a TokenSet from a string. + * + * The string may contain one or more wildcard characters (*) + * that will allow wildcard matching when intersecting with + * another TokenSet. + * + * @param {string} str - The string to create a TokenSet from. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.fromString = function (str) { + var node = new lunr.TokenSet, + root = node + + /* + * Iterates through all characters within the passed string + * appending a node for each character. + * + * When a wildcard character is found then a self + * referencing edge is introduced to continually match + * any number of any characters. + */ + for (var i = 0, len = str.length; i < len; i++) { + var char = str[i], + final = (i == len - 1) + + if (char == "*") { + node.edges[char] = node + node.final = final + + } else { + var next = new lunr.TokenSet + next.final = final + + node.edges[char] = next + node = next + } + } + + return root +} + +/** + * Converts this TokenSet into an array of strings + * contained within the TokenSet. + * + * This is not intended to be used on a TokenSet that + * contains wildcards, in these cases the results are + * undefined and are likely to cause an infinite loop. + * + * @returns {string[]} + */ +lunr.TokenSet.prototype.toArray = function () { + var words = [] + + var stack = [{ + prefix: "", + node: this + }] + + while (stack.length) { + var frame = stack.pop(), + edges = Object.keys(frame.node.edges), + len = edges.length + + if (frame.node.final) { + /* In Safari, at this point the prefix is sometimes corrupted, see: + * https://github.com/olivernn/lunr.js/issues/279 Calling any + * String.prototype method forces Safari to "cast" this string to what + * it's supposed to be, fixing the bug. */ + frame.prefix.charAt(0) + words.push(frame.prefix) + } + + for (var i = 0; i < len; i++) { + var edge = edges[i] + + stack.push({ + prefix: frame.prefix.concat(edge), + node: frame.node.edges[edge] + }) + } + } + + return words +} + +/** + * Generates a string representation of a TokenSet. + * + * This is intended to allow TokenSets to be used as keys + * in objects, largely to aid the construction and minimisation + * of a TokenSet. As such it is not designed to be a human + * friendly representation of the TokenSet. + * + * @returns {string} + */ +lunr.TokenSet.prototype.toString = function () { + // NOTE: Using Object.keys here as this.edges is very likely + // to enter 'hash-mode' with many keys being added + // + // avoiding a for-in loop here as it leads to the function + // being de-optimised (at least in V8). From some simple + // benchmarks the performance is comparable, but allowing + // V8 to optimize may mean easy performance wins in the future. + + if (this._str) { + return this._str + } + + var str = this.final ? '1' : '0', + labels = Object.keys(this.edges).sort(), + len = labels.length + + for (var i = 0; i < len; i++) { + var label = labels[i], + node = this.edges[label] + + str = str + label + node.id + } + + return str +} + +/** + * Returns a new TokenSet that is the intersection of + * this TokenSet and the passed TokenSet. + * + * This intersection will take into account any wildcards + * contained within the TokenSet. + * + * @param {lunr.TokenSet} b - An other TokenSet to intersect with. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.prototype.intersect = function (b) { + var output = new lunr.TokenSet, + frame = undefined + + var stack = [{ + qNode: b, + output: output, + node: this + }] + + while (stack.length) { + frame = stack.pop() + + // NOTE: As with the #toString method, we are using + // Object.keys and a for loop instead of a for-in loop + // as both of these objects enter 'hash' mode, causing + // the function to be de-optimised in V8 + var qEdges = Object.keys(frame.qNode.edges), + qLen = qEdges.length, + nEdges = Object.keys(frame.node.edges), + nLen = nEdges.length + + for (var q = 0; q < qLen; q++) { + var qEdge = qEdges[q] + + for (var n = 0; n < nLen; n++) { + var nEdge = nEdges[n] + + if (nEdge == qEdge || qEdge == '*') { + var node = frame.node.edges[nEdge], + qNode = frame.qNode.edges[qEdge], + final = node.final && qNode.final, + next = undefined + + if (nEdge in frame.output.edges) { + // an edge already exists for this character + // no need to create a new node, just set the finality + // bit unless this node is already final + next = frame.output.edges[nEdge] + next.final = next.final || final + + } else { + // no edge exists yet, must create one + // set the finality bit and insert it + // into the output + next = new lunr.TokenSet + next.final = final + frame.output.edges[nEdge] = next + } + + stack.push({ + qNode: qNode, + output: next, + node: node + }) + } + } + } + } + + return output +} +lunr.TokenSet.Builder = function () { + this.previousWord = "" + this.root = new lunr.TokenSet + this.uncheckedNodes = [] + this.minimizedNodes = {} +} + +lunr.TokenSet.Builder.prototype.insert = function (word) { + var node, + commonPrefix = 0 + + if (word < this.previousWord) { + throw new Error ("Out of order word insertion") + } + + for (var i = 0; i < word.length && i < this.previousWord.length; i++) { + if (word[i] != this.previousWord[i]) break + commonPrefix++ + } + + this.minimize(commonPrefix) + + if (this.uncheckedNodes.length == 0) { + node = this.root + } else { + node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child + } + + for (var i = commonPrefix; i < word.length; i++) { + var nextNode = new lunr.TokenSet, + char = word[i] + + node.edges[char] = nextNode + + this.uncheckedNodes.push({ + parent: node, + char: char, + child: nextNode + }) + + node = nextNode + } + + node.final = true + this.previousWord = word +} + +lunr.TokenSet.Builder.prototype.finish = function () { + this.minimize(0) +} + +lunr.TokenSet.Builder.prototype.minimize = function (downTo) { + for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) { + var node = this.uncheckedNodes[i], + childKey = node.child.toString() + + if (childKey in this.minimizedNodes) { + node.parent.edges[node.char] = this.minimizedNodes[childKey] + } else { + // Cache the key for this node since + // we know it can't change anymore + node.child._str = childKey + + this.minimizedNodes[childKey] = node.child + } + + this.uncheckedNodes.pop() + } +} +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * An index contains the built index of all documents and provides a query interface + * to the index. + * + * Usually instances of lunr.Index will not be created using this constructor, instead + * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be + * used to load previously built and serialized indexes. + * + * @constructor + * @param {Object} attrs - The attributes of the built search index. + * @param {Object} attrs.invertedIndex - An index of term/field to document reference. + * @param {Object} attrs.fieldVectors - Field vectors + * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens. + * @param {string[]} attrs.fields - The names of indexed document fields. + * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms. + */ +lunr.Index = function (attrs) { + this.invertedIndex = attrs.invertedIndex + this.fieldVectors = attrs.fieldVectors + this.tokenSet = attrs.tokenSet + this.fields = attrs.fields + this.pipeline = attrs.pipeline +} + +/** + * A result contains details of a document matching a search query. + * @typedef {Object} lunr.Index~Result + * @property {string} ref - The reference of the document this result represents. + * @property {number} score - A number between 0 and 1 representing how similar this document is to the query. + * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match. + */ + +/** + * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple + * query language which itself is parsed into an instance of lunr.Query. + * + * For programmatically building queries it is advised to directly use lunr.Query, the query language + * is best used for human entered text rather than program generated text. + * + * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported + * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello' + * or 'world', though those that contain both will rank higher in the results. + * + * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can + * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding + * wildcards will increase the number of documents that will be found but can also have a negative + * impact on query performance, especially with wildcards at the beginning of a term. + * + * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term + * hello in the title field will match this query. Using a field not present in the index will lead + * to an error being thrown. + * + * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term + * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported + * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2. + * Avoid large values for edit distance to improve query performance. + * + * Each term also supports a presence modifier. By default a term's presence in document is optional, however + * this can be changed to either required or prohibited. For a term's presence to be required in a document the + * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and + * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not + * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'. + * + * To escape special characters the backslash character '\' can be used, this allows searches to include + * characters that would normally be considered modifiers, e.g. `foo\~2` will search for a term "foo~2" instead + * of attempting to apply a boost of 2 to the search term "foo". + * + * @typedef {string} lunr.Index~QueryString + * @example Simple single term query + * hello + * @example Multiple term query + * hello world + * @example term scoped to a field + * title:hello + * @example term with a boost of 10 + * hello^10 + * @example term with an edit distance of 2 + * hello~2 + * @example terms with presence modifiers + * -foo +bar baz + */ + +/** + * Performs a search against the index using lunr query syntax. + * + * Results will be returned sorted by their score, the most relevant results + * will be returned first. For details on how the score is calculated, please see + * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}. + * + * For more programmatic querying use lunr.Index#query. + * + * @param {lunr.Index~QueryString} queryString - A string containing a lunr query. + * @throws {lunr.QueryParseError} If the passed query string cannot be parsed. + * @returns {lunr.Index~Result[]} + */ +lunr.Index.prototype.search = function (queryString) { + return this.query(function (query) { + var parser = new lunr.QueryParser(queryString, query) + parser.parse() + }) +} + +/** + * A query builder callback provides a query object to be used to express + * the query to perform on the index. + * + * @callback lunr.Index~queryBuilder + * @param {lunr.Query} query - The query object to build up. + * @this lunr.Query + */ + +/** + * Performs a query against the index using the yielded lunr.Query object. + * + * If performing programmatic queries against the index, this method is preferred + * over lunr.Index#search so as to avoid the additional query parsing overhead. + * + * A query object is yielded to the supplied function which should be used to + * express the query to be run against the index. + * + * Note that although this function takes a callback parameter it is _not_ an + * asynchronous operation, the callback is just yielded a query object to be + * customized. + * + * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query. + * @returns {lunr.Index~Result[]} + */ +lunr.Index.prototype.query = function (fn) { + // for each query clause + // * process terms + // * expand terms from token set + // * find matching documents and metadata + // * get document vectors + // * score documents + + var query = new lunr.Query(this.fields), + matchingFields = Object.create(null), + queryVectors = Object.create(null), + termFieldCache = Object.create(null), + requiredMatches = Object.create(null), + prohibitedMatches = Object.create(null) + + /* + * To support field level boosts a query vector is created per + * field. An empty vector is eagerly created to support negated + * queries. + */ + for (var i = 0; i < this.fields.length; i++) { + queryVectors[this.fields[i]] = new lunr.Vector + } + + fn.call(query, query) + + for (var i = 0; i < query.clauses.length; i++) { + /* + * Unless the pipeline has been disabled for this term, which is + * the case for terms with wildcards, we need to pass the clause + * term through the search pipeline. A pipeline returns an array + * of processed terms. Pipeline functions may expand the passed + * term, which means we may end up performing multiple index lookups + * for a single query term. + */ + var clause = query.clauses[i], + terms = null, + clauseMatches = lunr.Set.empty + + if (clause.usePipeline) { + terms = this.pipeline.runString(clause.term, { + fields: clause.fields + }) + } else { + terms = [clause.term] + } + + for (var m = 0; m < terms.length; m++) { + var term = terms[m] + + /* + * Each term returned from the pipeline needs to use the same query + * clause object, e.g. the same boost and or edit distance. The + * simplest way to do this is to re-use the clause object but mutate + * its term property. + */ + clause.term = term + + /* + * From the term in the clause we create a token set which will then + * be used to intersect the indexes token set to get a list of terms + * to lookup in the inverted index + */ + var termTokenSet = lunr.TokenSet.fromClause(clause), + expandedTerms = this.tokenSet.intersect(termTokenSet).toArray() + + /* + * If a term marked as required does not exist in the tokenSet it is + * impossible for the search to return any matches. We set all the field + * scoped required matches set to empty and stop examining any further + * clauses. + */ + if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) { + for (var k = 0; k < clause.fields.length; k++) { + var field = clause.fields[k] + requiredMatches[field] = lunr.Set.empty + } + + break + } + + for (var j = 0; j < expandedTerms.length; j++) { + /* + * For each term get the posting and termIndex, this is required for + * building the query vector. + */ + var expandedTerm = expandedTerms[j], + posting = this.invertedIndex[expandedTerm], + termIndex = posting._index + + for (var k = 0; k < clause.fields.length; k++) { + /* + * For each field that this query term is scoped by (by default + * all fields are in scope) we need to get all the document refs + * that have this term in that field. + * + * The posting is the entry in the invertedIndex for the matching + * term from above. + */ + var field = clause.fields[k], + fieldPosting = posting[field], + matchingDocumentRefs = Object.keys(fieldPosting), + termField = expandedTerm + "/" + field, + matchingDocumentsSet = new lunr.Set(matchingDocumentRefs) + + /* + * if the presence of this term is required ensure that the matching + * documents are added to the set of required matches for this clause. + * + */ + if (clause.presence == lunr.Query.presence.REQUIRED) { + clauseMatches = clauseMatches.union(matchingDocumentsSet) + + if (requiredMatches[field] === undefined) { + requiredMatches[field] = lunr.Set.complete + } + } + + /* + * if the presence of this term is prohibited ensure that the matching + * documents are added to the set of prohibited matches for this field, + * creating that set if it does not yet exist. + */ + if (clause.presence == lunr.Query.presence.PROHIBITED) { + if (prohibitedMatches[field] === undefined) { + prohibitedMatches[field] = lunr.Set.empty + } + + prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet) + + /* + * Prohibited matches should not be part of the query vector used for + * similarity scoring and no metadata should be extracted so we continue + * to the next field + */ + continue + } + + /* + * The query field vector is populated using the termIndex found for + * the term and a unit value with the appropriate boost applied. + * Using upsert because there could already be an entry in the vector + * for the term we are working with. In that case we just add the scores + * together. + */ + queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b }) + + /** + * If we've already seen this term, field combo then we've already collected + * the matching documents and metadata, no need to go through all that again + */ + if (termFieldCache[termField]) { + continue + } + + for (var l = 0; l < matchingDocumentRefs.length; l++) { + /* + * All metadata for this term/field/document triple + * are then extracted and collected into an instance + * of lunr.MatchData ready to be returned in the query + * results + */ + var matchingDocumentRef = matchingDocumentRefs[l], + matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field), + metadata = fieldPosting[matchingDocumentRef], + fieldMatch + + if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) { + matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata) + } else { + fieldMatch.add(expandedTerm, field, metadata) + } + + } + + termFieldCache[termField] = true + } + } + } + + /** + * If the presence was required we need to update the requiredMatches field sets. + * We do this after all fields for the term have collected their matches because + * the clause terms presence is required in _any_ of the fields not _all_ of the + * fields. + */ + if (clause.presence === lunr.Query.presence.REQUIRED) { + for (var k = 0; k < clause.fields.length; k++) { + var field = clause.fields[k] + requiredMatches[field] = requiredMatches[field].intersect(clauseMatches) + } + } + } + + /** + * Need to combine the field scoped required and prohibited + * matching documents into a global set of required and prohibited + * matches + */ + var allRequiredMatches = lunr.Set.complete, + allProhibitedMatches = lunr.Set.empty + + for (var i = 0; i < this.fields.length; i++) { + var field = this.fields[i] + + if (requiredMatches[field]) { + allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field]) + } + + if (prohibitedMatches[field]) { + allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field]) + } + } + + var matchingFieldRefs = Object.keys(matchingFields), + results = [], + matches = Object.create(null) + + /* + * If the query is negated (contains only prohibited terms) + * we need to get _all_ fieldRefs currently existing in the + * index. This is only done when we know that the query is + * entirely prohibited terms to avoid any cost of getting all + * fieldRefs unnecessarily. + * + * Additionally, blank MatchData must be created to correctly + * populate the results. + */ + if (query.isNegated()) { + matchingFieldRefs = Object.keys(this.fieldVectors) + + for (var i = 0; i < matchingFieldRefs.length; i++) { + var matchingFieldRef = matchingFieldRefs[i] + var fieldRef = lunr.FieldRef.fromString(matchingFieldRef) + matchingFields[matchingFieldRef] = new lunr.MatchData + } + } + + for (var i = 0; i < matchingFieldRefs.length; i++) { + /* + * Currently we have document fields that match the query, but we + * need to return documents. The matchData and scores are combined + * from multiple fields belonging to the same document. + * + * Scores are calculated by field, using the query vectors created + * above, and combined into a final document score using addition. + */ + var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]), + docRef = fieldRef.docRef + + if (!allRequiredMatches.contains(docRef)) { + continue + } + + if (allProhibitedMatches.contains(docRef)) { + continue + } + + var fieldVector = this.fieldVectors[fieldRef], + score = queryVectors[fieldRef.fieldName].similarity(fieldVector), + docMatch + + if ((docMatch = matches[docRef]) !== undefined) { + docMatch.score += score + docMatch.matchData.combine(matchingFields[fieldRef]) + } else { + var match = { + ref: docRef, + score: score, + matchData: matchingFields[fieldRef] + } + matches[docRef] = match + results.push(match) + } + } + + /* + * Sort the results objects by score, highest first. + */ + return results.sort(function (a, b) { + return b.score - a.score + }) +} + +/** + * Prepares the index for JSON serialization. + * + * The schema for this JSON blob will be described in a + * separate JSON schema file. + * + * @returns {Object} + */ +lunr.Index.prototype.toJSON = function () { + var invertedIndex = Object.keys(this.invertedIndex) + .sort() + .map(function (term) { + return [term, this.invertedIndex[term]] + }, this) + + var fieldVectors = Object.keys(this.fieldVectors) + .map(function (ref) { + return [ref, this.fieldVectors[ref].toJSON()] + }, this) + + return { + version: lunr.version, + fields: this.fields, + fieldVectors: fieldVectors, + invertedIndex: invertedIndex, + pipeline: this.pipeline.toJSON() + } +} + +/** + * Loads a previously serialized lunr.Index + * + * @param {Object} serializedIndex - A previously serialized lunr.Index + * @returns {lunr.Index} + */ +lunr.Index.load = function (serializedIndex) { + var attrs = {}, + fieldVectors = {}, + serializedVectors = serializedIndex.fieldVectors, + invertedIndex = Object.create(null), + serializedInvertedIndex = serializedIndex.invertedIndex, + tokenSetBuilder = new lunr.TokenSet.Builder, + pipeline = lunr.Pipeline.load(serializedIndex.pipeline) + + if (serializedIndex.version != lunr.version) { + lunr.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + lunr.version + "' does not match serialized index '" + serializedIndex.version + "'") + } + + for (var i = 0; i < serializedVectors.length; i++) { + var tuple = serializedVectors[i], + ref = tuple[0], + elements = tuple[1] + + fieldVectors[ref] = new lunr.Vector(elements) + } + + for (var i = 0; i < serializedInvertedIndex.length; i++) { + var tuple = serializedInvertedIndex[i], + term = tuple[0], + posting = tuple[1] + + tokenSetBuilder.insert(term) + invertedIndex[term] = posting + } + + tokenSetBuilder.finish() + + attrs.fields = serializedIndex.fields + + attrs.fieldVectors = fieldVectors + attrs.invertedIndex = invertedIndex + attrs.tokenSet = tokenSetBuilder.root + attrs.pipeline = pipeline + + return new lunr.Index(attrs) +} +/*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.Builder performs indexing on a set of documents and + * returns instances of lunr.Index ready for querying. + * + * All configuration of the index is done via the builder, the + * fields to index, the document reference, the text processing + * pipeline and document scoring parameters are all set on the + * builder before indexing. + * + * @constructor + * @property {string} _ref - Internal reference to the document reference field. + * @property {string[]} _fields - Internal reference to the document fields to index. + * @property {object} invertedIndex - The inverted index maps terms to document fields. + * @property {object} documentTermFrequencies - Keeps track of document term frequencies. + * @property {object} documentLengths - Keeps track of the length of documents added to the index. + * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing. + * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing. + * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index. + * @property {number} documentCount - Keeps track of the total number of documents indexed. + * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75. + * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2. + * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space. + * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index. + */ +lunr.Builder = function () { + this._ref = "id" + this._fields = Object.create(null) + this._documents = Object.create(null) + this.invertedIndex = Object.create(null) + this.fieldTermFrequencies = {} + this.fieldLengths = {} + this.tokenizer = lunr.tokenizer + this.pipeline = new lunr.Pipeline + this.searchPipeline = new lunr.Pipeline + this.documentCount = 0 + this._b = 0.75 + this._k1 = 1.2 + this.termIndex = 0 + this.metadataWhitelist = [] +} + +/** + * Sets the document field used as the document reference. Every document must have this field. + * The type of this field in the document should be a string, if it is not a string it will be + * coerced into a string by calling toString. + * + * The default ref is 'id'. + * + * The ref should _not_ be changed during indexing, it should be set before any documents are + * added to the index. Changing it during indexing can lead to inconsistent results. + * + * @param {string} ref - The name of the reference field in the document. + */ +lunr.Builder.prototype.ref = function (ref) { + this._ref = ref +} + +/** + * A function that is used to extract a field from a document. + * + * Lunr expects a field to be at the top level of a document, if however the field + * is deeply nested within a document an extractor function can be used to extract + * the right field for indexing. + * + * @callback fieldExtractor + * @param {object} doc - The document being added to the index. + * @returns {?(string|object|object[])} obj - The object that will be indexed for this field. + * @example Extracting a nested field + * function (doc) { return doc.nested.field } + */ + +/** + * Adds a field to the list of document fields that will be indexed. Every document being + * indexed should have this field. Null values for this field in indexed documents will + * not cause errors but will limit the chance of that document being retrieved by searches. + * + * All fields should be added before adding documents to the index. Adding fields after + * a document has been indexed will have no effect on already indexed documents. + * + * Fields can be boosted at build time. This allows terms within that field to have more + * importance when ranking search results. Use a field boost to specify that matches within + * one field are more important than other fields. + * + * @param {string} fieldName - The name of a field to index in all documents. + * @param {object} attributes - Optional attributes associated with this field. + * @param {number} [attributes.boost=1] - Boost applied to all terms within this field. + * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document. + * @throws {RangeError} fieldName cannot contain unsupported characters '/' + */ +lunr.Builder.prototype.field = function (fieldName, attributes) { + if (/\//.test(fieldName)) { + throw new RangeError ("Field '" + fieldName + "' contains illegal character '/'") + } + + this._fields[fieldName] = attributes || {} +} + +/** + * A parameter to tune the amount of field length normalisation that is applied when + * calculating relevance scores. A value of 0 will completely disable any normalisation + * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b + * will be clamped to the range 0 - 1. + * + * @param {number} number - The value to set for this tuning parameter. + */ +lunr.Builder.prototype.b = function (number) { + if (number < 0) { + this._b = 0 + } else if (number > 1) { + this._b = 1 + } else { + this._b = number + } +} + +/** + * A parameter that controls the speed at which a rise in term frequency results in term + * frequency saturation. The default value is 1.2. Setting this to a higher value will give + * slower saturation levels, a lower value will result in quicker saturation. + * + * @param {number} number - The value to set for this tuning parameter. + */ +lunr.Builder.prototype.k1 = function (number) { + this._k1 = number +} + +/** + * Adds a document to the index. + * + * Before adding fields to the index the index should have been fully setup, with the document + * ref and all fields to index already having been specified. + * + * The document must have a field name as specified by the ref (by default this is 'id') and + * it should have all fields defined for indexing, though null or undefined values will not + * cause errors. + * + * Entire documents can be boosted at build time. Applying a boost to a document indicates that + * this document should rank higher in search results than other documents. + * + * @param {object} doc - The document to add to the index. + * @param {object} attributes - Optional attributes associated with this document. + * @param {number} [attributes.boost=1] - Boost applied to all terms within this document. + */ +lunr.Builder.prototype.add = function (doc, attributes) { + var docRef = doc[this._ref], + fields = Object.keys(this._fields) + + this._documents[docRef] = attributes || {} + this.documentCount += 1 + + for (var i = 0; i < fields.length; i++) { + var fieldName = fields[i], + extractor = this._fields[fieldName].extractor, + field = extractor ? extractor(doc) : doc[fieldName], + tokens = this.tokenizer(field, { + fields: [fieldName] + }), + terms = this.pipeline.run(tokens), + fieldRef = new lunr.FieldRef (docRef, fieldName), + fieldTerms = Object.create(null) + + this.fieldTermFrequencies[fieldRef] = fieldTerms + this.fieldLengths[fieldRef] = 0 + + // store the length of this field for this document + this.fieldLengths[fieldRef] += terms.length + + // calculate term frequencies for this field + for (var j = 0; j < terms.length; j++) { + var term = terms[j] + + if (fieldTerms[term] == undefined) { + fieldTerms[term] = 0 + } + + fieldTerms[term] += 1 + + // add to inverted index + // create an initial posting if one doesn't exist + if (this.invertedIndex[term] == undefined) { + var posting = Object.create(null) + posting["_index"] = this.termIndex + this.termIndex += 1 + + for (var k = 0; k < fields.length; k++) { + posting[fields[k]] = Object.create(null) + } + + this.invertedIndex[term] = posting + } + + // add an entry for this term/fieldName/docRef to the invertedIndex + if (this.invertedIndex[term][fieldName][docRef] == undefined) { + this.invertedIndex[term][fieldName][docRef] = Object.create(null) + } + + // store all whitelisted metadata about this token in the + // inverted index + for (var l = 0; l < this.metadataWhitelist.length; l++) { + var metadataKey = this.metadataWhitelist[l], + metadata = term.metadata[metadataKey] + + if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) { + this.invertedIndex[term][fieldName][docRef][metadataKey] = [] + } + + this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata) + } + } + + } +} + +/** + * Calculates the average document length for this index + * + * @private + */ +lunr.Builder.prototype.calculateAverageFieldLengths = function () { + + var fieldRefs = Object.keys(this.fieldLengths), + numberOfFields = fieldRefs.length, + accumulator = {}, + documentsWithField = {} + + for (var i = 0; i < numberOfFields; i++) { + var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), + field = fieldRef.fieldName + + documentsWithField[field] || (documentsWithField[field] = 0) + documentsWithField[field] += 1 + + accumulator[field] || (accumulator[field] = 0) + accumulator[field] += this.fieldLengths[fieldRef] + } + + var fields = Object.keys(this._fields) + + for (var i = 0; i < fields.length; i++) { + var fieldName = fields[i] + accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName] + } + + this.averageFieldLength = accumulator +} + +/** + * Builds a vector space model of every document using lunr.Vector + * + * @private + */ +lunr.Builder.prototype.createFieldVectors = function () { + var fieldVectors = {}, + fieldRefs = Object.keys(this.fieldTermFrequencies), + fieldRefsLength = fieldRefs.length, + termIdfCache = Object.create(null) + + for (var i = 0; i < fieldRefsLength; i++) { + var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), + fieldName = fieldRef.fieldName, + fieldLength = this.fieldLengths[fieldRef], + fieldVector = new lunr.Vector, + termFrequencies = this.fieldTermFrequencies[fieldRef], + terms = Object.keys(termFrequencies), + termsLength = terms.length + + + var fieldBoost = this._fields[fieldName].boost || 1, + docBoost = this._documents[fieldRef.docRef].boost || 1 + + for (var j = 0; j < termsLength; j++) { + var term = terms[j], + tf = termFrequencies[term], + termIndex = this.invertedIndex[term]._index, + idf, score, scoreWithPrecision + + if (termIdfCache[term] === undefined) { + idf = lunr.idf(this.invertedIndex[term], this.documentCount) + termIdfCache[term] = idf + } else { + idf = termIdfCache[term] + } + + score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf) + score *= fieldBoost + score *= docBoost + scoreWithPrecision = Math.round(score * 1000) / 1000 + // Converts 1.23456789 to 1.234. + // Reducing the precision so that the vectors take up less + // space when serialised. Doing it now so that they behave + // the same before and after serialisation. Also, this is + // the fastest approach to reducing a number's precision in + // JavaScript. + + fieldVector.insert(termIndex, scoreWithPrecision) + } + + fieldVectors[fieldRef] = fieldVector + } + + this.fieldVectors = fieldVectors +} + +/** + * Creates a token set of all tokens in the index using lunr.TokenSet + * + * @private + */ +lunr.Builder.prototype.createTokenSet = function () { + this.tokenSet = lunr.TokenSet.fromArray( + Object.keys(this.invertedIndex).sort() + ) +} + +/** + * Builds the index, creating an instance of lunr.Index. + * + * This completes the indexing process and should only be called + * once all documents have been added to the index. + * + * @returns {lunr.Index} + */ +lunr.Builder.prototype.build = function () { + this.calculateAverageFieldLengths() + this.createFieldVectors() + this.createTokenSet() + + return new lunr.Index({ + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline + }) +} + +/** + * Applies a plugin to the index builder. + * + * A plugin is a function that is called with the index builder as its context. + * Plugins can be used to customise or extend the behaviour of the index + * in some way. A plugin is just a function, that encapsulated the custom + * behaviour that should be applied when building the index. + * + * The plugin function will be called with the index builder as its argument, additional + * arguments can also be passed when calling use. The function will be called + * with the index builder as its context. + * + * @param {Function} plugin The plugin to apply. + */ +lunr.Builder.prototype.use = function (fn) { + var args = Array.prototype.slice.call(arguments, 1) + args.unshift(this) + fn.apply(this, args) +} +/** + * Contains and collects metadata about a matching document. + * A single instance of lunr.MatchData is returned as part of every + * lunr.Index~Result. + * + * @constructor + * @param {string} term - The term this match data is associated with + * @param {string} field - The field in which the term was found + * @param {object} metadata - The metadata recorded about this term in this field + * @property {object} metadata - A cloned collection of metadata associated with this document. + * @see {@link lunr.Index~Result} + */ +lunr.MatchData = function (term, field, metadata) { + var clonedMetadata = Object.create(null), + metadataKeys = Object.keys(metadata || {}) + + // Cloning the metadata to prevent the original + // being mutated during match data combination. + // Metadata is kept in an array within the inverted + // index so cloning the data can be done with + // Array#slice + for (var i = 0; i < metadataKeys.length; i++) { + var key = metadataKeys[i] + clonedMetadata[key] = metadata[key].slice() + } + + this.metadata = Object.create(null) + + if (term !== undefined) { + this.metadata[term] = Object.create(null) + this.metadata[term][field] = clonedMetadata + } +} + +/** + * An instance of lunr.MatchData will be created for every term that matches a + * document. However only one instance is required in a lunr.Index~Result. This + * method combines metadata from another instance of lunr.MatchData with this + * objects metadata. + * + * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one. + * @see {@link lunr.Index~Result} + */ +lunr.MatchData.prototype.combine = function (otherMatchData) { + var terms = Object.keys(otherMatchData.metadata) + + for (var i = 0; i < terms.length; i++) { + var term = terms[i], + fields = Object.keys(otherMatchData.metadata[term]) + + if (this.metadata[term] == undefined) { + this.metadata[term] = Object.create(null) + } + + for (var j = 0; j < fields.length; j++) { + var field = fields[j], + keys = Object.keys(otherMatchData.metadata[term][field]) + + if (this.metadata[term][field] == undefined) { + this.metadata[term][field] = Object.create(null) + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k] + + if (this.metadata[term][field][key] == undefined) { + this.metadata[term][field][key] = otherMatchData.metadata[term][field][key] + } else { + this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key]) + } + + } + } + } +} + +/** + * Add metadata for a term/field pair to this instance of match data. + * + * @param {string} term - The term this match data is associated with + * @param {string} field - The field in which the term was found + * @param {object} metadata - The metadata recorded about this term in this field + */ +lunr.MatchData.prototype.add = function (term, field, metadata) { + if (!(term in this.metadata)) { + this.metadata[term] = Object.create(null) + this.metadata[term][field] = metadata + return + } + + if (!(field in this.metadata[term])) { + this.metadata[term][field] = metadata + return + } + + var metadataKeys = Object.keys(metadata) + + for (var i = 0; i < metadataKeys.length; i++) { + var key = metadataKeys[i] + + if (key in this.metadata[term][field]) { + this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key]) + } else { + this.metadata[term][field][key] = metadata[key] + } + } +} +/** + * A lunr.Query provides a programmatic way of defining queries to be performed + * against a {@link lunr.Index}. + * + * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method + * so the query object is pre-initialized with the right index fields. + * + * @constructor + * @property {lunr.Query~Clause[]} clauses - An array of query clauses. + * @property {string[]} allFields - An array of all available fields in a lunr.Index. + */ +lunr.Query = function (allFields) { + this.clauses = [] + this.allFields = allFields +} + +/** + * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause. + * + * This allows wildcards to be added to the beginning and end of a term without having to manually do any string + * concatenation. + * + * The wildcard constants can be bitwise combined to select both leading and trailing wildcards. + * + * @constant + * @default + * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour + * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists + * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists + * @see lunr.Query~Clause + * @see lunr.Query#clause + * @see lunr.Query#term + * @example query term with trailing wildcard + * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING }) + * @example query term with leading and trailing wildcard + * query.term('foo', { + * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING + * }) + */ + +lunr.Query.wildcard = new String ("*") +lunr.Query.wildcard.NONE = 0 +lunr.Query.wildcard.LEADING = 1 +lunr.Query.wildcard.TRAILING = 2 + +/** + * Constants for indicating what kind of presence a term must have in matching documents. + * + * @constant + * @enum {number} + * @see lunr.Query~Clause + * @see lunr.Query#clause + * @see lunr.Query#term + * @example query term with required presence + * query.term('foo', { presence: lunr.Query.presence.REQUIRED }) + */ +lunr.Query.presence = { + /** + * Term's presence in a document is optional, this is the default value. + */ + OPTIONAL: 1, + + /** + * Term's presence in a document is required, documents that do not contain + * this term will not be returned. + */ + REQUIRED: 2, + + /** + * Term's presence in a document is prohibited, documents that do contain + * this term will not be returned. + */ + PROHIBITED: 3 +} + +/** + * A single clause in a {@link lunr.Query} contains a term and details on how to + * match that term against a {@link lunr.Index}. + * + * @typedef {Object} lunr.Query~Clause + * @property {string[]} fields - The fields in an index this clause should be matched against. + * @property {number} [boost=1] - Any boost that should be applied when matching this clause. + * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be. + * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline. + * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended. + * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents. + */ + +/** + * Adds a {@link lunr.Query~Clause} to this query. + * + * Unless the clause contains the fields to be matched all fields will be matched. In addition + * a default boost of 1 is applied to the clause. + * + * @param {lunr.Query~Clause} clause - The clause to add to this query. + * @see lunr.Query~Clause + * @returns {lunr.Query} + */ +lunr.Query.prototype.clause = function (clause) { + if (!('fields' in clause)) { + clause.fields = this.allFields + } + + if (!('boost' in clause)) { + clause.boost = 1 + } + + if (!('usePipeline' in clause)) { + clause.usePipeline = true + } + + if (!('wildcard' in clause)) { + clause.wildcard = lunr.Query.wildcard.NONE + } + + if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) { + clause.term = "*" + clause.term + } + + if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) { + clause.term = "" + clause.term + "*" + } + + if (!('presence' in clause)) { + clause.presence = lunr.Query.presence.OPTIONAL + } + + this.clauses.push(clause) + + return this +} + +/** + * A negated query is one in which every clause has a presence of + * prohibited. These queries require some special processing to return + * the expected results. + * + * @returns boolean + */ +lunr.Query.prototype.isNegated = function () { + for (var i = 0; i < this.clauses.length; i++) { + if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) { + return false + } + } + + return true +} + +/** + * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause} + * to the list of clauses that make up this query. + * + * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion + * to a token or token-like string should be done before calling this method. + * + * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an + * array, each term in the array will share the same options. + * + * @param {object|object[]} term - The term(s) to add to the query. + * @param {object} [options] - Any additional properties to add to the query clause. + * @returns {lunr.Query} + * @see lunr.Query#clause + * @see lunr.Query~Clause + * @example adding a single term to a query + * query.term("foo") + * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard + * query.term("foo", { + * fields: ["title"], + * boost: 10, + * wildcard: lunr.Query.wildcard.TRAILING + * }) + * @example using lunr.tokenizer to convert a string to tokens before using them as terms + * query.term(lunr.tokenizer("foo bar")) + */ +lunr.Query.prototype.term = function (term, options) { + if (Array.isArray(term)) { + term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this) + return this + } + + var clause = options || {} + clause.term = term.toString() + + this.clause(clause) + + return this +} +lunr.QueryParseError = function (message, start, end) { + this.name = "QueryParseError" + this.message = message + this.start = start + this.end = end +} + +lunr.QueryParseError.prototype = new Error +lunr.QueryLexer = function (str) { + this.lexemes = [] + this.str = str + this.length = str.length + this.pos = 0 + this.start = 0 + this.escapeCharPositions = [] +} + +lunr.QueryLexer.prototype.run = function () { + var state = lunr.QueryLexer.lexText + + while (state) { + state = state(this) + } +} + +lunr.QueryLexer.prototype.sliceString = function () { + var subSlices = [], + sliceStart = this.start, + sliceEnd = this.pos + + for (var i = 0; i < this.escapeCharPositions.length; i++) { + sliceEnd = this.escapeCharPositions[i] + subSlices.push(this.str.slice(sliceStart, sliceEnd)) + sliceStart = sliceEnd + 1 + } + + subSlices.push(this.str.slice(sliceStart, this.pos)) + this.escapeCharPositions.length = 0 + + return subSlices.join('') +} + +lunr.QueryLexer.prototype.emit = function (type) { + this.lexemes.push({ + type: type, + str: this.sliceString(), + start: this.start, + end: this.pos + }) + + this.start = this.pos +} + +lunr.QueryLexer.prototype.escapeCharacter = function () { + this.escapeCharPositions.push(this.pos - 1) + this.pos += 1 +} + +lunr.QueryLexer.prototype.next = function () { + if (this.pos >= this.length) { + return lunr.QueryLexer.EOS + } + + var char = this.str.charAt(this.pos) + this.pos += 1 + return char +} + +lunr.QueryLexer.prototype.width = function () { + return this.pos - this.start +} + +lunr.QueryLexer.prototype.ignore = function () { + if (this.start == this.pos) { + this.pos += 1 + } + + this.start = this.pos +} + +lunr.QueryLexer.prototype.backup = function () { + this.pos -= 1 +} + +lunr.QueryLexer.prototype.acceptDigitRun = function () { + var char, charCode + + do { + char = this.next() + charCode = char.charCodeAt(0) + } while (charCode > 47 && charCode < 58) + + if (char != lunr.QueryLexer.EOS) { + this.backup() + } +} + +lunr.QueryLexer.prototype.more = function () { + return this.pos < this.length +} + +lunr.QueryLexer.EOS = 'EOS' +lunr.QueryLexer.FIELD = 'FIELD' +lunr.QueryLexer.TERM = 'TERM' +lunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE' +lunr.QueryLexer.BOOST = 'BOOST' +lunr.QueryLexer.PRESENCE = 'PRESENCE' + +lunr.QueryLexer.lexField = function (lexer) { + lexer.backup() + lexer.emit(lunr.QueryLexer.FIELD) + lexer.ignore() + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexTerm = function (lexer) { + if (lexer.width() > 1) { + lexer.backup() + lexer.emit(lunr.QueryLexer.TERM) + } + + lexer.ignore() + + if (lexer.more()) { + return lunr.QueryLexer.lexText + } +} + +lunr.QueryLexer.lexEditDistance = function (lexer) { + lexer.ignore() + lexer.acceptDigitRun() + lexer.emit(lunr.QueryLexer.EDIT_DISTANCE) + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexBoost = function (lexer) { + lexer.ignore() + lexer.acceptDigitRun() + lexer.emit(lunr.QueryLexer.BOOST) + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexEOS = function (lexer) { + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } +} + +// This matches the separator used when tokenising fields +// within a document. These should match otherwise it is +// not possible to search for some tokens within a document. +// +// It is possible for the user to change the separator on the +// tokenizer so it _might_ clash with any other of the special +// characters already used within the search string, e.g. :. +// +// This means that it is possible to change the separator in +// such a way that makes some words unsearchable using a search +// string. +lunr.QueryLexer.termSeparator = lunr.tokenizer.separator + +lunr.QueryLexer.lexText = function (lexer) { + while (true) { + var char = lexer.next() + + if (char == lunr.QueryLexer.EOS) { + return lunr.QueryLexer.lexEOS + } + + // Escape character is '\' + if (char.charCodeAt(0) == 92) { + lexer.escapeCharacter() + continue + } + + if (char == ":") { + return lunr.QueryLexer.lexField + } + + if (char == "~") { + lexer.backup() + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } + return lunr.QueryLexer.lexEditDistance + } + + if (char == "^") { + lexer.backup() + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } + return lunr.QueryLexer.lexBoost + } + + // "+" indicates term presence is required + // checking for length to ensure that only + // leading "+" are considered + if (char == "+" && lexer.width() === 1) { + lexer.emit(lunr.QueryLexer.PRESENCE) + return lunr.QueryLexer.lexText + } + + // "-" indicates term presence is prohibited + // checking for length to ensure that only + // leading "-" are considered + if (char == "-" && lexer.width() === 1) { + lexer.emit(lunr.QueryLexer.PRESENCE) + return lunr.QueryLexer.lexText + } + + if (char.match(lunr.QueryLexer.termSeparator)) { + return lunr.QueryLexer.lexTerm + } + } +} + +lunr.QueryParser = function (str, query) { + this.lexer = new lunr.QueryLexer (str) + this.query = query + this.currentClause = {} + this.lexemeIdx = 0 +} + +lunr.QueryParser.prototype.parse = function () { + this.lexer.run() + this.lexemes = this.lexer.lexemes + + var state = lunr.QueryParser.parseClause + + while (state) { + state = state(this) + } + + return this.query +} + +lunr.QueryParser.prototype.peekLexeme = function () { + return this.lexemes[this.lexemeIdx] +} + +lunr.QueryParser.prototype.consumeLexeme = function () { + var lexeme = this.peekLexeme() + this.lexemeIdx += 1 + return lexeme +} + +lunr.QueryParser.prototype.nextClause = function () { + var completedClause = this.currentClause + this.query.clause(completedClause) + this.currentClause = {} +} + +lunr.QueryParser.parseClause = function (parser) { + var lexeme = parser.peekLexeme() + + if (lexeme == undefined) { + return + } + + switch (lexeme.type) { + case lunr.QueryLexer.PRESENCE: + return lunr.QueryParser.parsePresence + case lunr.QueryLexer.FIELD: + return lunr.QueryParser.parseField + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expected either a field or a term, found " + lexeme.type + + if (lexeme.str.length >= 1) { + errorMessage += " with value '" + lexeme.str + "'" + } + + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } +} + +lunr.QueryParser.parsePresence = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + switch (lexeme.str) { + case "-": + parser.currentClause.presence = lunr.Query.presence.PROHIBITED + break + case "+": + parser.currentClause.presence = lunr.Query.presence.REQUIRED + break + default: + var errorMessage = "unrecognised presence operator'" + lexeme.str + "'" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + var errorMessage = "expecting term or field, found nothing" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.FIELD: + return lunr.QueryParser.parseField + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expecting term or field, found '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseField = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + if (parser.query.allFields.indexOf(lexeme.str) == -1) { + var possibleFields = parser.query.allFields.map(function (f) { return "'" + f + "'" }).join(', '), + errorMessage = "unrecognised field '" + lexeme.str + "', possible fields: " + possibleFields + + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.fields = [lexeme.str] + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + var errorMessage = "expecting term, found nothing" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expecting term, found '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseTerm = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + parser.currentClause.term = lexeme.str.toLowerCase() + + if (lexeme.str.indexOf("*") != -1) { + parser.currentClause.usePipeline = false + } + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseEditDistance = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + var editDistance = parseInt(lexeme.str, 10) + + if (isNaN(editDistance)) { + var errorMessage = "edit distance must be numeric" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.editDistance = editDistance + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseBoost = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + var boost = parseInt(lexeme.str, 10) + + if (isNaN(boost)) { + var errorMessage = "boost must be numeric" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.boost = boost + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + + /** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ + ;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like enviroments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + root.lunr = factory() + } + }(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return lunr + })) +})(); diff --git a/assets/js/lunr/lunr.min.js b/assets/js/lunr/lunr.min.js new file mode 100644 index 0000000..cdc94cd --- /dev/null +++ b/assets/js/lunr/lunr.min.js @@ -0,0 +1,6 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ +!function(){var e=function(t){var r=new e.Builder;return r.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),r.searchPipeline.add(e.stemmer),t.call(r,r),r.build()};e.version="2.3.9",e.utils={},e.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),e.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},e.utils.clone=function(e){if(null===e||void 0===e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i0){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/assets/js/main.min.js b/assets/js/main.min.js new file mode 100644 index 0000000..649c525 --- /dev/null +++ b/assets/js/main.min.js @@ -0,0 +1,7 @@ +/*! + * Minimal Mistakes Jekyll Theme 4.27.3 by Michael Rose + * Copyright 2013-2025 Michael Rose - mademistakes.com | @mmistakes + * Free for personal and commercial use under the MIT license + * https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE + */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(w,P){"use strict";function y(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item}function m(e){return null!=e&&e===e.window}var t=[],M=Object.getPrototypeOf,s=t.slice,_=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},R=t.push,B=t.indexOf,F={},$=F.toString,W=F.hasOwnProperty,z=W.toString,U=z.call(Object),g={},C=w.document,X={type:!0,src:!0,nonce:!0,noModule:!0};function Q(e,t,n){var r,o,i=(n=n||C).createElement("script");if(i.text=e,t)for(r in X)(o=t[r]||t.getAttribute&&t.getAttribute(r))&&i.setAttribute(r,o);n.head.appendChild(i).parentNode.removeChild(i)}function h(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?F[$.call(e)]||"object":typeof e}var e="3.6.0",T=function(e,t){return new T.fn.init(e,t)};function Y(e){var t=!!e&&"length"in e&&e.length,n=h(e);return!y(e)&&!m(e)&&("array"===n||0===t||"number"==typeof t&&0>10|55296,1023&e|56320))}function M(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}function _(){C()}var e,f,x,i,R,p,B,F,w,l,u,C,T,n,E,h,r,o,m,S="sizzle"+ +new Date,c=P.document,k=0,$=0,W=L(),z=L(),U=L(),g=L(),X=function(e,t){return e===t&&(u=!0),0},Q={}.hasOwnProperty,t=[],Y=t.pop,V=t.push,A=t.push,G=t.slice,y=function(e,t){for(var n=0,r=e.length;n+~]|"+a+")"+a+"*"),re=new RegExp(a+"|>"),oe=new RegExp(J),ie=new RegExp("^"+s+"$"),b={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),TAG:new RegExp("^("+s+"|[*])"),ATTR:new RegExp("^"+Z),PSEUDO:new RegExp("^"+J),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+a+"*(even|odd|(([+-]|)(\\d*)n|)"+a+"*(?:([+-]|)"+a+"*(\\d+)|))"+a+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+a+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+a+"*((?:-\\d)?\\d*)"+a+"*\\)|)(?=[^-]|$)","i")},ae=/HTML$/i,se=/^(?:input|select|textarea|button)$/i,le=/^h\d$/i,N=/^[^{]+\{\s*\[native \w/,ue=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ce=/[+~]/,j=new RegExp("\\\\[\\da-fA-F]{1,6}"+a+"?|\\\\([^\\r\\n\\f])","g"),de=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,fe=ye(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{A.apply(t=G.call(c.childNodes),c.childNodes),t[c.childNodes.length].nodeType}catch(e){A={apply:t.length?function(e,t){V.apply(e,G.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function I(t,e,n,r){var o,i,a,s,l,u,c=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(C(e),e=e||T,E)){if(11!==d&&(s=ue.exec(t)))if(o=s[1]){if(9===d){if(!(u=e.getElementById(o)))return n;if(u.id===o)return n.push(u),n}else if(c&&(u=c.getElementById(o))&&m(e,u)&&u.id===o)return n.push(u),n}else{if(s[2])return A.apply(n,e.getElementsByTagName(t)),n;if((o=s[3])&&f.getElementsByClassName&&e.getElementsByClassName)return A.apply(n,e.getElementsByClassName(o)),n}if(f.qsa&&!g[t+" "]&&(!h||!h.test(t))&&(1!==d||"object"!==e.nodeName.toLowerCase())){if(u=t,c=e,1===d&&(re.test(t)||ne.test(t))){for((c=ce.test(t)&&ge(e.parentNode)||e)===e&&f.scope||((a=e.getAttribute("id"))?a=a.replace(de,M):e.setAttribute("id",a=S)),i=(l=p(t)).length;i--;)l[i]=(a?"#"+a:":scope")+" "+H(l[i]);u=l.join(",")}try{return A.apply(n,c.querySelectorAll(u)),n}catch(e){g(t,!0)}finally{a===S&&e.removeAttribute("id")}}}return F(t.replace(v,"$1"),e,n,r)}function L(){var n=[];function r(e,t){return n.push(e+" ")>x.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function D(e){return e[S]=!0,e}function O(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function pe(e,t){for(var n=e.split("|"),r=n.length;r--;)x.attrHandle[n[r]]=t}function he(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function me(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&fe(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function q(a){return D(function(i){return i=+i,D(function(e,t){for(var n,r=a([],e.length,i),o=r.length;o--;)e[n=r[o]]&&(e[n]=!(t[n]=e[n]))})})}function ge(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in f=I.support={},R=I.isXML=function(e){var t=e&&e.namespaceURI,e=e&&(e.ownerDocument||e).documentElement;return!ae.test(t||e&&e.nodeName||"HTML")},C=I.setDocument=function(e){var e=e?e.ownerDocument||e:c;return e!=T&&9===e.nodeType&&e.documentElement&&(n=(T=e).documentElement,E=!R(T),c!=T&&(e=T.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",_,!1):e.attachEvent&&e.attachEvent("onunload",_)),f.scope=O(function(e){return n.appendChild(e).appendChild(T.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),f.attributes=O(function(e){return e.className="i",!e.getAttribute("className")}),f.getElementsByTagName=O(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),f.getElementsByClassName=N.test(T.getElementsByClassName),f.getById=O(function(e){return n.appendChild(e).id=S,!T.getElementsByName||!T.getElementsByName(S).length}),f.getById?(x.filter.ID=function(e){var t=e.replace(j,d);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if(void 0!==t.getElementById&&E)return(t=t.getElementById(e))?[t]:[]}):(x.filter.ID=function(e){var t=e.replace(j,d);return function(e){e=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}},x.find.ID=function(e,t){if(void 0!==t.getElementById&&E){var n,r,o,i=t.getElementById(e);if(i){if((n=i.getAttributeNode("id"))&&n.value===e)return[i];for(o=t.getElementsByName(e),r=0;i=o[r++];)if((n=i.getAttributeNode("id"))&&n.value===e)return[i]}return[]}}),x.find.TAG=f.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):f.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"!==e)return i;for(;n=i[o++];)1===n.nodeType&&r.push(n);return r},x.find.CLASS=f.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&E)return t.getElementsByClassName(e)},r=[],h=[],(f.qsa=N.test(T.querySelectorAll))&&(O(function(e){var t;n.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&h.push("[*^$]="+a+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||h.push("\\["+a+"*(?:value|"+K+")"),e.querySelectorAll("[id~="+S+"-]").length||h.push("~="),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||h.push("\\["+a+"*name"+a+"*="+a+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||h.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||h.push(".#.+[+~]"),e.querySelectorAll("\\\f"),h.push("[\\r\\n\\f]")}),O(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&h.push("name"+a+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&h.push(":enabled",":disabled"),n.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(f.matchesSelector=N.test(o=n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.oMatchesSelector||n.msMatchesSelector))&&O(function(e){f.disconnectedMatch=o.call(e,"*"),o.call(e,"[s!='']:x"),r.push("!=",J)}),h=h.length&&new RegExp(h.join("|")),r=r.length&&new RegExp(r.join("|")),e=N.test(n.compareDocumentPosition),m=e||N.test(n.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,t=t&&t.parentNode;return e===t||!(!t||1!==t.nodeType||!(n.contains?n.contains(t):e.compareDocumentPosition&&16&e.compareDocumentPosition(t)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},X=e?function(e,t){var n;return e===t?(u=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!f.sortDetached&&t.compareDocumentPosition(e)===n?e==T||e.ownerDocument==c&&m(c,e)?-1:t==T||t.ownerDocument==c&&m(c,t)?1:l?y(l,e)-y(l,t):0:4&n?-1:1)}:function(e,t){if(e===t)return u=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],s=[t];if(!o||!i)return e==T?-1:t==T?1:o?-1:i?1:l?y(l,e)-y(l,t):0;if(o===i)return he(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?he(a[r],s[r]):a[r]==c?-1:s[r]==c?1:0}),T},I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(C(e),f.matchesSelector&&E&&!g[t+" "]&&(!r||!r.test(t))&&(!h||!h.test(t)))try{var n=o.call(e,t);if(n||f.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){g(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(j,d),e[3]=(e[3]||e[4]||e[5]||"").replace(j,d),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return b.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&oe.test(n)&&(t=(t=p(n,!0))&&n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(j,d).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=W[e+" "];return t||(t=new RegExp("(^|"+a+")"+e+"("+a+"|$)"))&&W(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=I.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Z(e,n,r){return y(n)?T.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?T.grep(e,function(e){return e===n!==r}):"string"!=typeof n?T.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/,te=((T.fn.init=function(e,t,n){if(e){if(n=n||J,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(T):T.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:ee.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof T?t[0]:t,T.merge(this,T.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),K.test(r[1])&&T.isPlainObject(t))for(var r in t)y(this[r])?this[r](t[r]):this.attr(r,t[r])}else(n=C.getElementById(r[2]))&&(this[0]=n,this.length=1)}return this}).prototype=T.fn,J=T(C),/^(?:parents|prev(?:Until|All))/),ne={children:!0,contents:!0,next:!0,prev:!0};function re(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}T.fn.extend({has:function(e){var t=T(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Te=/^$|^module$|\/(?:java|ecma)script/i,N=(D=C.createDocumentFragment().appendChild(C.createElement("div")),(a=C.createElement("input")).setAttribute("type","radio"),a.setAttribute("checked","checked"),a.setAttribute("name","t"),D.appendChild(a),g.checkClone=D.cloneNode(!0).cloneNode(!0).lastChild.checked,D.innerHTML="",g.noCloneChecked=!!D.cloneNode(!0).lastChild.defaultValue,D.innerHTML="",g.option=!!D.lastChild,{thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]});function j(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&l(e,t)?T.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var Se=/<|&#?\w+;/;function ke(e,t,n,r,o){for(var i,a,s,l,u,c=t.createDocumentFragment(),d=[],f=0,p=e.length;f\s*$/g;function qe(e,t){return l(e,"table")&&l(11!==t.nodeType?t:t.firstChild,"tr")&&T(e).children("tbody")[0]||e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Pe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,o,i;if(1===t.nodeType){if(x.hasData(e)&&(i=x.get(e).events))for(o in x.remove(t,"handle events"),i)for(n=0,r=i[o].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",o=function(e){r.remove(),o=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){o&&o()}}}),[]),Vt=/(=)\?(?=&|$)|\?\?/,Gt=(T.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||T.expando+"_"+At.guid++;return this[e]=!0,e}}),T.ajaxPrefilter("json jsonp",function(e,t,n){var r,o,i,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=y(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Nt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return i||T.error(r+" was not called"),i[0]},e.dataTypes[0]="json",o=w[r],w[r]=function(){i=arguments},n.always(function(){void 0===o?T(w).removeProp(r):w[r]=o,e[r]&&(e.jsonpCallback=t.jsonpCallback,Yt.push(r)),i&&y(o)&&o(i[0]),i=o=void 0}),"script"}),g.createHTMLDocument=((e=C.implementation.createHTMLDocument("").body).innerHTML="
",2===e.childNodes.length),T.parseHTML=function(e,t,n){var r;return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(g.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),r=!n&&[],(n=K.exec(e))?[t.createElement(n[1])]:(n=ke([e],t,r),r&&r.length&&T(r).remove(),T.merge([],n.childNodes)))},T.fn.load=function(e,t,n){var r,o,i,a=this,s=e.indexOf(" ");return-1").append(T.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},T.expr.pseudos.animated=function(t){return T.grep(T.timers,function(e){return t===e.elem}).length},T.offset={setOffset:function(e,t,n){var r,o,i,a,s=T.css(e,"position"),l=T(e),u={};"static"===s&&(e.style.position="relative"),i=l.offset(),r=T.css(e,"top"),a=T.css(e,"left"),s=("absolute"===s||"fixed"===s)&&-1<(r+a).indexOf("auto")?(o=(s=l.position()).top,s.left):(o=parseFloat(r)||0,parseFloat(a)||0),null!=(t=y(t)?t.call(e,n,T.extend({},i)):t).top&&(u.top=t.top-i.top+o),null!=t.left&&(u.left=t.left-i.left+s),"using"in t?t.using.call(e,u):l.css(u)}},T.fn.extend({offset:function(t){var e,n;return arguments.length?void 0===t?this:this.each(function(e){T.offset.setOffset(this,t,e)}):(n=this[0])?n.getClientRects().length?(e=n.getBoundingClientRect(),n=n.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],o={top:0,left:0};if("fixed"===T.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===T.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((o=T(e).offset()).top+=T.css(e,"borderTopWidth",!0),o.left+=T.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-T.css(r,"marginTop",!0),left:t.left-o.left-T.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===T.css(e,"position");)e=e.offsetParent;return e||S})}}),T.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,o){var i="pageYOffset"===o;T.fn[t]=function(e){return d(this,function(e,t,n){var r;if(m(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[o]:e[t];r?r.scrollTo(i?r.pageXOffset:n,i?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),T.each(["top","left"],function(e,n){T.cssHooks[n]=Je(g.pixelPosition,function(e,t){if(t)return t=Ze(e,n),Ye.test(t)?T(e).position()[n]+"px":t})}),T.each({Height:"height",Width:"width"},function(a,s){T.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,i){T.fn[i]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),o=r||(!0===e||!0===t?"margin":"border");return d(this,function(e,t,n){var r;return m(e)?0===i.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?T.css(e,t,o):T.style(e,t,n,o)},s,n?e:void 0,n)}})}),T.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){T.fn[t]=function(e){return this.on(t,e)}}),T.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),T.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){T.fn[n]=function(e,t){return 0=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)}function f(e,t){var n;e&&(n=e.nav.closest("li"))&&(n.classList.remove(t.navClass),e.content.classList.remove(t.contentClass),o(n,t),h("gumshoeDeactivate",n,{link:e.nav,content:e.content,settings:t}))}var p={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},h=function(e,t,n){n.settings.events&&(e=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n}),t.dispatchEvent(e))},r=function(e){var t=0;if(e.offsetParent)for(;e;)t+=e.offsetTop,e=e.offsetParent;return 0<=t?t:0},m=function(e,t,n){e=e.getBoundingClientRect(),t="function"==typeof(t=t).offset?parseFloat(t.offset()):parseFloat(t.offset);return n?parseInt(e.bottom,10)<(c.innerHeight||document.documentElement.clientHeight):parseInt(e.top,10)<=t},g=function(e,t){return!(!n()||!m(e.content,t,!0))},o=function(e,t){t.nested&&(e=e.parentNode.closest("li"))&&(e.classList.remove(t.nestedClass),o(e,t))},v=function(e,t){t.nested&&(e=e.parentNode.closest("li"))&&(e.classList.add(t.nestedClass),v(e,t))};return function(e,t){function n(e){s&&c.cancelAnimationFrame(s),s=c.requestAnimationFrame(u.detect)}function r(e){s&&c.cancelAnimationFrame(s),s=c.requestAnimationFrame(function(){d(i),u.detect()})}var o,i,a,s,l,u={setup:function(){o=document.querySelectorAll(e),i=[],Array.prototype.forEach.call(o,function(e){var t=document.getElementById(decodeURIComponent(e.hash.substr(1)));t&&i.push({nav:e,content:t})}),d(i)}};u.detect=function(){var e,t,n,r=function(e,t){var n=e[e.length-1];if(g(n,t))return n;for(var r=e.length-1;0<=r;r--)if(m(e[r].content,t))return e[r]}(i,l);r?a&&r.content===a.content||(f(a,l),t=l,(e=r)&&(n=e.nav.closest("li"))&&(n.classList.add(t.navClass),e.content.classList.add(t.contentClass),v(n,t),h("gumshoeActivate",n,{link:e.nav,content:e.content,settings:t})),a=r):a&&(f(a,l),a=null)},u.destroy=function(){a&&f(a,l),c.removeEventListener("scroll",n,!1),l.reflow&&c.removeEventListener("resize",r,!1),l=s=a=o=i=null};return l=function(){var n={};return Array.prototype.forEach.call(arguments,function(e){for(var t in e){if(!e.hasOwnProperty(t))return;n[t]=e[t]}}),n}(p,t||{}),u.setup(),u.detect(),c.addEventListener("scroll",n,!1),l.reflow&&c.addEventListener("resize",r,!1),u}}),function(e,c){var r,t=e.jQuery||e.Cowboy||(e.Cowboy={});t.throttle=r=function(o,i,a,s){var l,u=0;function e(){var e=this,t=+new Date-u,n=arguments;function r(){u=+new Date,a.apply(e,n)}s&&!l&&r(),l&&clearTimeout(l),s===c&&ox

',t.appendChild(n.childNodes[1])),e&&i.extend(o,e),this.each(function(){var e=['iframe[src*="player.vimeo.com"]','iframe[src*="youtube.com"]','iframe[src*="youtube-nocookie.com"]','iframe[src*="kickstarter.com"][src*="video.html"]',"object","embed"],r=(o.customSelector&&e.push(o.customSelector),".fitvidsignore"),e=(o.ignore&&(r=r+", "+o.ignore),i(this).find(e.join(",")));(e=(e=e.not("object object")).not(r)).each(function(e){var t,n=i(this);0').parent(".fluid-width-video-wrapper").css("padding-top",100*t+"%"),n.removeAttr("height").removeAttr("width"))})})}}(window.jQuery||window.Zepto),$(function(){var n,r,e,o,t=$("nav.greedy-nav .greedy-nav__toggle"),i=$("nav.greedy-nav .visible-links"),a=$("nav.greedy-nav .hidden-links"),s=$("nav.greedy-nav"),l=$("nav.greedy-nav .site-logo"),u=$("nav.greedy-nav .site-logo img"),c=$("nav.greedy-nav .site-title"),d=$("nav.greedy-nav button.search__toggle");function f(){function t(e,t){r+=t,n+=1,o.push(r)}r=n=0,e=1e3,o=[],i.children().outerWidth(t),a.children().each(function(){var e;(e=(e=$(this)).clone()).css("visibility","hidden"),i.append(e),t(0,e.outerWidth()),e.remove()})}f();var p,h,m,g,v=$(window).width(),y=v<768?0:v<1024?1:v<1280?2:3;function b(){var e=(v=$(window).width())<768?0:v<1024?1:v<1280?2:3;e!==y&&f(),y=e,h=i.children().length,p=s.innerWidth()-(0!==l.length?l.outerWidth(!0):0)-c.outerWidth(!0)-(0!==d.length?d.outerWidth(!0):0)-(h!==o.length?t.outerWidth(!0):0),m=o[h-1],po[h]&&(a.children().first().appendTo(i),h+=1,b()),t.attr("count",n-h),h===n?t.addClass("hidden"):t.removeClass("hidden")}$(window).resize(function(){b()}),t.on("click",function(){a.toggleClass("hidden"),$(this).toggleClass("close"),clearTimeout(g)}),a.on("click",function(){a.addClass("hidden"),t.removeClass("close")}).on("mouseleave",function(){g=setTimeout(function(){a.addClass("hidden"),$(".greedy-nav__toggle").removeClass("close")},e)}).on("mouseenter",function(){clearTimeout(g)}),0===u.length||u[0].complete||0!==u[0].naturalWidth?b():u.one("load error",b)}),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?e(require("jquery")):e(window.jQuery||window.Zepto)}(function(u){function e(){}function c(e,t){h.ev.on("mfp"+e+T,t)}function d(e,t,n,r){var o=document.createElement("div");return o.className="mfp-"+e,n&&(o.innerHTML=n),r?t&&t.appendChild(o):(o=u(o),t&&o.appendTo(t)),o}function f(e,t){h.ev.triggerHandler("mfp"+e,t),h.st.callbacks&&(e=e.charAt(0).toLowerCase()+e.slice(1),h.st.callbacks[e])&&h.st.callbacks[e].apply(h,u.isArray(t)?t:[t])}function p(e){return e===n&&h.currTemplate.closeBtn||(h.currTemplate.closeBtn=u(h.st.closeMarkup.replace("%title%",h.st.tClose)),n=e),h.currTemplate.closeBtn}function i(){u.magnificPopup.instance||((h=new e).init(),u.magnificPopup.instance=h)}function a(){y&&(v.after(y.addClass(l)).detach(),y=null)}function o(){b&&u(document.body).removeClass(b)}function t(){o(),h.req&&h.req.abort()}var h,r,m,s,g,n,l,v,y,b,x="Close",P="BeforeClose",w="MarkupParse",C="Open",T=".mfp",E="mfp-ready",M="mfp-removing",S="mfp-prevent-close",k=!!window.jQuery,A=u(window),N=(u.magnificPopup={instance:null,proto:e.prototype={constructor:e,init:function(){var e=navigator.appVersion;h.isLowIE=h.isIE8=document.all&&!document.addEventListener,h.isAndroid=/android/gi.test(e),h.isIOS=/iphone|ipad|ipod/gi.test(e),h.supportsTransition=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1}(),h.probablyMobile=h.isAndroid||h.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),m=u(document),h.popupsCache={}},open:function(e){if(!1===e.isObj){h.items=e.items.toArray(),h.index=0;for(var t,n=e.items,r=0;r(e||A.height())},_setFocus:function(){(h.st.focus?h.content.find(h.st.focus).eq(0):h.wrap).focus()},_onFocusIn:function(e){if(e.target!==h.wrap[0]&&!u.contains(h.wrap[0],e.target))return h._setFocus(),!1},_parseMarkup:function(o,e,t){var i;t.data&&(e=u.extend(t.data,e)),f(w,[o,e,t]),u.each(e,function(e,t){if(void 0===t||!1===t)return!0;var n,r;1<(i=e.split("_")).length?0<(n=o.find(T+"-"+i[0])).length&&("replaceWith"===(r=i[1])?n[0]!==t[0]&&n.replaceWith(t):"img"===r?n.is("img")?n.attr("src",t):n.replaceWith(u("").attr("src",t).attr("class",n.attr("class"))):n.attr(i[1],t)):o.find(T+"-"+e).html(t)})},_getScrollbarSize:function(){var e;return void 0===h.scrollbarSize&&((e=document.createElement("div")).style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),h.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),h.scrollbarSize}},modules:[],open:function(e,t){return i(),(e=e?u.extend(!0,{},e):{}).isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return u.magnificPopup.instance&&u.magnificPopup.instance.close()},registerModule:function(e,t){t.options&&(u.magnificPopup.defaults[e]=t.options),u.extend(this.proto,t.proto),this.modules.push(e)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},u.fn.magnificPopup=function(e){i();var t,n,r,o=u(this);return"string"==typeof e?"open"===e?(t=k?o.data("magnificPopup"):o[0].magnificPopup,n=parseInt(arguments[1],10)||0,r=t.items?t.items[n]:(r=o,(r=t.delegate?r.find(t.delegate):r).eq(n)),h._openClick({mfpEl:r},o,t)):h.isOpen&&h[e].apply(h,Array.prototype.slice.call(arguments,1)):(e=u.extend(!0,{},e),k?o.data("magnificPopup",e):o[0].magnificPopup=e,h.addGroup(o,e)),o},"inline"),j=(u.magnificPopup.registerModule(N,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){h.types.push(N),c(x+"."+N,function(){a()})},getInline:function(e,t){var n,r,o;return a(),e.src?(n=h.st.inline,(r=u(e.src)).length?((o=r[0].parentNode)&&o.tagName&&(v||(l=n.hiddenClass,v=d(l),l="mfp-"+l),y=r.after(v).detach().removeClass(l)),h.updateStatus("ready")):(h.updateStatus("error",n.tNotFound),r=u("
")),e.inlineElement=r):(h.updateStatus("ready"),h._parseMarkup(t,{},e),t)}}}),"ajax");u.magnificPopup.registerModule(j,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){h.types.push(j),b=h.st.ajax.cursor,c(x+"."+j,t),c("BeforeChange."+j,t)},getAjax:function(r){b&&u(document.body).addClass(b),h.updateStatus("loading");var e=u.extend({url:r.src,success:function(e,t,n){e={data:e,xhr:n};f("ParseAjax",e),h.appendContent(u(e.data),j),r.finished=!0,o(),h._setFocus(),setTimeout(function(){h.wrap.addClass(E)},16),h.updateStatus("ready"),f("AjaxContentAdded")},error:function(){o(),r.finished=r.loadError=!0,h.updateStatus("error",h.st.ajax.tError.replace("%url%",r.src))}},h.st.ajax.settings);return h.req=u.ajax(e),""}}});var I;u.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=h.st.image,t=".image";h.types.push("image"),c(C+t,function(){"image"===h.currItem.type&&e.cursor&&u(document.body).addClass(e.cursor)}),c(x+t,function(){e.cursor&&u(document.body).removeClass(e.cursor),A.off("resize"+T)}),c("Resize"+t,h.resizeImage),h.isLowIE&&c("AfterChange",h.resizeImage)},resizeImage:function(){var e,t=h.currItem;t&&t.img&&h.st.image.verticalFit&&(e=0,h.isLowIE&&(e=parseInt(t.img.css("padding-top"),10)+parseInt(t.img.css("padding-bottom"),10)),t.img.css("max-height",h.wH-e))},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,I&&clearInterval(I),e.isCheckingImgSize=!1,f("ImageHasSize",e),e.imgHidden)&&(h.content&&h.content.removeClass("mfp-loading"),e.imgHidden=!1)},findImageSize:function(t){function n(e){I&&clearInterval(I),I=setInterval(function(){0
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){h.types.push(q),c("BeforeChange",function(e,t,n){t!==n&&(t===q?L():n===q&&L(!0))}),c(x+"."+q,function(){L()})},getIframe:function(e,t){var n=e.src,r=h.st.iframe,o=(u.each(r.patterns,function(){if(-1',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var i=h.st.gallery,e=".mfp-gallery";if(h.direction=!0,!i||!i.enabled)return!1;g+=" mfp-gallery",c(C+e,function(){i.navigateByImgClick&&h.wrap.on("click"+e,".mfp-img",function(){if(1=h.index,h.index=e,h.updateItemHTML()},preloadNearbyImages:function(){for(var e=h.st.gallery.preload,t=Math.min(e[0],h.items.length),n=Math.min(e[1],h.items.length),r=1;r<=(h.direction?n:t);r++)h._preloadItem(h.index+r);for(r=1;r<=(h.direction?t:n);r++)h._preloadItem(h.index-r)},_preloadItem:function(e){var t;e=D(e),h.items[e].preloaded||((t=h.items[e]).parsed||(t=h.parseEl(e)),f("LazyLoad",t),"image"===t.type&&(t.img=u('').on("load.mfploader",function(){t.hasSize=!0}).on("error.mfploader",function(){t.hasSize=!0,t.loadError=!0,f("LazyLoadError",t)}).attr("src",t.src)),t.preloaded=!0)}}}),"retina");u.magnificPopup.registerModule(H,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){var n,r;1t.durationMax?t.durationMax:t.durationMin&&e=l)return x.cancelScroll(!0),e=t,n=g,0===(t=r)&&document.body.focus(),n||(t.focus(),document.activeElement!==t&&(t.setAttribute("tabindex","-1"),t.focus(),t.style.outline="none"),w.scrollTo(0,e)),T("scrollStop",m,r,o),!(b=d=null)},h=function(e){var t,n,r;u+=e-(d=d||e),f=i+s*(n=1<(f=0===c?0:u/c)?1:f,"easeInQuad"===(t=m).easing&&(r=n*n),"easeOutQuad"===t.easing&&(r=n*(2-n)),"easeInOutQuad"===t.easing&&(r=n<.5?2*n*n:(4-2*n)*n-1),"easeInCubic"===t.easing&&(r=n*n*n),"easeOutCubic"===t.easing&&(r=--n*n*n+1),"easeInOutCubic"===t.easing&&(r=n<.5?4*n*n*n:(n-1)*(2*n-2)*(2*n-2)+1),"easeInQuart"===t.easing&&(r=n*n*n*n),"easeOutQuart"===t.easing&&(r=1- --n*n*n*n),"easeInOutQuart"===t.easing&&(r=n<.5?8*n*n*n*n:1-8*--n*n*n*n),"easeInQuint"===t.easing&&(r=n*n*n*n*n),"easeOutQuint"===t.easing&&(r=1+--n*n*n*n*n),"easeInOutQuint"===t.easing&&(r=n<.5?16*n*n*n*n*n:1+16*--n*n*n*n*n),(r=t.customEasing?t.customEasing(n):r)||n),w.scrollTo(0,Math.floor(f)),p(f,a)||(b=w.requestAnimationFrame(h),d=e)},0===w.pageYOffset&&w.scrollTo(0,0),e=r,t=m,g||history.pushState&&t.updateURL&&history.pushState({smoothScroll:JSON.stringify(t),anchor:e.id},document.title,e===document.documentElement?"#top":"#"+e.id),"matchMedia"in w&&w.matchMedia("(prefers-reduced-motion)").matches?w.scrollTo(0,Math.floor(a)):(T("scrollStart",m,r,o),x.cancelScroll(!0),w.requestAnimationFrame(h)))},x.destroy=function(){v&&(document.removeEventListener("click",t,!1),w.removeEventListener("popstate",n,!1),x.cancelScroll(),b=y=o=v=null)};if("querySelector"in document&&"addEventListener"in w&&"requestAnimationFrame"in w&&"closest"in w.Element.prototype)return x.destroy(),v=C(E,e||{}),y=v.header?document.querySelector(v.header):null,document.addEventListener("click",t,!1),v.updateURL&&v.popstate&&w.addEventListener("popstate",n,!1),x;throw"Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs."}}),$(document).ready(function(){$("#main").fitVids(),$(".author__urls-wrapper button").on("click",function(){$(".author__urls").toggleClass("is--visible"),$(".author__urls-wrapper").find("button").toggleClass("open")}),$(document).keyup(function(e){27===e.keyCode&&$(".initial-content").hasClass("is--hidden")&&($(".search-content").toggleClass("is--visible"),$(".initial-content").toggleClass("is--hidden"))}),$(".search__toggle").on("click",function(){$(".search-content").toggleClass("is--visible"),$(".initial-content").toggleClass("is--hidden"),setTimeout(function(){$(".search-content input").focus()},400)});function o(e){for(var t=e.target,n=t.nextElementSibling;n&&"code"!==n.tagName.toLowerCase();)n=n.nextElementSibling;if(n)return e=function(e){if(document.queryCommandEnabled("copy")&&navigator.clipboard)return navigator.clipboard.writeText(e).then(()=>!0,()=>console.error("Failed to copy text to clipboard: "+e)),!0;var t="rtl"===document.documentElement.getAttribute("dir"),n=document.createElement("textarea"),t=(n.className="clipboard-helper",n.style[t?"right":"left"]="-9999px",window.pageYOffset||document.documentElement.scrollTop),t=(n.style.top=t+"px",n.setAttribute("readonly",""),n.value=e,document.body.appendChild(n),!0);try{n.select(),t=document.execCommand("copy")}catch(e){t=!1}return n.parentNode.removeChild(n),t}((n=(e=n.querySelector("td.code, td.rouge-code"))?e:n).innerText),t.focus(),e&&(null!==t.interval&&clearInterval(t.interval),t.classList.add("copied"),t.interval=setTimeout(function(){t.classList.remove("copied"),clearInterval(t.interval),t.interval=null},1500)),e;throw console.warn(t),new Error("No code block found for this button.")}var e;new SmoothScroll('a[href*="#"]',{offset:20,speed:400,speedAsDuration:!0,durationMax:500}),0<$("nav.toc").length&&new Gumshoe("nav.toc a",{navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:20,reflow:!0,events:!0}),window.chrome&&document.addEventListener("gumshoeActivate",function(e){var e=e.target,t={behavior:"auto",block:"nearest",inline:"start"},n=document.querySelector("aside.sidebar__right.sticky");n&&"sticky"===window.getComputedStyle(n).position&&(e.parentElement.classList.contains("toc__menu")&&e==e.parentElement.firstElementChild?document.querySelector("nav.toc header"):e).scrollIntoView(t)}),$("a[href$='.jpg'],a[href$='.jpeg'],a[href$='.JPG'],a[href$='.png'],a[href$='.gif'],a[href$='.webp']").has("> img").addClass("image-popup"),$(".image-popup").magnificPopup({type:"image",tLoading:"Loading image #%curr%...",gallery:{enabled:!0,navigateByImgClick:!0,preload:[0,1]},image:{tError:'Image #%curr% could not be loaded.'},removalDelay:500,mainClass:"mfp-zoom-in",callbacks:{beforeOpen:function(){this.st.image.markup=this.st.image.markup.replace("mfp-figure","mfp-figure mfp-with-anim")}},closeOnContentClick:!0,midClick:!0}),(e=document.querySelector(".page__content"))&&e.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(function(e){var t,n=e.getAttribute("id");n&&((t=document.createElement("a")).className="header-link",t.href="#"+n,t.innerHTML='Permalink',t.title="Permalink",e.appendChild(t))});window.enable_copy_code_button&&document.querySelectorAll(".page__content pre.highlight > code").forEach(function(e,t,n){var r,e=e.parentElement;"code"===e.firstElementChild.tagName.toLowerCase()&&((r=document.createElement("button")).title="Copy to clipboard",r.className="clipboard-copy-button",r.innerHTML='Copy code',r.addEventListener("click",o),e.prepend(r))})}); \ No newline at end of file diff --git a/assets/js/main.min.js.map b/assets/js/main.min.js.map new file mode 100644 index 0000000..19426d8 --- /dev/null +++ b/assets/js/main.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["assets/js/vendor/jquery/jquery-3.6.0.js","assets/js/plugins/gumshoe.js","assets/js/plugins/jquery.ba-throttle-debounce.js","assets/js/plugins/jquery.fitvids.js","assets/js/plugins/jquery.greedy-navigation.js","assets/js/plugins/jquery.magnific-popup.js","assets/js/plugins/smooth-scroll.js","assets/js/_main.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","isFunction","obj","nodeType","item","isWindow","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","dir","until","matched","truncate","is","siblings","n","nextSibling","Sizzle","funescape","escape","nonHex","high","String","fromCharCode","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","setDocument","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","rcssescape","inDisabledFieldset","addCombinator","disabled","nodeName","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","hasCompare","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","matcherIn","matcherOut","matcherFromGroupMatchers","elementMatchers","setMatchers","superMatcher","outermost","matchedCount","setMatched","contextBackup","byElement","dirrunsUnique","bySet","filters","parseOnly","soFar","preFilters","cached","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","token","compiled","_name","defaultValue","rneedsContext","unique","isXMLDoc","escapeSelector","rsingleTag","winnow","qualifier","self","rootjQuery","rparentsprev","ready","parseHTML","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","fire","locked","once","fired","firing","queue","firingIndex","memory","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","mightThrow","that","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","updateFunc","resolveContexts","resolveValues","remaining","primary","rerrorNames","readyList","stack","console","warn","message","readyException","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","isHiddenWithinTree","style","display","isAttached","css","pnum","source","rcssNum","cssExpand","composed","getRootNode","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","rcheckableType","rtagName","rscriptType","wrapMap","div","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","handleObj","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","getStyles","opener","getComputedStyle","swap","old","pixelPositionVal","boxSizingReliableVal","scrollboxSizeVal","pixelBoxStylesVal","reliableTrDimensionsVal","reliableMarginLeftVal","container","rnumnonpx","rboxStyle","computeStyleTests","divStyle","cssText","roundPixelMeasures","marginLeft","right","width","position","offsetWidth","measure","round","parseFloat","curCSS","computed","maxWidth","getPropertyValue","pixelBoxStyles","minWidth","addGetHookIf","conditionFn","hookFn","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trStyle","trChild","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","doAnimation","optall","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","rfocusable","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","clazz","finalValue","curValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","stopPropagationCallback","rreturn","rfocusMorph","valHooks","optionSet","focusin","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","rbracket","parseXML","parserErrorElem","DOMParser","parseFromString","rCRLF","rsubmitterTypes","rsubmittable","param","traditional","valueOrFunction","s","encodeURIComponent","buildParams","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","fireGlobals","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","urlAnchor","host","hasContent","uncached","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","response","isSuccess","ct","finalDataType","firstDataType","conv2","current","conv","dataFilter","throws","modified","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","oldCallbacks","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curCSSTop","curTop","curOffset","curCSSLeft","curElem","curLeft","curPosition","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","_jQuery","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_$","$","noConflict","Gumshoe","sortContents","item1","item2","getOffsetTop","isAtBottom","innerHeight","scrollHeight","clientHeight","deactivate","items","li","nav","classList","navClass","contentClass","deactivateNested","emitEvent","link","defaults","nested","nestedClass","reflow","CustomEvent","dispatchEvent","offsetTop","isInView","bottom","bounds","useLastItem","activateNested","scrollHandler","cancelAnimationFrame","publicAPIs","detect","resizeHandler","navItems","forEach","decodeURIComponent","substr","destroy","merged","jq_throttle","Cowboy","throttle","no_trailing","debounce_mode","timeout_id","last_exec","wrapper","elapsed","debounce","at_begin","fitVids","customSelector","ignore","ignoreList","$allVideos","aspectRatio","$this","tagName","Zepto","numOfItems","totalSpace","closingTime","breakWidths","$btn","$vlinks","$hlinks","$nav","$logo","$logoImg","$title","$search","measureLinks","addWidth","outerWidth","availableSpace","numOfVisibleItems","requiredSpace","winWidth","lastBreakpoint","curBreakpoint","innerWidth","resize","naturalWidth","require","MagnificPopup","_mfpOn","f","mfp","ev","EVENT_NS","_getEl","_mfpTrigger","st","callbacks","charAt","_getCloseBtn","_currPopupType","currTemplate","closeBtn","closeMarkup","tClose","_checkInstance","magnificPopup","instance","_putInlineElementsBack","_lastInlineElement","_inlinePlaceholder","_hiddenClass","_removeAjaxCursor","_ajaxCur","_destroyAjaxRequest","req","_prevStatus","_document","_prevContentType","_wrapClasses","CLOSE_EVENT","BEFORE_CLOSE_EVENT","MARKUP_PARSE_EVENT","OPEN_EVENT","READY_CLASS","REMOVING_CLASS","PREVENT_CLOSE_CLASS","_isJQ","_window","INLINE_NS","appVersion","navigator","isLowIE","isIE8","all","isAndroid","isIOS","supportsTransition","probablyMobile","userAgent","popupsCache","isObj","isOpen","mainEl","fixedContentPos","modal","closeOnContentClick","closeOnBgClick","showCloseBtn","enableEscapeKey","bgOverlay","close","_checkIfClose","contentContainer","preloader","tLoading","modules","closeBtnInside","template","close_replaceWith","alignTop","fixedBgPos","updateSize","windowHeight","wH","windowStyles","classesToadd","_hasScrollBar","_getScrollbarSize","marginRight","isIE7","mainClass","_addClassToMFP","updateItemHTML","_lastFocusedEl","_setFocus","_onFocusIn","removalDelay","_close","classesToRemove","_removeClassFromMFP","currItem","autoFocusLast","prevHeight","winHeight","zoomLevel","clientWidth","parseEl","newContent","markup","appendContent","preloaded","addGroup","eHandler","mfpEl","_openClick","eName","midClick","disableOn","updateStatus","closeOnContent","closeOnBg","cName","_parseMarkup","scrollDiv","scrollbarSize","registerModule","itemOpts","jqEl","AJAX_NS","hiddenClass","tNotFound","initInline","getInline","inlineSt","inline","inlineElement","cursor","tError","initAjax","getAjax","textStatus","finished","loadError","_imgInterval","titleSrc","verticalFit","initImage","imgSt","ns","resizeImage","decr","img","_onImageHasSize","hasSize","clearInterval","isCheckingImgSize","imgHidden","findImageSize","mfpSetInterval","setInterval","counter","getImage","onLoadComplete","loaded","guard","onLoadError","alt","title","img_replaceWith","loading","_fixIframeBugs","isShowing","IFRAME_NS","_getLoopedId","numSlides","_replaceCurrTotal","curr","total","element","initZoom","getElToAnimate","showMainContent","openTimeout","animatedImg","zoomSt","newImg","transition","cssObj","-webkit-backface-visibility","_allowZoom","_getItemToZoom","_getOffset","isLarge","paddingTop","paddingBottom","hasMozTransform","MozTransform","RETINA_NS","srcAction","patterns","youtube","vimeo","gmaps","initIframe","prevType","newType","getIframe","embedSrc","iframeSt","iframe","dataObj","lastIndexOf","arrowMarkup","preload","navigateByImgClick","arrows","tPrev","tNext","tCounter","initGallery","gSt","gallery","direction","arrowLeft","arrowRight","_preloadTimeout","preloadNearbyImages","goTo","newIndex","preloadBefore","min","preloadAfter","_preloadItem","replaceSrc","ratio","initRetina","devicePixelRatio","retina","max-width","SmoothScroll","escapeCharacters","codeUnit","firstCodeUnit","InvalidCharacterError","anchor","emitEvents","topOnEmptyHash","speedAsDuration","durationMax","durationMin","clip","customEasing","updateURL","popstate","getHeight","getDocumentHeight","clickHandler","hostname","pathname","querySelector","history","replaceState","smoothScroll","stringify","animateScroll","popstateHandler","fixedHeader","animationInterval","cancelScroll","noEvent","startLocation","endLocation","distance","documentHeight","timeLapsed","stopAnimateScroll","loopAnimateScroll","_settings","isNum","anchorElem","headerHeight","abs","currentLocation","outline","timestamp","percentage","floor","pushState","matchMedia","Element","keyup","copyButtonEventListener","thisButton","codeBlock","nextElementSibling","queryCommandEnabled","clipboard","writeText","isRTL","textarea","yPosition","execCommand","realCodeBlock","innerText","pageContentElement","chrome","scrollOptions","behavior","block","tocElement","parentElement","scrollIntoView","beforeOpen","enable_copy_code_button","parentList","copyButton"],"mappings":"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"} \ No newline at end of file diff --git a/assets/js/plugins/gumshoe.js b/assets/js/plugins/gumshoe.js new file mode 100644 index 0000000..713b6eb --- /dev/null +++ b/assets/js/plugins/gumshoe.js @@ -0,0 +1,484 @@ +/*! + * gumshoejs v5.1.1 + * A simple, framework-agnostic scrollspy script. + * (c) 2019 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/gumshoe + */ + +(function (root, factory) { + if ( typeof define === 'function' && define.amd ) { + define([], (function () { + return factory(root); + })); + } else if ( typeof exports === 'object' ) { + module.exports = factory(root); + } else { + root.Gumshoe = factory(root); + } +})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, (function (window) { + + 'use strict'; + + // + // Defaults + // + + var defaults = { + + // Active classes + navClass: 'active', + contentClass: 'active', + + // Nested navigation + nested: false, + nestedClass: 'active', + + // Offset & reflow + offset: 0, + reflow: false, + + // Event support + events: true + + }; + + + // + // Methods + // + + /** + * Merge two or more objects together. + * @param {Object} objects The objects to merge together + * @returns {Object} Merged values of defaults and options + */ + var extend = function () { + var merged = {}; + Array.prototype.forEach.call(arguments, (function (obj) { + for (var key in obj) { + if (!obj.hasOwnProperty(key)) return; + merged[key] = obj[key]; + } + })); + return merged; + }; + + /** + * Emit a custom event + * @param {String} type The event type + * @param {Node} elem The element to attach the event to + * @param {Object} detail Any details to pass along with the event + */ + var emitEvent = function (type, elem, detail) { + + // Make sure events are enabled + if (!detail.settings.events) return; + + // Create a new event + var event = new CustomEvent(type, { + bubbles: true, + cancelable: true, + detail: detail + }); + + // Dispatch the event + elem.dispatchEvent(event); + + }; + + /** + * Get an element's distance from the top of the Document. + * @param {Node} elem The element + * @return {Number} Distance from the top in pixels + */ + var getOffsetTop = function (elem) { + var location = 0; + if (elem.offsetParent) { + while (elem) { + location += elem.offsetTop; + elem = elem.offsetParent; + } + } + return location >= 0 ? location : 0; + }; + + /** + * Sort content from first to last in the DOM + * @param {Array} contents The content areas + */ + var sortContents = function (contents) { + if(contents) { + contents.sort((function (item1, item2) { + var offset1 = getOffsetTop(item1.content); + var offset2 = getOffsetTop(item2.content); + if (offset1 < offset2) return -1; + return 1; + })); + } + }; + + /** + * Get the offset to use for calculating position + * @param {Object} settings The settings for this instantiation + * @return {Float} The number of pixels to offset the calculations + */ + var getOffset = function (settings) { + + // if the offset is a function run it + if (typeof settings.offset === 'function') { + return parseFloat(settings.offset()); + } + + // Otherwise, return it as-is + return parseFloat(settings.offset); + + }; + + /** + * Get the document element's height + * @private + * @returns {Number} + */ + var getDocumentHeight = function () { + return Math.max( + document.body.scrollHeight, document.documentElement.scrollHeight, + document.body.offsetHeight, document.documentElement.offsetHeight, + document.body.clientHeight, document.documentElement.clientHeight + ); + }; + + /** + * Determine if an element is in view + * @param {Node} elem The element + * @param {Object} settings The settings for this instantiation + * @param {Boolean} bottom If true, check if element is above bottom of viewport instead + * @return {Boolean} Returns true if element is in the viewport + */ + var isInView = function (elem, settings, bottom) { + var bounds = elem.getBoundingClientRect(); + var offset = getOffset(settings); + if (bottom) { + return parseInt(bounds.bottom, 10) < (window.innerHeight || document.documentElement.clientHeight); + } + return parseInt(bounds.top, 10) <= offset; + }; + + /** + * Check if at the bottom of the viewport + * @return {Boolean} If true, page is at the bottom of the viewport + */ + var isAtBottom = function () { + if (window.innerHeight + window.pageYOffset >= getDocumentHeight()) return true; + return false; + }; + + /** + * Check if the last item should be used (even if not at the top of the page) + * @param {Object} item The last item + * @param {Object} settings The settings for this instantiation + * @return {Boolean} If true, use the last item + */ + var useLastItem = function (item, settings) { + if (isAtBottom() && isInView(item.content, settings, true)) return true; + return false; + }; + + /** + * Get the active content + * @param {Array} contents The content areas + * @param {Object} settings The settings for this instantiation + * @return {Object} The content area and matching navigation link + */ + var getActive = function (contents, settings) { + var last = contents[contents.length-1]; + if (useLastItem(last, settings)) return last; + for (var i = contents.length - 1; i >= 0; i--) { + if (isInView(contents[i].content, settings)) return contents[i]; + } + }; + + /** + * Deactivate parent navs in a nested navigation + * @param {Node} nav The starting navigation element + * @param {Object} settings The settings for this instantiation + */ + var deactivateNested = function (nav, settings) { + + // If nesting isn't activated, bail + if (!settings.nested) return; + + // Get the parent navigation + var li = nav.parentNode.closest('li'); + if (!li) return; + + // Remove the active class + li.classList.remove(settings.nestedClass); + + // Apply recursively to any parent navigation elements + deactivateNested(li, settings); + + }; + + /** + * Deactivate a nav and content area + * @param {Object} items The nav item and content to deactivate + * @param {Object} settings The settings for this instantiation + */ + var deactivate = function (items, settings) { + + // Make sure their are items to deactivate + if (!items) return; + + // Get the parent list item + var li = items.nav.closest('li'); + if (!li) return; + + // Remove the active class from the nav and content + li.classList.remove(settings.navClass); + items.content.classList.remove(settings.contentClass); + + // Deactivate any parent navs in a nested navigation + deactivateNested(li, settings); + + // Emit a custom event + emitEvent('gumshoeDeactivate', li, { + link: items.nav, + content: items.content, + settings: settings + }); + + }; + + + /** + * Activate parent navs in a nested navigation + * @param {Node} nav The starting navigation element + * @param {Object} settings The settings for this instantiation + */ + var activateNested = function (nav, settings) { + + // If nesting isn't activated, bail + if (!settings.nested) return; + + // Get the parent navigation + var li = nav.parentNode.closest('li'); + if (!li) return; + + // Add the active class + li.classList.add(settings.nestedClass); + + // Apply recursively to any parent navigation elements + activateNested(li, settings); + + }; + + /** + * Activate a nav and content area + * @param {Object} items The nav item and content to activate + * @param {Object} settings The settings for this instantiation + */ + var activate = function (items, settings) { + + // Make sure their are items to activate + if (!items) return; + + // Get the parent list item + var li = items.nav.closest('li'); + if (!li) return; + + // Add the active class to the nav and content + li.classList.add(settings.navClass); + items.content.classList.add(settings.contentClass); + + // Activate any parent navs in a nested navigation + activateNested(li, settings); + + // Emit a custom event + emitEvent('gumshoeActivate', li, { + link: items.nav, + content: items.content, + settings: settings + }); + + }; + + /** + * Create the Constructor object + * @param {String} selector The selector to use for navigation items + * @param {Object} options User options and settings + */ + var Constructor = function (selector, options) { + + // + // Variables + // + + var publicAPIs = {}; + var navItems, contents, current, timeout, settings; + + + // + // Methods + // + + /** + * Set variables from DOM elements + */ + publicAPIs.setup = function () { + + // Get all nav items + navItems = document.querySelectorAll(selector); + + // Create contents array + contents = []; + + // Loop through each item, get it's matching content, and push to the array + Array.prototype.forEach.call(navItems, (function (item) { + + // Get the content for the nav item + var content = document.getElementById(decodeURIComponent(item.hash.substr(1))); + if (!content) return; + + // Push to the contents array + contents.push({ + nav: item, + content: content + }); + + })); + + // Sort contents by the order they appear in the DOM + sortContents(contents); + + }; + + /** + * Detect which content is currently active + */ + publicAPIs.detect = function () { + + // Get the active content + var active = getActive(contents, settings); + + // if there's no active content, deactivate and bail + if (!active) { + if (current) { + deactivate(current, settings); + current = null; + } + return; + } + + // If the active content is the one currently active, do nothing + if (current && active.content === current.content) return; + + // Deactivate the current content and activate the new content + deactivate(current, settings); + activate(active, settings); + + // Update the currently active content + current = active; + + }; + + /** + * Detect the active content on scroll + * Debounced for performance + */ + var scrollHandler = function (event) { + + // If there's a timer, cancel it + if (timeout) { + window.cancelAnimationFrame(timeout); + } + + // Setup debounce callback + timeout = window.requestAnimationFrame(publicAPIs.detect); + + }; + + /** + * Update content sorting on resize + * Debounced for performance + */ + var resizeHandler = function (event) { + + // If there's a timer, cancel it + if (timeout) { + window.cancelAnimationFrame(timeout); + } + + // Setup debounce callback + timeout = window.requestAnimationFrame((function () { + sortContents(contents); + publicAPIs.detect(); + })); + + }; + + /** + * Destroy the current instantiation + */ + publicAPIs.destroy = function () { + + // Undo DOM changes + if (current) { + deactivate(current, settings); + } + + // Remove event listeners + window.removeEventListener('scroll', scrollHandler, false); + if (settings.reflow) { + window.removeEventListener('resize', resizeHandler, false); + } + + // Reset variables + contents = null; + navItems = null; + current = null; + timeout = null; + settings = null; + + }; + + /** + * Initialize the current instantiation + */ + var init = function () { + + // Merge user options into defaults + settings = extend(defaults, options || {}); + + // Setup variables based on the current DOM + publicAPIs.setup(); + + // Find the currently active content + publicAPIs.detect(); + + // Setup event listeners + window.addEventListener('scroll', scrollHandler, false); + if (settings.reflow) { + window.addEventListener('resize', resizeHandler, false); + } + + }; + + + // + // Initialize and return the public APIs + // + + init(); + return publicAPIs; + + }; + + + // + // Return the Constructor + // + + return Constructor; + +})); \ No newline at end of file diff --git a/assets/js/plugins/jquery.auto-redirect.js b/assets/js/plugins/jquery.auto-redirect.js new file mode 100644 index 0000000..3f691ba --- /dev/null +++ b/assets/js/plugins/jquery.auto-redirect.js @@ -0,0 +1,59 @@ +(function ($) { + var pluginName = "autoRedirect"; + function Plugin(element, options) { + this.$el = $(element); + this.settings = $.extend({}, $.fn[pluginName].defaults, options, this.$el.data()); + this.timer = null; + this.init(); + } + Plugin.prototype = { + init: function () { + var self = this; + var delay = parseInt(self.settings.delay, 10); + var href = self.$el.attr("href"); + + if (!href) return; + + var $info = $(" (将在 " + delay + " 秒后自动跳转,您也可以手动取消跳转) "); + self.$el.after($info); + + self.timer = setInterval(function () { + delay--; + $info.find(".time").text(delay); + if (delay <= 0) { + clearInterval(self.timer); + window.location.href = href; + } + }, 1000); + + $info.on("click", ".cancel-redirect", function () { + clearInterval(self.timer); + $info.text(""); + }); + }, + destroy: function () { + clearInterval(this.timer); + this.$el.next(".redirect-info").remove(); + } + }; + $.fn[pluginName] = function (option) { + return this.each(function () { + var $this = $(this); + var instance = $this.data(pluginName); + + if (!instance) { + $this.data(pluginName, new Plugin(this, option)); + } else if (typeof option === "string" && instance[option]) { + instance[option](); + } + }); + }; + $.fn[pluginName].defaults = { + delay: 5 + }; + $(function () { + $("a[data-redirect]").each(function () { + $(this)[pluginName](); + }); + }); +})(jQuery); diff --git a/assets/js/plugins/jquery.ba-throttle-debounce.js b/assets/js/plugins/jquery.ba-throttle-debounce.js new file mode 100644 index 0000000..fa30bdf --- /dev/null +++ b/assets/js/plugins/jquery.ba-throttle-debounce.js @@ -0,0 +1,252 @@ +/*! + * jQuery throttle / debounce - v1.1 - 3/7/2010 + * http://benalman.com/projects/jquery-throttle-debounce-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ + +// Script: jQuery throttle / debounce: Sometimes, less is more! +// +// *Version: 1.1, Last updated: 3/7/2010* +// +// Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/ +// GitHub - http://github.com/cowboy/jquery-throttle-debounce/ +// Source - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js +// (Minified) - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb) +// +// About: License +// +// Copyright (c) 2010 "Cowboy" Ben Alman, +// Dual licensed under the MIT and GPL licenses. +// http://benalman.com/about/license/ +// +// About: Examples +// +// These working examples, complete with fully commented code, illustrate a few +// ways in which this plugin can be used. +// +// Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/ +// Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/ +// +// About: Support and Testing +// +// Information about what version or versions of jQuery this plugin has been +// tested with, what browsers it has been tested in, and where the unit tests +// reside (so you can test it yourself). +// +// jQuery Versions - none, 1.3.2, 1.4.2 +// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1. +// Unit Tests - http://benalman.com/code/projects/jquery-throttle-debounce/unit/ +// +// About: Release History +// +// 1.1 - (3/7/2010) Fixed a bug in where trailing callbacks +// executed later than they should. Reworked a fair amount of internal +// logic as well. +// 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over +// from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the +// no_trailing throttle parameter and debounce functionality. +// +// Topic: Note for non-jQuery users +// +// jQuery isn't actually required for this plugin, because nothing internal +// uses any jQuery methods or properties. jQuery is just used as a namespace +// under which these methods can exist. +// +// Since jQuery isn't actually required for this plugin, if jQuery doesn't exist +// when this plugin is loaded, the method described below will be created in +// the `Cowboy` namespace. Usage will be exactly the same, but instead of +// $.method() or jQuery.method(), you'll need to use Cowboy.method(). + +(function(window,undefined){ + '$:nomunge'; // Used by YUI compressor. + + // Since jQuery really isn't required for this plugin, use `jQuery` as the + // namespace only if it already exists, otherwise use the `Cowboy` namespace, + // creating it if necessary. + var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ), + + // Internal method reference. + jq_throttle; + + // Method: jQuery.throttle + // + // Throttle execution of a function. Especially useful for rate limiting + // execution of handlers on events like resize and scroll. If you want to + // rate-limit execution of a function to a single time, see the + // method. + // + // In this visualization, | is a throttled-function call and X is the actual + // callback execution: + // + // > Throttled with `no_trailing` specified as false or unspecified: + // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| + // > X X X X X X X X X X X X + // > + // > Throttled with `no_trailing` specified as true: + // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| + // > X X X X X X X X X X + // + // Usage: + // + // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback ); + // > + // > jQuery('selector').bind( 'someevent', throttled ); + // > jQuery('selector').unbind( 'someevent', throttled ); + // + // This also works in jQuery 1.4+: + // + // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) ); + // > jQuery('selector').unbind( 'someevent', callback ); + // + // Arguments: + // + // delay - (Number) A zero-or-greater delay in milliseconds. For event + // callbacks, values around 100 or 250 (or even higher) are most useful. + // no_trailing - (Boolean) Optional, defaults to false. If no_trailing is + // true, callback will only execute every `delay` milliseconds while the + // throttled-function is being called. If no_trailing is false or + // unspecified, callback will be executed one final time after the last + // throttled-function call. (After the throttled-function has not been + // called for `delay` milliseconds, the internal counter is reset) + // callback - (Function) A function to be executed after delay milliseconds. + // The `this` context and all arguments are passed through, as-is, to + // `callback` when the throttled-function is executed. + // + // Returns: + // + // (Function) A new, throttled, function. + + $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) { + // After wrapper has stopped being called, this timeout ensures that + // `callback` is executed at the proper times in `throttle` and `end` + // debounce modes. + var timeout_id, + + // Keep track of the last time `callback` was executed. + last_exec = 0; + + // `no_trailing` defaults to falsy. + if ( typeof no_trailing !== 'boolean' ) { + debounce_mode = callback; + callback = no_trailing; + no_trailing = undefined; + } + + // The `wrapper` function encapsulates all of the throttling / debouncing + // functionality and when executed will limit the rate at which `callback` + // is executed. + function wrapper() { + var that = this, + elapsed = +new Date() - last_exec, + args = arguments; + + // Execute `callback` and update the `last_exec` timestamp. + function exec() { + last_exec = +new Date(); + callback.apply( that, args ); + }; + + // If `debounce_mode` is true (at_begin) this is used to clear the flag + // to allow future `callback` executions. + function clear() { + timeout_id = undefined; + }; + + if ( debounce_mode && !timeout_id ) { + // Since `wrapper` is being called for the first time and + // `debounce_mode` is true (at_begin), execute `callback`. + exec(); + } + + // Clear any existing timeout. + timeout_id && clearTimeout( timeout_id ); + + if ( debounce_mode === undefined && elapsed > delay ) { + // In throttle mode, if `delay` time has been exceeded, execute + // `callback`. + exec(); + + } else if ( no_trailing !== true ) { + // In trailing throttle mode, since `delay` time has not been + // exceeded, schedule `callback` to execute `delay` ms after most + // recent execution. + // + // If `debounce_mode` is true (at_begin), schedule `clear` to execute + // after `delay` ms. + // + // If `debounce_mode` is false (at end), schedule `callback` to + // execute after `delay` ms. + timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay ); + } + }; + + // Set the guid of `wrapper` function to the same of original callback, so + // it can be removed in jQuery 1.4+ .unbind or .die by using the original + // callback as a reference. + if ( $.guid ) { + wrapper.guid = callback.guid = callback.guid || $.guid++; + } + + // Return the wrapper function. + return wrapper; + }; + + // Method: jQuery.debounce + // + // Debounce execution of a function. Debouncing, unlike throttling, + // guarantees that a function is only executed a single time, either at the + // very beginning of a series of calls, or at the very end. If you want to + // simply rate-limit execution of a function, see the + // method. + // + // In this visualization, | is a debounced-function call and X is the actual + // callback execution: + // + // > Debounced with `at_begin` specified as false or unspecified: + // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| + // > X X + // > + // > Debounced with `at_begin` specified as true: + // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| + // > X X + // + // Usage: + // + // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback ); + // > + // > jQuery('selector').bind( 'someevent', debounced ); + // > jQuery('selector').unbind( 'someevent', debounced ); + // + // This also works in jQuery 1.4+: + // + // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) ); + // > jQuery('selector').unbind( 'someevent', callback ); + // + // Arguments: + // + // delay - (Number) A zero-or-greater delay in milliseconds. For event + // callbacks, values around 100 or 250 (or even higher) are most useful. + // at_begin - (Boolean) Optional, defaults to false. If at_begin is false or + // unspecified, callback will only be executed `delay` milliseconds after + // the last debounced-function call. If at_begin is true, callback will be + // executed only at the first debounced-function call. (After the + // throttled-function has not been called for `delay` milliseconds, the + // internal counter is reset) + // callback - (Function) A function to be executed after delay milliseconds. + // The `this` context and all arguments are passed through, as-is, to + // `callback` when the debounced-function is executed. + // + // Returns: + // + // (Function) A new, debounced, function. + + $.debounce = function( delay, at_begin, callback ) { + return callback === undefined + ? jq_throttle( delay, at_begin, false ) + : jq_throttle( delay, callback, at_begin !== false ); + }; + +})(this); diff --git a/assets/js/plugins/jquery.fitvids.js b/assets/js/plugins/jquery.fitvids.js new file mode 100644 index 0000000..5c2f85c --- /dev/null +++ b/assets/js/plugins/jquery.fitvids.js @@ -0,0 +1,82 @@ +/*jshint browser:true */ +/*! +* FitVids 1.1 +* +* Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com +* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ +* Released under the WTFPL license - http://sam.zoy.org/wtfpl/ +* +*/ + +;(function( $ ){ + + 'use strict'; + + $.fn.fitVids = function( options ) { + var settings = { + customSelector: null, + ignore: null + }; + + if(!document.getElementById('fit-vids-style')) { + // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js + var head = document.head || document.getElementsByTagName('head')[0]; + var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}'; + var div = document.createElement("div"); + div.innerHTML = '

x

'; + head.appendChild(div.childNodes[1]); + } + + if ( options ) { + $.extend( settings, options ); + } + + return this.each(function(){ + var selectors = [ + 'iframe[src*="player.vimeo.com"]', + 'iframe[src*="youtube.com"]', + 'iframe[src*="youtube-nocookie.com"]', + 'iframe[src*="kickstarter.com"][src*="video.html"]', + 'object', + 'embed' + ]; + + if (settings.customSelector) { + selectors.push(settings.customSelector); + } + + var ignoreList = '.fitvidsignore'; + + if(settings.ignore) { + ignoreList = ignoreList + ', ' + settings.ignore; + } + + var $allVideos = $(this).find(selectors.join(',')); + $allVideos = $allVideos.not('object object'); // SwfObj conflict patch + $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video. + + $allVideos.each(function(count){ + var $this = $(this); + if($this.parents(ignoreList).length > 0) { + return; // Disable FitVids on this video. + } + if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } + if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) + { + $this.attr('height', 9); + $this.attr('width', 16); + } + var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), + width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), + aspectRatio = height / width; + if(!$this.attr('id')){ + var videoID = 'fitvid' + count; + $this.attr('id', videoID); + } + $this.wrap('
').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%'); + $this.removeAttr('height').removeAttr('width'); + }); + }); + }; +// Works with either jQuery or Zepto +})( window.jQuery || window.Zepto ); \ No newline at end of file diff --git a/assets/js/plugins/jquery.greedy-navigation.js b/assets/js/plugins/jquery.greedy-navigation.js new file mode 100644 index 0000000..a12ec3e --- /dev/null +++ b/assets/js/plugins/jquery.greedy-navigation.js @@ -0,0 +1,132 @@ +/* +GreedyNav.js - https://github.com/lukejacksonn/GreedyNav +Licensed under the MIT license - http://opensource.org/licenses/MIT +Copyright (c) 2015 Luke Jackson http://lukejacksonn.com +*/ + +$(function() { + + var $btn = $("nav.greedy-nav .greedy-nav__toggle"); + var $vlinks = $("nav.greedy-nav .visible-links"); + var $hlinks = $("nav.greedy-nav .hidden-links"); + var $nav = $("nav.greedy-nav"); + var $logo = $('nav.greedy-nav .site-logo'); + var $logoImg = $('nav.greedy-nav .site-logo img'); + var $title = $("nav.greedy-nav .site-title"); + var $search = $('nav.greedy-nav button.search__toggle'); + + var numOfItems, totalSpace, closingTime, breakWidths; + + // This function measures both hidden and visible links and sets the navbar breakpoints + // This is called the first time the script runs and everytime the "check()" function detects a change of window width that reached a different CSS width breakpoint, which affects the size of navbar Items + // Please note that "CSS width breakpoints" (which are only 4) !== "navbar breakpoints" (which are as many as the number of items on the navbar) + function measureLinks(){ + numOfItems = 0; + totalSpace = 0; + closingTime = 1000; + breakWidths = []; + + // Adds the width of a navItem in order to create breakpoints for the navbar + function addWidth(i, w) { + totalSpace += w; + numOfItems += 1; + breakWidths.push(totalSpace); + } + + // Measures the width of hidden links by making a temporary clone of them and positioning under visible links + function hiddenWidth(obj){ + var clone = obj.clone(); + clone.css("visibility","hidden"); + $vlinks.append(clone); + addWidth(0, clone.outerWidth()); + clone.remove(); + } + // Measure both visible and hidden links widths + $vlinks.children().outerWidth(addWidth); + $hlinks.children().each(function(){hiddenWidth($(this))}); + } + // Get initial state + measureLinks(); + + var winWidth = $( window ).width(); + // Set the last measured CSS width breakpoint: 0: <768px, 1: <1024px, 2: < 1280px, 3: >= 1280px. + var lastBreakpoint = winWidth < 768 ? 0 : winWidth < 1024 ? 1 : winWidth < 1280 ? 2 : 3; + + var availableSpace, numOfVisibleItems, requiredSpace, timer; + + function check() { + + winWidth = $( window ).width(); + // Set the current CSS width breakpoint: 0: <768px, 1: <1024px, 2: < 1280px, 3: >= 1280px. + var curBreakpoint = winWidth < 768 ? 0 : winWidth < 1024 ? 1 : winWidth < 1280 ? 2 : 3; + // If current breakpoint is different from last measured breakpoint, measureLinks again + if(curBreakpoint !== lastBreakpoint) measureLinks(); + // Set the last measured CSS width breakpoint with the current breakpoint + lastBreakpoint = curBreakpoint; + + // Get instant state + numOfVisibleItems = $vlinks.children().length; + // Decrease the width of visible elements from the nav innerWidth to find out the available space for navItems + availableSpace = /* nav */ $nav.innerWidth() + - /* logo */ ($logo.length !== 0 ? $logo.outerWidth(true) : 0) + - /* title */ $title.outerWidth(true) + - /* search */ ($search.length !== 0 ? $search.outerWidth(true) : 0) + - /* toggle */ (numOfVisibleItems !== breakWidths.length ? $btn.outerWidth(true) : 0); + requiredSpace = breakWidths[numOfVisibleItems - 1]; + + // There is not enought space + if (requiredSpace > availableSpace) { + $vlinks.children().last().prependTo($hlinks); + numOfVisibleItems -= 1; + check(); + // There is more than enough space. If only one element is hidden, add the toggle width to the available space + } else if (availableSpace + (numOfVisibleItems === breakWidths.length - 1?$btn.outerWidth(true):0) > breakWidths[numOfVisibleItems]) { + $hlinks.children().first().appendTo($vlinks); + numOfVisibleItems += 1; + check(); + } + // Update the button accordingly + $btn.attr("count", numOfItems - numOfVisibleItems); + if (numOfVisibleItems === numOfItems) { + $btn.addClass('hidden'); + } else $btn.removeClass('hidden'); + } + + // Window listeners + $(window).resize(function() { + check(); + }); + + $btn.on('click', function() { + $hlinks.toggleClass('hidden'); + $(this).toggleClass('close'); + clearTimeout(timer); + }); + + $hlinks.on("click", function () { + // Hide the hidden links & remove the overlay when one is clicked. + $hlinks.addClass("hidden"); + $btn.removeClass("close"); + }).on('mouseleave', function() { + // Mouse has left, start the timer + timer = setTimeout(function() { + $hlinks.addClass('hidden'); + $('.greedy-nav__toggle').removeClass('close'); + }, closingTime); + }).on('mouseenter', function() { + // Mouse is back, cancel the timer + clearTimeout(timer); + }) + + // check if page has a logo + if($logoImg.length !== 0){ + // check if logo is not loaded + if(!($logoImg[0].complete || $logoImg[0].naturalWidth !== 0)){ + // if logo is not loaded wait for logo to load or fail to check + $logoImg.one("load error", check); + // if logo is already loaded just check + } else check(); + // if page does not have a logo just check + } else check(); + +}); diff --git a/assets/js/plugins/jquery.magnific-popup.js b/assets/js/plugins/jquery.magnific-popup.js new file mode 100644 index 0000000..7d1d197 --- /dev/null +++ b/assets/js/plugins/jquery.magnific-popup.js @@ -0,0 +1,1860 @@ +/*! Magnific Popup - v1.1.0 - 2016-02-20 +* http://dimsemenov.com/plugins/magnific-popup/ +* Copyright (c) 2016 Dmitry Semenov; */ +;(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(window.jQuery || window.Zepto); + } + }(function($) { + + /*>>core*/ + /** + * + * Magnific Popup Core JS file + * + */ + + + /** + * Private static constants + */ + var CLOSE_EVENT = 'Close', + BEFORE_CLOSE_EVENT = 'BeforeClose', + AFTER_CLOSE_EVENT = 'AfterClose', + BEFORE_APPEND_EVENT = 'BeforeAppend', + MARKUP_PARSE_EVENT = 'MarkupParse', + OPEN_EVENT = 'Open', + CHANGE_EVENT = 'Change', + NS = 'mfp', + EVENT_NS = '.' + NS, + READY_CLASS = 'mfp-ready', + REMOVING_CLASS = 'mfp-removing', + PREVENT_CLOSE_CLASS = 'mfp-prevent-close'; + + + /** + * Private vars + */ + /*jshint -W079 */ + var mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this' + MagnificPopup = function(){}, + _isJQ = !!(window.jQuery), + _prevStatus, + _window = $(window), + _document, + _prevContentType, + _wrapClasses, + _currPopupType; + + + /** + * Private functions + */ + var _mfpOn = function(name, f) { + mfp.ev.on(NS + name + EVENT_NS, f); + }, + _getEl = function(className, appendTo, html, raw) { + var el = document.createElement('div'); + el.className = 'mfp-'+className; + if(html) { + el.innerHTML = html; + } + if(!raw) { + el = $(el); + if(appendTo) { + el.appendTo(appendTo); + } + } else if(appendTo) { + appendTo.appendChild(el); + } + return el; + }, + _mfpTrigger = function(e, data) { + mfp.ev.triggerHandler(NS + e, data); + + if(mfp.st.callbacks) { + // converts "mfpEventName" to "eventName" callback and triggers it if it's present + e = e.charAt(0).toLowerCase() + e.slice(1); + if(mfp.st.callbacks[e]) { + mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]); + } + } + }, + _getCloseBtn = function(type) { + if(type !== _currPopupType || !mfp.currTemplate.closeBtn) { + mfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) ); + _currPopupType = type; + } + return mfp.currTemplate.closeBtn; + }, + // Initialize Magnific Popup only when called at least once + _checkInstance = function() { + if(!$.magnificPopup.instance) { + /*jshint -W020 */ + mfp = new MagnificPopup(); + mfp.init(); + $.magnificPopup.instance = mfp; + } + }, + // CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr + supportsTransitions = function() { + var s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist + v = ['ms','O','Moz','Webkit']; // 'v' for vendor + + if( s['transition'] !== undefined ) { + return true; + } + + while( v.length ) { + if( v.pop() + 'Transition' in s ) { + return true; + } + } + + return false; + }; + + + + /** + * Public functions + */ + MagnificPopup.prototype = { + + constructor: MagnificPopup, + + /** + * Initializes Magnific Popup plugin. + * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed + */ + init: function() { + var appVersion = navigator.appVersion; + mfp.isLowIE = mfp.isIE8 = document.all && !document.addEventListener; + mfp.isAndroid = (/android/gi).test(appVersion); + mfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion); + mfp.supportsTransition = supportsTransitions(); + + // We disable fixed positioned lightbox on devices that don't handle it nicely. + // If you know a better way of detecting this - let me know. + mfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) ); + _document = $(document); + + mfp.popupsCache = {}; + }, + + /** + * Opens popup + * @param data [description] + */ + open: function(data) { + + var i; + + if(data.isObj === false) { + // convert jQuery collection to array to avoid conflicts later + mfp.items = data.items.toArray(); + + mfp.index = 0; + var items = data.items, + item; + for(i = 0; i < items.length; i++) { + item = items[i]; + if(item.parsed) { + item = item.el[0]; + } + if(item === data.el[0]) { + mfp.index = i; + break; + } + } + } else { + mfp.items = $.isArray(data.items) ? data.items : [data.items]; + mfp.index = data.index || 0; + } + + // if popup is already opened - we just update the content + if(mfp.isOpen) { + mfp.updateItemHTML(); + return; + } + + mfp.types = []; + _wrapClasses = ''; + if(data.mainEl && data.mainEl.length) { + mfp.ev = data.mainEl.eq(0); + } else { + mfp.ev = _document; + } + + if(data.key) { + if(!mfp.popupsCache[data.key]) { + mfp.popupsCache[data.key] = {}; + } + mfp.currTemplate = mfp.popupsCache[data.key]; + } else { + mfp.currTemplate = {}; + } + + + + mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data ); + mfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos; + + if(mfp.st.modal) { + mfp.st.closeOnContentClick = false; + mfp.st.closeOnBgClick = false; + mfp.st.showCloseBtn = false; + mfp.st.enableEscapeKey = false; + } + + + // Building markup + // main containers are created only once + if(!mfp.bgOverlay) { + + // Dark overlay + mfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() { + mfp.close(); + }); + + mfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) { + if(mfp._checkIfClose(e.target)) { + mfp.close(); + } + }); + + mfp.container = _getEl('container', mfp.wrap); + } + + mfp.contentContainer = _getEl('content'); + if(mfp.st.preloader) { + mfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading); + } + + + // Initializing modules + var modules = $.magnificPopup.modules; + for(i = 0; i < modules.length; i++) { + var n = modules[i]; + n = n.charAt(0).toUpperCase() + n.slice(1); + mfp['init'+n].call(mfp); + } + _mfpTrigger('BeforeOpen'); + + + if(mfp.st.showCloseBtn) { + // Close button + if(!mfp.st.closeBtnInside) { + mfp.wrap.append( _getCloseBtn() ); + } else { + _mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) { + values.close_replaceWith = _getCloseBtn(item.type); + }); + _wrapClasses += ' mfp-close-btn-in'; + } + } + + if(mfp.st.alignTop) { + _wrapClasses += ' mfp-align-top'; + } + + + + if(mfp.fixedContentPos) { + mfp.wrap.css({ + overflow: mfp.st.overflowY, + overflowX: 'hidden', + overflowY: mfp.st.overflowY + }); + } else { + mfp.wrap.css({ + top: _window.scrollTop(), + position: 'absolute' + }); + } + if( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) { + mfp.bgOverlay.css({ + height: _document.height(), + position: 'absolute' + }); + } + + + + if(mfp.st.enableEscapeKey) { + // Close on ESC key + _document.on('keyup' + EVENT_NS, function(e) { + if(e.keyCode === 27) { + mfp.close(); + } + }); + } + + _window.on('resize' + EVENT_NS, function() { + mfp.updateSize(); + }); + + + if(!mfp.st.closeOnContentClick) { + _wrapClasses += ' mfp-auto-cursor'; + } + + if(_wrapClasses) + mfp.wrap.addClass(_wrapClasses); + + + // this triggers recalculation of layout, so we get it once to not to trigger twice + var windowHeight = mfp.wH = _window.height(); + + + var windowStyles = {}; + + if( mfp.fixedContentPos ) { + if(mfp._hasScrollBar(windowHeight)){ + var s = mfp._getScrollbarSize(); + if(s) { + windowStyles.marginRight = s; + } + } + } + + if(mfp.fixedContentPos) { + if(!mfp.isIE7) { + windowStyles.overflow = 'hidden'; + } else { + // ie7 double-scroll bug + $('body, html').css('overflow', 'hidden'); + } + } + + + + var classesToadd = mfp.st.mainClass; + if(mfp.isIE7) { + classesToadd += ' mfp-ie7'; + } + if(classesToadd) { + mfp._addClassToMFP( classesToadd ); + } + + // add content + mfp.updateItemHTML(); + + _mfpTrigger('BuildControls'); + + // remove scrollbar, add margin e.t.c + $('html').css(windowStyles); + + // add everything to DOM + mfp.bgOverlay.add(mfp.wrap).prependTo( mfp.st.prependTo || $(document.body) ); + + // Save last focused element + mfp._lastFocusedEl = document.activeElement; + + // Wait for next cycle to allow CSS transition + setTimeout(function() { + + if(mfp.content) { + mfp._addClassToMFP(READY_CLASS); + mfp._setFocus(); + } else { + // if content is not defined (not loaded e.t.c) we add class only for BG + mfp.bgOverlay.addClass(READY_CLASS); + } + + // Trap the focus in popup + _document.on('focusin' + EVENT_NS, mfp._onFocusIn); + + }, 16); + + mfp.isOpen = true; + mfp.updateSize(windowHeight); + _mfpTrigger(OPEN_EVENT); + + return data; + }, + + /** + * Closes the popup + */ + close: function() { + if(!mfp.isOpen) return; + _mfpTrigger(BEFORE_CLOSE_EVENT); + + mfp.isOpen = false; + // for CSS3 animation + if(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition ) { + mfp._addClassToMFP(REMOVING_CLASS); + setTimeout(function() { + mfp._close(); + }, mfp.st.removalDelay); + } else { + mfp._close(); + } + }, + + /** + * Helper for close() function + */ + _close: function() { + _mfpTrigger(CLOSE_EVENT); + + var classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' '; + + mfp.bgOverlay.detach(); + mfp.wrap.detach(); + mfp.container.empty(); + + if(mfp.st.mainClass) { + classesToRemove += mfp.st.mainClass + ' '; + } + + mfp._removeClassFromMFP(classesToRemove); + + if(mfp.fixedContentPos) { + var windowStyles = {marginRight: ''}; + if(mfp.isIE7) { + $('body, html').css('overflow', ''); + } else { + windowStyles.overflow = ''; + } + $('html').css(windowStyles); + } + + _document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS); + mfp.ev.off(EVENT_NS); + + // clean up DOM elements that aren't removed + mfp.wrap.attr('class', 'mfp-wrap').removeAttr('style'); + mfp.bgOverlay.attr('class', 'mfp-bg'); + mfp.container.attr('class', 'mfp-container'); + + // remove close button from target element + if(mfp.st.showCloseBtn && + (!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) { + if(mfp.currTemplate.closeBtn) + mfp.currTemplate.closeBtn.detach(); + } + + + if(mfp.st.autoFocusLast && mfp._lastFocusedEl) { + $(mfp._lastFocusedEl).focus(); // put tab focus back + } + mfp.currItem = null; + mfp.content = null; + mfp.currTemplate = null; + mfp.prevHeight = 0; + + _mfpTrigger(AFTER_CLOSE_EVENT); + }, + + updateSize: function(winHeight) { + + if(mfp.isIOS) { + // fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2 + var zoomLevel = document.documentElement.clientWidth / window.innerWidth; + var height = window.innerHeight * zoomLevel; + mfp.wrap.css('height', height); + mfp.wH = height; + } else { + mfp.wH = winHeight || _window.height(); + } + // Fixes #84: popup incorrectly positioned with position:relative on body + if(!mfp.fixedContentPos) { + mfp.wrap.css('height', mfp.wH); + } + + _mfpTrigger('Resize'); + + }, + + /** + * Set content of popup based on current index + */ + updateItemHTML: function() { + var item = mfp.items[mfp.index]; + + // Detach and perform modifications + mfp.contentContainer.detach(); + + if(mfp.content) + mfp.content.detach(); + + if(!item.parsed) { + item = mfp.parseEl( mfp.index ); + } + + var type = item.type; + + _mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]); + // BeforeChange event works like so: + // _mfpOn('BeforeChange', function(e, prevType, newType) { }); + + mfp.currItem = item; + + if(!mfp.currTemplate[type]) { + var markup = mfp.st[type] ? mfp.st[type].markup : false; + + // allows to modify markup + _mfpTrigger('FirstMarkupParse', markup); + + if(markup) { + mfp.currTemplate[type] = $(markup); + } else { + // if there is no markup found we just define that template is parsed + mfp.currTemplate[type] = true; + } + } + + if(_prevContentType && _prevContentType !== item.type) { + mfp.container.removeClass('mfp-'+_prevContentType+'-holder'); + } + + var newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]); + mfp.appendContent(newContent, type); + + item.preloaded = true; + + _mfpTrigger(CHANGE_EVENT, item); + _prevContentType = item.type; + + // Append container back after its content changed + mfp.container.prepend(mfp.contentContainer); + + _mfpTrigger('AfterChange'); + }, + + + /** + * Set HTML content of popup + */ + appendContent: function(newContent, type) { + mfp.content = newContent; + + if(newContent) { + if(mfp.st.showCloseBtn && mfp.st.closeBtnInside && + mfp.currTemplate[type] === true) { + // if there is no markup, we just append close button element inside + if(!mfp.content.find('.mfp-close').length) { + mfp.content.append(_getCloseBtn()); + } + } else { + mfp.content = newContent; + } + } else { + mfp.content = ''; + } + + _mfpTrigger(BEFORE_APPEND_EVENT); + mfp.container.addClass('mfp-'+type+'-holder'); + + mfp.contentContainer.append(mfp.content); + }, + + + /** + * Creates Magnific Popup data object based on given data + * @param {int} index Index of item to parse + */ + parseEl: function(index) { + var item = mfp.items[index], + type; + + if(item.tagName) { + item = { el: $(item) }; + } else { + type = item.type; + item = { data: item, src: item.src }; + } + + if(item.el) { + var types = mfp.types; + + // check for 'mfp-TYPE' class + for(var i = 0; i < types.length; i++) { + if( item.el.hasClass('mfp-'+types[i]) ) { + type = types[i]; + break; + } + } + + item.src = item.el.attr('data-mfp-src'); + if(!item.src) { + item.src = item.el.attr('href'); + } + } + + item.type = type || mfp.st.type || 'inline'; + item.index = index; + item.parsed = true; + mfp.items[index] = item; + _mfpTrigger('ElementParse', item); + + return mfp.items[index]; + }, + + + /** + * Initializes single popup or a group of popups + */ + addGroup: function(el, options) { + var eHandler = function(e) { + e.mfpEl = this; + mfp._openClick(e, el, options); + }; + + if(!options) { + options = {}; + } + + var eName = 'click.magnificPopup'; + options.mainEl = el; + + if(options.items) { + options.isObj = true; + el.off(eName).on(eName, eHandler); + } else { + options.isObj = false; + if(options.delegate) { + el.off(eName).on(eName, options.delegate , eHandler); + } else { + options.items = el; + el.off(eName).on(eName, eHandler); + } + } + }, + _openClick: function(e, el, options) { + var midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick; + + + if(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey ) ) { + return; + } + + var disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn; + + if(disableOn) { + if($.isFunction(disableOn)) { + if( !disableOn.call(mfp) ) { + return true; + } + } else { // else it's number + if( _window.width() < disableOn ) { + return true; + } + } + } + + if(e.type) { + e.preventDefault(); + + // This will prevent popup from closing if element is inside and popup is already opened + if(mfp.isOpen) { + e.stopPropagation(); + } + } + + options.el = $(e.mfpEl); + if(options.delegate) { + options.items = el.find(options.delegate); + } + mfp.open(options); + }, + + + /** + * Updates text on preloader + */ + updateStatus: function(status, text) { + + if(mfp.preloader) { + if(_prevStatus !== status) { + mfp.container.removeClass('mfp-s-'+_prevStatus); + } + + if(!text && status === 'loading') { + text = mfp.st.tLoading; + } + + var data = { + status: status, + text: text + }; + // allows to modify status + _mfpTrigger('UpdateStatus', data); + + status = data.status; + text = data.text; + + mfp.preloader.html(text); + + mfp.preloader.find('a').on('click', function(e) { + e.stopImmediatePropagation(); + }); + + mfp.container.addClass('mfp-s-'+status); + _prevStatus = status; + } + }, + + + /* + "Private" helpers that aren't private at all + */ + // Check to close popup or not + // "target" is an element that was clicked + _checkIfClose: function(target) { + + if($(target).hasClass(PREVENT_CLOSE_CLASS)) { + return; + } + + var closeOnContent = mfp.st.closeOnContentClick; + var closeOnBg = mfp.st.closeOnBgClick; + + if(closeOnContent && closeOnBg) { + return true; + } else { + + // We close the popup if click is on close button or on preloader. Or if there is no content. + if(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) { + return true; + } + + // if click is outside the content + if( (target !== mfp.content[0] && !$.contains(mfp.content[0], target)) ) { + if(closeOnBg) { + // last check, if the clicked element is in DOM, (in case it's removed onclick) + if( $.contains(document, target) ) { + return true; + } + } + } else if(closeOnContent) { + return true; + } + + } + return false; + }, + _addClassToMFP: function(cName) { + mfp.bgOverlay.addClass(cName); + mfp.wrap.addClass(cName); + }, + _removeClassFromMFP: function(cName) { + this.bgOverlay.removeClass(cName); + mfp.wrap.removeClass(cName); + }, + _hasScrollBar: function(winHeight) { + return ( (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) ); + }, + _setFocus: function() { + (mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus(); + }, + _onFocusIn: function(e) { + if( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) { + mfp._setFocus(); + return false; + } + }, + _parseMarkup: function(template, values, item) { + var arr; + if(item.data) { + values = $.extend(item.data, values); + } + _mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] ); + + $.each(values, function(key, value) { + if(value === undefined || value === false) { + return true; + } + arr = key.split('_'); + if(arr.length > 1) { + var el = template.find(EVENT_NS + '-'+arr[0]); + + if(el.length > 0) { + var attr = arr[1]; + if(attr === 'replaceWith') { + if(el[0] !== value[0]) { + el.replaceWith(value); + } + } else if(attr === 'img') { + if(el.is('img')) { + el.attr('src', value); + } else { + el.replaceWith( $('').attr('src', value).attr('class', el.attr('class')) ); + } + } else { + el.attr(arr[1], value); + } + } + + } else { + template.find(EVENT_NS + '-'+key).html(value); + } + }); + }, + + _getScrollbarSize: function() { + // thx David + if(mfp.scrollbarSize === undefined) { + var scrollDiv = document.createElement("div"); + scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;'; + document.body.appendChild(scrollDiv); + mfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + } + return mfp.scrollbarSize; + } + + }; /* MagnificPopup core prototype end */ + + + + + /** + * Public static functions + */ + $.magnificPopup = { + instance: null, + proto: MagnificPopup.prototype, + modules: [], + + open: function(options, index) { + _checkInstance(); + + if(!options) { + options = {}; + } else { + options = $.extend(true, {}, options); + } + + options.isObj = true; + options.index = index || 0; + return this.instance.open(options); + }, + + close: function() { + return $.magnificPopup.instance && $.magnificPopup.instance.close(); + }, + + registerModule: function(name, module) { + if(module.options) { + $.magnificPopup.defaults[name] = module.options; + } + $.extend(this.proto, module.proto); + this.modules.push(name); + }, + + defaults: { + + // Info about options is in docs: + // http://dimsemenov.com/plugins/magnific-popup/documentation.html#options + + disableOn: 0, + + key: null, + + midClick: false, + + mainClass: '', + + preloader: true, + + focus: '', // CSS selector of input to focus after popup is opened + + closeOnContentClick: false, + + closeOnBgClick: true, + + closeBtnInside: true, + + showCloseBtn: true, + + enableEscapeKey: true, + + modal: false, + + alignTop: false, + + removalDelay: 0, + + prependTo: null, + + fixedContentPos: 'auto', + + fixedBgPos: 'auto', + + overflowY: 'auto', + + closeMarkup: '', + + tClose: 'Close (Esc)', + + tLoading: 'Loading...', + + autoFocusLast: true + + } + }; + + + + $.fn.magnificPopup = function(options) { + _checkInstance(); + + var jqEl = $(this); + + // We call some API method of first param is a string + if (typeof options === "string" ) { + + if(options === 'open') { + var items, + itemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup, + index = parseInt(arguments[1], 10) || 0; + + if(itemOpts.items) { + items = itemOpts.items[index]; + } else { + items = jqEl; + if(itemOpts.delegate) { + items = items.find(itemOpts.delegate); + } + items = items.eq( index ); + } + mfp._openClick({mfpEl:items}, jqEl, itemOpts); + } else { + if(mfp.isOpen) + mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1)); + } + + } else { + // clone options obj + options = $.extend(true, {}, options); + + /* + * As Zepto doesn't support .data() method for objects + * and it works only in normal browsers + * we assign "options" object directly to the DOM element. FTW! + */ + if(_isJQ) { + jqEl.data('magnificPopup', options); + } else { + jqEl[0].magnificPopup = options; + } + + mfp.addGroup(jqEl, options); + + } + return jqEl; + }; + + /*>>core*/ + + /*>>inline*/ + + var INLINE_NS = 'inline', + _hiddenClass, + _inlinePlaceholder, + _lastInlineElement, + _putInlineElementsBack = function() { + if(_lastInlineElement) { + _inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach(); + _lastInlineElement = null; + } + }; + + $.magnificPopup.registerModule(INLINE_NS, { + options: { + hiddenClass: 'hide', // will be appended with `mfp-` prefix + markup: '', + tNotFound: 'Content not found' + }, + proto: { + + initInline: function() { + mfp.types.push(INLINE_NS); + + _mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() { + _putInlineElementsBack(); + }); + }, + + getInline: function(item, template) { + + _putInlineElementsBack(); + + if(item.src) { + var inlineSt = mfp.st.inline, + el = $(item.src); + + if(el.length) { + + // If target element has parent - we replace it with placeholder and put it back after popup is closed + var parent = el[0].parentNode; + if(parent && parent.tagName) { + if(!_inlinePlaceholder) { + _hiddenClass = inlineSt.hiddenClass; + _inlinePlaceholder = _getEl(_hiddenClass); + _hiddenClass = 'mfp-'+_hiddenClass; + } + // replace target inline element with placeholder + _lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass); + } + + mfp.updateStatus('ready'); + } else { + mfp.updateStatus('error', inlineSt.tNotFound); + el = $('
'); + } + + item.inlineElement = el; + return el; + } + + mfp.updateStatus('ready'); + mfp._parseMarkup(template, {}, item); + return template; + } + } + }); + + /*>>inline*/ + + /*>>ajax*/ + var AJAX_NS = 'ajax', + _ajaxCur, + _removeAjaxCursor = function() { + if(_ajaxCur) { + $(document.body).removeClass(_ajaxCur); + } + }, + _destroyAjaxRequest = function() { + _removeAjaxCursor(); + if(mfp.req) { + mfp.req.abort(); + } + }; + + $.magnificPopup.registerModule(AJAX_NS, { + + options: { + settings: null, + cursor: 'mfp-ajax-cur', + tError: 'The content could not be loaded.' + }, + + proto: { + initAjax: function() { + mfp.types.push(AJAX_NS); + _ajaxCur = mfp.st.ajax.cursor; + + _mfpOn(CLOSE_EVENT+'.'+AJAX_NS, _destroyAjaxRequest); + _mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest); + }, + getAjax: function(item) { + + if(_ajaxCur) { + $(document.body).addClass(_ajaxCur); + } + + mfp.updateStatus('loading'); + + var opts = $.extend({ + url: item.src, + success: function(data, textStatus, jqXHR) { + var temp = { + data:data, + xhr:jqXHR + }; + + _mfpTrigger('ParseAjax', temp); + + mfp.appendContent( $(temp.data), AJAX_NS ); + + item.finished = true; + + _removeAjaxCursor(); + + mfp._setFocus(); + + setTimeout(function() { + mfp.wrap.addClass(READY_CLASS); + }, 16); + + mfp.updateStatus('ready'); + + _mfpTrigger('AjaxContentAdded'); + }, + error: function() { + _removeAjaxCursor(); + item.finished = item.loadError = true; + mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src)); + } + }, mfp.st.ajax.settings); + + mfp.req = $.ajax(opts); + + return ''; + } + } + }); + + /*>>ajax*/ + + /*>>image*/ + var _imgInterval, + _getTitle = function(item) { + if(item.data && item.data.title !== undefined) + return item.data.title; + + var src = mfp.st.image.titleSrc; + + if(src) { + if($.isFunction(src)) { + return src.call(mfp, item); + } else if(item.el) { + return item.el.attr(src) || ''; + } + } + return ''; + }; + + $.magnificPopup.registerModule('image', { + + options: { + markup: '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
', + cursor: 'mfp-zoom-out-cur', + titleSrc: 'title', + verticalFit: true, + tError: 'The image could not be loaded.' + }, + + proto: { + initImage: function() { + var imgSt = mfp.st.image, + ns = '.image'; + + mfp.types.push('image'); + + _mfpOn(OPEN_EVENT+ns, function() { + if(mfp.currItem.type === 'image' && imgSt.cursor) { + $(document.body).addClass(imgSt.cursor); + } + }); + + _mfpOn(CLOSE_EVENT+ns, function() { + if(imgSt.cursor) { + $(document.body).removeClass(imgSt.cursor); + } + _window.off('resize' + EVENT_NS); + }); + + _mfpOn('Resize'+ns, mfp.resizeImage); + if(mfp.isLowIE) { + _mfpOn('AfterChange', mfp.resizeImage); + } + }, + resizeImage: function() { + var item = mfp.currItem; + if(!item || !item.img) return; + + if(mfp.st.image.verticalFit) { + var decr = 0; + // fix box-sizing in ie7/8 + if(mfp.isLowIE) { + decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10); + } + item.img.css('max-height', mfp.wH-decr); + } + }, + _onImageHasSize: function(item) { + if(item.img) { + + item.hasSize = true; + + if(_imgInterval) { + clearInterval(_imgInterval); + } + + item.isCheckingImgSize = false; + + _mfpTrigger('ImageHasSize', item); + + if(item.imgHidden) { + if(mfp.content) + mfp.content.removeClass('mfp-loading'); + + item.imgHidden = false; + } + + } + }, + + /** + * Function that loops until the image has size to display elements that rely on it asap + */ + findImageSize: function(item) { + + var counter = 0, + img = item.img[0], + mfpSetInterval = function(delay) { + + if(_imgInterval) { + clearInterval(_imgInterval); + } + // decelerating interval that checks for size of an image + _imgInterval = setInterval(function() { + if(img.naturalWidth > 0) { + mfp._onImageHasSize(item); + return; + } + + if(counter > 200) { + clearInterval(_imgInterval); + } + + counter++; + if(counter === 3) { + mfpSetInterval(10); + } else if(counter === 40) { + mfpSetInterval(50); + } else if(counter === 100) { + mfpSetInterval(500); + } + }, delay); + }; + + mfpSetInterval(1); + }, + + getImage: function(item, template) { + + var guard = 0, + + // image load complete handler + onLoadComplete = function() { + if(item) { + if (item.img[0].complete) { + item.img.off('.mfploader'); + + if(item === mfp.currItem){ + mfp._onImageHasSize(item); + + mfp.updateStatus('ready'); + } + + item.hasSize = true; + item.loaded = true; + + _mfpTrigger('ImageLoadComplete'); + + } + else { + // if image complete check fails 200 times (20 sec), we assume that there was an error. + guard++; + if(guard < 200) { + setTimeout(onLoadComplete,100); + } else { + onLoadError(); + } + } + } + }, + + // image error handler + onLoadError = function() { + if(item) { + item.img.off('.mfploader'); + if(item === mfp.currItem){ + mfp._onImageHasSize(item); + mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) ); + } + + item.hasSize = true; + item.loaded = true; + item.loadError = true; + } + }, + imgSt = mfp.st.image; + + + var el = template.find('.mfp-img'); + if(el.length) { + var img = document.createElement('img'); + img.className = 'mfp-img'; + if(item.el && item.el.find('img').length) { + img.alt = item.el.find('img').attr('alt'); + } + item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError); + img.src = item.src; + + // without clone() "error" event is not firing when IMG is replaced by new IMG + // TODO: find a way to avoid such cloning + if(el.is('img')) { + item.img = item.img.clone(); + } + + img = item.img[0]; + if(img.naturalWidth > 0) { + item.hasSize = true; + } else if(!img.width) { + item.hasSize = false; + } + } + + mfp._parseMarkup(template, { + title: _getTitle(item), + img_replaceWith: item.img + }, item); + + mfp.resizeImage(); + + if(item.hasSize) { + if(_imgInterval) clearInterval(_imgInterval); + + if(item.loadError) { + template.addClass('mfp-loading'); + mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) ); + } else { + template.removeClass('mfp-loading'); + mfp.updateStatus('ready'); + } + return template; + } + + mfp.updateStatus('loading'); + item.loading = true; + + if(!item.hasSize) { + item.imgHidden = true; + template.addClass('mfp-loading'); + mfp.findImageSize(item); + } + + return template; + } + } + }); + + /*>>image*/ + + /*>>zoom*/ + var hasMozTransform, + getHasMozTransform = function() { + if(hasMozTransform === undefined) { + hasMozTransform = document.createElement('p').style.MozTransform !== undefined; + } + return hasMozTransform; + }; + + $.magnificPopup.registerModule('zoom', { + + options: { + enabled: false, + easing: 'ease-in-out', + duration: 300, + opener: function(element) { + return element.is('img') ? element : element.find('img'); + } + }, + + proto: { + + initZoom: function() { + var zoomSt = mfp.st.zoom, + ns = '.zoom', + image; + + if(!zoomSt.enabled || !mfp.supportsTransition) { + return; + } + + var duration = zoomSt.duration, + getElToAnimate = function(image) { + var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'), + transition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing, + cssObj = { + position: 'fixed', + zIndex: 9999, + left: 0, + top: 0, + '-webkit-backface-visibility': 'hidden' + }, + t = 'transition'; + + cssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition; + + newImg.css(cssObj); + return newImg; + }, + showMainContent = function() { + mfp.content.css('visibility', 'visible'); + }, + openTimeout, + animatedImg; + + _mfpOn('BuildControls'+ns, function() { + if(mfp._allowZoom()) { + + clearTimeout(openTimeout); + mfp.content.css('visibility', 'hidden'); + + // Basically, all code below does is clones existing image, puts in on top of the current one and animated it + + image = mfp._getItemToZoom(); + + if(!image) { + showMainContent(); + return; + } + + animatedImg = getElToAnimate(image); + + animatedImg.css( mfp._getOffset() ); + + mfp.wrap.append(animatedImg); + + openTimeout = setTimeout(function() { + animatedImg.css( mfp._getOffset( true ) ); + openTimeout = setTimeout(function() { + + showMainContent(); + + setTimeout(function() { + animatedImg.remove(); + image = animatedImg = null; + _mfpTrigger('ZoomAnimationEnded'); + }, 16); // avoid blink when switching images + + }, duration); // this timeout equals animation duration + + }, 16); // by adding this timeout we avoid short glitch at the beginning of animation + + + // Lots of timeouts... + } + }); + _mfpOn(BEFORE_CLOSE_EVENT+ns, function() { + if(mfp._allowZoom()) { + + clearTimeout(openTimeout); + + mfp.st.removalDelay = duration; + + if(!image) { + image = mfp._getItemToZoom(); + if(!image) { + return; + } + animatedImg = getElToAnimate(image); + } + + animatedImg.css( mfp._getOffset(true) ); + mfp.wrap.append(animatedImg); + mfp.content.css('visibility', 'hidden'); + + setTimeout(function() { + animatedImg.css( mfp._getOffset() ); + }, 16); + } + + }); + + _mfpOn(CLOSE_EVENT+ns, function() { + if(mfp._allowZoom()) { + showMainContent(); + if(animatedImg) { + animatedImg.remove(); + } + image = null; + } + }); + }, + + _allowZoom: function() { + return mfp.currItem.type === 'image'; + }, + + _getItemToZoom: function() { + if(mfp.currItem.hasSize) { + return mfp.currItem.img; + } else { + return false; + } + }, + + // Get element postion relative to viewport + _getOffset: function(isLarge) { + var el; + if(isLarge) { + el = mfp.currItem.img; + } else { + el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem); + } + + var offset = el.offset(); + var paddingTop = parseInt(el.css('padding-top'),10); + var paddingBottom = parseInt(el.css('padding-bottom'),10); + offset.top -= ( $(window).scrollTop() - paddingTop ); + + + /* + + Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa. + + */ + var obj = { + width: el.width(), + // fix Zepto height+padding issue + height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop + }; + + // I hate to do this, but there is no another option + if( getHasMozTransform() ) { + obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)'; + } else { + obj.left = offset.left; + obj.top = offset.top; + } + return obj; + } + + } + }); + + + + /*>>zoom*/ + + /*>>iframe*/ + + var IFRAME_NS = 'iframe', + _emptyPage = '//about:blank', + + _fixIframeBugs = function(isShowing) { + if(mfp.currTemplate[IFRAME_NS]) { + var el = mfp.currTemplate[IFRAME_NS].find('iframe'); + if(el.length) { + // reset src after the popup is closed to avoid "video keeps playing after popup is closed" bug + if(!isShowing) { + el[0].src = _emptyPage; + } + + // IE8 black screen bug fix + if(mfp.isIE8) { + el.css('display', isShowing ? 'block' : 'none'); + } + } + } + }; + + $.magnificPopup.registerModule(IFRAME_NS, { + + options: { + markup: '
'+ + '
'+ + ''+ + '
', + + srcAction: 'iframe_src', + + // we don't care and support only one default type of URL by default + patterns: { + youtube: { + index: 'youtube.com', + id: 'v=', + src: '//www.youtube.com/embed/%id%?autoplay=1' + }, + vimeo: { + index: 'vimeo.com/', + id: '/', + src: '//player.vimeo.com/video/%id%?autoplay=1' + }, + gmaps: { + index: '//maps.google.', + src: '%id%&output=embed' + } + } + }, + + proto: { + initIframe: function() { + mfp.types.push(IFRAME_NS); + + _mfpOn('BeforeChange', function(e, prevType, newType) { + if(prevType !== newType) { + if(prevType === IFRAME_NS) { + _fixIframeBugs(); // iframe if removed + } else if(newType === IFRAME_NS) { + _fixIframeBugs(true); // iframe is showing + } + }// else { + // iframe source is switched, don't do anything + //} + }); + + _mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() { + _fixIframeBugs(); + }); + }, + + getIframe: function(item, template) { + var embedSrc = item.src; + var iframeSt = mfp.st.iframe; + + $.each(iframeSt.patterns, function() { + if(embedSrc.indexOf( this.index ) > -1) { + if(this.id) { + if(typeof this.id === 'string') { + embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length); + } else { + embedSrc = this.id.call( this, embedSrc ); + } + } + embedSrc = this.src.replace('%id%', embedSrc ); + return false; // break; + } + }); + + var dataObj = {}; + if(iframeSt.srcAction) { + dataObj[iframeSt.srcAction] = embedSrc; + } + mfp._parseMarkup(template, dataObj, item); + + mfp.updateStatus('ready'); + + return template; + } + } + }); + + + + /*>>iframe*/ + + /*>>gallery*/ + /** + * Get looped index depending on number of slides + */ + var _getLoopedId = function(index) { + var numSlides = mfp.items.length; + if(index > numSlides - 1) { + return index - numSlides; + } else if(index < 0) { + return numSlides + index; + } + return index; + }, + _replaceCurrTotal = function(text, curr, total) { + return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total); + }; + + $.magnificPopup.registerModule('gallery', { + + options: { + enabled: false, + arrowMarkup: '', + preload: [0,2], + navigateByImgClick: true, + arrows: true, + + tPrev: 'Previous (Left arrow key)', + tNext: 'Next (Right arrow key)', + tCounter: '%curr% of %total%' + }, + + proto: { + initGallery: function() { + + var gSt = mfp.st.gallery, + ns = '.mfp-gallery'; + + mfp.direction = true; // true - next, false - prev + + if(!gSt || !gSt.enabled ) return false; + + _wrapClasses += ' mfp-gallery'; + + _mfpOn(OPEN_EVENT+ns, function() { + + if(gSt.navigateByImgClick) { + mfp.wrap.on('click'+ns, '.mfp-img', function() { + if(mfp.items.length > 1) { + mfp.next(); + return false; + } + }); + } + + _document.on('keydown'+ns, function(e) { + if (e.keyCode === 37) { + mfp.prev(); + } else if (e.keyCode === 39) { + mfp.next(); + } + }); + }); + + _mfpOn('UpdateStatus'+ns, function(e, data) { + if(data.text) { + data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length); + } + }); + + _mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) { + var l = mfp.items.length; + values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : ''; + }); + + _mfpOn('BuildControls' + ns, function() { + if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) { + var markup = gSt.arrowMarkup, + arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS), + arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS); + + arrowLeft.click(function() { + mfp.prev(); + }); + arrowRight.click(function() { + mfp.next(); + }); + + mfp.container.append(arrowLeft.add(arrowRight)); + } + }); + + _mfpOn(CHANGE_EVENT+ns, function() { + if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout); + + mfp._preloadTimeout = setTimeout(function() { + mfp.preloadNearbyImages(); + mfp._preloadTimeout = null; + }, 16); + }); + + + _mfpOn(CLOSE_EVENT+ns, function() { + _document.off(ns); + mfp.wrap.off('click'+ns); + mfp.arrowRight = mfp.arrowLeft = null; + }); + + }, + next: function() { + mfp.direction = true; + mfp.index = _getLoopedId(mfp.index + 1); + mfp.updateItemHTML(); + }, + prev: function() { + mfp.direction = false; + mfp.index = _getLoopedId(mfp.index - 1); + mfp.updateItemHTML(); + }, + goTo: function(newIndex) { + mfp.direction = (newIndex >= mfp.index); + mfp.index = newIndex; + mfp.updateItemHTML(); + }, + preloadNearbyImages: function() { + var p = mfp.st.gallery.preload, + preloadBefore = Math.min(p[0], mfp.items.length), + preloadAfter = Math.min(p[1], mfp.items.length), + i; + + for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) { + mfp._preloadItem(mfp.index+i); + } + for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) { + mfp._preloadItem(mfp.index-i); + } + }, + _preloadItem: function(index) { + index = _getLoopedId(index); + + if(mfp.items[index].preloaded) { + return; + } + + var item = mfp.items[index]; + if(!item.parsed) { + item = mfp.parseEl( index ); + } + + _mfpTrigger('LazyLoad', item); + + if(item.type === 'image') { + item.img = $('').on('load.mfploader', function() { + item.hasSize = true; + }).on('error.mfploader', function() { + item.hasSize = true; + item.loadError = true; + _mfpTrigger('LazyLoadError', item); + }).attr('src', item.src); + } + + + item.preloaded = true; + } + } + }); + + /*>>gallery*/ + + /*>>retina*/ + + var RETINA_NS = 'retina'; + + $.magnificPopup.registerModule(RETINA_NS, { + options: { + replaceSrc: function(item) { + return item.src.replace(/\.\w+$/, function(m) { return '@2x' + m; }); + }, + ratio: 1 // Function or number. Set to 1 to disable. + }, + proto: { + initRetina: function() { + if(window.devicePixelRatio > 1) { + + var st = mfp.st.retina, + ratio = st.ratio; + + ratio = !isNaN(ratio) ? ratio : ratio(); + + if(ratio > 1) { + _mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) { + item.img.css({ + 'max-width': item.img[0].naturalWidth / ratio, + 'width': '100%' + }); + }); + _mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) { + item.src = st.replaceSrc(item, ratio); + }); + } + } + + } + } + }); + + /*>>retina*/ + _checkInstance(); })); \ No newline at end of file diff --git a/assets/js/plugins/smooth-scroll.js b/assets/js/plugins/smooth-scroll.js new file mode 100644 index 0000000..c4179a7 --- /dev/null +++ b/assets/js/plugins/smooth-scroll.js @@ -0,0 +1,650 @@ +/*! + * smooth-scroll v16.1.2 + * Animate scrolling to anchor links + * (c) 2020 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/smooth-scroll + */ + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define([], (function () { + return factory(root); + })); + } else if (typeof exports === 'object') { + module.exports = factory(root); + } else { + root.SmoothScroll = factory(root); + } +})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, (function (window) { + + 'use strict'; + + // + // Default settings + // + + var defaults = { + + // Selectors + ignore: '[data-scroll-ignore]', + header: null, + topOnEmptyHash: true, + + // Speed & Duration + speed: 500, + speedAsDuration: false, + durationMax: null, + durationMin: null, + clip: true, + offset: 0, + + // Easing + easing: 'easeInOutCubic', + customEasing: null, + + // History + updateURL: true, + popstate: true, + + // Custom Events + emitEvents: true + + }; + + + // + // Utility Methods + // + + /** + * Check if browser supports required methods + * @return {Boolean} Returns true if all required methods are supported + */ + var supports = function () { + return ( + 'querySelector' in document && + 'addEventListener' in window && + 'requestAnimationFrame' in window && + 'closest' in window.Element.prototype + ); + }; + + /** + * Merge two or more objects together. + * @param {Object} objects The objects to merge together + * @returns {Object} Merged values of defaults and options + */ + var extend = function () { + var merged = {}; + Array.prototype.forEach.call(arguments, (function (obj) { + for (var key in obj) { + if (!obj.hasOwnProperty(key)) return; + merged[key] = obj[key]; + } + })); + return merged; + }; + + /** + * Check to see if user prefers reduced motion + * @param {Object} settings Script settings + */ + var reduceMotion = function () { + if ('matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches) { + return true; + } + return false; + }; + + /** + * Get the height of an element. + * @param {Node} elem The element to get the height of + * @return {Number} The element's height in pixels + */ + var getHeight = function (elem) { + return parseInt(window.getComputedStyle(elem).height, 10); + }; + + /** + * Escape special characters for use with querySelector + * @author Mathias Bynens + * @link https://github.com/mathiasbynens/CSS.escape + * @param {String} id The anchor ID to escape + */ + var escapeCharacters = function (id) { + + // Remove leading hash + if (id.charAt(0) === '#') { + id = id.substr(1); + } + + var string = String(id); + var length = string.length; + var index = -1; + var codeUnit; + var result = ''; + var firstCodeUnit = string.charCodeAt(0); + while (++index < length) { + codeUnit = string.charCodeAt(index); + // Note: there’s no need to special-case astral symbols, surrogate + // pairs, or lone surrogates. + + // If the character is NULL (U+0000), then throw an + // `InvalidCharacterError` exception and terminate these steps. + if (codeUnit === 0x0000) { + throw new InvalidCharacterError( + 'Invalid character: the input contains U+0000.' + ); + } + + if ( + // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is + // U+007F, […] + (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F || + // If the character is the first character and is in the range [0-9] + // (U+0030 to U+0039), […] + (index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) || + // If the character is the second character and is in the range [0-9] + // (U+0030 to U+0039) and the first character is a `-` (U+002D), […] + ( + index === 1 && + codeUnit >= 0x0030 && codeUnit <= 0x0039 && + firstCodeUnit === 0x002D + ) + ) { + // http://dev.w3.org/csswg/cssom/#escape-a-character-as-code-point + result += '\\' + codeUnit.toString(16) + ' '; + continue; + } + + // If the character is not handled by one of the above rules and is + // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or + // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to + // U+005A), or [a-z] (U+0061 to U+007A), […] + if ( + codeUnit >= 0x0080 || + codeUnit === 0x002D || + codeUnit === 0x005F || + codeUnit >= 0x0030 && codeUnit <= 0x0039 || + codeUnit >= 0x0041 && codeUnit <= 0x005A || + codeUnit >= 0x0061 && codeUnit <= 0x007A + ) { + // the character itself + result += string.charAt(index); + continue; + } + + // Otherwise, the escaped character. + // http://dev.w3.org/csswg/cssom/#escape-a-character + result += '\\' + string.charAt(index); + + } + + // Return sanitized hash + return '#' + result; + + }; + + /** + * Calculate the easing pattern + * @link https://gist.github.com/gre/1650294 + * @param {String} type Easing pattern + * @param {Number} time Time animation should take to complete + * @returns {Number} + */ + var easingPattern = function (settings, time) { + var pattern; + + // Default Easing Patterns + if (settings.easing === 'easeInQuad') pattern = time * time; // accelerating from zero velocity + if (settings.easing === 'easeOutQuad') pattern = time * (2 - time); // decelerating to zero velocity + if (settings.easing === 'easeInOutQuad') pattern = time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time; // acceleration until halfway, then deceleration + if (settings.easing === 'easeInCubic') pattern = time * time * time; // accelerating from zero velocity + if (settings.easing === 'easeOutCubic') pattern = (--time) * time * time + 1; // decelerating to zero velocity + if (settings.easing === 'easeInOutCubic') pattern = time < 0.5 ? 4 * time * time * time : (time - 1) * (2 * time - 2) * (2 * time - 2) + 1; // acceleration until halfway, then deceleration + if (settings.easing === 'easeInQuart') pattern = time * time * time * time; // accelerating from zero velocity + if (settings.easing === 'easeOutQuart') pattern = 1 - (--time) * time * time * time; // decelerating to zero velocity + if (settings.easing === 'easeInOutQuart') pattern = time < 0.5 ? 8 * time * time * time * time : 1 - 8 * (--time) * time * time * time; // acceleration until halfway, then deceleration + if (settings.easing === 'easeInQuint') pattern = time * time * time * time * time; // accelerating from zero velocity + if (settings.easing === 'easeOutQuint') pattern = 1 + (--time) * time * time * time * time; // decelerating to zero velocity + if (settings.easing === 'easeInOutQuint') pattern = time < 0.5 ? 16 * time * time * time * time * time : 1 + 16 * (--time) * time * time * time * time; // acceleration until halfway, then deceleration + + // Custom Easing Patterns + if (!!settings.customEasing) pattern = settings.customEasing(time); + + return pattern || time; // no easing, no acceleration + }; + + /** + * Determine the document's height + * @returns {Number} + */ + var getDocumentHeight = function () { + return Math.max( + document.body.scrollHeight, document.documentElement.scrollHeight, + document.body.offsetHeight, document.documentElement.offsetHeight, + document.body.clientHeight, document.documentElement.clientHeight + ); + }; + + /** + * Calculate how far to scroll + * Clip support added by robjtede - https://github.com/cferdinandi/smooth-scroll/issues/405 + * @param {Element} anchor The anchor element to scroll to + * @param {Number} headerHeight Height of a fixed header, if any + * @param {Number} offset Number of pixels by which to offset scroll + * @param {Boolean} clip If true, adjust scroll distance to prevent abrupt stops near the bottom of the page + * @returns {Number} + */ + var getEndLocation = function (anchor, headerHeight, offset, clip) { + var location = 0; + if (anchor.offsetParent) { + do { + location += anchor.offsetTop; + anchor = anchor.offsetParent; + } while (anchor); + } + location = Math.max(location - headerHeight - offset, 0); + if (clip) { + location = Math.min(location, getDocumentHeight() - window.innerHeight); + } + return location; + }; + + /** + * Get the height of the fixed header + * @param {Node} header The header + * @return {Number} The height of the header + */ + var getHeaderHeight = function (header) { + return !header ? 0 : (getHeight(header) + header.offsetTop); + }; + + /** + * Calculate the speed to use for the animation + * @param {Number} distance The distance to travel + * @param {Object} settings The plugin settings + * @return {Number} How fast to animate + */ + var getSpeed = function (distance, settings) { + var speed = settings.speedAsDuration ? settings.speed : Math.abs(distance / 1000 * settings.speed); + if (settings.durationMax && speed > settings.durationMax) return settings.durationMax; + if (settings.durationMin && speed < settings.durationMin) return settings.durationMin; + return parseInt(speed, 10); + }; + + var setHistory = function (options) { + + // Make sure this should run + if (!history.replaceState || !options.updateURL || history.state) return; + + // Get the hash to use + var hash = window.location.hash; + hash = hash ? hash : ''; + + // Set a default history + history.replaceState( + { + smoothScroll: JSON.stringify(options), + anchor: hash ? hash : window.pageYOffset + }, + document.title, + hash ? hash : window.location.href + ); + + }; + + /** + * Update the URL + * @param {Node} anchor The anchor that was scrolled to + * @param {Boolean} isNum If true, anchor is a number + * @param {Object} options Settings for Smooth Scroll + */ + var updateURL = function (anchor, isNum, options) { + + // Bail if the anchor is a number + if (isNum) return; + + // Verify that pushState is supported and the updateURL option is enabled + if (!history.pushState || !options.updateURL) return; + + // Update URL + history.pushState( + { + smoothScroll: JSON.stringify(options), + anchor: anchor.id + }, + document.title, + anchor === document.documentElement ? '#top' : '#' + anchor.id + ); + + }; + + /** + * Bring the anchored element into focus + * @param {Node} anchor The anchor element + * @param {Number} endLocation The end location to scroll to + * @param {Boolean} isNum If true, scroll is to a position rather than an element + */ + var adjustFocus = function (anchor, endLocation, isNum) { + + // Is scrolling to top of page, blur + if (anchor === 0) { + document.body.focus(); + } + + // Don't run if scrolling to a number on the page + if (isNum) return; + + // Otherwise, bring anchor element into focus + anchor.focus(); + if (document.activeElement !== anchor) { + anchor.setAttribute('tabindex', '-1'); + anchor.focus(); + anchor.style.outline = 'none'; + } + window.scrollTo(0 , endLocation); + + }; + + /** + * Emit a custom event + * @param {String} type The event type + * @param {Object} options The settings object + * @param {Node} anchor The anchor element + * @param {Node} toggle The toggle element + */ + var emitEvent = function (type, options, anchor, toggle) { + if (!options.emitEvents || typeof window.CustomEvent !== 'function') return; + var event = new CustomEvent(type, { + bubbles: true, + detail: { + anchor: anchor, + toggle: toggle + } + }); + document.dispatchEvent(event); + }; + + + // + // SmoothScroll Constructor + // + + var SmoothScroll = function (selector, options) { + + // + // Variables + // + + var smoothScroll = {}; // Object for public APIs + var settings, anchor, toggle, fixedHeader, eventTimeout, animationInterval; + + + // + // Methods + // + + /** + * Cancel a scroll-in-progress + */ + smoothScroll.cancelScroll = function (noEvent) { + cancelAnimationFrame(animationInterval); + animationInterval = null; + if (noEvent) return; + emitEvent('scrollCancel', settings); + }; + + /** + * Start/stop the scrolling animation + * @param {Node|Number} anchor The element or position to scroll to + * @param {Element} toggle The element that toggled the scroll event + * @param {Object} options + */ + smoothScroll.animateScroll = function (anchor, toggle, options) { + + // Cancel any in progress scrolls + smoothScroll.cancelScroll(); + + // Local settings + var _settings = extend(settings || defaults, options || {}); // Merge user options with defaults + + // Selectors and variables + var isNum = Object.prototype.toString.call(anchor) === '[object Number]' ? true : false; + var anchorElem = isNum || !anchor.tagName ? null : anchor; + if (!isNum && !anchorElem) return; + var startLocation = window.pageYOffset; // Current location on the page + if (_settings.header && !fixedHeader) { + // Get the fixed header if not already set + fixedHeader = document.querySelector(_settings.header); + } + var headerHeight = getHeaderHeight(fixedHeader); + var endLocation = isNum ? anchor : getEndLocation(anchorElem, headerHeight, parseInt((typeof _settings.offset === 'function' ? _settings.offset(anchor, toggle) : _settings.offset), 10), _settings.clip); // Location to scroll to + var distance = endLocation - startLocation; // distance to travel + var documentHeight = getDocumentHeight(); + var timeLapsed = 0; + var speed = getSpeed(distance, _settings); + var start, percentage, position; + + /** + * Stop the scroll animation when it reaches its target (or the bottom/top of page) + * @param {Number} position Current position on the page + * @param {Number} endLocation Scroll to location + * @param {Number} animationInterval How much to scroll on this loop + */ + var stopAnimateScroll = function (position, endLocation) { + + // Get the current location + var currentLocation = window.pageYOffset; + + // Check if the end location has been reached yet (or we've hit the end of the document) + if (position == endLocation || currentLocation == endLocation || ((startLocation < endLocation && window.innerHeight + currentLocation) >= documentHeight)) { + + // Clear the animation timer + smoothScroll.cancelScroll(true); + + // Bring the anchored element into focus + adjustFocus(anchor, endLocation, isNum); + + // Emit a custom event + emitEvent('scrollStop', _settings, anchor, toggle); + + // Reset start + start = null; + animationInterval = null; + + return true; + + } + }; + + /** + * Loop scrolling animation + */ + var loopAnimateScroll = function (timestamp) { + if (!start) { start = timestamp; } + timeLapsed += timestamp - start; + percentage = speed === 0 ? 0 : (timeLapsed / speed); + percentage = (percentage > 1) ? 1 : percentage; + position = startLocation + (distance * easingPattern(_settings, percentage)); + window.scrollTo(0, Math.floor(position)); + if (!stopAnimateScroll(position, endLocation)) { + animationInterval = window.requestAnimationFrame(loopAnimateScroll); + start = timestamp; + } + }; + + /** + * Reset position to fix weird iOS bug + * @link https://github.com/cferdinandi/smooth-scroll/issues/45 + */ + if (window.pageYOffset === 0) { + window.scrollTo(0, 0); + } + + // Update the URL + updateURL(anchor, isNum, _settings); + + // If the user prefers reduced motion, jump to location + if (reduceMotion()) { + window.scrollTo(0, Math.floor(endLocation)); + return; + } + + // Emit a custom event + emitEvent('scrollStart', _settings, anchor, toggle); + + // Start scrolling animation + smoothScroll.cancelScroll(true); + window.requestAnimationFrame(loopAnimateScroll); + + }; + + /** + * If smooth scroll element clicked, animate scroll + */ + var clickHandler = function (event) { + + // Don't run if event was canceled but still bubbled up + // By @mgreter - https://github.com/cferdinandi/smooth-scroll/pull/462/ + if (event.defaultPrevented) return; + + // Don't run if right-click or command/control + click or shift + click + if (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey) return; + + // Check if event.target has closest() method + // By @totegi - https://github.com/cferdinandi/smooth-scroll/pull/401/ + if (!('closest' in event.target)) return; + + // Check if a smooth scroll link was clicked + toggle = event.target.closest(selector); + if (!toggle || toggle.tagName.toLowerCase() !== 'a' || event.target.closest(settings.ignore)) return; + + // Only run if link is an anchor and points to the current page + if (toggle.hostname !== window.location.hostname || toggle.pathname !== window.location.pathname || !/#/.test(toggle.href)) return; + + // Get an escaped version of the hash + var hash; + try { + hash = escapeCharacters(decodeURIComponent(toggle.hash)); + } catch(e) { + hash = escapeCharacters(toggle.hash); + } + + // Get the anchored element + var anchor; + if (hash === '#') { + if (!settings.topOnEmptyHash) return; + anchor = document.documentElement; + } else { + anchor = document.querySelector(hash); + } + anchor = !anchor && hash === '#top' ? document.documentElement : anchor; + + // If anchored element exists, scroll to it + if (!anchor) return; + event.preventDefault(); + setHistory(settings); + smoothScroll.animateScroll(anchor, toggle); + + }; + + /** + * Animate scroll on popstate events + */ + var popstateHandler = function (event) { + + // Stop if history.state doesn't exist (ex. if clicking on a broken anchor link). + // fixes `Cannot read property 'smoothScroll' of null` error getting thrown. + if (history.state === null) return; + + // Only run if state is a popstate record for this instantiation + if (!history.state.smoothScroll || history.state.smoothScroll !== JSON.stringify(settings)) return; + + // Only run if state includes an anchor + + // if (!history.state.anchor && history.state.anchor !== 0) return; + + // Get the anchor + var anchor = history.state.anchor; + if (typeof anchor === 'string' && anchor) { + anchor = document.querySelector(escapeCharacters(history.state.anchor)); + if (!anchor) return; + } + + // Animate scroll to anchor link + smoothScroll.animateScroll(anchor, null, {updateURL: false}); + + }; + + /** + * Destroy the current initialization. + */ + smoothScroll.destroy = function () { + + // If plugin isn't already initialized, stop + if (!settings) return; + + // Remove event listeners + document.removeEventListener('click', clickHandler, false); + window.removeEventListener('popstate', popstateHandler, false); + + // Cancel any scrolls-in-progress + smoothScroll.cancelScroll(); + + // Reset variables + settings = null; + anchor = null; + toggle = null; + fixedHeader = null; + eventTimeout = null; + animationInterval = null; + + }; + + /** + * Initialize Smooth Scroll + * @param {Object} options User settings + */ + var init = function () { + + // feature test + if (!supports()) throw 'Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs.'; + + // Destroy any existing initializations + smoothScroll.destroy(); + + // Selectors and variables + settings = extend(defaults, options || {}); // Merge user options with defaults + fixedHeader = settings.header ? document.querySelector(settings.header) : null; // Get the fixed header + + // When a toggle is clicked, run the click handler + document.addEventListener('click', clickHandler, false); + + // If updateURL and popState are enabled, listen for pop events + if (settings.updateURL && settings.popstate) { + window.addEventListener('popstate', popstateHandler, false); + } + + }; + + + // + // Initialize plugin + // + + init(); + + + // + // Public APIs + // + + return smoothScroll; + + }; + + return SmoothScroll; + +})); diff --git a/assets/js/settings.js b/assets/js/settings.js new file mode 100644 index 0000000..6ba39b5 --- /dev/null +++ b/assets/js/settings.js @@ -0,0 +1,73 @@ +(function (global) { + var PREFIX = "HMCL_DOCS_SETTINGS_"; + var data = {}; + var events = {}; + var config = /**//**/{"appearance_color":{"type":"radio","default":"light","options":["light","dark","auto"]},"appearance_skin_light":{"type":"radio","default":"default","options":["default","air","aqua","contrast","dark","dirt","neon","mint","plum","sunrise"]},"appearance_skin_dark":{"type":"radio","default":"dark","options":["default","air","aqua","contrast","dark","dirt","neon","mint","plum","sunrise"]}}/**/; + + global.addEventListener("storage", function (event) { + if (!event.key) return; + if (event.key.indexOf(PREFIX) !== 0) return; + + var handlers = events[event.key]; + if (!handlers) return; + + var newValue = event.newValue; + var oldValue = event.oldValue; + if (oldValue === newValue) return; + + data[event.key] = newValue; + for (var i = 0; i < handlers.length; i++) { + if (typeof handlers[i] === "function") { + handlers[i](newValue, oldValue); + } + } + }); + + var settings = { + set: function (key, value) { + if (config[key] === undefined) return; + var strKey = (PREFIX + key).toUpperCase(); + var newValue = value + ""; + data[strKey] = newValue; + localStorage.setItem(strKey, newValue); + var handlers = events[strKey]; + if (!handlers) return; + + for (var i = 0; i < handlers.length; i++) { + if (typeof handlers[i] === "function") { + handlers[i](newValue); + } + } + }, + + get: function (key, defaultValue) { + if (config[key] === undefined) return; + var strKey = (PREFIX + key).toUpperCase(); + data.hasOwnProperty(strKey) || (data[strKey] = localStorage.getItem(strKey)); + if (typeof defaultValue === "string" && data[strKey] === null) { + return defaultValue; + } + return data[strKey]; + }, + + refresh: function (key) { + if (config[key] === undefined) return; + settings.set(key, settings.get(key, config[key].default)); + }, + + onChange: function (key, handler) { + if (config[key] === undefined) return; + if (typeof handler !== "function") return; + var strKey = (PREFIX + key).toUpperCase(); + if (config[key].type === "radio") { + handler(settings.get(key, config[key].default)); + } + if (!events[strKey]) { + events[strKey] = [handler]; + } else { + events[strKey].push(handler); + } + } + }; + global.settings = settings; +})(window); diff --git a/assets/js/theme.js b/assets/js/theme.js new file mode 100644 index 0000000..383601a --- /dev/null +++ b/assets/js/theme.js @@ -0,0 +1,67 @@ +window.addEventListener("DOMContentLoaded", function () { + var skinLink = document.getElementById("skin"); + var darkModeQuery = window.matchMedia("(prefers-color-scheme: dark)"); + function applyDarkSkin() { + skinLink.href = "/assets/css/skins/" + settings.get("appearance_skin_dark", "dark") + ".css"; + } + function applyLightSkin() { + skinLink.href = "/assets/css/skins/" + settings.get("appearance_skin_light", "default") + ".css"; + } + function autoSchemeHandler() { + if (darkModeQuery.matches) { + applyDarkSkin(); + } else { + applyLightSkin(); + } + } + var activeModeIndex = 0; + var modeKeys = ["light", "dark", "auto"]; + var modeLabels = ["亮色", "暗色", "自动"]; + + var menuList = document.querySelector(".masthead .visible-links"); + var modeSwitcher = null; + if (menuList) { + modeSwitcher = document.createElement("a"); + modeSwitcher.className = "masthead__menu-item"; + modeSwitcher.textContent = modeLabels[activeModeIndex]; + modeSwitcher.href = "javascript:;"; + modeSwitcher.onclick = function () { + var nextIndex = (activeModeIndex + 1) % modeKeys.length; + settings.set("appearance_color", modeKeys[nextIndex]); + } + menuList.appendChild(modeSwitcher); + } + function applyTheme(mode) { + var newIndex = modeKeys.indexOf(mode); + if (newIndex < 0) newIndex = 0; + + if (modeKeys[activeModeIndex] === "auto") { + darkModeQuery.removeEventListener("change", autoSchemeHandler); + } + + activeModeIndex = newIndex; + var resolvedMode = modeKeys[activeModeIndex]; + + if (modeSwitcher) { + modeSwitcher.textContent = modeLabels[activeModeIndex]; + } + + if (resolvedMode === "light") { + applyLightSkin(); + } + else if (resolvedMode === "dark") { + applyDarkSkin(); + } + else { + darkModeQuery.addEventListener("change", autoSchemeHandler); + autoSchemeHandler(); + } + } + settings.onChange("appearance_color", applyTheme); + settings.onChange("appearance_skin_dark", function () { + settings.refresh("appearance_color"); + }); + settings.onChange("appearance_skin_light", function () { + settings.refresh("appearance_color"); + }); +}); diff --git a/assets/js/vendor/jquery/jquery-3.6.0.js b/assets/js/vendor/jquery/jquery-3.6.0.js new file mode 100644 index 0000000..fc6c299 --- /dev/null +++ b/assets/js/vendor/jquery/jquery-3.6.0.js @@ -0,0 +1,10881 @@ +/*! + * jQuery JavaScript Library v3.6.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2021-03-02T17:08Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.6.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.6 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2021-02-16 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is display: block + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( "

Hits

本文由 未署名用户 创建。

Changelogs are written in Chinese.

HMCL 3.12.0.332

详细版本介绍 (Bilibili)

  • GP-5773: 更新模组数据 (by Glavo)
  • GP-4706: 添加”关闭启动时的更新弹窗”选项 (by An5w1r, Glavo)
  • GP-5620: 更新关于页面的许可证信息 (by 3gf8jv4dv)
  • GP-5769: 当背景自定义路径是文件夹时随机在文件夹中选取图片作为背景 (by 辞庐)
  • GP-5664: 优化删除垃圾桶图标 (by 辞庐)
  • GP-5663: 调整导出游戏运行栈加载指示器大小 (by 辞庐)

错误修复:

  • GP-5728: 修复“从互联网下载整合包”选项对话框可能会意外被关闭的问题 (by Glavo)
  • GP-5765: 修复 26.1-pre-1 版本号无法归一化的问题 (by mineDiamond)
  • GP-5772: 修复显示器 125% 缩放时弹出菜单内容模糊的问题 (by 辞庐)
  • GP-5776: 修复颜色选择器中“自定义颜色”对话框初始值不会与当前颜色同步的问题 (by Damon Lu)

HMCL 3.12.0.331

详细版本介绍 (Bilibili)

  • GP-5731: 将 Gradle 更新至 9.4.0 (by 辞庐)
  • GP-5717: 将 JetBrains Java Annotations 更新至 26.1.0 (by Glavo)
  • GP-5675: 支持解析 Minecraft 26.1-snapshot-6 新版本存档数据 (by mineDiamond)
  • GP-5690: 优化 FileSelector 按钮样式 (by 辞庐)
  • GP-5697: 将 BAT 脚本命令长度限制增加至 32767 (by 辞庐)
  • GP-5698: 优化安装实例时自动补全模组加载器名称 (by 辞庐)
  • GP-5707: 优化 LineSelectButton 弹出菜单配色 (by 辞庐)
  • GP-5716: 向滚动条添加圆角 (by Calboot)
  • GP-5739: 移除下载页面超链接多余 Tooltip (by 辞庐)
  • GP-5760: 优化 JFXToggleButton 配色 (by Glavo)
  • GP-5636: 支持使用键盘方向键调整 LineSelectButton 值 (by 辞庐)
  • GP-5759: 为主页启动按钮添加冷却时间 (by Glavo)
  • GP-5714: 更新阿拉伯语翻译 (by Hommam-Prom)
  • GP-5737: 更新运行路径中包含非法字符 = 时的提示 (by 辞庐)

错误修复:

  • GP-5659: 修复导出游戏运行栈按钮对低版本 Java 未显示不兼容提示的问题 (by 辞庐)
  • GP-5662: 修复无法为使用 Java 11 启动的游戏导出游戏运行栈的问题 (by 辞庐)
  • GP-5669: 修复无法导入部分 Modrinth 整合包的问题 (by 辞庐)
  • GP-5691: 修复整合包安装界面文件名重复的提示显示不全的问题 (by 辞庐)
  • GP-5692: 修复整合包安装页面游戏实例名选项显示为文件名的问题 (by 辞庐)
  • GP-5693: 修复 SpinnerPane 会裁切元素的问题 (by 辞庐)
  • GP-5705: 修复取消模组更新检查时会弹窗操作失败的问题 (by 辞庐)
  • GP-5706: 修复 LineComponent 副标题样式未正确应用的问题 (by 辞庐)
  • GP-5710: 修复导出 Modrinth 整合包时不要求填写作者的问题 (by MovTery)

HMCL 3.12.0.330

详细版本介绍 (Bilibili)

  • GP-5030: 重新启用 MCIM 加速 (by Glavo)
  • GP-5359: 修复语言为文言时下载游戏的选择模组加载器页面的版本号未本地化的问题 (by Wulian233)
  • GP-5458, GP-5463: 下载界面简介不滚动 (by Calboot)
  • GP-5554: 向图标添加圆角 (by Dime)
  • GP-5603: 下载任务在重试前添加等待延迟 (by Glavo)
  • GP-5610: 优化设备代码流登录流程 (by Glavo)
  • GP-5622: 更新 Copyright 年份 (by 3gf8jv4dv)
  • GP-5624: 更新对 Linux LoongArch64 平台的支持 (by Glavo)
  • GP-5638: 切换实例隔离设置后自动刷新其他子页面 (by 辞庐)
  • GP-5652: 在世界管理页面中不展示 zip 格式的世界 (by Wulian233)
  • GP-5655: 添加对 1.21.11-rc3_unobfuscated 的支持 (by TNTyep520, Glavo)
  • GP-5623: 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-5605: 修复选择角色弹窗未适配深色模式 (by 辞庐)
  • GP-5607: 修复账号列表复制按钮未正确应用样式的问题 (by 辞庐)
  • GP-5617: 修复 JFXSpinner 样式失效的问题 (by 辞庐)
  • GP-5613: 修复本地安装整合包时出现错误的问题 (by 辞庐)
  • GP-5633: 修复 message.question 未本地化的问题 (by 辞庐)

HMCL 3.12.0.328

详细版本介绍 (Bilibili)

  • GP-5242: 支持在实例列表搜索实例 (by 辞庐)
  • GP-5514: 为“渲染器”添加描述 (by Damon Lu)
  • GP-5521: 优化下载页面条目水波纹样式 (by 辞庐)
  • GP-5539: 解析 Yggdrasil 服务器地址时遵循服务器重定向 (by Glavo)
  • GP-5552: 支持新版本世界指定资源包位置 (by mineDiamond)
  • GP-5583: 支持在 FreeBSD x86-64、Linux Arm64、Linux RISC-V64 平台上启动 Minecraft 26.1-snapshot-8 或更高版本 (by Glavo)
  • GP-5585: 修复下载源失效时刷新版本列表不会回退到备用下载源的问题 (by Glavo)
  • GP-5586: 优化无法补全 JavaFX 时的报错信息 (by Glavo)
  • GP-5546, GP-5559, GP-5560, GP-5564, GP-5565, GP-5569, GP-5570, GP-5574: 优化部分控件样式 (by Glavo)

错误修复:

  • GP-5430: 修复启动游戏补全文件时任务没有正确归类的问题 (by 辞庐)
  • GP-5532: 修复高分屏下新建账户 Tab 文字模糊的问题 (by 辞庐)
  • GP-5536: 修复更新整合包后模组加载器版本号不会及时更新的问题 (by 小宇)
  • GP-5549: 修复微软登录报错的超链接显示 (by Xirren)
  • GP-5550: 修复安装整合包时任务弹窗可能空白的问题 (by 辞庐)
  • GP-5556: 修复通过 CurseForge/Modrinth 安装整合包时可以返回到整合包类型选择页面的问题 (by 辞庐)
  • GP-5558: 修复光影下载搜索栏中错误地显示“支持中英文搜索”提示的问题 (by 辞庐)
  • GP-5575: 修复无法使用授权代码流登录微软账户的问题 (by 辞庐)
  • GP-5581: 修复日志窗口 Ctrl+C 复制日志时在主窗口显示提示的问题 (by 辞庐)
  • GP-5584: 修复打开登录微软对话框时加载指示器一闪而过的问题 (by 辞庐)
  • GP-5600: 修复部分对话框中取消按钮行为异常的问题 (by 辞庐)

HMCL 3.12.0.327

详细版本介绍 (Bilibili)

  • GP-5330, GP-5531, GP-5538: 更新微软账户登录流程 (by 辞庐, Glavo)
  • GP-5368: 阻止在颜色选择器中输入非法颜色信息 (by Damon Lu)
  • GP-5527: 增加弹窗图标内容间距 (by 辞庐)
  • GP-5524: 将指向 MCEdit 的链接替换为 Minecraft Wiki 的教程页面 (by 3gf8jv4dv)
  • GP-5394: 使 Java 下载页面可以同时下载多个 Java (by NoClassDefFoundError)

错误修复:

  • GP-5508: 修复部分请求头中 Accept-Language 字段包含 Java 版本的问题 (by Glavo)
  • GP-5520: 修复下载游戏版本列表点击左侧图标无法触发水波纹效果及光标没有变成手型的问题 (by 辞庐)
  • GP-5522: 修复安装卡片部分区域点击无法触发水波纹效果的问题 (by 辞庐)
  • GP-5543: Fix #5525: 修复 Task 进度异常的问题 (by Glavo)

HMCL 3.11.0.326

详细版本介绍 (Bilibili)

  • GP-5504: 更新陶瓦联机至 0.4.2 (by Glavo)
  • GP-5462: 未安装实例时点击主页“开始游戏”按钮不选择不支持当前平台的版本 (by 辞庐, Glavo)

错误修复:

  • GP-5369: 修复在 ZIP 文件中遇到重名目录条目时读取失败的问题 (by NoClassDefFoundError)
  • GP-5507: 修复陶瓦联机页面“导出联机日志”按钮内边距异常的问题 (by Glavo)

HMCL 3.11.0.325

详细版本介绍 (Bilibili)

  • GP-5395, GP-5408, GP-5416, GP-5446: 统一列表卡片样式 (by Glavo)
  • GP-5422: 优化日志窗口无日志行的背景色 (by 辞庐)
  • GP-5405: 统一加载指示器大小 (by 辞庐)
  • GP-5406: 统一实例管理页面子页面刷新时的样式 (by 辞庐)
  • GP-5426: 导出运行栈时附加 -e-l 参数 (by 辞庐)
  • GP-5456: 优化工具栏按钮图标 (by Glavo)
  • GP-5465, GP-5474: 优化下载页面条目中标签的展示方式 (by Glavo)
  • GP-5481: 优化设置页面检查更新设置项的样式 (by Glavo)
  • GP-5467: 自动展开 NBT 查看器中部分子标签 (by Calboot)
  • GP-5417: 更新文言文 README (by GIGN)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-5012: 修复 Modrinth 模组依赖已经被删除的条目时无法加载版本列表的问题 (by Burning_TNT)
  • GP-5432: 修复部分页面弹出菜单会被重复触发的问题 (by Glavo)
  • GP-5398: 修复文本输入框右键菜单中图标风格与其他图标不一致的问题 (by 辞庐)
  • GP-5411: 修复离线账户换肤对话框中对 Custom Skin API 地址的校验未生效的问题 (by 辞庐)
  • GP-5413: 修复 1.5.2 等版本 Legacy Fabric 无法安装的问题 (by 辞庐)
  • GP-5414: 修复 Legacy Fabric API 可以和 Forge 同时安装的问题 (by 辞庐)
  • GP-5423: 修复安装游戏时选择版本后返回已选择的版本会被清除的问题 (by 辞庐)
  • GP-5433: 修复部分环境中进入下载页面时启动器崩溃的问题 (by Glavo)
  • GP-5434: 修复日志级别选择按钮背景颜色溢出的问题 (by 辞庐)
  • GP-5442: 修复无法为 Minecraft 1.12.2 安装 Forge 和 Cleanroom 的问题 (by Glavo)
  • GP-5449: 修复 SVG 图标对齐错误的问题 (by Glavo)
  • GP-5461: 修复世界管理页面中快速启动按钮出现在不支持的版本的问题 (by mineDiamond)
  • GP-5477: 修复部分页面意外的显示滚动条的问题 (by Glavo)
  • GP-5479: 修复无法正确识别 Minecraft 2.0 实例版本号的问题 (by Glavo)
  • GP-5480: 修复无法归一化版本号 “1.16.2 Pre-release 1” 的问题 (by Glavo)

HMCL 3.11.0.323

详细版本介绍 (Bilibili)

  • GP-5390: 将 TwelveMonkeys 更新至 3.13.0 (by Glavo)
  • GP-5391: 将 XZ for Java 更新至 1.11 (by Glavo)
  • GP-5392: 将 Gradle Shadow 插件更新至 9.3.1 (by Glavo)
  • GP-5385: 优化 ComponentList (by Glavo)
  • GP-4975: 调整渲染器名称 (by Chen Meng)
  • GP-5337: 使用 LineSelectButton 代替 JFXComboBox (by Glavo)
  • GP-5215: 优化世界管理与世界信息页面 (by mineDiamond, 3gf8jv4dv, Glavo)
  • GP-5272: 启动时检查 Jar 路径是否包含 ! (by 辞庐)
  • GP-5317: 在 Linux 平台使用 dbus-send 检测深色模式设置 (by Glavo)
  • GP-5364: 在 NBT 查看器页面启用平滑滚动 (by Glavo)

错误修复:

  • GP-5333: 修复启动服务端自动更新整合包时会下载并启用已禁用的模组的问题 (by Luo Chen)
  • GP-5374: 修复不透明度数值标签可能被折叠的问题 (by NoClassDefFoundError)
  • GP-5375: 修复部分列表点击后无法通过 esc 返回的问题 (by NoClassDefFoundError)
  • GP-5379: 修复版本设置页面滚动条总是显示的问题 (by Dime)
  • GP-5388: 修复导出的 PowerShell 脚本中路径可能无效的问题 (by Xirren)

HMCL 3.11.0.322

详细版本介绍 (Bilibili)

  • GP-4733: 导出日志时允许重名文件 (by Glavo)
  • GP-5245: 修复主页公告阴影被裁切的问题 (by 辞庐)
  • GP-5270: 在陶瓦联机页面添加切换账号菜单 (by Glavo)
  • GP-5279: 更新下载页面条目样式 (by Glavo)
  • GP-5283, GP-5319: 优化深色模式支持 (by Glavo)
  • GP-5292: 更新文本输入框的右键菜单样式 (by 辞庐)
  • GP-5296: 扫描模组子目录时忽略 .connector 文件夹 (by 辞庐)
  • GP-5304: 取消游戏下载页面中高版本游戏对 Windows 7 的不兼容提示 (by 辞庐)

错误修复:

  • GP-5284: 修复部分列表页面出现横向滚动条的问题 (by Glavo)
  • GP-5299: 修复添加认证服务器对话框非 CJK 语言下宽度异常的问题 (by 辞庐)
  • GP-5300: 修复下载页面模组简介只会显示一行的问题 (by 辞庐)
  • GP-5305: 修复返回页面时可能卡进空白页面的问题 (by 辞庐)
  • GP-5308: 修复 JFXTabPane 指示器偏移的问题 (by 辞庐)
  • GP-5310: 修复点击实例列表条目的中央区域无法触发涟漪效果的问题 (by 辞庐)
  • GP-5328: 修复弹出菜单在 RTL 布局下弹出位置错误的问题 (by 辞庐)

HMCL 3.11.0.321

详细版本介绍 (Bilibili)

  • GP-4792: 优化 Fabric API / Quilt API 安装提示 (by 辞庐, 3gf8jv4dv)
  • GP-5029: 优化检查模组更新功能 (by Burning_TNT)
  • GP-5090: 支持自动安装 Legacy Fabric (by 辞庐)
  • GP-5172: 支持通过拖动标题栏退出最大化 (by neveler)
  • GP-5196: 使用 Forge/Quilt 加载器时模组管理页面应当扫描子文件夹 (by Wulian233)
  • GP-5198: 将世界管理界面“生成启动脚本”按钮折叠到二级菜单 (by Glavo)
  • GP-5239: 下载页面图标尚未加载时应当将图像更新为空白 (by Glavo)
  • GP-5250: Modrinth 默认不获取更新日志 (by Calboot)
  • GP-5251: 修复自动安装界面卡片上按钮无法点击的问题 (by 神奇的赵二 (OrzMiku))
  • GP-5259: 提早非法路径检查 (by 辞庐)
  • GP-5269: 支持右键点击侧边栏弹出切换实例菜单 (by Glavo)
  • GP-5273: 优化游戏代理参数设置 (by Glavo)
  • GP-5274: 对 Java 26 默认启用压缩对象头 (by Glavo)
  • GP-5276: 重构 SchematicsPage 以使用 ListCell 展示元素 (by Glavo)

错误修复:

  • GP-5195: 修复导出 Modrinth 整合包时勾选“包含启动器”选项时导出的整合包不是 ZIP 格式的问题 (by 辞庐)
  • GP-5243: 修复实例列表中包含名称超长的实例时出现水平滚动条的问题 (by OrzMiku)
  • GP-5257: 修复本地安装 Cleanroom 完成后会删除安装器的问题 (by 辞庐)
  • GP-5261: 修复下载页面选择游戏版本对话框包含 _unobfuscated 版本的问题 (by Glavo)
  • GP-5262: 修复使用 GIF 背景时调整背景不透明度导致启动器崩溃的问题 (by Glavo)
  • GP-5265: 修复未正确为游戏设置 java.net.useSystemProxies JVM 参数的问题 (by Xirren)
  • GP-5267: 修复部分场景中解压空 ZIP 文件失败的问题 (by Glavo)

HMCL 3.10.0.319

详细版本介绍 (Bilibili)

  • GP-5208: 惰性初始化 JFXRippler 属性 (by Glavo)
  • GP-5211: 优化下载页面图标缓存功能 (by Glavo)
  • GP-5221: 更新 ToolbarListPageSkin 以使用 JFXListView 展示节点 (by Glavo)
  • GP-5223: 重构 JavaManagementPage 以使用 ListCell 展示元素 (by Glavo)
  • GP-5224: 重构 WorldListPage 以使用 ListCell 展示元素 (by Glavo)

错误修复:

  • GP-5203: 修复实例列表不显示实例名的问题 (by Xirren)
  • GP-5220: 修复 CurseForge 源无法搜索到内容的问题 (by Glavo)

HMCL 3.10.0.318

详细版本介绍 (Bilibili)

  • GP-4823: 优化世界管理界面和世界信息界面 (by mineDiamond, 3gf8jv4dv)
  • GP-4832: 支持更新部分模组 (by ZZZank)
  • GP-4929: 将陶瓦联机更新至 0.4.1 (by Burning_TNT)
  • GP-5026: 限制访问 Modrinth/CurseForge 时的并发数 (by Burning_TNT)
  • GP-5133: 修复第三方构建下禁用账户刷新的 tooltip 展示不支持的超链接标签的问题 (by Wulian233, 3gf8jv4dv)
  • GP-5137: 允许重命名实例时使用原名 (by mineDiamond)
  • GP-5143, GP-5168: 优化对获取账号信息时发生 SSL 异常的处理 (by Xirren, 3gf8jv4dv)
  • GP-5146: 使用 kala-compress 读取模组元数据 (by Glavo)
  • GP-5150: 调整平滑滚动的截止速度 (by Glavo)
  • GP-5159: 更新“检查模组更新”按钮的文本 (by 3gf8jv4dv)
  • GP-5160: 优化下载页面中来自 Modrinth 的内容标签显示 (by ENC_Euphony)
  • GP-5174: 优化实例列表的性能 (by Glavo)
  • GP-5180: 在资源包下载页面中隐藏不必要的标签 (by Glavo)
  • GP-5182: 支持重置日志字体 (by 辞庐)
  • GP-5186: 优化弹出菜单的显示 (by 辞庐)
  • GP-5188: 仅在左键点击时触发 JFXRippler 的波纹 (by Glavo)

错误修复:

  • GP-5124: 修复离线换肤界面部分字体下产生额外空行的问题 (by NoClassDefFoundError)
  • GP-5144: 修复 FetchTask 未捕获部分异常的问题 (by Glavo)
  • GP-5148, GP-5151: 修复无法安装文件名包含特殊字符的整合包的问题 (by Glavo)
  • GP-5153: 修复窗口重新获取焦点时 JFXRadioButton 显示阴影的问题 (by Glavo)
  • GP-5162: 修复数据包管理页面在加载大量数据包时卡顿的问题 (by mineDiamond)
  • GP-5178: 修复窗口重新获取焦点时 JFXButton 意外地显示阴影的问题 (by Glavo)
  • GP-5179: 修复窗口重新获取焦点时 JFXCheckBox 意外地显示阴影的问题 (by Glavo)
  • GP-5166: 修复未下载陶瓦联机时打开陶瓦联机页面抛出异常的问题 (by Glavo)
  • GP-5167: 修复游戏设置中 Java 路径过长时可能与 Java 版本号标签冲突的问题 (by ENC_Euphony)
  • GP-5170: 修复无法安装部分带有 NeoForge 的 Modrinth 整合包的问题 (by 3gf8jv4dv)
  • GP-5183: 修复重置字体后未遵循 hmcl.font.override/HMCL_FONT 设置的问题 (by 辞庐, Glavo)
  • GP-5184: 修复游戏安装页面中卡片未显示波纹的问题 (by 辞庐)
  • GP-5197: 修复使用默认窗口大小时进入高级版本设置会向下滚动一段距离的问题 (by 辞庐)

HMCL 3.10.0.317

详细版本介绍 (Bilibili)

  • GP-4289: 在添加游戏目录页面选择目录时自动填写名称 (by Dime,辞庐,Glavo)
  • GP-4794: 优化微软登录页面 (by 辞庐,3gf8jv4dv)
  • GP-4882: 取消 FXUtils#onClicked 的连点限制 (by 辞庐)
  • GP-5043: 修复导出整合包界面以及 NBT 文件查看界面样式 (by Calboot)
  • GP-5046: 禁用游戏日志窗口的平滑滚动效果 (by Glavo)
  • GP-5052: 优化列表的平滑滚动效果 (by Glavo)
  • GP-5054: 优化账户选择弹窗在列表为空时的表现 (by mineDiamond)
  • GP-5056: 优化列表性能 (by Glavo)
  • GP-5057: 更新“没有游戏实例”标签的颜色 (by Glavo)
  • GP-5060: 优化非主窗口中对话框的效果 (by 辞庐)
  • GP-5062: 更新 NBT 标签图标 (by mineDiamond)
  • GP-5076: 优化不透明度滑块显示效果 (by neveler)
  • GP-5077: 优化设置页面的内边距 (by neveler)
  • GP-5079: 为不同类型的对话框指定相应的默认标题 (by neveler)
  • GP-5082: 更新关于页面的版权年份至 2026 (by 辞庐)
  • GP-5086: 更新安装游戏时选择加载器版本后的返回动画方向 (by 辞庐)
  • GP-5087: 更新启动按钮分隔符颜色 (by neveler)
  • GP-5088: 切换实例菜单仅在菜单高度大于最大高度时显示垂直滚动条 (by neveler)
  • GP-5101: 在进度指示器中添加圆角 (by 辞庐)
  • GP-5102: 优化文本输入框右键菜单的样式 (by Glavo)
  • GP-5107: 优化 OptionToggleButton (by 辞庐)
  • GP-5108: 优化打包日志逻辑 (by 辞庐)
  • GP-5114: 优化部分页面显示效果 (by neveler)
  • GP-5119: 安装 Modrinth 整合包时下载图标 (by Glavo)
  • GP-5129: 优化校验输入框内容的方式 (by 辞庐)
  • GP-5131: 修复缓存目录设置进入时默认未勾选的问题 (by 辞庐)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-5034: 修复下载光影时对话框的标题文字错误的问题 (by Wulian233)
  • GP-5064: 修复弹出菜单在 HiDPI 显示器上播放动画过程中内容 Y 轴方向缩放异常的问题 (by Glavo)
  • GP-5080: 修复外置登录对话框在部分情况下未正确验证用户名的问题 (by Glavo)
  • GP-5081: 修复无法读取部分模组信息的问题 (by Glavo)
  • GP-5091: 修复未正确处理部分特殊版本号的问题 (by mineDiamond)
  • GP-5110: 修复无法解析新版本 NeoForge 版本号的问题 (by 辞庐)
  • GP-5111: 修复复制游戏实例相关问题 (by 辞庐)
  • GP-5112: 修复添加实例目录页面有一个空 Tooltip 的问题 (by 辞庐)
  • GP-5117: 修复离线换肤对话框中提示栏和按钮重叠的问题 (by NoClassDefFoundError)
  • GP-5118: 修复部分平台弹出菜单无法通过点击侧边栏收起的问题 (by 辞庐)
  • GP-5125: 修复未正确归类 NeoForge alpha 版本的问题 (by 辞庐)
  • GP-5128: 修复使用 BMCLAPI 下载源时选择 Liteloader 版本时可能报错的问题 (by Wulian233)

HMCL 3.10.0.315

详细版本介绍 (Bilibili)

  • GP-4932: 在主页右键点击账户按钮时弹出快速切换账户菜单 (by zimzaza4)
  • GP-5011: 在 JFXCustomColorPickerDialog 中使用 HEX 作为默认 Tab (by Glavo)
  • GP-5019: 使用子标题注解“提前预览 HMCL 版本”选项 (by neveler)
  • GP-5019: 使用子标题显示“重启后生效”提示 (by neveler)
  • GP-4927: 在 macOS 平台上导出启动脚本时支持导出 .command 文件 (by WhatDamon)
  • GP-4872: 添加快速进入世界功能 (by mineDiamond)
  • GP-5008: 优化反馈页面 (by Glavo)
  • GP-5035: 在所有平台上将 : 视为文件名中的非法字符 (by 辞庐)
  • GP-5016: 在刷新 ModListPage 时不滚动到顶部 (by OrzMiku)
  • GP-5032: 优化 InputDialogPane (by mineDiamond)
  • GP-4897: 导出整合包时隐藏系统资源文件 (by Calboot)

错误修复:

  • GP-5018: 修复 subtitle 颜色丢失的问题 (by neveler)
  • GP-5020: 修复 GameCrashWindowfeedbackTextFlow 样式错误的问题 (by Glavo)
  • GP-5040: 修复陶瓦联机页面部分文本在深色模式下颜色异常的问题 (by Glavo)

HMCL 3.9.0.313

详细版本介绍: cv44304232

  • GP-4992: 将 authlib-injector 更新至 1.2.7 (by Burning_TNT)
  • GP-4144: 添加输出游戏调试日志选项 (by 辞庐)
  • GP-4475: 添加资源包管理功能 (by 辞庐)
  • GP-4899, GP-4903, GP-4912, GP-4910, GP-4947, GP-4943, GP-4948, GP-4952, GP-4953: 优化深色模式支持 (by Glavo, Wulian233)
  • GP-4915: 在 HintPane 提示框中为图标和文本添加间距 (by neveler)
  • GP-4917: 适配 Minecraft 新版本号规则 (by Glavo)
  • GP-4911, GP-4963: 添加对 1.21.11_unobfuscated 及其预发布版的支持 (by mineDiamond)
  • GP-4854: 更新 TableView 的样式 (by Calboot)
  • GP-4951: 更新 JFXComboBox 下拉菜单滚动条的样式 (by Glavo)
  • GP-4964: 将 TableView 中的 CheckBox 替换为 JFXCheckBox (by Glavo)
  • GP-4581: 在日志中记录显示器信息 (by Glavo)
  • GP-4866: 在 DownloadListPage 中添加图标缓存 (by Glavo)
  • GP-4990: 支持下载 Java 25 (by OrzMiku)
  • GP-4916: 在陶瓦联机界面启动游戏时禁用离线皮肤功能 (by Glavo)
  • GP-4985: 在低于 JavaFX 23 的情况下隐藏主题模式跟随系统选项 (by Glavo)

错误修复:

  • GP-4895: 修复模组更新列表界面按 esc 无法正确退出的问题 (by Calboot)
  • GP-4913: 修复 ManagedProcess#getLines 完成后不会解除锁定的问题 (by Glavo)
  • GP-4949: 修复从 BMCLAPI 下载部分旧文件时校验失败的问题 (by Glavo)
  • GP-4935: 修复本地安装新版本 Forge 时未移除版本号中 forge- 前缀的问题 (by 辞庐)
  • GP-4946: 修复模组管理页面中 OptiFine HD U G6 pre1 与 CurseForge 上的无关模组相关联的问题 (by Burning_TNT)
  • GP-4945: 修复无法识别部分 Forge/NeoForge 模组的问题 (by Burning_TNT)
  • GP-5002: 修复无法解析类似 “26.1 Snapshot 1” 的版本号的问题 (by Glavo)

HMCL 3.9.0.311

详细版本介绍: cv43951420

  • GP-4835: 更新至 Material Design 3 颜色系统 (by Glavo)
  • GP-4837: 实验性支持阿拉伯语 (by Hommam-Prom)
  • GP-4845: 更新 AMD 显卡信息数据 (by 辞庐)
  • GP-4865: 使用 JFXColorPicker 代替 ColorPicker (by Glavo)
  • GP-4856: 优化下载源选择逻辑 (by Glavo)
  • GP-4788: 优化模组下载对话框文本翻译 (by 3gf8jv4dv)
  • GP-4886: 优化对 Linux MIPS64el 平台的支持 (by Glavo)
  • GP-4870: 添加对 1.21.11-pre3_unobfuscated 的支持 (by mineDiamond)
  • GP-4869: 在陶瓦联机页面向非中国内地用户添加提示框 (by Glavo)

错误修复:

  • GP-4844: 修复缓存异常时 FetchTask 无限循环的问题 (by Glavo)
  • GP-4850: 修复 FetchTask 未设置 User-Agent 的问题 (by Glavo)
  • GP-4857: 修复惯性滚动可能导致弹出菜单错位的问题 (by Glavo)
  • GP-4862: 修复部分页面播放动画完毕后图标模糊的问题 (by Glavo)
  • GP-4871: 修复修改主题色后 JFXCheckBox 颜色不会及时变化的问题 (by Glavo)
  • GP-4874: 修复 JFXRadioButton 在 Windows 平台上中心圆点偏移的问题 (by Glavo)
  • GP-4864: 修复 macOS 上导出 Modrinth 整合包时默认文件名称中包含两个扩展名的问题 (by Calboot)

HMCL 3.8.0.310

详细版本介绍: cv43826997

  • GP-4780, GP-4790, GP-4803, GP-4815: 优化界面动画效果 (by Glavo)
  • GP-4829: 添加对 1.21.11-pre1/2_unobfuscated 的支持 (by mineDiamond)
  • GP-4796: 将 Gradle 更新至 9.2.0 (by Glavo)
  • GP-4798: 将 jsoup 更新至 1.21.2 (by Glavo)
  • GP-4799: 将 JNA 更新至 5.18.1 (by Glavo)
  • GP-4838: 将陶瓦联机更新至 0.3.14 (by Burning_TNT)
  • GP-4782: 添加对 25w46a_unobfuscated 的支持 (by Glavo)
  • GP-4779: 预加载页面以减少动画卡顿 (by Glavo)
  • GP-4776: 优化游戏实例默认图标 (by Glavo)
  • GP-4762: 在 macOS 下使用系统最小化动画 (by Damon Lu)
  • GP-4672: 优化数据包管理功能 (by mineDiamond)
  • GP-4612: 增强对数据包/资源包mcmeta的解析能力 (by mineDiamond)
  • GP-4809: 在 JFXListView 上启用平滑滚动 (by Glavo)
  • GP-4830: 使用 EdgeOne 分发 HMCL 元数据 (by Glavo)
  • GP-4826: 从首页打开子页面时打开默认标签页 (by Glavo)

错误修复:

  • GP-4775: 修复无法获取部分远古版本版本号的问题 (by Glavo)
  • GP-4795: 修复初次打开部分页面时页面闪烁的问题 (by Glavo)
  • GP-4805: 修复复制实例时使用非法实例 ID 启动器行为异常的问题 (by Haowei Wen)
  • GP-4808: 修复 Windows 下全局游戏设置中本地库路径路径分隔符显示错误的问题 (by 辞庐)
  • GP-4793: 使用低版本 Java 启动且带有 --apply-to 参数时提醒用户手动下载最新版本 HMCL (by Glavo)

HMCL 3.8.0.307

详细版本介绍: cv43667929

  • GP-4770: 更新模组数据 (2025-11-07) (by Glavo)
  • GP-4767: 添加对 25w45a_unobfuscated 的支持 (by Glavo)
  • GP-4760: 从注册表中读取 Windows 版本信息 (by Glavo)
  • GP-4540: 删除实例失败时弹出对话框 (by Glavo)

HMCL 3.8.0.306

详细版本介绍: cv43585405

  • GP-4723: 将陶瓦联机更新至 0.3.13 (by Burning_TNT)
  • GP-4742: 更新 Chunkbase 种子地图链接 (by Wulian233)
  • GP-4735: 在不支持的平台上打开陶瓦联机页面时弹出提示 (by Glavo)
  • GP-4734: 调整模组管理页面“模组文件夹”按钮的文本 (by 3gf8jv4dv)
  • GP-4743: 优化检查更新日志的方式 (by Glavo)
  • GP-4749: 恢复对 JavaFX 14 的兼容性 (by Glavo)

错误修复:

  • GP-4736: 修复 FreeBSD x86-64 平台上错误地将所有版本视作未经测试的版本的问题 (by Glavo)

HMCL 3.8.0.305

详细版本介绍: cv43527381

  • GP-4724: Bump Terracotta to 0.3.12 (by Burning_TNT)
  • GP-4698: 在被打包为 macOS App 时不设置 macOS Dock 栏图标 (by YiZhiMCQiu)
  • GP-4727: 将官方群组入口重新移动到主界面 (by Glavo)

错误修复:

  • GP-4721: 修复 JFXListViewSkin 创建大量平台线程的问题 (by Glavo)

HMCL 3.8.0.304

详细版本介绍: cv43498590

  • GP-4675: 通过解析 IANA 语言子标签注册表增强本地化功能 (by Glavo)
  • GP-4700: 当且仅当用户位于中国大陆地区时尝试从镜像源下载陶瓦联机 (by Burning_TNT)
  • GP-4705: 在陶瓦联机界面的启动游戏按钮中显示当前实例名称 (by Glavo)
  • GP-4703: 优化更新日志展示功能 (by Glavo)
  • GP-4709: 本地化下载速度显示 (by Glavo)
  • GP-4712: 优化软件文案,修订翻译 (by 3gf8jv4dv)
  • GP-4697: 优化没有可启动的游戏时的提示 (by Glavo)
  • GP-4696: 在外部链接按钮上安装 Tooltip (by neveler)

HMCL 3.8.0.303

详细版本介绍: cv43416106

  • GP-4681: 将 HMCLauncher 更新至 3.7.0.1 (by Glavo)
  • GP-4682: 将陶瓦联机更新至 0.3.10 (by Burning_TNT)
  • GP-4688: 调整陶瓦联机界面左侧按钮 (by Glavo)
  • GP-4686: 优化陶瓦联机用户须知对话框 (by Glavo)
  • GP-4695: 删除 VersionPage.Skin 中未使用的 BorderPane (by Glavo)
  • GP-4694: 优化 Task 的资源占用 (by Glavo)
  • GP-4687: 优化陶瓦联机的复制邀请码功能 (by Glavo)

HMCL 3.7.0.302

详细版本介绍: cv43370363

错误修复:

  • GP-4665: 排序模组时忽略文件名大小写 (by Glavo)
  • GP-4674: 修复不在场景中的按钮尝试取消自身焦点时触发 NPE 的问题 (by Glavo)

HMCL 3.7.0.301

详细版本介绍: cv43345643

  • GP-4608: 更新陶瓦联机至 0.3.10 (by Burning_TNT)
  • GP-4617: 更新 authlib-injector 至 1.2.6 (by 辞庐)
  • GP-4626: 更新模组下载页游戏版本列表至 1.21.10 (by Glavo)
  • GP-4621, GP-4636, GP-4638, GP-4659: 优化模组管理页面 (by Glavo)
  • GP-4641, GP-4652, GP-4654, GP-4658: 支持读取更多模组的元数据 (by Glavo)
  • GP-3231: 优先使用模组名称匹配模组翻译 (by Zkitefly)
  • GP-4601: 在全局设置中储存是否曾向用户展示过陶瓦联机用户须知 (by Burning_TNT)
  • GP-4609: 隐藏空的陶瓦联机玩家列表 (by Burning_TNT)
  • GP-4611: 更新陶瓦联机时显示反馈收集表 (by Burning_TNT)
  • GP-4622: 优化模组加载器检测机制 (by Glavo)
  • GP-4635: 将模组中文译名中的小括号统一为半角括号 (by Glavo)
  • GP-4471: 在游戏下载界面提示版本支持状态 (by Glavo)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-4585: 修复部分按钮点击后始终保持焦点状态的问题 (by Wulian233)
  • GP-4596: 修复 FetchTask 不遵循代理设置的问题 (by Glavo)
  • GP-4619: 修复陶瓦联机和部分 MacOS 版本的兼容性 (by Burning_TNT)
  • GP-4625: 修复本地安装升级 Cleanroom 相关问题 (by 辞庐)
  • GP-4631: 修复颠倒英语中括号显示错误的问题 (by Glavo)
  • GP-4624: 修复导出游戏崩溃信息后弹窗没有正常弹出的问题 (by 辞庐)
  • GP-4646: 修复 Minecraft 1.21.9+ 安装了 NeoForge 的实例未使用 NeoForge 图标作为实例图标的问题 (by 3gf8jv4dv)
  • GP-4648: 修复总是将同时兼容 Forge 和 NeoForge 的模组识别为 Forge 模组的问题 (by Glavo)
  • GP-4660: 修复模组下载页面在高分屏上图标模糊的问题 (by Glavo)

HMCL 3.7.0.300

详细版本介绍: cv43252149

  • GP-4215: 在启动器中内置 Terracotta | 陶瓦联机 (by Burning_TNT)
    Terracotta | 陶瓦联机 是第三方提供的开源免费联机工具,基于 EasyTier 开源项目开发。 我们基于该工具为所有用户免费提供开箱即用的联机功能。
    详情请参见这篇文章: HMCL x Terracotta | 陶瓦联机全面开放
  • GP-4566: 更新模组下载页游戏版本列表至 1.21.9 (by 3gf8jv4dv)
  • GP-3229: 优化模组管理布局 (by zkitefly)
  • GP-4521: 支持通过环境变量控制 UI 缩放比例 (by Glavo)
  • GP-4577: 优化对颠倒的英语的支持 (by Glavo)
  • GP-4592: 更新中文(文言)环境中其他语言名称的译法 (by 3gf8jv4dv)

错误修复:

  • GP-4568: 修复在短时间内连续点击“行按钮”只会更改一次状态的问题 (by 辞庐)
  • GP-4571: 修复「外观 - 不透明度」滑块的刻度线在不同滑块位置时排布不统一的问题 (by 辞庐)
  • GP-4583: 修复“不自动添加 Java 虚拟机优化参数”选项未保存至配置文件的问题 (by Glavo)

HMCL 3.6.18.297

详细版本介绍: cv43205532

  • GP-4520: 将 Gradle 更新至 9.1.0 (by Glavo)
  • GP-4549: 将 JNA 更新至 5.18.0 (by Glavo)
  • GP-4509: 支持在“实例管理”按钮上通过滚动滚轮切换游戏实例 (by Glavo)
  • GP-4525: 优化本地化支持 (by Glavo)
  • GP-4527: 支持颠倒的英语 (by Glavo)
  • GP-4532: 将 boot.properties 翻译至西班牙语 (by 3gf8jv4dv)
  • GP-4546: 重构 FetchTask 以使用 HttpClient 和虚拟线程 (by Glavo)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-4296: 修复切换下载源后需要重启启动器才会生效的问题 (by Glavo)
  • GP-4500: 修复删除世界时无法删除 zip 格式世界的问题 (by Wulian233)
  • GP-4514: 修复 AdvancedListBox 在非必要的情况下显示滚动条的问题 (by rootwhois)
  • GP-4528: 修复将空字符串注册为 access token 后日志输出异常的问题 (by Glavo)
  • GP-4517: 修复日志页面选中条目时 hover 背景闪烁两次的问题 (by rootwhois)

HMCL 3.6.17.296

详细版本介绍: cv43101143

  • GP-4454: 将默认 JavaFX 版本更新至 21.0.8/25 (by Glavo)
  • GP-4490: 将 Gson 更新至 2.13.2 (by Glavo)
  • GP-4263: 世界管理页面新增删除世界功能 (by Wulian233)
  • GP-4474: 主页下载选项卡的 Tooltip 中添加光影下载相关说明 (by Wulian233)
  • GP-4487: 在未启用 JIT 或硬件渲染加速的环境中启动时弹出提示 (by Glavo)
  • GP-4462: 缓存文件时遵循 Cache-Control 标头的配置 (by Glavo)
  • GP-4502: 从 java.io.File 迁移至 NIO (by Glavo)
  • GP-4506: 使用 Java 25 启动游戏时默认开启压缩对象头 (by Glavo)
  • GP-4507: 游戏设置中添加“不自动添加 Java 虚拟机优化参数”选项 (by Glavo)
  • GP-4510: 在未启用 JIT 或硬件渲染加速的环境中默认禁用动画 (by Glavo)
  • GP-4515: 优化 Java 自动选择规则 (by Glavo)

错误修复:

  • GP-3976: 修复 Minecraft 1.5.2 安装 Forge 后启动时无法下载 fmllib 的问题 (by zkitefly)
  • GP-4034: 修复无法安装带有 Fabric 的非标准 MMC 整合包的问题 (by Burning_TNT)
  • GP-4492: 修复 .hmcl 目录为跨驱动器符号链接时无法卸载 Java 的问题 (by Glavo)
  • GP-4508: 修复使用 JavaFX 25 时游戏下载界面布局错误的问题 (by Glavo)

HMCL 3.6.17.294

详细版本介绍: cv43036782

  • GP-4452: 使用 Java 17 构建 HMCL (by Glavo)
  • GP-4415: 序列化不透明的 Color 时省略 Alpha 通道的值 (by Glavo)
  • GP-4413: 文言时间使用古代时辰格式 (by Glavo)
  • GP-4439: 更新模组和整合包数据 (by Glavo)
  • GP-4414: 检测到配置文件由高版本启动器创建时禁止保存配置文件 (by Glavo)
  • GP-4455: 优化对于 ISO 639-3 语言代码的支持 (by Glavo)
  • GP-4467: 在标签文本溢出时使用 Tooltip 显示完整文本 (需要 JavaFX 23+) (by Glavo)

错误修复:

  • GP-4437: 修复 backgroundTypenull 时启动器崩溃的问题 (by Glavo)
  • GP-4412: 修复第一次弹出菜单时无法计算高度的问题 (by ENC_Euphony)
  • GP-4465: 修复启用代理身份认证且未设置密码时启动器崩溃的问题 (by Glavo)
  • GP-4466: 修复滚动切换游戏实例/账户时方向错误的问题 (by Glavo)
  • GP-4428: 修复数据包管理在低于1.13的版本意外出现的问题 (by Wulian233)

HMCL 3.6.16.293

详细版本介绍: cv42962968

  • GP-4272: 支持自动安装 Cleanroom (by 辞庐, zkitefly)
  • GP-4370: 优化 Linux/FreeBSD 平台的默认中文字体查询机制 (by Glavo)
  • GP-4372: 优化 Minecraft Wiki 跳转功能 (by Glavo)
  • GP-4376: 将「版本」重命名为「实例」(by 3gf8jv4dv)
  • GP-4379: 增强本地化支持 (by Glavo)
  • GP-4387: 优化文言文翻译 (by dovisutu, 物灵, Bei Dou, 繁繁芙芙, Kaohaaa, 365KW, Andypsl8, Au0727, threwd, vinds476283)
  • GP-4388: 更新 microsoft_auth.html (by Glavo)
  • GP-4394: 重构 Config (by Glavo)
  • GP-4401: 优化地区判断逻辑 (by Glavo)
  • GP-4405: 在游戏下载列表右侧添加下载按钮 (by Glavo)
  • GP-4410: 优化语言设置中简体/繁体中文选项的显示方式 (by Glavo)

错误修复:

  • GP-4382: 修复更新 MMC 整合包后未更新 JVM 参数的问题 (by 小宇)
  • GP-4384: 修复连续点击两次返回按钮会使窗口最大化的问题 (by Glavo)
  • GP-4386: 修复离线换肤功能使用无效 CSL API 时游戏启动失败的问题 (by Glavo)
  • GP-4404: 修复地支中的「丑」被误写为「醜」的问题 (by Glavo)
  • GP-4411: 修复导出的历史日志文件为空的问题 (by Glavo)

HMCL 3.6.16.292

详细版本介绍:cv42887511

  • 添加文言文翻译 (by Glavo, Andypsl8, Wulian233) (BV1vNh9zqEEP)
  • GP-4346: 添加乌克兰语翻译 (by BANSAFAn)
  • GP-4294: 游戏崩溃窗口中增加对拍照的提醒 (by YuChuXi)
  • GP-4311: 使用 Java 11 打开启动器时显示弃用警告 (by Glavo)
  • GP-4338: 不对回环地址应用代理 (by Glavo)
  • GP-4340: 增加 TaskListPane 中任务条目之间的间距 (by Glavo)
  • GP-4341: 更严格地检测文件名合法性 (by Glavo)
  • GP-4342: 导出启动器日志时解压旧日志 (by Burning_TNT)
  • GP-4349: 启动游戏时隐藏 GameAssetDownloadTask (by Glavo)
  • GP-4353: 优化自动切换游戏语言功能 (by Glavo)

错误修复:

  • GP-4321: 修复世界管理页面不支持显示极限模式的问题 (by Wulian233)
  • GP-4347: 修复 TaskListPane.StatusChangeListener 持有 ListCell 的强引用的问题 (by Glavo)
  • GP-4350: 修复无法识别部分简体中文环境的问题 (by Glavo)
  • GP-4365: 修复首次打开子页面时切换动画丢失的问题 (by Glavo)

HMCL 3.6.16.291

详细版本介绍:cv42815084

  • GP-4274: 更新 chunkbase 种子地图链接 (by Wulian233)
  • GP-4275: 基于实际屏幕分辨率添加游戏窗口分辨率选项 (by Wulian233)
  • GP-4276: 优化版本号排序规则 (by Glavo)
  • GP-4282: 支持解析 Indev 版本号 (by Glavo)
  • GP-4285, GP-4292, GP-4297, GP-4301, GP-4306, GP-4310: 优化 TaskListPane (by Glavo)
  • GP-4293: 在 macOS 上禁止最大化和全屏模式 (by Glavo)
  • GP-4323: HintPane 使用新版 Bootstrap 调色盘 (by 辞庐)
  • GP-4329: 将 URI 中的错误代理对编码为 U+FFFD (by Glavo)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-4288: 修复 Windows 平台 GPU 信息可能显示为 “[B@xxx” 的问题 (by Henryxjh)
  • GP-4298: 修复版本图标显示错误的问题 (by Glavo)
  • GP-4327: 修复未将 15w14a 识别为愚人节版本的问题 (by Glavo)

HMCL 3.6.15.290

详细版本介绍:cv42726031

  • GP-3205: 支持设置背景的不透明度 (by 吞云)
  • GP-3230: 模组管理页面支持根据更多数据搜索模组 (by zkitefly)
  • GP-3716: 支持导出 Modrinth 整合包 (by zkitefly)
  • GP-4051: 导出启动日志时额外导出近五次启动的日志 (by zkitefly)
  • GP-4141, GP-4264: 优化游戏下载页面 (by Glavo)
  • GP-4181: 统一转义 URI 中的特殊字符 (by Glavo)
  • GP-4184: 支持纯色背景 (by Glavo)
  • GP-4201: 为弹窗文本添加平滑滚动 (by 辞庐)
  • GP-4203: 智能选择 popup 弹出位置 (by ENC_Euphony)
  • GP-4205, GP-4210: 支持 APNG 动图 (by Glavo, Liu Wenyuan)
  • GP-4206: 支持 data: URI (by Glavo)
  • GP-4219: 下载文件时支持使用透明 GZip 压缩 (by Glavo)
  • GP-4222: 在实例名称中包含字母、数字、减号和下划线以外的字符时弹出警告 (by Glavo)
  • GP-4234: 优化游戏窗口大小选择功能 (by Glavo)
  • GP-4246: 将 authlib-injector 嵌入启动器 (by Glavo)
  • GP-4248: 在未安装游戏版本时支持一键下载启动游戏 (by Glavo) (BV1BbYxzNEFE)
  • GP-4260: 支持最大化和全屏模式 (by Glavo)
  • GP-4268: 为 NeoForge 下载页面添加正式版/快照分类筛选功能 (by Wulian233)
  • 修复代码中的一些 typo (by Wulian233, ENC_Euphony)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-3956: 修复启动整合包时会尝试补全被禁用的模组的问题 (by zkitefly)
  • GP-4176: 修复整合包格式不匹配提示未被正确格式化的问题 (by 辞庐)
  • GP-4180: 修复无法找到不包含 release 文件的 Java 的问题 (by Glavo)
  • GP-4183: 修复 GetTask 未遵循 Content-Type 中的字符集设置的问题 (by Glavo)
  • GP-4185: 修复未开启版本特定游戏设置时,内存显示条未更新样式的问题 (by OrzMiku)
  • GP-4192: 修复本机库路径显示错误的问题 (by 辞庐)
  • GP-4211: 修复无法打开部分游戏版本的 wiki 页面的问题 (by ENC_Euphony)
  • GP-4224: 修复 Windows 7 上无法使用软渲染器的问题 (by Glavo)
  • GP-4241: 修复非 Windows 平台上游戏进程的 user.home 可能被设置为 null 的问题 (by Glavo)
  • GP-4244: 修复版本列表排序错误的问题 (by Wulian233)

HMCL 3.6.15.288

详细版本介绍:cv42545461

  • GP-4168: 将 Gradle 更新至 9.0.0 (by Glavo)
  • GP-4064: 优化主页公告关闭按钮 (by 辞庐)
  • GP-4088: 当离线账户名称超过 16 字符时弹出警告 (by ShulkerSakura)
  • GP-4142: 扫描 Java 时忽略 %ProgramFiles%\Common Files\Oracle\Java 中的 Java (by Glavo)
  • GP-4145: 在 Windows 平台优先使用注册表检测 GPU (by Glavo)
  • GP-4148: 当系统设置中禁用动画效果时关闭动画 (需要 JavaFX 22+) (by Glavo)
  • GP-4160: 缺少 Microsoft OAuth App ID 时禁用微软账户的刷新选项 (by 辞庐)
  • GP-4163: 通过主页右下角弹出菜单切换版本后隐藏菜单 (by Glavo)
  • GP-4169: 支持缓存更多来自 BMCLAPI 的资源 (by Glavo)
  • GP-4170: 在模组下载列表中翻页后自动回到顶部 (by 辞庐)
  • GP-4171: 支持加载 WebP 格式的图标 (by Glavo)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-4128: 修复在 EA 版本的 JDK 上无法正常启动的问题 (by onion108)
  • GP-4130: 修复日志窗口中的结束进程按钮会结束全部游戏进程的问题 (by 辞庐)
  • GP-4152: 修复导入格式异常的数据包时启动器崩溃的问题 (by Glavo)
  • GP-4153: 修复“下载线程数”的指示器被提示覆盖的问题 (by 辞庐)
  • GP-4167: 修复文件下载缓存不生效的问题 (by Glavo)
  • GP-4174: 修复无法从 BMCLAPI 下载部分 NeoForge 所需文件的问题 (by 辞庐)

HMCL 3.6.15.287

详细版本介绍:cv42465621

  • GP-4078: 使用 Java 11 构建 HMCL (by Glavo)
  • GP-4113: 更新 HMCLauncher for Windows 至 3.7.0.0 (by Glavo)
  • GP-4085: 更新模组下载页游戏版本列表至 1.21.8 (by Glavo)
  • GP-4118: 添加字体抗锯齿算法设置选项 (by Glavo)
  • GP-4095, GP-4120: 更换 unlisted-versions-of-minecraft 镜像源 (by zkitefly, 8Mi_Yile)
  • GP-3690: 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-4096: 修复无法使用部分日志字体的问题 (by Glavo)
  • GP-4097: 修复 InstallersPage 意外地显示滚动条的问题 (by Glavo)
  • GP-4121: 修复多次启动游戏时内存泄露的问题 (by Roj234)
  • GP-4066: 修复游戏版本列表错误地过滤掉部分版本的问题 (by Wulian233)

HMCL 3.6.14.286

详细版本介绍:cv42361009

  • GP-4086: 更新 HMCLauncher for Windows 至 3.6.0.6 (by Glavo)

错误修复:

  • GP-4065: 修复添加游戏文件夹页面缺少灰色背景的问题 (by 辞庐)
  • GP-4069: 修复使用 JavaFX 25 EA 启动时下载界面布局错位的问题 (by Glavo)
  • GP-4074: 修复 Windows 平台无法使用部分中文字体的问题 (by Glavo)

HMCL 3.6.12.283

详细版本介绍:cv42221199

  • GP-4035: 更新模组下载页游戏版本列表至 1.21.7 (by Glavo)
  • GP-4032: 使用 Java 8 运行时禁止更新 (by Glavo)
  • GP-4040: 更新模组数据 (by Glavo)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • 修复部分 Linux 环境中未正确选择默认字体的问题 (by Glavo)

HMCL 3.6.12.282

详细版本介绍:cv42087635

  • GP-4011: 更新模组下载页游戏版本列表至 1.21.6 (by 3gf8jv4dv)

错误修复:

  • GP-4007: 修复光影下载页面中标签名称未翻译的问题 (by Glavo)
  • GP-4009: 修复 macOS 上无法读取 CPU 信息的问题 (by Glavo)
  • GP-4015: 修复代码中的拼写错误 (by kfatyuip)
  • GP-4016: 修复 MultiMC 整合包中包含相同标识符的库时无法导入的问题 (by Burning_TNT)

HMCL 3.6.12.281

详细版本介绍:cv42015225

  • GP-3992: 更新 HMCLauncher for Windows 至 3.6.0.4 (by Glavo)
  • GP-2794: 支持下载光影 (by Burning_TNT)
  • GP-3836: 自动安装页面隐藏 mcbbs 项 (by 辞庐)
  • GP-3974: 更新日志中仅显示本次更新内容 (by Wulian233)
  • GP-3991: 创建世界管理页面 (by Glavo) (BV1LrMCzXERZ)
  • GP-4003: 解析 MultiMC 整合包中未声明但在依赖链上的组件 (by Burning_TNT)
  • GP-4004: 更新加入群组链接至 B 站专栏 (by Glavo)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-3995: 修复 Controller 未能读取 JAVA_VERSION_TIP 的问题 (by Burning_TNT)
  • GP-3996: 修复在 schematics 文件夹不存在的情况下,打开投影管理页面会抛出异常的问题 (by Glavo)
  • GP-3998: 修复模组搜索返回结果为空时下载界面异常的问题 (by Burning_TNT)
  • GP-4001: 修复自动安装界面中更改 MC 版本后无法点击安装键的问题 (by Burning_TNT)

HMCL 3.6.12.280

详细版本介绍:cv41943291

  • GP-3979: 更新 HMCLauncher for Windows 至 3.6.0.3 (by Glavo)
  • GP-3547: 重构 MultiMC 整合包兼容功能 (by Burning_TNT)
  • GP-3929: 使用独立线程保存设置 (by Glavo)
  • GP-3978: 优化原理图管理功能 (by Glavo)
  • GP-3981: 忽略与版本 JSON 指定的 Java 相冲突的 Java 检测规则 (by Glavo)
  • 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-3968: 修复 Java 管理页面中无法添加 IKVM 的问题 (by Glavo)

HMCL 3.6.12.279

详细版本介绍:cv41864476

  • GP-3927: 将 JavaFX 更新至 17.0.15/24.0.1 (by Glavo)
  • GP-3953: 更新 HMCLauncher for Windows 至 3.6.0.2 (by Glavo)
  • GP-3860: 添加 XBox 封禁相关提示 (by 辞庐)
  • GP-3875: 使用工作路径下的 .hmcl 文件夹存放所有配置文件 (by Glavo)
  • GP-3876: 优化代理设置功能 (by Glavo)
  • GP-3878: 将 OS X 重命名为 macOS (by Glavo)
  • GP-3890: 在 Windows 平台使用 JNA 调用本机 API (by Glavo)
  • GP-3891、GP-3921: 优化用户区域识别功能 (by Glavo)
  • GP-3914: 启动时在日志中记录用户设备的 CPU 信息 (by Glavo)
  • GP-3893: 启动时在日志中记录用户设备的 GPU 信息 (by Glavo)
  • GP-3895: 在“关于”页面中添加贡献者 Red_lnn 的主页链接 (by Glavo)
  • GP-3899: 尝试从 HMCL.jar 所在文件夹加载默认字体 (by Glavo)
  • GP-3910: 重构 Theme (by Glavo)
  • GP-3922: 在 Linux 平台 通过 fc-match 查询默认字体 (by Glavo)
  • GP-3919: 在日志中将包名 org.jackhuang.hmcl 简化为 @ (by Burning_TNT)
  • GP-3938: 使用 Java 8 打开启动器时弹出弃用警告 (by Glavo)
  • GP-3944、GP-3949: 优化版本列表为空时,主页切换版本菜单的显示效果 (by GeneralK1ng)
  • GP-3951: 新增“原理图管理”界面 (by Glavo)(BV1kk7rz2Enm

错误修复:

  • GP-3866: 修复下载游戏内容页面搜索新内容时分页按钮未重置的问题 (by Wulian233)
  • GP-3874: 修复在已安装游戏版本的自动安装界面中游戏版本名称报红的问题 (by e74yp8)
  • GP-3877: 修复启动器退出时未压缩日志的问题 (by Glavo)
  • GP-3883: 修复当离线账户用户名中包含中文字符时,无法使用 LittleSkin 皮肤的问题 (by e74yp8)
  • GP-3888: 修复无法一键更新整合包的问题 (by mzdluo123)
  • GP-3901: 修复模组/整合包下载界面无法完整显示多行信息的问题 (by e74yp8)
  • GP-3942: 修复无法正确处理版本服务器地址设置中的 IPv6 地址的问题 (by Glavo)

HMCL 3.6.12.278

详细版本介绍:cv41495241

  • GP-3840: 将 HMCLauncher 拆分至独立项目 (by Glavo)
  • GP-3857: 将 Gradle 更新至 8.14 (by Glavo)
  • GP-3854: 右键主页“启动游戏”按钮时展开版本列表菜单 (by Glavo)
  • GP-3853: 优化离线账户名称中包含非 ASCII 字符时的提示 (by Glavo)
  • 优化软件文案,修订翻译(by 3gf8jv4dv)

错误修复:

  • GP-3856: 修复导出过长日志时可能发生 OutOfMemoryError 的问题 (by Glavo)
  • GP-3863: 修复游戏崩溃分析窗口乱码的问题 (by Glavo)

HMCL 3.6.12.276

详细版本介绍:cv41401127

  • GP-3834: 将 Gson 更新至 2.13.0 (by Glavo)
  • GP-3835: 将 jsoup 更新至 1.19.1 (by Glavo)
  • GP-3822: 统一导出和导入整合包页面样式 (by 辞庐)
  • GP-3823: 默认限制境外地区使用离线账户功能 (by Glavo)
  • GP-3824: 优化默认 JVM 参数 (by Glavo)
  • GP-3830: 将模组/整合包/资源包的默认下载源调整为 Modrinth (by Burning_TNT)

错误修复:

  • GP-3826: 修复无法正常解析 NeoForge 愚人节版本的问题 (by Burning_TNT)

HMCL 3.6.12.275

详细版本介绍:cv41320419

  • GP-3080: 反序列化账户信息时优先将数字解析为 Long (by zly2006)
  • GP-3481: 使用 Kala Compress 替代 commons-compress (by Glavo)
  • GP-3799: 优化下载列表中特殊版本的版本号 (by zkitefly)
  • GP-3800: 优化整合包导出类型选择界面 (by Wulian233)
  • GP-3819: 将 mesa-loader-windows 更新至 25.0.3 (by Glavo)

错误修复:

  • GP-3768: 修复模组下载界面无法正常翻页,以及类别会在切换下载源时出错的问题 (by Burning_TNT)
  • GP-3772: 修复模组管理内“安装到当前版本”与“下载到本地文件夹”实际效果相同的问题 (by Burning_TNT)
  • GP-3776: 修复 LiteLoader 下载相关问题 (by Burning_TNT)
  • GP-3806: 修复 RISC-V 平台游戏识别 CPU 名称出错的问题 (by Glavo)
  • GP-3814: 修复 Fabric Metadata 无效时 FabricInstallTask 抛出 NPE 的问题 (by Glavo)
  • GP-3817: 修复自定义背景图片路径包含无效字符时启动器崩溃的问题 (by Glavo)

HMCL 3.6.12.274

详细版本介绍:cv41243757

  • GP-3247: 支持下载部分特殊版本 (by zkitefly)
  • GP-3674: 更新链接为 Metadata 中的常量,优化代码可维护性 (by zkitefly)
  • GP-3744: 更新模组下载页游戏版本列表至 1.21.5
  • GP-3781: 优化对 25w14craftmine 愚人节快照的支持 (by Glavo)
  • GP-3734: 折叠高级设置中不适用于当前系统的选项 (by Wulian233)
  • GP-3685: 优化软件文案,修订翻译 (by 3gf8jv4dv)

错误修复:

  • GP-3762: 修复离线账户皮肤 cslApi 为 null 时启动器崩溃的问题 (by Glavo)
  • GP-3769: 修复离线账户切换模型时左侧 3D 预览不会即时更新的问题 (by Burning_TNT)
  • GP-3770: 修复 Windows 平台部分语言编码下无法打开 Minecraft 中文 Wiki 的问题 (by Burning_TNT)
  • GP-3771: 修复资源包和世界下载对话框标题为“模组下载”的问题 (by 辞庐)
  • GP-3778: 修复 macOS 平台使用 Rosetta 2 转译运行启动器时无法正确识别系统架构的问题 (by YiZhiMCQiu)
  • GP-3793: 修复启动器更新下载对话框中有两个相同进度条的问题 (by Burning_TNT)
  • GP-3797: 修复无法打开游戏购买页面的问题 (by zkitefly)

HMCL 3.6.11.273

版本介绍:cv41100626

  • GP-3432: 优化滚动页面时的性能 (by Glavo)
  • GP-3747: 在日志中记录编码信息 (by Glavo)
  • GP-3749, GP-3750: 消除使用 Java 24 运行 HMCL 时控制台中的弃用警告 (by Glavo)
  • GP-3755: 更新 macOS Dock 栏图标 (by Shulker)

错误修复:

  • GP-3752: 修复取消导出整合包时弹出报错对话框的问题 (by Glavo)
  • GP-3759: 修复无法解析部分 Java 版本号的问题 (by Glavo)

HMCL 3.6.11.272

版本介绍:cv41026311

  • GP-3717: 显示对话框时隐藏焦点
  • GP-3723: 在游戏崩溃界面添加滚动条
  • GP-3729: 为更新日志对话框添加平滑滚动
  • GP-3730: 为世界信息页面和版本高级设置页面背景添加半透明遮罩
  • GP-3736: 优化账户信息卡片的显示效果
  • GP-3714: 优化软件文案,修订翻译

错误修复:

  • GP-3722: 修复备份文件路径被错误地设置为源世界路径的问题
  • GP-3733: 删除更新日志对话框中多余的换行符
  • GP-3735: 修复在 Modrinth 上获取模组版本时未正确处理 404 响应的问题

HMCL 3.6.11.271

版本介绍:cv40935564

  • GP-3689: 在世界管理界面显示世界图标
  • GP-3675: 更新 Microsoft 应用商店链接
  • GP-3700: 重新限制动画帧率至 60fps
  • GP-3701: 在 DDE 上禁用自绘窗口动画
  • GP-3695: 优化离线登录对话框
  • GP-3687: 更新全部图标至 Material Symbols
  • GP-3711: 优化世界管理界面,新增备份世界页面
  • 优化软件文案,修订翻译

错误修复:

  • GP-3708: 修复更改游戏 Java 时路径显示错误的问题

HMCL 3.6.11.270

版本介绍:cv40898336

  • GP-3650: 点击账户卡片空白处时切换账户
  • GP-3442: 添加打开启动器时的窗口动画
  • GP-3652: 添加关闭启动器时的窗口动画
  • GP-3657: 添加最小化和还原启动器窗口的动画
  • GP-3655: 启用高帧率动画
  • GP-3663: 启动时尝试从 HMCL_DIRECTORY 中加载字体
  • GP-3665, GP-3673: 支持在世界详情页面、Java 安装页面和整合包详情对话框中双击复制信息
  • GP-3666, GP-3677: 禁止标题栏按钮获取焦点
  • GP-3668, GP-3680: 优化动画效果
  • 优化软件文案,修订翻译

错误修复:

  • GP-3623: 修复离线账户皮肤对话框「本地皮肤图片文件」部分选项文字被覆盖的问题
  • GP-3651: 当微软账户 Token 过期时应当刷新账户
  • GP-3653: 修复无法打开空 mca/mcr 文件的问题
  • GP-3654: 修复标题过长时窗口异常的问题
  • GP-3676: 修复对话框关闭动画缺失的问题

HMCL 3.6.11.269

  • GP-3619: 在启动器日志中记录处理器型号(仅 Windows)
  • GP-3620: 修改整合包下载对话框内“安装到当前版本”按钮的文本为“安装整合包”,修正对话框标题
  • GP-3621: 点击安装整合包时无条件关闭整合包下载对话框
  • GP-3625: 允许用户在「下载 → 游戏」页面搜索时调整搜索范围
  • GP-3629: 删除全局游戏设置页面的离线账户更换皮肤提示
  • GP-3628: 在版本的游戏设置中添加“复制全局游戏设置”选项
  • 优化软件文案/翻译

错误修复:

  • GP-3618: 修复无法识别 Intel64 架构的问题
  • GP-3626: 修复离线账户选择 Steve/Alex 皮肤时模型错误的问题
  • GP-3622: 修复在非官方支持的平台上 Minecraft 1.21 与 Sodium 不兼容的问题
  • GP-3638: 修复 NeoForge 版本识别错误的问题
  • GP-3645: 修复在 macOS 平台无法找到通过 DMG 安装的 Java 的问题

HMCL 3.6.11.268

  • GP-3613: 优化软件内日期时间格式
  • GP-3605: 添加 NeoForge 的 BMCLAPI 代理支持

错误修复

  • GP-3612: 修复语言设置中英语选项名称错误的问题

HMCL 3.6.11.267

  • GP-3601: 更新模组数据
  • GP-3603: 支持临时隐藏预览版提示
  • GP-3610: 统一软件内日期时间格式
  • 优化软件文案

错误修复

  • GP-3549: 修复 macOS 平台 HMCLauncher.sh 不会显示 Java 下载页面的问题
  • GP-3594: Java 下载对话框中切换包类型时不应重置版本字段
  • GP-3598: 修复使用自定义字体时未正确设置字重的问题
  • GP-3602: 修复使用系统 GLFW/OpenAL 时无法启动部分游戏版本的问题
  • GC-ecafc9d: 修复安装新游戏页面中组件框的高度问题

HMCL 3.6.11.266

  • GP-3517: 游戏下载页面添加搜索功能
  • GP-3244: 安装新游戏/整合包时检查版本名称是否包含非 ASCII 字符
  • GP-3523: 模组列表页中按下 ESC 键时取消选中
  • GP-3536: 优化对 Linux RISC-V 64 平台的支持
  • 优化文本描述

错误修复

  • GP-3252: 修复无法补全部分第三方 Minecraft 客户端游戏资源的问题
  • GC-56d20a5, GC-397edae: 修复 Linux 平台调整窗口大小的问题
  • GP-3531: 修复在 FreeBSD x86-64 平台未正确替换 LWJGL 本地库的问题
  • GP-3541: 修复安装 MultiMC 整合包后没有设置图标的问题

HMCL 3.6.11.265

  • GP-3458: 降低窗口阴影质量以改善性能
  • GP-3484: 更新模组下载页游戏版本列表至 1.21.4

错误修复:

  • GP-3490: 修复 OAuth 登录时轮询过于频繁的问题
  • GP-3464: 修复在更新日志界面无法拖动启动器窗口的问题
  • GP-3503: 使用 Zink 渲染器时禁用 DRI3
  • GC-5fd52bb: 皮肤缓存不再保存到 .minecraft 目录
  • GC-d5408c3: 版本特定游戏设置从全局设置复制
  • GC-81b3911: 修复按 ESC 键时文本框内的值没有保存的问题
  • GC-260f4b6: 修复输入对话框中 ESC 键不起作用的问题
  • GC-7d12ef6: 修复内存滑块提示被设备内存进度条覆盖的问题
  • GC-78e15d1: 修复游戏设置中内存没有实时刷新的问题
  • GC-6f53da1: 完善模组下载界面

HMCL 3.6.11.264

  • GP-3457: 实验性支持 WebP 格式的背景图片
  • GP-3476: 在 Linux RISC-V 平台添加 banshanjdk-8 的下载地址

错误修复:

  • GP-3470: 修复无法读取部分 Forge 模组信息的问题

HMCL 3.5.9.263

  • GP-3435: 在游戏下载列表中添加 Minecraft Wiki 链接
  • GP-3450: 使最小化按钮居中
  • 优化文本描述

错误修复:

  • GP-3030: 修复导入 MultiMC 整合包时 JVM 参数未移除引号的问题
  • GP-3439: 修复 Minecraft 1.20.2+Forge 默认图标错误的问题
  • GP-3444: 修复检查模组更新失败对话框未翻译的问题
  • GP-3451: 修复下载整合包失败时对话框标题过长的问题
  • GP-3461: 修复 macOS 上点击按钮时虚拟机崩溃的问题

HMCL 3.5.9.262

错误修复:

  • GP-3308: 修复启动时自动补全 Modrinth 整合包中已禁用模组的问题
  • GP-3434: 修复为游戏 1.20.5+Forge 自动选择 Java 17 的问题
  • GP-3437: 修复“关于”页面编码错误的问题

HMCL 3.5.9.261

  • GP-3428: 优化文本描述

错误修复:

  • GP-3430: 修复使用高版本 Java 启动低版本游戏时提示对话框中的文本错误

HMCL 3.5.9.260

  • GP-3232: 支持在模组管理页面通过右键单击模组查看模组详情
  • GP-3396、GP-3397、GP-3406: 优化账户列表页面按钮图标
  • GP-3424: 调整字体选择组合框的默认宽度
  • GP-3427: 更新 EXE 图标
  • 优化文本描述

错误修复:

  • GP-3392: 修复微软账户登录对话框中“忘记密码”链接
  • GP-3421: 修复打开游戏设置页时启动器崩溃的问题
  • GP-3422: 修复模组下载对话框中点击前置模组时,对话框不会关闭的问题
  • GP-3423: 修复对话框按钮自行移动的问题
  • GP-3425: 修复 HMCLauncher 无法正确识别 Windows on Arm 平台的问题

HMCL 3.5.9.259

  • GP-3378: 优化首页公告,添加隐藏按钮
  • 优化文本描述

错误修复:

  • GP-3379: 修复部分按钮无法用键盘触发的问题
  • GP-3380: 修复部分控件响应鼠标任意按钮点击的问题

HMCL 3.5.9.258

  • GP-3342, GP-3369, GP-3371: 优化 Java 下载功能
  • GP-3363: 支持下载 IBM Semeru Runtime (OpenJ9)
  • GP-3375: 支持微软账户上传皮肤
  • GP-3032: 检查模组更新界面加入全选/取消全选复选框
  • GP-3347: 当整合包没有描述时,隐藏查看整合包描述按钮
  • GP-3373: 更新模组下载页游戏版本列表至 1.21.3
  • GP-3364: 将自动下载的 JavaFX 版本提升至 17.0.13
  • GP-3287: 优化文本描述

错误修复:

  • GP-3352: 修复无法安装 zip 格式的 Java 安装包的问题

HMCL 3.5.9.257

  • GP-2988: 添加 Java 管理页面,优化查找、下载、自动选择 Java 等功能 (BV1WvCUY4EwK
  • GP-3262: 优化模组下载页面按钮的翻译文本
  • GP-3313: 启动时不再检测 Fractureiser 病毒
  • GP-3280: 在删除账户和认证服务器时弹出确认提示
  • GP-3314: 优化 Linux/FreeBSD 平台上显示的系统信息
  • GP-3282: 发现更新弹窗添加取消按钮
  • GP-3321: 移除对 WebView 的依赖,使用 Jsoup 解析并渲染 HTML
  • GP-3088: 隐藏整合包安装页面上的整合包文件位置
  • GP-3278: 调换游戏管理侧边栏上“自动安装”和“模组管理”的顺序
  • GP-3237: 设置页面添加打开启动器日志文件夹按钮
  • GP-3264: 在 Linux LoongArch64 平台支持 Minecraft 1.20.2+
  • GP-3234: 在安装新游戏版本页面的默认游戏版本名称中包含已选择的加载器名称
  • GP-3221: 模组管理搜索操作更改为文本更新后触发
  • GP-3325: 更新关于页面

错误修复:

  • GP-3324: 修复对话框标题和按钮未使用用户字体的问题

HMCL 3.5.9.255

  • GP-3233: 在 Linux/FreeBSD 平台打开日志、模组等位置时会选中该文件
  • GP-3274: 优化日志窗口
  • GP-3062: 支持从 SDKMAN! 默认目录查找可用 Java 路径
  • GP-3271: 隐藏版本管理的 Fabric API 和 QSL/QFAPI 自动安装选项
  • GP-3306: 模组等资源版本图标会根据标签自动调整样式

错误修复:

  • GP-3142: 修复日志窗口错误地将 authlib-injector 日志识别为 ERROR 类型

HMCL 3.5.9.254

  • GP-3256: 选择要安装的 Forge 版本时显示版本发布时间

HMCL 3.5.9.252

  • GP-3251、GP-3259: 支持从官方源下载 Forge

错误修复:

  • GP-3224: 修复部分游戏版本无法正常安装的问题
  • GP-3227: 修复模组详情页图标显示问题
  • GP-3260: 修复部分 CurseForge 翻译缺失的问题

HMCL 3.5.8.251

  • GP-3201 [重要]: 修复 HMCL 在 Java 8 上运行时游戏安装界面卡片布局的问题

HMCL 3.5.8.250

  • GP-3121、GP-3194 [重要]: 微软登录界面对 Xbox 400 错误给予提示
  • GP-3197: 优化对 Linux RISC-V 64、FreeBSD x86-64 平台的支持
  • GP-3058: 支持解析更多游戏版本号
  • GP-3181: 支持使用 HMCL_FONT 环境变量指定字体

错误修复:

  • GP-2838: 修复本地模组查看信息时标签错误的问题
  • GP-3066: 修复 CurseForge 搜索 API 对翻页总量计算不正确的问题;修复 下载 - 模组 切换下载源时不刷新页面的问题
  • GP-3114: 修复模组详情中即使无此游戏版本,仍会出现对应版本下拉栏的问题
  • GP-3117: 修复自动安装选项卡重新选择版本按钮消失的问题;修复 下载 - 游戏 选择游戏版本后窗口标题重复的问题;修复无法启动官方启动器安装的 1.21 的问题
  • GP-3126: 修复无法正确读取微软账户 Token 过期时间的问题
  • GP-3128: 修复 1.21 NeoForge 无法下载的问题
  • GP-3130: 修复 1.8 及 1.9 可能无法安装 OptiFine 的问题
  • GP-3133、GP-3136: 修复 1.7.10-pre4 版本 Forge 安装问题
  • GP-3160: 修复游戏启动过程中部分情况下点击取消按钮会导致启动器出错的问题
  • GP-3197: 修复部分平台无法运行 1.14 ~ 1.14.2 的问题
  • GP-3198: 修复无法同时安装 LiteLoader 与 Forge 的问题
  • GC-85b68ad: 修复 Linux 系统上无法找到 Mojang 提供的 Java 的问题

HMCL 3.5.8.249

  • GP-3113 [重要]: 修复无法启动部分 Forge 版本的问题

HMCL 3.5.8.248

  • GP-3023: 特定游戏设置 - 自动安装 中禁止升级或卸载由其他启动器安装的游戏组件
  • GP-3089: 优化 下载 - 模组 中模组版本推荐逻辑
  • GP-3097: 更新 Linux ARM64 支持
  • GP-3092: 移除 KOOK 入口

错误修复:

  • GP-3023: 修复 1.20.4 版本 Forge 和 OptiFine 同时安装的情况下游戏无法启动的问题
  • GP-3027: 修复低版本游戏在开启版本隔离后没有声音的问题
  • GP-3028: 修复 全局游戏设置 - 版本隔离 中错误展示路径的问题
  • GP-3081: 修复启动器退出时卡死的问题
  • GP-3082: 修复整合包 NeoForge 版本识别不正确的问题

HMCL 3.5.7.247

  • GP-2990: 更新指向 XZ 主页的链接
  • GP-3017: 在 Linux 系统上删除文件至回收站增加对 Cinnamon 桌面环境的支持
  • GP-3042: 对日志中 Someone is closing me! 不做检测(这是正常退出的提示)
  • GP-3045: 支持自动安装 Java 21
  • GP-3035: 在 macOS 环境下支持查找 Homebrew 安装的 Java
  • GP-3031: 适配新版本 NeoForge 模组,修复部分模组无法被正确识别的问题

错误修复:

  • GP-2994: 修复自动安装界面 NeoForge 图标在高分辨率屏幕上会很模糊的问题

HMCL 3.5.7.246

  • GP-2797: 添加更多日志分析规则
  • GP-2958: 重新加入对 MCBBS 的鸣谢

错误修复:

  • GP-2986 [重要]: 修复微软账户登录失败的问题
  • GP-2980: 修复整合包下载失败提示窗标题未正确格式化的问题
  • GP-2984: 修复日志文件夹不存在时无法将日志写入文件的问题
  • GP-2989: 修复导入部分整合包失败的问题

HMCL 3.5.7.245

  • GP-2950: 未设置字体时会尝试从当前路径寻找 font.ttffont.otf 并加载为默认字体
  • GP-2953: 清理残余 MCBBS 相关内容
  • GP-2951: 重新实现日志记录,保留最近 20 次启动的日志文件,退出时会压缩日志,并优化日志性能表现

HMCL 3.5.7.244

  • GP-2942: 支持更多格式的版本图标
  • GP-2943: 添加更多默认皮肤,目前已与最新 Minecraft 保持一致
  • GP-2948: 优化了启动时加载语言文件的性能

错误修复:

  • GP-2948: 修复模组下载界面展示“损坏的模组”时,语言始终为系统默认,无法跟随 HMCL 配置文件的问题
  • GP-2521: 添加外置登录时,应该请求并显示当前语言的外置登录服务端名称,而不是默认英文名称

HMCL 3.5.6.243

  • GP-2929: Modrinth 翻译文本将在缺失时显示原内容

错误修复:

  • GP-2939: 修复游戏启动时包装命令会被添加两次的问题的问题
  • GP-2936: 修复无法读取远古版本版本号的问题
  • GP-2933: 修复高版本变更离线皮肤可能不生效的问题
  • GP-2928: 修复自动更新整合包导出页面教程链接错误问题

HMCL 3.5.6.242

  • GP-2917: 不再尝试下载 .pack.xz 文件
  • GP-2921: 当系统属性 java.net.useSystemProxies 被设置为 false 时不再使用系统代理
  • GP-2856: 当加载网络背景图片超时时回退至默认背景,解决启动时卡死的问题
  • GP-2912: 当下载失败时,打印重定向链至日志

错误修复

  • GP-2919: 修复 Minecraft 1.6 之前的版本没有声音的问题
  • GP-2920: 修复了在 CurseForge 下载源中使用中文搜索无法呈现结果的问题

HMCL 3.5.6.241

  • GP-2904、GP-2915: 更新语言文件,使表达更精确
  • GP-2905: 更改语言选项添加重启后生效的提示
  • GP-2916: 在 CurseForge 下载源中搜索时始终会按照模组标题与关键词的相似性排序
  • GP-2885: 在 Linux 系统上且处于未知桌面环境时,禁用删除至回收站功能

错误修复:

  • GP-2908 [重要]: 修复微软账户登录失败的问题
  • GP-2804: 修复游戏非正常退出提示界面文字编码显示错误的问题
  • GP-2906: 修复未初始化 FileDownloadProvider 的问题

HMCL 3.5.6.240

  • GP-2862: 默认不进行降级更新(手动切换更新源时依然会正常提示)
  • GP-2888: 移除设置 - 赞助页面
  • GP-2889: 删除 Mojang 登录支持
  • GP-2897: 主界面移除联机大厅按钮,添加引导用户进入官方 QQ 群的按钮
  • GP-2886: 自动下载 Java 支持下载 Java 21

错误修复:

  • GP-2869: 修复下载 Java 不会尝试备用下载源的问题
  • GP-2871: 修复导出启动脚本时无法正确处理“游戏启动前执行命令”和“游戏结束后执行命令”的问题,现在会预解析命令
  • GP-2881: 修复无法安装带有 NeoForge 的 Modrinth 整合包的问题

HMCL 3.5.5.238

  • GP-2864: 改善在非 Windows 平台任务栏图标的质量

错误修复:

  • GP-2859: 修复 Forge 和 NeoForge 安装失败的问题

HMCL 3.5.5.237

错误修复:

  • GP-2840: 修复 Linux RISC-V 64 平台的支持
  • GP-2846: 修复使用 Java 19+ 启动游戏时,游戏 JVM 字符编码参数错误导致控制台乱码的问题
  • GP-2857: 修复搜索页面搜索结果为空,即总页面为 0 时点击最后一页按钮会跳转到不存在的页面导致无法正常使用的问题,现在会自动禁用该按钮
  • GP-2858: 修复 Windows 下自定义命令中使用 $INST_DIR 等带有反斜杠的内容会错误触发转义导致路径错误的问题
  • GP-2859: 修复启动器在版本 JSON 缺失 Patches 信息时无法获得游戏版本,导致游戏启动参数重复、管理版本表现不正确等问题

HMCL 3.5.5.236

  • GP-2836: 更新启动器发布页至官网,而不是 MCBBS
  • GP-2700: 优化游戏版本比较规则,现在模组下载界面能够正常排序 Minecraft 正式版、快照版或其他版本了
  • GP-2805: 默认开启自动选择并发数
  • GC-9361719、GC-420d77d、GP-2839: 移除 MCBBS 的下载源和鸣谢文本,介于其下载源已不再可用
  • GP-2801: 添加部分 CurseForge 的分类翻译文本
  • GP-2742: 支持在游戏崩溃提示界面显示 Fabric Loader 给出的警告信息
  • GP-2813: 当日志中含有部分常见报错信息时,即使进程退出代码为 0 也显示游戏崩溃提示界面
  • GP-2828: 支持检测 Forge 模组重复导致的游戏崩溃
  • GP-2834: 支持检测 Forge 安装不完整导致的游戏崩溃
  • GP-2785: 支持检测 JVM 堆内存不足导致的游戏崩溃
  • GP-2790: 支持检测 Forge 与高版本 Java 不兼容导致的游戏崩溃
  • GP-2760: 更新对 Linux RISC-V 64 系统的支持

错误修复:

  • GP-2745: 修复只会从 MCBBS 源下载 authlib-injector 的问题
  • GP-2746: 修复部分情况下修改并发下载数量会导致启动器崩溃的问题
  • GP-2756: 修复网络下载缓存当缓存索引文件所在目录不存在时会导致下载失败的问题
  • GP-2758: 修复 HMCL 背景网络图片 URL 输入框会持续触发网络请求的问题,现在仅会在输入结束后加载图片
  • GP-2768: 修复自动安装界面错误提示 Quilt 与 Fabric API 不兼容的问题,现在两者能够同时安装了
  • GP-2770: 修复 CurseForge 整合包启动时检测游戏完整性极其缓慢的问题,并支持显示进度条;修复光影包会被错误的安装至模组文件夹的问题
  • GP-2775: 修复本地 NeoForge 模组被错误地识别为 Forge 模组的问题
  • GP-2788: 修复选中使用非默认皮肤的离线账户时,启动器主页头像会被错误地显示为默认皮肤头像的问题,现在正常显示用户选择的皮肤头像
  • GP-2789: 修复皮肤预览界面 Alex 皮肤被显示为 Classic 模型的问题,现在会使用 Slim 模型
  • GP-2791: 修复世界管理界面下载按钮图标不正确的问题,使更加贴切其功能
  • GP-2799: 修复由低版本 HMCL 升级后,窗口位置不会显示在正中央的问题
  • GP-2810: 修复本地模组搜索功能无法正确处理大小写,导致有大写字母的模组永远不可能被搜索到的问题
  • GP-2811: 修复 Java 8 上 JavaFX 不存在时英文提示不正确的问题
  • GP-2827: 修复启动器主窗口隐藏后从日志窗口复制内容导致启动器崩溃的问题
  • GP-2835: 修复关于界面上启动器图标仍为旧版图标的问题

HMCL 3.5.5.235

  • 完善 Quilt 支持
  • 添加了对 NeoForge 的支持
  • 打开启动器时会验证 JavaFX 完整性
  • 放弃 EXE 版本与 Windows XP 的兼容性,如果需要可以使用 JAR 版本(当前版本的 EXE 版本并未放弃,在不久的将来会构建不支持 Windows XP 的 HMCLauncher 并分发。如果是从旧版本通过启动器更新升级到最新版本,则 HMCLauncher 并不会被覆盖修改,仍然支持 Windows XP)
  • 支持从 Modrinth 更新模组,会比对 CurseForge 和 Modrinth 取最新版本
  • 支持在模组管理和模组搜索中显示所支持的模组加载器
  • 支持日志窗口中的复制操作,选中要复制的行,按 Ctrl+C 即可
  • 日志窗口默认显示行数调整至 1000
  • 添加光影包文件夹和日志文件夹打开按钮
  • 在离线账户创建时对不合法的账户名做出警告
  • 游戏安装界面现在会隐藏不可用的模组加载器
  • 现在系统 GLFW 和系统 OpenAL 也可在 Windows 上使用
  • 在出现 InternalError 的时候提示用户 Java 损坏
  • 添加了翻页按钮,用户可以按照 50 个一页分页查找
  • 在从 CurseForge 上按照“名称”搜索排序时能正确按照相关度显示
  • 在中文搜索时会额外按照中文相关度排序
  • 移动依赖信息显示到模组/整合包/资源包文件详情界面,分依赖类型显示文件依赖详情
  • 资源选择页面会根据所选版本的模组加载器、游戏版本推荐最新的合适资源
  • 整合包安装界面添加跳转至搜索整合包页面的按钮
  • 将阿里镜像源替换至腾讯云镜像源
  • 不默认修改 forceUnicodeFont 游戏设置
  • 优化文件详情无效依赖的提示
  • 更新了启动器图标
  • 新增 OptiFine 图标
  • 支持查看 NBT 文件,将 NBT 文件拖动至主页面即可查看
  • 添加龙芯新世界支持
  • 添加了更多的日志分析规则
  • 支持导出待更新模组列表
  • 支持导出游戏运行栈文件
  • 适配高版本自动进入服务器功能
  • 对多个语言文件进行了更新和修正
  • 标题黑白颜色跟随主题设置
  • 优化游戏进程被 SIGKILL 信号终止时的提示
  • 网络请求支持 Gzip 解压
  • 等待启动游戏时显示假进度条
  • 记忆窗口位置,打开程序时会按照上次的窗口位置
  • 在模组管理页面点击搜索按钮时自动将光标定位到输入框
  • 将网络超时设置为 8000 毫秒
  • 支持在 Linux/FreeBSD 删除操作时移动至回收站
  • 优化日志性能
  • 支持复制账户的 UUID
  • 支持 FreeBSD x86-64
  • 添加帮助按钮

错误修复:

  • 修复自定义命令的一些问题
  • 修复游戏语言自动切换功能与不同版本的兼容性问题
  • 修复一些崩溃问题
  • 修复一些 MultiMC 整合包不会导入包内的文件的问题
  • 修复对 Windows ARM64 的支持
  • 修复对 Linux ARM64 的支持
  • 修复 Curse 整合包中包含资源包时 HMCL 不能正确识别的问题
  • 修复不会自动刷新微软账户的问题
  • 修复 Minecraft 1.19+ 在 Linux/macOS 下中文路径导致启动游戏崩溃的问题
  • 修复搜索模组/整合包/资源包等页面图标不会缓存的问题
  • 修复自动选择下载源功能的一些问题
  • 修复在资源下载详情界面链接文字显示不完整的问题

HMCL 3.5.4.234

  • 拒绝在被 Fractureiser 病毒感染的设备上启动 HMCL(若检测到将会提示并退出,详情
  • 检测 HMCL 是否处于 macOS 上的 App Translocation(macOS 使用了 App Translocation 机制,可能会自动将 HMCL 移动至 /private/var/folders 中的临时文件夹内,导致用户关闭 HMCL 后游戏数据和设置丢失)
  • 添加 Linux RISC-V 64 平台支持
  • 日志分析窗口中显示物理内存大小
  • 更新 Minecraft 购买链接
  • 添加删除游戏资源文件按钮
  • 优化 SSL 异常报错信息
  • 添加更多日志分析规则
  • 更新搜索版本号
  • 更新游戏版本号检测性能
  • 添加隐藏测试版提示开关
  • 更新翻译

错误修复:

  • 修复在 Minecraft 1.20 不能正常使用游戏内聊天功能的问题
  • 修复在 Windows on ARM 平台上的启动问题
  • 修复使用系统 GLFW 选项对 1.19+ 不生效的问题
  • 修复无法使用 macOS aarch64 JRE 启动部分版本的问题
  • 修复一些崩溃问题

HMCL 3.5.4.232

  • 添加环境变量设置
  • 添加渲染器设置
  • 将版本高级设置拆分至单独页面中
  • 在 Linux 上支持 MESA_LOADER_DRIVER_OVERRIDE 环境变量,适配 Zink 驱动程序

错误修复:

  • 修复日志分析窗口的渲染问题

HMCL 3.5.3.230

  • Quilt 相关功能完善
  • 默认将搜索排序修改为“热度”
  • 更新语言文件
  • 减小 JAR 文件体积
  • 优化性能,轻微降低内存占用
  • 不将默认的日志行数保存到配置中,使其导出崩溃日志中的 minecraft.log 不会受其行数限制

错误修复:

  • 修复 GIF 动图加载占用主线程的问题
  • 修复一些崩溃问题
  • 修复下载源选择框过长的问题
  • 修复添加冗余 G1 参数的问题

HMCL 3.5.3.229

  • 更新整合包、模组、资源包、世界搜索中页面游戏版本标签,并修改类别的顺序
  • 优化自动内存分配
  • 弃用 FXML,能够便于调试修改、优化资源占用和优化启动速度
  • 将 Little skin 更改为可选的登录选项
  • 启动时检查 HMCL 是否在临时路径中
  • 修改一些提示
  • 优化 Mod 列表加载速度
  • 优化对 Java 兼容性问题的检测
  • 更新全部图标,改善了高分屏上图标的显示质量
  • 在更新整合包中包含的 Mod 时弹出警告
  • 支持导出更多崩溃日志
  • 更新反馈页面
  • 减小 JAR 文件体积
  • 向非官方构建添加提示
  • x86-64 平台上不自动选择 32 位 Java
  • 建议 Forge 用户使用官方推荐版本的 Java 启动游戏
  • 默认在用户文件夹中存储账户信息,并添加 便携账户 和 全局账户 按钮切换
  • 优化日志分析
  • 添加模组列表搜索
  • 新添加 JVM 选项 hmcl.home,允许用户自行指定 HMCL_DIRECTORY

错误修复:

  • 修复导入整合包界面,整合包名称文本框验证失败时提示被遮盖的问题
  • 修复消息对话框内字体大小样式未生效的问题
  • 修复主题相关问题
  • 修复代理页面的提示问题
  • 修复游戏内存显示问题
  • 修复路径拼接问题
  • 修复了一些内存泄露问题
  • 修复使用 Java 9+ 构建的 HMCL 的问题

HMCL 3.5.3.228

  • 优化启动器资源占用
  • 优化游戏 JVM 参数,改善游戏性能
  • 优化高分辨率屏幕上图标的显示效果
  • 优化微软账户登录相关提示
  • 支持 Gif 格式背景图
  • 在微软账户登录弹窗中添加 忘记密码 按钮
  • 添加关于离线账户命名的提示
  • 更新整合包、模组、资源包、世界搜索中页面游戏版本与类别标签

错误修复:

  • 修复下载页卡顿的问题
  • 修复自动下载 Java 相关问题
  • 修复使用 Java 18+ 运行 Minecraft 时日志乱码的问题
  • 修复更新模组时可能崩溃的问题
  • 修复重复回滚 Mod 更新导致启动器崩溃的问题
  • 修复无法正确处理带有 Quilt 的 MultiMC 整合包的问题
  • 修复 Quilt 版本选择页未显示 Quilt 图标的问题
  • 修复 Mcbbs 整合包中 JVM 参数覆盖版本设置的问题
  • 修复使用 Java 8 运行时启动器标题显示 @develop@ 的问题
  • 修复使用 Java 8 运行时账户无法登录的问题
  • 修复使用 Java 8 运行时无法从 CurseForge 下载 Mod 的问题
  • 修复 macOS 上 Dock 中没有正确显示图标的问题
  • 修复导出整合包时在导出路径生成大量临时文件的问题
  • 修复修改版本设置时反复保存配置文件的问题
  • 修复未过滤部分整合包简介中颜色代码的问题
  • 修复 Mcbbs 整合包 JVM 参数覆盖版本设置的问题

HMCL 3.5.3.227

  • 多人联机功能暂时下线维护详情
  • 修复中文路径下启动 <= 1.12.2 的版本没有声音的问题
  • 修复 提示弹窗 的文本显示问题
  • 更新相关翻译
  • 优化未存在可用的 Java 环境启动 HMCL 时的提示

HMCL 3.5.3.223

  • 在启动游戏时刷新账户失败时提示重试登录
  • 修复在授权过期时不会显示重新登录对话框
  • 微软登录相关优化
  • 修复通过自动安装更新游戏时的崩溃
  • 支持 Github Action 的构建产物微软登录
  • 更多平台的原生适配
  • 修复在找不到合适的 Java 时启动时卡住的问题
  • 支持在 linux-loongarch64_ow 上自动下载 JavaFX
  • 更新翻译
  • 添加 sh 二进制文件支持
  • 修复 Modrinth 整合包安装
  • 更新多人联机
  • 日志分析器显示相关优化
  • 修复 Modrinth 格式的 Quilt 整合包安装错误
  • 修复 Modrinth 模组包解析错误
  • Quilt 自动安装相关调整
  • 修复下载 Java 链接错误

HMCL 3.5.3.222

  • 修复翻译错误
  • 适配 Apple Silicon Mac 与龙芯平台
  • 修复不会自动补全缺失的 OptiFine 文件的问题
  • 更新官方下载源链接
  • 修复 OptiFine 自动安装后启动崩溃的问题
  • 微软账户相关调整
  • 添加世界信息界面(允许玩家在启动器内查看更详细的世界信息以及调整一些基本设置)
  • 修复使用 Java 9+ 编译时的错误
  • 修复资源搜索获取信息失败相关问题
  • 添加 Quilt 自动安装
  • 回滚 HMCLauncher.exe ,减少杀毒软件报毒
  • 为非 x86 平台提供开箱即用的启动支持
  • 更新自动安装页面
  • 修复在创建账户页面下认证服务器未知的问题

HMCL 3.5.3.221

  • 支持在文件管理器中显示文件,或者在 Linux 中直接打开父目录。
  • 默认开启“自动选择合适的 Java”
  • 修复部分 UI 问题
  • 修复更换资源类别后不更新列表的问题
  • 修复无法获取前置模组信息
  • 更新翻译
  • 修复整合包的 mcmod 网址不正确问题
  • 修复无法将 mrpack 文件拖拽至主页面安装整合包的问题
  • 在 JDK 安装不完整时提醒重新安装
  • 修改微软账户上传皮肤链接

HMCL 3.5.3.220

  • 修复 CurseForge 整合包无法下载安装的问题

HMCL 3.5.3.219

  • 支持整合包下载页使用中文搜索
  • 支持下载安装 Modrinth 整合包
  • 修复在语言为英文时仍翻译 Mod 名称的问题
  • 修复离线模式帐户无法使用 LittleSkin 皮肤站的问题
  • 修复下载 Mod 和整合包时,没有显示下载进度的问题
  • 修复在 macOS 和 Linux 系统下不能打开模组文件路径的问题
  • 修复部分情况下因 Zip 包编码无法检测,以致无法安装整合包的问题
  • 修复无法启动包含 LabyMod 的游戏的问题
  • 在系统内没有检测到 Java 时,自动尝试安装 Java,而不只提示用户手动安装
  • 更新 cato 网站链接

HMCL 3.5.2.216

  • 修复在包含等于号的路径下运行时无法正确加载漏洞修复工具的问题
  • 修复 Mod 下载页选择 Modrinth 源时,排序选项不可用的问题
  • 修复下载游戏向导中,在某些情况下加载了错误的 Fabric API 列表的问题
  • 修复启动游戏时,如果 Java 版本不正确,某些情况下会导致启动器崩溃的问题
  • 修复某些情况下不能更新游戏版本为 Minecraft 1.18 所安装的 Forge
  • 修复多人联机页面在快速点击打开房间时导致启动器崩溃的问题
  • 修复删除离线帐户使用的本地皮肤文件后游戏不能启动的问题

HMCL 3.5.0.214

  • 重命名某个游戏版本后,该游戏版本将会被选中为当前游戏版本
  • 修复 cato 选项名称错误的问题
  • 修复 1.17/1.18 Forge 客户端不能启动的问题
  • 修复在定制离线帐户皮肤后,导出的游戏脚本不能正常启动游戏的问题
  • 修复 Mod 下载页面加载失败后点击刷新页面提示无反应的问题
  • 修复游戏崩溃分析窗口内显示了不知道是什么库的版本号的问题
  • 修复 Fabric-API 下载不完整的问题
  • 修复 Fabric-API 列表中存在与游戏版本不匹配的版本的问题

HMCL 3.5.0.213

  • 修复 Log4j 远程代码执行漏洞
  • 更新 cato 至 1.2.0

HMCL 3.4.212

  • 修复 Log4j 远程代码执行漏洞
  • 修复取消启动警告框后,启动游戏进度框不退出的问题

HMCL 3.4.211

  • 修复 Log4j 远程代码执行漏洞
  • 修复解压 zip 文件时丢失文件属性的问题

HMCL 3.4.210

  • 提示下载 Java 时,额外提供手动下载链接
  • 更新 cato 至 1.1.0
  • 修复部分页面进入时崩溃的问题
  • 修复设置系统环境变量 classpath 后游戏无法启动的问题
  • 修复删除所有游戏文件夹配置项后崩溃的问题
  • 修复删除游戏版本后不退出游戏设置页面的问题
  • 修复重命名游戏版本后游戏设置页面未刷新的问题

HMCL 3.4.209

  • 不再翻译 id 为 examplemod 的 Mod 名称以避免歧义
  • 如果在 macOS/Windows ARM 设备上使用 HMCL,HMCL 会优先使用 x86 的 JDK 运行游戏
  • 提供更多预设的游戏版本图标以供设置
  • 完善显卡驱动问题提示语
  • 完善 Linux 用户因使用 Java9+ 版本导致游戏崩溃的提示语
  • 导出游戏启动脚本时,可以导出 PowerShell 格式的脚本
  • 支持游戏需要 Java 8 时提示并下载 Java 8
  • 下载 Mod 时,可以自定义文件名称
  • 添加透明背景选项
  • 添加日语翻译
  • 更新俄语翻译
  • 兼容 TLauncher 游戏客户端
  • 联机: 修复使用 32 位 Java 时提示多人联机不支持当前平台的问题
  • 联机: 修复 NAT 检测状态一直为检测中的问题
  • 联机: 支持 Windows ARM64 平台
  • 联机: 更新 cato 至 1.1.1
  • 联机: 校验 cato 可执行文件的完整性,避免病毒等程序篡改 cato 导致安全风险
  • 联机: 缩短联机码长度,避免联机码中因为包含斜杠,与 QQ 的表情转义符冲突的问题
  • 修复 macOS 上不能启动远古版本游戏的问题
  • 修复启动器打开时提示找不到 DST ROOT CA X3 证书的问题
  • 修复因为调整了游戏进程优先级设置,导致游戏不能运行,提示命令行过长的问题
  • 修复游戏版本名过长时布局混乱的问题
  • 修复离线帐户披风显示错误的问题
  • 修复不能复制游戏实例的问题
  • 修复不能选择自定义 Java 路径的问题
  • 修复不能修改没有 jar 文件的游戏实例的问题
  • 修复远古测试版启动时提示需要 Java 7 的问题
  • 修复背景网址不合法时启动器背景全透明的问题
  • 修复 Linux 下无法启动在中文目录下的游戏的问题
  • 修复下载 Java 失败时提示启动器崩溃的问题
  • 修复取消下载 Java 时无法取消游戏启动进程的问题

HMCL 3.4.208

  • 运行环境缺少 JavaFX 时,直接开始下载而不是等待用户选择下载源
  • 修复联机断联的问题

HMCL 3.4.207

  • 在杀毒软件删除 cato 时,弹出警告提示,而不是崩溃启动器
  • 资源包下载页面添加版本选择
  • 微软账号登录时被服务器要求重新手动登录时弹出登录提示框而不是登录失败
  • 修复运行在 32 位 Java 上时不能正确提示游戏不应使用 32 位 Java 运行的问题
  • 修复模组页、游戏下载页等页面标签错乱的问题
  • 修复游戏崩溃报告窗口不显示内存和 Java 版本的问题
  • 修复联机加入房间失败时将连接无法建立显示为被房主踢出的问题

HMCL 3.4.206

  • 联机: 更新 cato 至 1.0.c,支持 macOS M1 芯片设备
  • 联机: 网络测试改用快速测试方法
  • 联机: 添加加入申请选项,默认不再需要房主手动同意加入申请
  • 联机: 在需要房主手动同意加入申请时,提供 30 秒超时,超时后自动拒绝申请
  • 在调试选项下和本地目录设置下显示警告信息
  • 离线账户皮肤选择本地文件时,允许修改人物模型为 Slim
  • 启用标题栏透明选项时,标题栏背景色调为半透明
  • 现启动器更新通道将与启动器本身发布为开发版或稳定版绑定,避免玩家使用开发版时因为忘记调整更新通道,不能收到后续开发版更新推送
  • 修改页面跳转动画
  • 修复游戏崩溃报告页面崩溃的问题
  • 修复进入联机页面时没有下载 cato 的问题
  • 修复离线账户皮肤选择 Blessing Skin 时,网址末尾添加斜杠会无法加载皮肤的问题
  • 修复复制游戏实例时崩溃的问题
  • 修复点击反馈页面空白处弹出反馈详细信息页面的问题
  • 修复批量更新模组时,将 Forge Mod 更新为 Fabric Mod 的问题

HMCL 3.4.205

  • 添加联机房间准入功能,房主同意后玩家才能加入房间
  • 添加联机房间管理功能,可以查看已经在房间中的玩家
  • 添加联机 Token 设置和中继模式
  • 联机时不再需要正版登录,但玩家必须在多人游戏页面直连 HMCL 多人联机房间
  • 添加修改离线账户皮肤的功能,允许使用本地图片和 LittleSkin 等皮肤站
  • 添加自动选择 Java 选项,省去提示用户需要更改 Java 版本的步骤
  • 添加模组批量更新功能
  • 修改页面跳转动画
  • 支持导入由玩家手动打包的包含 .minecraft 文件夹的整合包
  • Fabric Mod 崩溃时提示 Mod 冲突或缺失前置 Mod 原因
  • 在全局游戏设置中提示当前版本正在使用游戏独立设置,以避免玩家在错误的地方修改设置
  • 支持 1.17 下 OptiFine 与 Forge 同时安装
  • 修复由于 Java 损坏导致无法检测 Java 版本时,启动游戏卡死的问题
  • 修复 Mojang 账号和 Authlib-Injector 账号登录时卡死,看不到密码框的问题
  • 修复 Mojang 账号和 Authlib-Injector 账号刷新时崩溃的问题

HMCL 3.4.203

  • 添加多人联机,由于处于试验阶段,如果出现问题请反馈
  • 调整界面外观
  • 背景路径支持网络链接
  • 允许修改启动器字体
  • 添加崩溃分析报告窗口,尽量分析崩溃信息,而不是直接打开日志窗口
  • Mod 下载页面按游戏版本分类
  • Mod 下载页面显示前置 Mod
  • EXE 版本优先选择独立显卡
  • 打开不检查游戏完整性选项时,同时不检查服务端自动更新整合包的更新
  • 修复点击 Mod 列表页 Mod 文件夹按钮后不能打开正确文件夹的问题
  • 修复下载 Mod 时无法取消的问题
  • 修复不能正确识别 MCBBS V2 整合包的问题
  • 修复 PATH 格式不正确时导致启动器崩溃的问题

HMCL 3.4.202

  • 更新至 JavaFX 17,额外支持 Mac M1 设备下自动下载 JavaFX
  • Authlib-Injector 认证服务器管理页面移动至账户管理页侧边栏
  • 支持修改离线账户的 UUID
  • Mod 管理页面和下载页面尽可能显示 Mod 的中文名称
  • Mod 下载页面允许中文搜索
  • Mod 下载页面允许选择搜索 CurseForge 或者 Modrinth
  • Mod 下载页面允许查看 Mod 的 MC 百科页面与 MCBBS 页面
  • Mod 下载页面允许选择要安装到的目标游戏版本
  • 下载页面首页修改为游戏安装页,而不是 Mod 下载页
  • 自动安装 Fabric-API 至新游戏的 Mod 目录
  • 微软登录时无法自动打开浏览器时允许手动复制链接
  • 修复微软登录时提示 NullPointerException 或者部分情况下的无法连接认证服务器的问题
  • 修复安装新游戏失败的问题
  • 修复自动选择内存大小后内存大小过小的问题
  • 修复返回主页卡死的问题
  • 修复 Mod 下载页无法显示 Emoji 字符的问题

HMCL 3.3.201

  • 添加帮助页面
  • 添加修改游戏进程优先级的功能
  • 任意页面按 ESC 键可返回上一页
  • 支持自动选择游戏内存大小
  • 添加 Linux 下使用系统 GLFW 及 OpenAL 的功能
  • 添加自动选择下载源的功能
  • 允许修改默认的下载并发数
  • 添加单独的下载页面,额外支持资源包和存档的下载功能
  • 更换默认背景图
  • 调整界面外观
  • 支持自动安装 Fabric-API(该功能尚未完成,需要在 Java 虚拟机参数中添加 -Dfabric.development 方能使用)
  • 修复微软登录成功页乱码的问题
  • 修复微软账号年龄不满 18 岁显示的错误信息不易于阅读等问题
  • 修复不能启动 PCL 安装的部分游戏的问题
  • 修复不能启动 Fabric 安装器安装的 1.18 版本的问题
  • 修复模组下载页面没有按时间排序的问题
  • 修复 Java 11 以上滚动条的样式问题
  • 修复部分 Linux 发行版下不能打开微软登录页面的问题

HMCL 3.3.200

  • 修复微软登录超时后崩溃的问题

HMCL 3.3.199

  • 在整合包下载页按回车也可以发起搜索
  • 支持我的世界中文论坛整合包规范第二版,兼容 CurseForge 整合包格式,允许导入 MultiMC
  • 重新设计关于页面
  • 修改创建账号页面
  • 新增赞助列表页面
  • 修复微软登录页可能白屏的问题
  • 修复微软登录很快过期的问题
  • 修复错误检测 Forge 版本号以至于不能导出正确的整合包的问题
  • 修复在主页按多次回车键会重复启动游戏的问题
  • 修复安装整合包时没有检查名字是否符合 Windows 文件名规范的问题
  • 修复 Forge 安装器部分内容仍需从官方源下载的问题

HMCL 3.3.197

  • 修复不能启动 Forge 1.17.1-37.0.29 及以上版本的问题
  • 修复英文语言设置下版本管理页面的标题错误的问题

HMCL 3.3.196

  • 修复进入 Mod 下载页面时崩溃的问题

HMCL 3.3.195

  • 添加查看模组详细介绍及打开其官方页面的功能
  • Mod 下载列表会按照发布时间排序
  • 修复 Mod 下载页面存在空白区域的问题
  • 修复操作账户时崩溃的问题

HMCL 3.3.194

  • 支持 CurseForge 整合包和 Mod 下载
  • 改进版本管理和游戏设置的界面
  • 修复不能启动 BakaXL 安装后的游戏的问题

HMCL 3.3.192

  • 支持 1.17 Forge 的自动安装与游戏启动
  • 修复不能正常启动 Minecraft 1.5 及以下版本的问题(需要手动删除 options.txt)

HMCL 3.3.189

  • 支持使用 Fabric 作为 Mod 加载器的 CurseForge 整合包
  • 修复尝试下载 Java16 时只有确定没有取消按钮的问题
  • 修复下载 Java16 时取消下载过程后启动器崩溃的问题
  • 自动选择新添加的 Authlib-injector 服务器
  • 修复安装整合包时可能崩溃的问题
  • 压缩了启动器本体文件大小
  • 修复 MCBBS 整合包实现不符合规范的问题
  • 允许在 Minecraft 自定义参数内使用 ${game_directory} 等占位符
  • 支持官方启动器为 Minecraft 启动参数提供的一些占位符
  • 允许在 Java 自定义参数内覆盖启动器默认提供的启动参数,而不需要再禁止启动器生成默认参数

HMCL 3.3.188

  • 自定义本地库路径,允许 M1 设备运行 ARM 版本的 Minecraft
  • 自动检测系统内安装的 OpenJDK,包括 Liberica/Microsoft/Zulu/AdoptOpenJDK
  • 修复 exe 版本不能正常下载 JavaFX 的问题
  • 修复 Windows 下打开使用 Unicode UTF-8 提供全球语言支持选项后启动器无法打开的问题

HMCL 3.3.186

  • 解决 Java 16 下部分 mod 不能正常运行的问题
  • 修复对系统平台的识别错误导致部分平台不能正确下载 JavaFX 的问题
  • 启动 Minecraft 1.17 时自动下载官方提供的 Java 16

HMCL 3.3.184

  • 修复 macOS 下启动器图标和 Finder 相同的问题,仅在 Java 9+ 生效
  • 修复与 Java 16 的兼容性问题
  • 允许在导出的整合包内包含启动器程序

HMCL 3.3.183

  • 修复服务端自动更新整合包不能更新游戏、Forge 版本的问题
  • 兼容 Java11+,在 Java 11+ 上运行时会自动下载 JavaFX
  • 修复不能识别部分数据包的问题
  • 刷新账户时将显示进度条
  • 上传皮肤时自动检测 Steve、Alex 模型

HMCL 3.3.181

  • 微软登录页添加加载进度条
  • 修复整合包导出页无法点击下一步的问题

HMCL 3.3.180

  • 支持我的世界中文论坛整合包标准
  • 修复下载失败的问题

HMCL 3.3.179

  • 修复微软账号在设置了皮肤之后不能登录的问题
  • 修复不能显示微软账号皮肤的问题

HMCL 3.3.178

  • 修复不能检测 20w45a+ 以上游戏的版本号
  • 修复同时只有一个文件在下载的问题

HMCL 3.3.177

  • 修复下载失败导致游戏无法启动的问题

HMCL 3.3.176

  • 支持微软正版账户登录
  • 支持 Authlib-injector 账户上传皮肤
  • 支持 Authlib-injector 服务器用邮箱以外的账户登录
  • 尝试修复在游戏启动后启动器直接关闭时导致游戏卡死的问题
  • 修复启动器设置 HTTP 代理后,游戏无法访问网络的问题
  • 修复下载支持库文件失败时启动器崩溃的问题

HMCL 3.3.175

  • 修复部分情况误修改 options.txt 的问题

HMCL 3.3.174

  • 允许第三方修改 HMCL 的 BMCLAPI 下载源,从而支持第三方下载源
  • 自动设置游戏的默认语言为中文
  • 修复因为线程过多导致在 macOS 系统上运行崩溃的问题
  • 修复重命名游戏版本点击移动窗口而不是移动光标的问题

HMCL 3.3.173

  • 修复启动 Minecraft 1.0 时不会停止等待游戏启动的问题
  • 更新游戏整合包后会显示新的版本号
  • 修复更新整合包下载地址不能使用在线下载自动更新整合包的问题
  • 修复首次打开整合包会弹出 3 个新建账户窗口的问题
  • 配置文件会优先选择启动器同目录而不是工作目录
  • 修复运行在 Java 12+ 时列表和下拉菜单不能正常显示的问题
  • 修复鼠标指针不正常的问题
  • 修复添加外置登录的正版账号后会与普通正版账号冲突的问题

HMCL 3.3.172

  • 添加窗口阴影
  • 添加为正版账号上传皮肤的功能
  • 现在会校验资源索引文件的完整性
  • 现在启动器代理设置对启动后的游戏有效
  • 自动安装页面将提示不兼容的第三方库,比如 Forge 和 Fabric 不兼容
  • 添加启动器的 JVM 参数 -Dhmcl.font.override=fontfamily 以允许 Linux 用户更换字体以解决白屏问题
  • 修复无法安装 Curse 整合包的问题
  • 修复下载资源文件时不能自动切换下载源的问题
  • 修复 1.5.2 及以下版本不能下载资源文件的问题
  • 修复 1.5.2 及以下版本安装 Forge 后启动失败的问题
  • 修复不能在 Java 17 下载 Forge 和自动更新的问题
  • 修复整合包配置丢失后整合包游戏版本不能修改配置的问题

HMCL 3.3.170

  • 修复部分情况下崩溃的问题
  • 支持同时安装 Minecraft 1.14.4 及以上版本的 Forge 和 OptiFine

HMCL 3.3.169

  • 修复 1.12.2 同时安装 Forge, OptiFine 时无法进入游戏存档的问题
  • 修复服务器自动更新整合包更新时可能会出现 AccessDeniedException 的问题
  • 现在会记住启动器上次使用的窗口大小
  • 游戏设置页面也可以安装游戏、添加整合包和刷新版本列表
  • 游戏设置页面可以修改默认启动游戏版本
  • 使用外置登录账户时,主页面的账户将显示认证服务器名称

HMCL 3.3.168

  • 将主界面的版本列表弹框的滚动条改为黑色
  • 修复某些情况下启动游戏时,提示 NullPointerException 的问题
  • 允许使用在启动器同目录下的 authlib-injector.jar 文件
  • 修复刷新下载列表时可能提示 ConcurrentModificationException 的问题
  • 修复重命名被依赖的版本后,会破坏其他依赖这个版本的版本的问题
  • 更正重命名版本时,输入不合法的新名字后的错误提示
  • 修复在自定义游戏运行目录时,输入不合法的路径会导致崩溃的问题
  • 修复在输入特定错误的 authlib-injector 服务器地址时会导致启动器崩溃的问题

HMCL 3.3.166

  • 修复进入游戏设置后无法重命名部分游戏版本的问题
  • 修复 Curse 整合包下载时遗漏 Mod 的问题
  • 修复部分情况下弹框消失的问题
  • 在 OptiFine 库缺失时可以自动补全

HMCL 3.3.165

  • 修复无法自动更新的问题

HMCL 3.3.164

  • 更新俄语翻译
  • 修复在“在游戏启动后关闭启动器”启用时游戏无法启动的问题
  • 修复弹出对话框时无法拖动窗口的问题

HMCL 3.3.163

  • 修复日志窗口无法清除日志的问题
  • 检查下载的 Fabric 安装包是否完整,避免 MCBBS 源带来的错误
  • 启动提示内存过大时允许停止启动

HMCL 3.3.162

  • 修复无法下载资源文件的问题
  • 修复无法同时安装 Forge 1.12.2 2852 和 OptiFine 的问题
  • 加强对支持库文件完整/损坏的检查能力

HMCL 3.3.161

  • 调整界面细节
  • 修复无法安装 Forge 1.12.2 2852 的问题
  • 提升与 ServerSync 的兼容性
  • 安装游戏向导内可直接切换下载源,而不需要返回启动器设置页面

HMCL 3.3.160

  • 主界面标题栏透明
  • 游戏崩溃后弹出的日志窗口直接显示游戏崩溃报告(而不是游戏日志)
  • 修复游戏崩溃后弹出的日志窗口无法显示日志的问题

HMCL 3.3.159

  • 调整界面细节
  • 在日志窗口添加导出游戏日志功能
  • 修复复制游戏实例后的新游戏无效的问题

HMCL 3.3.158

  • 调整界面细节
  • 修复游戏安装失败时提示安装完成的问题
  • 在自动安装 Forge、OptiFine 等库时若下载失败,自动重试其他下载源

HMCL 3.3.157

  • 更新俄语翻译
  • 在游戏设置页面添加重命名等只能在游戏列表操作的功能
  • 在自动安装页面可以删除已选择安装的第三方库
  • 添加复制游戏实例功能

HMCL 3.3.156

  • 修复 3.3.155 导致的启动失败问题
  • 在修改游戏版本时要求重新安装相关库

HMCL 3.3.155

  • 修复 3.3.154 导致的启动失败问题

HMCL 3.3.154

  • 修复 3.3.153 导致的启动失败问题

HMCL 3.3.153

  • 调整界面样式
  • 提升自动安装功能与其他启动器的兼容性
  • 修复快速切换游戏时可能导致的一些问题
  • 支持调整启动器窗口大小

HMCL 3.3.152

  • 调整界面样式
  • 修改默认下载源为 MCBBS
  • 允许在启动游戏按钮上滑动鼠标滚轮切换游戏
  • 显示资源和 Curse Mod 下载总进度

HMCL 3.2.151

  • 修复 3.2.150 部分游戏启动失败的问题
  • 修改 Mod、数据包页面的界面样式
  • 修复终止游戏后启动器不会停止等待的问题

HMCL 3.2.150

  • 加快界面动画速度
  • 改善游戏下载速度
  • 添加清理缓存文件夹按钮
  • 修改安装游戏向导的界面
  • 在启动游戏、安装游戏等界面显示总下载速度
  • 在资源索引文件为空时自动重新下载资源文件
  • 在当前下载源下载失败后自动重试其他下载源
  • 在删除 Mod、世界、数据包时弹出删除确认提示
  • 在启动游戏、安装游戏等界面显示明确的安装步骤
  • 在游戏崩溃后的第二次启动时自动检查资源和支持库文件是否完整
  • 修复启动器崩溃时可能再次崩溃的问题
  • 修复部分整合包无法修改启动时游戏窗口大小的问题
  • 修复在 Curse 整合包安装部分成功时删除游戏的问题
  • 修复从 MCBBS 下载源下载文件可能会下载到空文件的问题

HMCL 3.2.149

  • 在主界面账户栏添加鼠标悬浮提示以查看完整游戏名
  • 在主界面账户栏添加鼠标滚轮便捷切换游戏账户

HMCL 3.2.148

  • 更新 Fabric 的 BMCLAPI 和 MCBBS 下载源支持
  • 更新繁体中文语言文件
  • 当 Curse 整合包部分 Mod 因服务器上文件不存在而下载失败时不删除游戏

HMCL 3.2.147

  • 修复正版登录失败的问题
  • 修复无法正常显示错误信息的问题

HMCL 3.2.146

  • 改进部分错误提示
  • 更新繁体中文语言文件
  • 修复重复下载游戏依赖文件的问题
  • 修复原版游戏用熔炉图标标识的问题
  • 修复取消登录时导致启动器崩溃的问题
  • 修复无法取消启动过程和安装过程的问题
  • 修复无法正常更新 authlib-injector 的问题
  • 修复在缺失资源索引文件时无法启动游戏的问题
  • 现官方下载源下载 Forge 时依赖文件不再强制从 BMCLAPI 下载

HMCL 3.2.145

  • 修复无法取消下载的问题
  • 添加 MCBBS 下载源
  • 在资源索引文件不合法时尝试重新下载
  • 修复切换游戏版本后启动失败的问题

HMCL 3.2.144

  • 修复导入 HMCL 整合包时无法安装 Forge 的问题
  • 修复无法下载 Curse 整合包部分 Mod(如潘马斯)的问题
  • 修复下载 Curse 整合包 Mod 失败后会删除整合包的问题
  • 修复无法启动使用 Vivecraft 安装器新安装的游戏的问题
  • 修复启动 1.15 时不会停止等待的问题
  • 修复 Windows 下导出启动脚本对双引号的错误转义
  • 修复部分正版账号登录 1.7.10 会导致游戏崩溃的问题

HMCL 3.2.143

  • 修复关闭 JVM 检查时仍然会检查 java.exe 是否合法的问题
  • 修复下载服务端整合包没有对链接转义而无法下载的问题
  • 修复下载游戏时可能出现的 “HTTP 302” 错误
  • 导出整合包时将剔除所有日志文件和 CustomSkinLoader 的缓存

HMCL 3.2.139

  • 修复服务器整合包下载时可能丢失文件的问题
  • 修复读取 authlib-injectors.json 时对链接格式要求过严的问题

HMCL 3.2.138

  • 添加服务器自动更新整合包,允许服务器远程更新游戏客户端
  • 允许直接从给定链接下载整合包并安装
  • 日志窗口允许关闭自动滚动
  • 更新了英语翻译
  • 修复了部分情况下可能导致崩溃的问题
  • 修复了无法获取使用 authlib-injectors.json 添加的服务器的服务器名称的问题

HMCL 3.2.137

  • 更新了英语和俄语翻译
  • 修复了一些导致启动器崩溃的问题
  • 修复了无法识别 Java 12 的问题
  • 修复了无法下载 Curse 整合包模组的问题
  • 修复了下载 Curse 整合包失败后删除了对应版本的问题

HMCL 3.2.136

  • 修复 tryCacheLibrary 可能导致崩溃的问题
  • 修复无法安装 1.14.4 及 1.15 快照的问题

HMCL 3.2.135

  • 添加 authlib-injectors.json,允许服主将添加账号页面更改为默认添加指定服务器的 Authlib Injector 账户
  • 访问 https://www.huangyuhui.net/index.php/2019/09/09/109/ 以查看添加方法
  • 检查安装游戏时输入的名称是否符合 Windows 系统需求
  • 修复导出整合包导入时无法安装 1.13 Forge 和 OptiFine 的问题
  • 修复部分情况下无法下载 Forge 安装包的问题

HMCL 3.2.134

  • 修复了某些情况下无法安装 1.12.2 及以下版本的 Forge 的问题
  • 修复输入某些错误的 Java 路径时导致的崩溃
  • 修复了浏览 Mod 列表时可能出现的崩溃问题

HMCL 3.2.133

  • 新安装的游戏支持修改游戏版本
  • 支持在打开启动器后的主页面按回车键启动游戏
  • 支持游戏列表内点击列表项进入游戏设置,右键列表项打开游戏管理菜单
  • 修复 OptiFine 自动安装(需要重新安装 OptiFine 生效)
  • 修复无法从本地安装 OptiFine 的问题
  • 修复同时安装 Forge 和 OptiFine 自动安装失败的问题
  • 不再强制使用 java.exe

HMCL 3.2.132

  • 添加 Fabric 自动安装
  • 添加西班牙语
  • 支持导出 MultiMC 整合包
  • 修复无法下载 Curse 模组的问题

HMCL 3.2.130

  • 添加对 Fabric 模组的管理支持
  • 将游戏依赖的动态链接库解压到 .minecraft 中而不是系统临时文件夹
  • 在遇到 SocketTimeoutException 时弹窗提示用户超时
  • 在遇到 404 时提示用户找不到文件而不是 IOException
  • 在 HMCL 本体不完整时提示用户而不是崩溃
  • 在启动器更新时显示更新日志
  • 禁止导出 1.13.2 游戏整合包
  • 修复删除游戏版本时消息框重复显示的问题
  • 修复删除模组时可能出现的 NullPointerException
  • 修复尝试更新 OptiFine 时却没有可用版本时导致的崩溃
  • 修复刷新数据包列表时崩溃的问题
  • 修复不能导入 Fabric 官方网站提供的 MultiMC 整合包的问题
  • 修复启动器皮肤预览异常的问题
  • 修复 macOS 无法安装 1.13.2 Forge 的问题

HMCL 3.2.129

  • 在未安装 Mod API 的情况下禁用模组管理面板
  • 为自动安装中的 Forge、LiteLoader、OptiFine 添加更新按钮
  • 忽略游戏存档名中的颜色转移符
  • 隐藏游戏版本不匹配的游戏存档
  • 允许数据包列表页面多选
  • 修复无法下载安装 Forge 的问题
  • 修复下载失败后无法删除游戏版本的问题
  • 修复设置页面下方有大面积空白区域的问题
  • 回滚 JFoenix 组件库以修复一些 UI 的细节问题

HMCL 3.2.127

  • 禁止用户同时安装 Forge 1.13.2 和 OptiFine

HMCL 3.2.126

  • 重构任务执行器
  • 修复填写账号时崩溃的问题
  • 修复添加账号面板中认证服务器列表显示不正确的问题
  • 修复刷新版本列表时的卡顿问题
  • 修复无法刷新 Forge 列表的问题
  • 修复 Forge 1.13 安装问题

HMCL 3.2.124

  • 修复无法正版登录的问题
  • 修复 mods 不是文件夹时无法安装模组的问题

HMCL 3.2.123

  • 启动前检查是否是 Java 8~10
  • 模组管理面板支持多选
  • 下载库文件失败时提供更友好的提示
  • 只从 BMCLAPI 获取 Forge 列表
  • 添加 BMCLAPI 赞助信息
  • 修复头像不显示头盔层的问题

HMCL 3.2.121

  • 支持 Forge 1.13 的自动安装
  • 安装游戏时更新资源文件
  • 启动时下载缺失的 Minecraft 本体文件
  • 支持自动检测整合包自带的 Java 运行时
  • 更新 authlib-injector
  • 下载库文件失败时提供更友好的提示
  • 重构正版登录
  • 修复启动按钮无法根据背景颜色更改字体颜色的问题

HMCL 3.2.120

  • 修复打开版本管理时的崩溃

HMCL 3.2.119

  • 添加提示部分版本的 Forge 和 LiteLoader 不兼容的问题
  • 在模组管理面板添加加载进度条
  • 支持整合包拖拽到主页面打开安装向导
  • 支持新版 MultiMC 整合包的导入
  • 删除在版本管理页面中的删除游戏和重命名按钮
  • 加载游戏存档过程更加流畅
  • 在登录对话框中添加注册链接
  • 修复标题栏中没有显示返回主页按钮的问题
  • 修复保存设置时的潜在问题

HMCL 3.2.117

  • 提醒用户在修改版本独立选项时需要注意游戏文件的转移
  • 修复 Java 10 上 UI 错位的问题
  • 修复游戏认证服务器列表的渲染问题
  • 修复启动 Curse 整合包时尝试下载被禁用的模组的问题

HMCL 3.2.116

  • 在缓存目录无效时自动更改设置
  • 在安装游戏失败时删除不完全的游戏
  • 自动检测整合包、游戏存档、数据包的编码以增强兼容性
  • 在更新整合包时进行游戏文件的备份
  • 添加打开存档文件夹的菜单
  • 添加刷新模组列表的按钮
  • 支持拖拽游戏存档压缩包到游戏界面以便安装游戏存档
  • 修复皮肤图片文件损坏时导致的崩溃问题
  • 修复配置文件格式不正确时导致的崩溃问题
  • 修复 Curse 整合包更新失败的问题
  • 修复自动更新弹出气泡的界面错乱问题

HMCL 3.2.115

  • 修复安装游戏后不显示游戏的问题
  • 修复下载资源文件时潜在的崩溃问题

HMCL 3.2.114

  • 修复导入整合包时的乱码问题
  • 更新 authlib-injector
  • 从 Cursemeta 上下载 Curse 上被删除的 Mod 文件

更新时间:

diff --git a/changelog/stable.html b/changelog/stable.html new file mode 100644 index 0000000..cc39eb5 --- /dev/null +++ b/changelog/stable.html @@ -0,0 +1 @@ +稳定版更新日志 - HMCL 文档

Hits

本文由 未署名用户 创建。

Changelogs are written in Chinese.

HMCL 3.11.2

详细版本介绍 (Bilibili)

  • 账户
    • GP-5610: 优化设备代码流登录流程 (by Glavo)
  • 错误修复
    • GP-5550: 修复安装整合包时任务弹窗可能空白的问题 (by 辞庐)
    • GP-5549: 修复微软登录报错的超链接显示 (by Xirren)
    • GP-5584: 修复打开登录微软对话框时加载指示器一闪而过的问题 (by 辞庐)
    • GP-5585, GP-5602: 修复下载源失效时刷新版本列表不会回退到备用下载源的问题 (by Glavo)
    • GP-5575: 修复无法使用授权代码流登录微软账户的问题 (by 辞庐)

HMCL 3.11.1

详细版本介绍 (Bilibili)

  • 启动器
    • GP-5391: 将 XZ for Java 更新至 1.11 (by Glavo)
    • GP-5390: 将 TwelveMonkeys 更新至 3.13.0 (by Glavo)
    • GP-5392: 将 Gradle Shadow 插件更新至 9.3.1 (by Glavo)
    • GP-4733: 导出日志时允许重名文件 (by Glavo)
    • GP-5172: 支持通过拖动标题栏退出最大化 (by neveler)
    • GP-5259, GP-5272: 优化非法路径检查 (by 辞庐)
    • GP-5273: 优化游戏代理参数设置 (by Glavo)
    • GP-5274: 对 Java 26 默认启用压缩对象头 (by Glavo)
    • GP-5364: 在 NBT 查看器页面启用平滑滚动 (by Glavo)
    • GP-5426: 导出运行栈时附加 -e-l 参数 (by 辞庐)
    • GP-5462: 未安装实例时点击主页“开始游戏”按钮不选择不支持当前平台的版本 (by 辞庐, Glavo)
    • GP-5467: 自动展开 NBT 查看器中部分子标签 (by Calboot)
    • GP-5527: 增加弹窗图标与内容间距 (by 辞庐)
  • 游戏设置
    • GP-4975: 调整渲染器名称 (by Chen Meng)
  • 模组管理
    • GP-5029: 优化检查模组更新功能 (by Burning_TNT)
    • GP-5196: 使用 Forge/Quilt 加载器时模组管理页面应当扫描子文件夹 (by Wulian233)
    • GP-5296: 扫描模组子目录时忽略 .connector 文件夹 (by 辞庐)
  • 世界管理
    • GP-5215: 优化世界管理与世界信息页面 (by mineDiamond, 3gf8jv4dv, Glavo)
  • 账户
    • GP-5330, GP-5531, GP-5538: 优化微软登录流程,更新微软账户登录对话框 (by 辞庐, 3gf8jv4dv, Glavo)
  • 下载
    • GP-4792: 优化 Fabric API / Quilt API 安装提示 (by 辞庐, 3gf8jv4dv)
    • GP-5090: 支持 Legacy Fabric 自动安装 (by 辞庐)
    • GP-5250: Modrinth 默认不获取更新日志 (by Calboot)
    • GP-5304: 取消游戏下载页面中高版本游戏对 Windows 7/8/8.1 的不兼容提示 (by 辞庐)
    • GP-5394: Java 下载页面支持选择多个 Java 版本下载 (by NoClassDefFoundError, Glavo)
    • GP-5465, GP-5474: 优化下载页面条目中标签的展示方式 (by Glavo)
  • 外观
    • GP-5279: 更新下载页面条目样式 (by Glavo)
    • GP-5283, GP-5317, GP-5319: 优化深色模式支持 (by Glavo)
    • GP-5292, GP-5398: 更新文本输入框的右键菜单样式 (by 辞庐)
    • GP-5337: 使用 LineSelectButton 代替 JFXComboBox (by Glavo)
    • GP-5368: 自定义颜色对话框添加输入验证,阻止输入非法信息 (by WhatDamon)
    • GP-5395, GP-5408, GP-5416, GP-5446: 统一列表卡片样式 (by Glavo)
    • GP-5405: 统一加载指示器大小 (by 辞庐)
    • GP-5406: 统一实例管理页面子页面刷新时的样式 (by 辞庐)
    • GP-5422: 优化日志窗口无日志行的背景色 (by 辞庐)
    • GP-5456: 优化工具栏按钮图标 (by Glavo)
    • GP-5481: 优化设置页面检查更新设置项的样式 (by Glavo)
  • 本地化
    • 优化软件文案,修订简繁英翻译,清理过时翻译 (by 3gf8jv4dv)
  • 错误修复
    • GP-5012: 修复 Modrinth 模组依赖已经被删除的条目时无法加载版本列表的问题 (by Burning_TNT)
    • GP-5195: 修复导出 Modrinth 整合包时勾选“包含启动器”选项时导出的整合包不是 ZIP 格式的问题 (by 辞庐)
    • GP-5245: 修复主页公告阴影被裁切的问题 (by 辞庐)
    • GP-5265: 修复系统代理 JVM 参数格式 (by Xirren)
    • GP-5284: 修复部分列表页面出现横向滚动条的问题 (by Glavo)
    • GP-5299: 修复添加认证服务器对话框非 CJK 语言下宽度异常的问题 (by 辞庐)
    • GP-5300: 修复下载页面模组简介只会显示一行的问题 (by 辞庐)
    • GP-5308: 修复 JFXTabPane 指示器偏移的问题 (by 辞庐)
    • GP-5328: 修复弹出菜单在 RTL 布局下弹出位置错误的问题 (by 辞庐)
    • GP-5333: 修复启动服务端自动更新整合包时会下载并启用已禁用的模组的问题 (by Luo Chen)
    • GP-5369: 修复在 ZIP 文件中遇到重名目录条目时读取失败的问题 (by NoClassDefFoundError)
    • GP-5374: 修复不透明度数值标签可能被折叠的问题 (by NoClassDefFoundError)
    • GP-5375: 修复部分列表点击后无法通过 Esc 返回的问题 (by NoClassDefFoundError)
    • GP-5379: 修复版本设置页面滚动条总是显示的问题 (by Dime)
    • GP-5388: 修复导出的 PowerShell 脚本中路径可能无效的问题 (by Xirren)
    • GP-5411: 修复离线账户换肤对话框中对 Custom Skin API 地址的校验未生效的问题 (by 辞庐)
    • GP-5423: 修复安装游戏时选择版本后返回已选择的版本会被清除的问题 (by 辞庐)
    • GP-5432: 修复部分页面弹出菜单会被重复触发的问题 (by Glavo)
    • GP-5433: 修复部分环境中进入下载页面时启动器崩溃的问题 (by Glavo)
    • GP-5434: 修复日志级别选择按钮背景颜色溢出的问题 (by 辞庐)
    • GP-5449: 修复 SVG 图标对齐错误的问题 (by Glavo)
    • GP-5477: 修复部分页面意外的显示滚动条的问题 (by Glavo)
    • GP-5479: 修复无法正确识别 Minecraft 2.0 实例版本号的问题 (by Glavo)
    • GP-5480: 修复无法归一化版本号 “1.16.2 Pre-release 1” 的问题 (by Glavo)
    • GP-5508: 修复部分请求头中 Accept-Language 字段包含 Java 版本的问题 (by Glavo)
    • GP-5520: 下载游戏版本列表点击左侧图标无法触发水波纹效果、光标没有变成手型的问题 (by 辞庐)
    • GP-5522: 修复安装卡片部分区域点击无法触发水波纹效果的问题 (by 辞庐)

HMCL 3.10.4

详细版本介绍 (Bilibili)

  • 错误修复
    • GP-5265: 修复未正确为游戏设置 java.net.useSystemProxies JVM 参数的问题 (by Xirren)
    • GP-5508: 修复部分请求头中 Accept-Language 字段包含 Java 版本的问题 (by Glavo)
    • GP-5550: 修复安装整合包时任务弹窗可能空白的问题 (by 辞庐)
    • GP-5585: 修复下载源失效时刷新版本列表不会回退到备用下载源的问题 (by Glavo)

HMCL 3.10.3

详细版本介绍 (Bilibili)

  • 联机
    • GP-5504: 修复陶瓦联机无法正常使用的问题 (by Glavo)

HMCL 3.10.2

详细版本介绍 (Bilibili)

  • 世界管理
    • GP-5198: 将世界管理界面“生成启动脚本”按钮折叠到二级菜单 (by Glavo)
  • 错误修复
    • GP-5239: 修复下载页面滚动时图标未及时更新的问题 (by Glavo)
    • GP-5243: 修复实例列表中可能意外出现水平滚动条的问题 (by OrzMiku)
    • GP-5251: 修复自动安装界面卡片上按钮无法点击的问题 (by OrzMiku)
    • GP-5257: 修复 Cleanroom 本地安装完成后会删除安装器的问题 (by 辞庐)
    • GP-5261: 修复下载页面选择游戏版本对话框包含 _unobfuscated 版本的问题 (by Glavo)
    • GP-5262: 修复使用 GIF 背景时调整背景不透明度导致启动器崩溃的问题 (by Glavo)
    • GP-5267: 修复 Unzipper 解压空 zip 文件时抛出异常的问题 (by Glavo)
    • GP-5305: 修复返回页面时可能卡进空白页面的问题 (by 辞庐)
    • GP-5310: 修复点击实例列表条目的中央区域无法触发涟漪效果的问题 (by 辞庐)

HMCL 3.10.1

详细版本介绍 (Bilibili)

  • 启动器
    • GP-4289: 在添加游戏目录页面选择目录时自动填写名称 (by Dime, 辞庐, Glavo)
    • GP-4882: 取消部分控件的连点限制 (by 辞庐)
    • GP-5024: 使用副标题显示重启生效提示 (by neveler)
    • GP-5032: 优化文本输入对话框体验 (by mineDiamond)
    • GP-5035: 在非 Windows 平台也将文件名中的 : 视为非法字符 (by 辞庐)
    • GP-5056: 优化列表滚动时的性能 (by Glavo)
    • GP-5060: 优化独立窗口中对话框的样式 (by 辞庐)
    • GP-5062: 更新 NBT 标签图标 (by mineDiamond)
    • GP-5077: 优化设置页面内边距 (by neveler)
    • GP-5082: 更新关于页面的版权年份至 2026 (by 辞庐)
    • GP-5087: 更新启动按钮分隔符颜色 (by neveler)
    • GP-5088: 首页切换实例菜单仅在菜单高度大于最大高度时显示垂直滚动条 (by neveler)
    • GP-5101: 在进度指示器中添加圆角 (by 辞庐)
    • GP-5107: 使切换按钮垂直居中对齐 (by 辞庐)
    • GP-5108: 优化打包日志逻辑 (by 辞庐)
    • GP-5114: 优化部分页面的布局效果 (by neveler)
    • GP-5129: 优化输入框校验逻辑 (by 辞庐, Glavo)
    • GP-5150: 调整平滑滚动的截止速度 (by Glavo)
    • GP-5143, GP-5168: 优化对获取账号信息时发生 SSL 异常的处理 (by Xirren, 3gf8jv4dv)
    • GP-5182: 支持重置日志字体 (by 辞庐)
    • GP-5188: 仅在左键点击时触发 JFXRippler 波纹 (by Glavo)
  • 实例管理
    • GP-5059: 调整实例管理页面“浏览”菜单中条目的顺序 (by 3gf8jv4dv)
    • GP-5137: 允许重命名实例时使用原名 (by mineDiamond)
    • GP-5174: 优化存在大量实例的情况下的实例列表性能 (by Glavo)
  • 模组管理
    • GP-4832: 支持更新选中的模组 (by ZZZank)
    • GP-5016: 刷新模组列表不滚动到顶部 (by OrzMiku)
  • 世界管理
    • GP-4823: 优化世界管理界面和世界信息界面 (by mineDiamond, 3gf8jv4dv)
    • GP-5162: 优化存在大量数据包的情况下数据包管理页面的性能 (by mineDiamond)
    • GP-5224: 优化存在大量世界的情况下世界管理页面的性能 (by Glavo)
  • 整合包
    • GP-4897: 导出整合包时隐藏系统资源文件 (by Calboot)
    • GP-5119: 安装 Modrinth 整合包时下载图标 (by Glavo)
  • 账户
    • GP-4794: 优化微软登录页面 (by 辞庐, 3gf8jv4dv)
  • 下载
    • GP-5026: 限制访问 CurseForge/Modrinth 时的并发数 (by Burning_TNT)
    • GP-5180: 在资源包下载页面中隐藏不必要的标签 (by Glavo)
    • GP-5160: 优化下载页面中来自 Modrinth 的内容标签显示 (by ENC_Euphony)
    • GP-5211: 优化下载页面图标缓存功能 (by Glavo)
  • 联机
    • GP-4929: 将陶瓦联机更新至 0.4.1 (by Burning_TNT)
  • 本地化
    • 优化软件文案,修订翻译 (by 3gf8jv4dv)
  • 错误修复
    • GP-5034: 修复下载光影时对话框的标题文字错误的问题 (by Wulian233)
    • GP-5043: 修复导出整合包有关以及 NBT 文件查看有关的界面样式及深色模式问题 (by Calboot)
    • GP-5064: 修复弹出菜单在 HiDPI 显示器上播放动画过程中内容 Y 轴方向缩放异常的问题 (by Glavo)
    • GP-5076: 优化不透明度滑块未垂直居中的问题 (by neveler)
    • GP-5080: 修复外置登录对话框在部分情况下未正确验证用户名的问题 (by Glavo)
    • GP-5081: 修复无法读取 AppliedE 模组信息的问题 (by Glavo)
    • GP-5086: 修复安装游戏时选择加载器版本后返回动画方向不正确的问题 (by 辞庐)
    • GP-5091: 修复部分版本无法正确归一化的问题 (by mineDiamond)
    • GP-5102: 修复文本输入框的上下文菜单未使用 MD3 色彩系统的问题 (by Glavo)
    • GP-5111: 修复复制游戏实例相关问题 (by 辞庐)
    • GP-5112: 修复添加实例目录页面有一个空 Tooltip 的问题 (by 辞庐)
    • GP-5117: 修复离线换肤对话框提示栏和按钮重叠的问题 (by NoClassDefFoundError)
    • GP-5118: 修复部分平台弹出菜单无法通过点击侧边栏收起的问题 (by 辞庐)
    • GP-5131: 修复缓存目录设置进入时默认未勾选的问题 (by 辞庐)
    • GP-5133: 修复第三方构建下禁用账户刷新的 tooltip 展示不支持的超链接标签的问题 (by Wulian233, 3gf8jv4dv)
    • GP-5144: 修复 FetchTask 未捕获部分异常的问题 (by Glavo)
    • GP-5146, GP-5148, GP-5151: 修复无法读取部分包含特殊字符的整合包的问题 (by Glavo)
    • GP-5153: 修复窗口重新获取焦点时 JFXRadioButton 显示阴影的问题 (by Glavo)
    • GP-5166: 修复未下载陶瓦联机时打开陶瓦联机页面抛出异常的问题 (by Glavo)
    • GP-5167: 修复游戏设置中 Java 路径过长时可能与 Java 版本号标签冲突的问题 (by ENC_Euphony)
    • GP-5170: 修复无法安装 Aether Enhanced 整合包的问题 (by 3gf8jv4dv)
    • GP-5178: 修复窗口重新获取焦点时 JFXButton 意外地显示阴影的问题 (by Glavo)
    • GP-5179: 修复窗口重新获取焦点时 JFXCheckBox 意外地显示阴影的问题 (by Glavo)
    • GP-5183: 修复重置字体后未遵循 hmcl.font.override/HMCL_FONT 设置的问题 (by 辞庐, Glavo)
    • GP-5184: 修复安装页面选择模组加载器按钮波纹没有正常显示的问题 (by 辞庐, Glavo)
    • GP-5186: 修复弹出菜单在 Windows HiDPI 显示器上异常模糊的问题 (by 辞庐)
    • GP-5197: 修复默认窗口大小下进入高级版本设置会向下滚动一段距离的问题 (by 辞庐)

HMCL 3.9.2

详细版本介绍 (Bilibili)

  • 启动器
    • GP-5046: 禁用日志窗口的平滑滚动效果 (by Glavo)
    • GP-5052: 优化列表的平滑滚动效果 (by Glavo)
    • GP-5110: 更新 NeoForge 版本号规则 (by 辞庐)
  • 错误修复
    • GP-5128: 修复使用 BMCLAPI 下载源时选择 Liteloader 版本时可能报错的问题 (by Wulian233)
    • GP-5125: 修复未正确归类 NeoForge alpha 版本的问题 (by 辞庐)
    • GP-5220: 修复 CurseForge 源无法搜索到内容的问题 (by Glavo)

HMCL 3.9.1

详细版本介绍 (Bilibili)

  • 启动器
    • GP-4837: 实验性支持阿拉伯语 (by Hommam-Prom)
    • GP-4911, GP-4963: 添加对 1.21.11_unobfuscated 及其预发布版的支持 (by mineDiamond)
    • GP-4927: 在 macOS 平台上导出启动脚本时支持导出 .command 文件 (by WhatDamon)
    • GP-5019: 使用子标题注解“提前预览 HMCL 版本”选项 (by neveler)
    • GP-5008: 优化反馈页面 (by Glavo)
  • 游戏设置
    • GP-4144: 添加输出游戏调试日志选项 (by 辞庐)
  • 实例管理
    • GP-4475: 添加资源包管理功能 (by 辞庐)
    • GP-4872: 添加快速进入世界功能 (by mineDiamond)
  • 账户管理
    • GP-4932: 在主页右键点击账户按钮时弹出快速切换账户菜单 (by zimzaza4)
  • 外观
    • GP-4835: 更新至 Material Design 3 颜色系统 (by Glavo)
    • 支持深色模式 (by Glavo, Wulian233, neveler)
    • GP-4854: 更新表格控件的样式 (by Calboot)
    • GP-4865: 更新颜色选择器样式 (by Glavo)
    • GP-4915: 在 HintPane 提示框中为图标和文本添加间距 (by neveler)
    • GP-4951: 更新选择框下拉菜单滚动条样式 (by Glavo)
    • GP-4964: 更新表格中复选框的样式 (by Glavo)
  • 下载
    • GP-4856: 优化下载源选择逻辑 (by Glavo)
    • GP-4990: 支持下载 Java 25 (by OrzMiku)
  • 联机
    • GP-4869: 在陶瓦联机页面向非中国内地用户添加提示框 (by Glavo)
    • GP-4916: 在陶瓦联机界面启动游戏时禁用离线皮肤功能 (by Glavo)
  • 错误修复
    • GP-4857: 修复惯性滚动可能导致弹出菜单错位的问题 (by Glavo)
    • GP-4871: 修复修改主题色后 JFXCheckBox 颜色不会及时变化的问题 (by Glavo)
    • GP-4874: 修复 JFXRadioButton 在 Windows 平台上中心圆点偏移的问题 (by Glavo)
    • GP-4895: 修复模组更新列表界面按 esc 无法正确退出的问题 (by Calboot)
    • GP-4935: 修复本地安装新版本 Forge 时未移除版本号中 forge- 前缀的问题 (by 辞庐)
    • GP-4946: 修复模组管理页面中 OptiFine HD U G6 pre1 与 CurseForge 上的无关模组相关联的问题 (by Burning_TNT)
    • GP-4945: 修复无法识别部分 Forge/NeoForge 模组的问题 (by Burning_TNT)

HMCL 3.8.2

详细版本介绍 (Bilibili)

  • 启动器
    • GP-4886: 优化对 Linux MIPS64el 平台的支持 (by Glavo)
    • GP-4917: 支持 Minecraft 新版本号规则 (by Glavo)
  • 错误修复
    • GP-4850: 修复 FetchTask 未设置 User-Agent 的问题 (by Glavo)
    • GP-4913: 修复游戏进程结束时点击日志窗口的“结束游戏进程”按钮会导致启动器无响应的问题 (by Glavo)
    • GP-4981: 修复从 BMCLAPI 下载部分旧文件时校验失败的问题 (by Glavo)

HMCL 3.8.1

详细版本介绍: cv43836921

  • 启动器
    • GP-4703, GP-4743: 优化更新日志展示功能 (by Glavo)
    • GP-4696: 在外链按钮上添加 tooltip (by neveler)
    • GP-4749: 恢复对 JavaFX 14 的兼容性 (by Glavo)
    • GP-4760: 从注册表中读取 Windows 版本信息 (by Glavo)
    • GP-4540: 删除实例失败时弹出对话框 (by Glavo)
    • GP-4770: 更新模组数据 (by Glavo)
    • GP-4776: 优化游戏实例默认图标 (by Glavo)
    • GP-4672: 优化数据包管理功能 (by mineDiamond)
    • GP-4612: 增强解析数据包/资源包元数据的能力 (by mineDiamond)
    • GP-4826: 从首页打开子页面时打开默认标签页 (by Glavo)
    • GP-4845: 更新 amdgpu.ids (by 辞庐)
  • 外观/动画
    • GP-4780, GP-4790, GP-4803, GP-4815: 优化界面动画效果 (by Glavo)
    • GP-4698: 被打包为 .app 文件时使用 .app 文件内置的 Dock 栏图标 (by 风花AnemoFlower)
    • GP-4779: 预加载页面以减少动画卡顿 (by Glavo)
    • GP-4762: 在 macOS 平台使用系统默认最小化动画 (by Damon Lu)
    • GP-4809: 在更多页面上启用平滑滚动 (by Glavo)
  • 本地化
    • GP-4709: 本地化下载速度显示 (by Glavo)
    • 优化软件文案,修订翻译 (by 3gf8jv4dv, Glavo)
  • 错误修复
    • GP-4775: 修复无法获取部分远古版本版本号的问题 (by Glavo)
    • GP-4783: 修复模组管理页面点击搜索按钮后未聚焦到搜索栏的问题 (by mineDiamond)
    • GP-4805: 修复复制实例时使用非法实例 ID 启动器行为异常的问题 (by Haowei Wen)
    • GP-4844: 修复缓存异常时下载任务无限循环的问题 (by Glavo)

HMCL 3.7.6

详细版本介绍: cv43836292

  • 下载
    • GP-4767: 添加对 25w45a_unobfuscated 的支持 (by Glavo)
    • GP-4782: 添加对 25w46a_unobfuscated 的支持 (by Glavo)
    • GP-4829: 添加对 1.21.11-pre1/2_unobfuscated 的支持 (by mineDiamond)
    • GP-4841: 更新 HMCL 元数据链接 (by Glavo)
  • 联机
    • GP-4816: 更新陶瓦联机用户须知 (by Glavo)
    • GP-4838: 将陶瓦联机更新至 0.3.14 (by Burning_TNT)
  • 错误修复
    • GP-4795: 修复初次打开部分页面时页面闪烁的问题 (by Glavo)
    • GP-4808: 修复 Windows 下全局设置中本地库路径路径分隔符显示错误的问题 (by 辞庐)

HMCL 3.7.5

详细版本介绍: cv43648491

  • 启动器
    • GP-4742: 更新 Chunkbase 种子地图链接 (by Wulian233)
  • 联机
    • GP-4723: 将陶瓦联机更新至 0.3.13 (by Burning_TNT)
    • GP-4735: 在不支持的平台上打开陶瓦联机页面时弹出提示 (by Glavo)
  • 错误修复
    • GP-4736: 修复 FreeBSD x86-64 平台上错误的将所有版本视作未经测试的版本的问题 (by Glavo)

HMCL 3.7.3

详细版本介绍: cv43540463

  • 启动器
    • GP-4727: 将官方群组入口重新移动到主界面 (by Glavo)
  • 联机
    • GP-4724: 将陶瓦联机更新至 0.3.12 (by Burning_TNT)
  • 错误修复
    • GP-4721: 修复 JFXListViewSkin 创建大量平台线程的问题 (by Glavo)

HMCL 3.7.2

详细版本介绍: cv43439723

  • GP-4682: 将陶瓦联机更新至 0.3.10 (by Burning_TNT)
  • GP-4688: 调整陶瓦联机界面左侧按钮 (by Glavo)
  • GP-4686: 优化陶瓦联机用户须知对话框 (by Glavo)
  • GP-4687: 优化陶瓦联机的复制邀请码功能 (by Glavo)
  • GP-4700: 当且仅当用户位于中国大陆地区时尝试从镜像源下载陶瓦联机 (by Burning_TNT)
  • GP-4705: 在陶瓦联机界面的启动游戏按钮中显示当前实例名称 (by Glavo)

HMCL 3.7.1

详细版本介绍: cv43400451

  • 启动器
    • GP-4452: 将最低 Java 版本提升至 Java 17 (by Glavo)
    • GP-4454: 将默认 JavaFX 版本更新至 21.0.8/25 (by Glavo)
    • GP-4439: 更新模组和整合包数据 (by Glavo)
    • GP-4064: 优化主页公告关闭按钮 (by 辞庐)
    • GP-4145: 在 Windows 平台优先使用注册表探测 GPU (by Glavo)
    • GP-4163: 通过主页右下角弹出菜单切换版本后隐藏菜单 (by Glavo)
    • GP-4142: 忽略 %ProgramFiles%\Common Files\Oracle\Java 中的 Java (by Glavo)
    • GP-4180: 支持搜索不包含 release 文件的 Java (by Glavo)
    • GP-4201: 为弹窗文本添加平滑滚动 (by 辞庐)
    • GP-4203: 优化弹出菜单的默认弹出位置 (by ENC_Euphony)
    • GP-4051: 导出日志时附带最近日志 (by Zkitefly)
    • GP-4179: 支持搜索 ./.hmcl/java 目录中的 Java (by Glavo)
    • GP-4248: 在未安装游戏版本时支持一键下载启动游戏 (by Glavo) (BV1BbYxzNEFE)
    • GP-4246: 将 authlib-injector 嵌入启动器 (by Glavo)
    • GP-4260: 支持最大化和全屏模式 (by Glavo)
    • GP-4276: 优化版本号排序规则 (by Glavo)
    • GP-4282: 优化对 Indev 版本的支持 (by Glavo)
    • GP-4292, GP-4306: 优化显示进度对话框 (by Glavo)
    • GP-4294: 游戏崩溃窗口中增加对拍照的提醒 (by YuChuXi)
    • GP-4341: 更严格地检测文件名合法性 (by Glavo)
    • GP-4362: 优化语言设置选项中语言名称的显示方式 (by Glavo)
    • GP-4353: 优化自动切换游戏语言功能 (by Glavo)
    • GP-4414: 检测到配置文件由高版本启动器创建时禁止保存配置文件 (by Glavo)
    • GP-4487: 在未启用 JIT 或硬件渲染加速的环境中启动时弹出提示 (by Glavo)
    • GP-4506: 使用 Java 25 启动游戏时默认开启 Compact Object Headers (by Glavo)
  • 游戏设置
    • GP-4234: 优化游戏窗口大小选择功能 (by Glavo)
    • GP-4275: 基于实际屏幕分辨率添加游戏窗口分辨率选项 (by Wulian233)
    • GP-4507: 游戏设置中添加「不自动添加 Java 虚拟机优化参数」选项 (by Glavo)
    • GP-4515: 优化 Java 自动选择规则 (by Glavo)
  • 实例管理
    • GP-4222: 在实例名称中包含非字母、数字、减号和下划线字符时弹出警告 (by Glavo)
    • GP-4509: 支持在主界面「实例管理」按钮上通过滚动滚轮切换游戏实例 (by Glavo)
  • 模组管理
    • GP-3230: 支持根据更多信息搜索模组 (by Zkitefly)
    • GP-3231: 优化模组中文译名匹配机制 (by Zkitefly)
    • GP-3229, GP-4621: 优化模组管理页面布局 (by Zkitefly, Glavo)
    • GP-4622, GP-4648: 优化模组加载器检测机制 (by Glavo)
    • GP-4641, GP-4652, GP-4654, GP-4658: 支持识别更多模组的元数据 (by Glavo)
  • 世界管理
    • GP-4263: 支持删除世界 (by Wulian233)
  • 整合包
    • GP-3716: 支持导出 Modrinth 整合包 (by Zkitefly)
  • 下载
    • GP-4272: 支持自动安装 Cleanroom (by 辞庐, zkitefly)
    • GP-4141: 优化游戏下载页版本分类功能 (by Glavo)
    • GP-4249: 游戏下载页面中使用史莱姆块作为愚人节版本的图标 (by Wulian233)
    • GP-4471: 在游戏下载界面中显示当前平台对每个版本的支持状态 (by Glavo)
    • GP-4268: 在 NeoForge 下载页面中添加正式版/快照分类 (by Wulian233)
    • GP-4167, GP-4169, GP-4462: 优化下载缓存功能 (by Glavo)
    • GP-4219: 下载文件时启用透明 GZip 压缩 (by Glavo)
    • GP-4546: 支持通过 HTTP/2 协议下载文件 (by Glavo)
  • 外观
    • GP-4118: 添加字体抗锯齿算法设置选项 (by Glavo)
    • GP-4148: 在系统设置中禁用动画效果时,默认禁用启动器动画 (by Glavo)
    • GP-4510: 在未启用 JIT 或硬件渲染加速的环境中默认启动器禁用动画 (by Glavo)
    • GP-4164: 支持通过环境变量强制使用 GPU 渲染和控制动画帧率 (by Glavo)
    • GP-4184: 支持设置纯色背景 (by Glavo)
    • GP-3205: 支持修改背景的不透明度 (by 吞云)
    • GP-4205: 支持 APNG 动画图片 (by Glavo)
    • GP-4323: HintPane 使用新版 Bootstrap 调色盘 (by 辞庐)
    • GP-4521: 支持通过环境变量控制 UI 缩放比例 (by Glavo)
  • 联机
    • GP-4215: 在启动器中内置 Terracotta陶瓦联机 (by Burning_TNT)
  • 本地化
    • GP-4348: 添加文言翻译 (by Glavo, Andypsl8, Wulian233, dovisutu, 物灵, Bei Dou, 繁繁芙芙, Kaohaaa, 365KW, Andypsl8, Au0727, threwd, vinds476283)
    • GP-4346: 添加乌克兰语翻译 (by BANSAFAn)
    • GP-4527: 添加颠倒的英语翻译 (by Glavo)
  • 错误修复
    • GP-3976: 修复 Minecraft 1.5.2 安装 Forge 后无法正常启动的问题 (by Zkitefly)
    • GP-3956: 修复启动时会尝试补全服务端自动更新整合包中已禁用的 mod 的问题 (by Zkitefly)
    • GP-4239: 修复部分版本 wiki 链接不正确的问题 (by ENC_Euphony)
    • GP-4321: 修复世界管理页面不支持极限模式的问题 (by Wulian233)
    • GP-4350: 修复在部分简体中文环境中默认显示繁体中文的问题 (by Glavo)
    • GP-4386: 修复离线账户换肤功能使用无效 CSL API 会导致启动失败的问题 (by Glavo)
    • GP-4492: 修复 Windows 平台上 %APPDATA%\.hmcl 目录为跨驱动器符号链接时无法卸载 Java 的问题 (by Glavo)
    • GP-4514: 修复 AdvancedListBox 在非必要的情况下显示滚动条的问题 (by rootwhois)
    • GP-4517: 修复日志页面选中条目时 hover 背景闪烁两次的问题 (by rootwhois)
    • GP-4296: 修复切换下载源后需要重启启动器才会生效的问题 (by Glavo)
    • GP-4568: 修复在短时间内连续点击 OptionToggleButton 只会更改一次状态的问题 (by 辞庐)
    • GP-4585: 修复部分按钮点击后始终保持焦点状态的问题 (by Wulian233)
    • GP-4646: 修复 Minecraft 1.21.9+ 安装了 NeoForge 的实例未使用 NeoForge 图标作为实例图标的问题 (by 3gf8jv4dv)
    • GP-4624: 修复导出游戏崩溃信息后弹窗没有正常弹出的问题 (by 辞庐)
    • GP-4660: 修复模组下载页面图标模糊的问题 (by Glavo)

HMCL 3.6.20

版本介绍: cv43348716

  • 启动器
    • GP-4223: 在“设置 > 通用”添加“提前预览 HMCL 版本”选项 (by Glavo)
      详情请见完整更新日志: cv43348716
    • GP-4088: 当离线账户名称超过 16 字符时弹出警告 (by ShulkerSakura)
  • 下载
    • GP-4120: 更新 unlisted-versions-of-minecraft 镜像源地址 (by 8Mi_Yile)
    • GP-4626: 更新模组下载页游戏版本列表至 1.21.10 (by Glavo)

HMCL 3.6.18

版本介绍: cv43162536

  • 游戏管理
    • GP-4515: 优化 Java 自动选择规则 (by Glavo)
  • 错误修复
    • GP-4508: 修复使用 JavaFX 25 时游戏下载界面布局错误的问题 (by Glavo)
    • GP-4465: 修复启用代理身份认证且未设置密码时启动器崩溃的问题 (by Glavo)
    • GP-4466: 修复滚动切换游戏实例/账户功能 (by Glavo)

HMCL 3.6.17

版本介绍: cv43005407

  • 启动器
    • GP-4422: 弃用 Java 11 支持 (by Glavo)
    • GP-4164: 支持通过环境变量强制使用 GPU 渲染和控制动画帧率 (by Glavo)
    • GP-4179: 在 ./.hmcl/java 中搜索 Java (by Glavo)
    • GP-4365: 修复首次打开子页面时切换动画丢失的问题 (by Glavo)
    • GP-4439: 更新模组和整合包数据 (by Glavo)
    • GP-4414: 检测到配置文件由高版本启动器创建时禁止保存配置文件 (by Glavo)
  • 游戏管理
    • GP-4224: 支持在 Windows 7/8/8.1 上使用软渲染器 (by Glavo)
  • 下载
    • GP-4170: 模组下载列表翻页后自动回到顶部 (by 辞庐)
    • GP-4171: 支持加载 WebP 图标,解决部分模组/整合包图标无法加载的问题 (by Glavo)
  • 外观
    • GP-4185: 新增内存显示条禁用样式 (by OrzMiku)
  • 本地化
    • GP-4376: 将“版本”重命名为“实例” (by 3gf8jv4dv)
    • 优化软件文案,完善英语、西班牙语、俄语翻译
  • 错误修复
    • GP-4121: 修复多次启动游戏时内存泄露的问题 (by roj234)
    • GP-4066: 修复游戏版本列表错误地过滤掉部分版本的问题 (by Wulian233)
    • GP-4152: 修复导入异常格式的数据包时启动器崩溃的问题 (by Glavo)
    • GP-4241: 修复非 Windows 平台上游戏进程的 user.home 可能被设置为 null 的问题 (by Glavo)
    • GP-4437: 修复 backgroundType 为 null 时启动器崩溃的问题 (by Glavo)
    • GP-4153: 修复“下载线程数”的指示器被提示覆盖的问题 (by 辞庐)
    • GP-4238: 修复 RemoteMod::getIntegrityCheck 未选择正确的算法的问题 (by Glavo)
    • GP-4176: 修复整合包格式不匹配提示未被正确格式化的问题 (by 辞庐)
    • GP-4321: 世界管理页面添加对极限模式的支持 (by Wulian233)
    • GP-4192: 修复 LWJGL 路径显示错误的问题 (by 辞庐)

HMCL 3.6.16

  • 启动器
    • GP-4262: 更新 AMD 显卡信息 (by Glavo)
    • GP-4274: 更新 chunkbase 种子地图链接 (by Wulian233)
  • 错误修复:
    • GP-4174: 修复无法从 BMCLAPI 下载部分 NeoForge 所需文件的问题 (by 辞庐)

HMCL 3.6.15

  • 下载
    • GP-4085: 更新模组下载页游戏版本列表至 1.21.8 (by Glavo)
  • 错误修复
    • GP-4086: 修复安装 Oracle JDK 后可能无法使用启动器的问题 (by Glavo)
    • GP-4096: 修复无法使用部分日志字体的问题 (by Glavo)
    • GP-4097: 修复 InstallersPage 可能意外地显示滚动条的问题 (by Glavo)

HMCL 3.6.14

版本介绍: cv42290390

  • 启动器
    • GP-3938: 使用 Java 8 打开启动器时弹出弃用警告 (by Glavo)
    • GP-4032: 使用 Java 8 运行时禁止更新 (by Glavo)
    • GP-3854: 右键主页“启动游戏”按钮时展开版本列表菜单 (by Glavo)
    • GP-3875: 使用工作路径下的 .hmcl 文件夹存放所有配置文件 (by Glavo)
    • GP-3914: 启动时在日志中记录用户设备的 CPU 信息 (by Glavo)
    • GP-3893: 启动时在日志中记录用户设备的 GPU 信息 (by Glavo)
    • GP-3974: 更新日志中仅显示本次更新内容 (by Wulian233)
    • GP-4040: 更新模组数据 (by Glavo)
  • 游戏管理
    • GP-3734: 折叠高级设置中不适用于当前系统的选项 (by Wulian233)
    • GP-3951: 新增原理图管理界面 (by Glavo)
    • GP-3991: 新增世界管理页面 (by Glavo)
  • 整合包
    • GP-3547: 重构 MultiMC 整合包兼容功能 (by Burning_TNT)
    • GP-3836: 自动安装页面隐藏 mcbbs 项 (by 辞庐)
    • GP-3981: 忽略与版本 JSON 指定的 Java 相冲突的 Java 检测规则 (by Glavo)
  • 账户
    • GP-3823: 默认限制境外地区使用离线账户功能 (by Glavo)
    • GP-3853: 优化离线账户名称中包含非 ASCII 字符时的提示 (by Glavo)
    • GP-3860: 添加 XBox 封禁相关提示 (by 辞庐)
  • 下载
    • GP-2794: 支持下载光影 (by Burning_TNT)
    • GP-3247, GP-3799: 支持下载部分特殊版本 (by zkitefly)
    • GP-3830: 将模组/整合包/资源包的默认下载源调整为 Modrinth (by Burning_TNT)
    • GP-3876: 优化代理设置功能 (by Glavo)
    • GP-4011: 更新模组下载页游戏版本列表至 1.21.7 (by Glavo)
  • 外观
    • GP-3800: 优化整合包导出类型选择界面 (by Wulian233)
    • GP-3822: 统一导出和导入整合包页面样式 (by 辞庐)
    • GP-3944、GP-3949: 优化版本列表为空时,主页切换版本菜单的显示效果 (by GeneralK1ng)
  • 本地化
    • 优化软件文案,完善英语、西班牙语、俄语翻译
  • 错误修复
    • GP-3768: 修复模组下载界面无法正常翻页,以及类别会在切换下载源时出错的问题 (by Burning_TNT)
    • GP-3769: 修复离线账户切换模型时左侧 3D 预览不会即时更新的问题 (by Burning_TNT)
    • GP-3770: 修复 Windows 平台部分语言编码下无法打开 Minecraft 中文 Wiki 的问题 (by Burning_TNT)
    • GP-3771: 修复资源包和世界下载对话框标题为“模组下载”的问题 (by 辞庐)
    • GP-3772: 修复模组管理内“安装到当前版本”与“下载到本地文件夹”实际效果相同的问题 (by Burning_TNT)
    • GP-3776: 修复 LiteLoader 下载相关问题 (by Burning_TNT)
    • GP-3778: 修复 macOS 平台使用 Rosetta 2 转译运行启动器时无法正确识别系统架构的问题 (by YiZhiMCQiu)
    • GP-3793: 修复启动器更新下载对话框中有两个相同进度条的问题 (by Burning_TNT)
    • GP-3797: 修复无法打开游戏购买页面的问题 (by zkitefly)
    • GP-3806: 修复 RISC-V 平台游戏识别 CPU 名称出错的问题 (by Glavo)
    • GP-3814: 修复 Fabric Metadata 无效时 FabricInstallTask 抛出 NPE 的问题 (by Glavo)
    • GP-3817: 修复自定义背景图片路径包含无效字符时启动器崩溃的问题 (by Glavo)
    • GP-3826: 修复无法正常解析 NeoForge 愚人节版本的问题 (by Burning_TNT)
    • GP-3856: 修复导出过长日志时可能发生 OutOfMemoryError 的问题 (by Glavo)
    • GP-3863: 修复游戏崩溃分析窗口乱码的问题 (by Glavo)
    • GP-3866: 修复下载游戏内容页面搜索新内容时分页按钮未重置的问题 (by Wulian233)
    • GP-3874: 修复在已安装游戏版本的自动安装界面中游戏版本名称报红的问题 (by e74yp8)
    • GP-3877: 修复启动器退出时未压缩日志的问题 (by Glavo)
    • GP-3883: 修复当离线账户用户名中包含中文字符时,无法使用 LittleSkin 皮肤的问题 (by e74yp8)
    • GP-3888: 修复无法一键更新整合包的问题 (by mzdluo123)
    • GP-3901: 修复模组/整合包下载界面无法完整显示多行信息的问题 (by e74yp8)
    • GP-3922、GP-4036: 修复部分 Linux 环境中未正确选择默认字体的问题 (by Glavo)
    • GP-3942: 修复无法正确处理版本服务器地址设置中的 IPv6 地址的问题 (by Glavo)
    • GP-3968: 修复 Java 管理页面中无法添加 IKVM 的问题 (by Glavo)
    • GP-3995: 修复 Controller 未能读取 JAVA_VERSION_TIP 的问题 (by Burning_TNT)
    • GP-3996: 修复在 schematics 文件夹不存在的情况下,打开投影管理页面会抛出异常的问题 (by Glavo)
    • GP-3998: 修复模组搜索返回结果为空时下载界面异常的问题 (by Burning_TNT)
    • GP-4001: 修复自动安装界面中更改 MC 版本后无法点击安装键的问题 (by Burning_TNT)
    • GP-4007: 修复光影下载页面中标签名称未翻译的问题 (by Glavo)
    • GP-4009: 修复 macOS 上无法读取 CPU 信息的问题 (by Glavo)
    • GP-4015: 修复代码中的拼写错误 (by kfatyuip)
    • GP-4016: 修复 MultiMC 整合包中包含相同标识符的库时无法导入的问题 (by Burning_TNT)
    • GP-4065: 修复添加游戏文件夹页面缺少灰色背景的问题 (by 辞庐)
    • GP-4069: 修复使用 JavaFX 25 EA 时下载界面布局错位的问题 (by Glavo)

HMCL 3.6.12

版本介绍:cv41174209

  • 启动器
    • GP-3457: 实验性支持 WebP 格式的背景图片
    • GP-3523: 模组列表页中按下 ESC 键时取消选中
    • GP-3601: 更新模组数据
    • GP-3603: 支持临时隐藏预览版提示
    • GP-3610, GP-3613: 统一并优化软件内日期时间格式
    • GP-3619: 在启动器日志中记录处理器型号(仅 Windows)
    • GP-3620: 修改整合包下载对话框内「安装到当前版本」按钮的文本为「安装整合包」,修正对话框标题
    • GP-3621: 点击安装整合包时无条件关闭整合包下载对话框
    • GP-3629: 删除全局游戏设置页面的离线账户更换皮肤提示
    • GP-3628: 在版本的游戏设置中添加「复制全局游戏设置」选项
    • GP-3650: 点击账户卡片空白处时切换账户
    • GP-3653: 优化 NBT 查看器,修复无法打开空 mca/mcr 文件的问题
    • GP-3663: 启动时尝试从 HMCL_DIRECTORY 中加载字体
    • GP-3665, GP-3673: 支持双击复制世界信息、安装 Java 页面信息、模组详情对话框信息
    • GP-3689: 在世界管理界面显示世界图标
    • GP-3675: 更新 Microsoft 应用商店链接
    • GP-3711: 优化世界管理界面,新增备份世界页面
    • GP-3736: 优化账户信息卡片的显示效果
    • GP-3432: 优化滚动页面时的性能
    • GP-3747: 在日志中记录编码信息
    • GP-3749, GP-3750: 消除使用 Java 24 运行 HMCL 时控制台中的弃用警告
    • 优化软件文案,完善英语、西班牙语、俄语翻译
  • 下载
    • GP-3484, GP-3744: 更新模组下载页游戏版本列表至 1.21.5
    • GP-3517: 游戏下载页面添加搜索功能
    • GP-3244: 安装新游戏/整合包时检查版本名称是否包含非 ASCII 字符
    • GP-3476: 在 Linux RISC-V 平台为「下载 Java」对话框添加 banshanjdk-8 下载地址
    • GP-3605: 添加 NeoForge 的 BMCLAPI 代理支持
    • GP-3625: 允许用户在「下载 → 游戏」页面搜索时调整搜索范围
  • 外观
    • GP-3458: 降低窗口阴影质量以改善性能
    • GP-3442: 添加打开启动器时的窗口动画
    • GP-3652: 添加关闭启动器时的窗口动画
    • GP-3657: 添加最小化和还原启动器窗口的动画
    • GP-3666, GP-3677: 禁止标题栏按钮获取焦点
    • GP-3668, GP-3680: 优化动画效果
    • GP-3687: 更新全部图标至 Material Symbols
    • GP-3695: 优化离线登录对话框
    • GP-3723: 在游戏崩溃界面添加滚动条
    • GP-3729: 为更新日志对话框添加平滑滚动
    • GP-3730: 为世界信息页面和版本高级设置页面背景添加半透明遮罩
    • GP-3755: 更新 macOS Dock 栏图标
  • 跨平台
    • GP-3536: 优化对 Linux RISC-V 64 平台的支持
  • 错误修复
    • GP-3490: 修复 OAuth 登录时轮询过于频繁的问题
    • GP-3464: 修复在更新日志界面无法拖动启动器窗口的问题
    • GP-3503: 使用 Zink 渲染器时禁用 DRI3
    • GC-5fd52bb: 皮肤缓存不再保存到 .minecraft 目录
    • GC-81b3911: 修复按 ESC 键时文本框内的值没有保存的问题
    • GC-260f4b6: 修复输入对话框中 ESC 键不起作用的问题
    • GC-7d12ef6: 修复内存滑块提示被设备内存进度条覆盖的问题
    • GC-78e15d1: 修复游戏设置中内存没有实时刷新的问题
    • GC-6f53da1: 完善模组下载界面
    • GP-3252: 修复无法补全部分第三方 Minecraft 客户端游戏资源的问题
    • GC-56d20a5, GC-397edae: 修复 Linux 平台调整窗口大小的问题
    • GP-3531: 修复在 FreeBSD x86-64 平台未正确替换 LWJGL 本地库的问题
    • GP-3541: 修复安装 MultiMC 整合包后没有设置版本图标的问题
    • GP-3549: 修复 macOS 平台 HMCLauncher.sh 不会显示 Java 下载页面的问题
    • GP-3594: Java 下载对话框中切换包类型时不应重置版本字段
    • GP-3598: 修复使用自定义字体时未正确设置字重的问题
    • GP-3602: 修复使用系统 GLFW/OpenAL 时无法启动部分游戏版本的问题
    • GC-ecafc9d: 修复安装新游戏页面中组件框的高度问题
    • GP-3618: 修复无法识别 Intel64 架构的问题
    • GP-3626: 修复离线账户选择 Steve/Alex 皮肤时模型错误的问题
    • GP-3622: 修复在非官方支持的平台上 Minecraft 1.21 与 Sodium 不兼容的问题
    • GP-3638: 修复 NeoForge 版本识别错误的问题
    • GP-3645: 修复在 macOS 平台无法找到通过 DMG 安装的 Java 的问题
    • GP-3623: 修复离线账户皮肤对话框「本地皮肤图片文件」部分选项文字被覆盖的问题
    • GP-3651: 当微软账户 Token 过期时应当刷新账户
    • GP-3654: 修复标题过长时窗口异常的问题
    • GP-3676: 修复对话框关闭动画缺失的问题
    • GP-3708: 修复更改游戏 Java 时路径显示错误的问题
    • GP-3733: 删除更新日志对话框中多余的换行符
    • GP-3735: 修复在 Modrinth 上获取模组版本时未正确处理 404 响应的问题
    • GP-3752: 修复取消导出整合包时弹出报错对话框的问题
    • GP-3759: 修复无法解析部分 Java 版本号的问题

HMCL 3.6.11

  • 启动器
    • GP-3233: 在 Linux/FreeBSD 平台打开日志、模组等位置时会选中该文件
    • GP-3274: 优化日志窗口
    • GP-2988: 添加 Java 管理页面,优化查找、下载、自动选择 Java 等功能 (BV1WvCUY4EwK
    • GP-3280: 在删除账户和认证服务器时弹出确认提示
    • GP-3314: 优化 Linux/FreeBSD 平台上显示的系统信息
    • GP-3282: 发现更新弹窗添加取消按钮
    • GP-3237: 设置页面添加打开启动器日志文件夹按钮
    • GP-3264: 在 Linux LoongArch64 平台支持 Minecraft 1.20.2+
    • GP-3234: 在安装新游戏版本页面的默认游戏版本名称中包含已选择的加载器名称
    • GP-3221: 模组管理搜索操作更改为文本更新后触发
    • GP-3375: 支持微软账户上传皮肤
    • GP-3032: 检查模组更新界面加入全选/取消全选复选框
    • GP-3373: 更新模组下载页游戏版本列表至 1.21.3
    • GP-3232: 支持在模组管理页面通过右键单击模组查看模组详情
    • GP-3427: 更新 EXE 图标
    • GP-3435: 在游戏下载列表中添加 Minecraft Wiki 链接
    • 优化文本描述/翻译
  • 下载
    • GP-3251, GP-3259: 支持从官方源下载 Forge
    • GP-3256: 选择要安装的 Forge 版本时显示版本发布时间
  • 外观
    • GP-3271: 隐藏版本管理的 Fabric API 和 QSL/QFAPI 自动安装选项
    • GP-3088: 隐藏整合包安装页面上的整合包文件位置
    • GP-3278: 调换游戏管理侧边栏上“自动安装”和“模组管理”的顺序
    • GP-3347: 当整合包没有描述时,隐藏查看整合包描述按钮
    • GP-3378: 优化首页公告,添加隐藏按钮
    • GP-3396, GP-3397, GP-3406: 优化账户列表页面按钮图标
    • GP-3424: 调整字体选择组合框的默认宽度
    • GP-3450: 使最小化按钮居中
  • 错误修复
    • GP-3030: 修复导入 MultiMC 整合包时未移除 JVM 参数两侧引号的问题
    • GP-3224: 修复部分游戏版本无法正常安装的问题
    • GP-3227: 修复模组详情页图标显示问题
    • GP-3142: 修复日志窗口错误地将 authlib-injector 日志识别为 ERROR 类型的问题
    • GP-3306: 修复下载界面中,模组等资源版本图标全部显示为“R”而不是对应版本标签图标的问题
    • GP-3308: 修复启动 Modrinth 整合包时补全已禁用的 mod
    • GP-3324: 修复对话框标题和按钮未使用用户字体的问题
    • GP-3364: 修复 Windows 上无法识别为当前用户安装的字体的问题
    • GP-3379: 修复部分按钮无法用键盘触发的问题
    • GP-3380: 修复部分控件响应鼠标任意按钮点击的问题
    • GP-3392: 修复微软账户登录对话框中“忘记密码”链接
    • GP-3421: 修复打开游戏设置页时启动器崩溃的问题
    • GP-3425: 修复 HMCLauncher 无法正确识别 Windows on Arm 平台的问题
    • GP-3434: 修复为 Minecraft 1.20.5+ 自动选择 Java 17 的问题
    • GP-3439: 修复 Minecraft 1.20.2+Forge 默认图标错误的问题
    • GP-3470: 修复无法读取部分 Forge 模组信息的问题

HMCL 3.5.9

  • 启动器
    • GP-3121、GP-3194: 微软登录界面对 Xbox 400 错误给予提示
    • GP-3097: 更新 Linux ARM64 支持
    • GP-3197: 优化对 Linux RISC-V 64、FreeBSD x86-64 平台的支持
    • GP-3058: 支持解析更多游戏版本号
    • GP-3092: 移除 KOOK 入口
  • 下载
    • GP-3023: 特定游戏设置 - 自动安装 中禁止升级或卸载由其他启动器安装的游戏组件
    • GP-3089、GP-3114: 优化 下载 - 模组 中模组版本推荐逻辑
  • 外观
    • GP-3181: 支持使用 HMCL_FONT 环境变量指定字体
  • 错误修复
    • GP-2838: 修复本地模组查看信息时标签错误的问题
    • GP-3023: 修复 1.20.4 版本 Forge 和 OptiFine 同时安装的情况下游戏无法启动的问题
    • GP-3027: 修复低版本游戏在开启版本隔离后没有声音的问题
    • GP-3028: 修复 全局游戏设置 - 版本隔离 中错误展示路径的问题
    • GP-3066: 修复 CurseForge 搜索 API 对翻页总量计算不正确的问题;修复 下载 - 模组 切换下载源时不刷新页面的问题
    • GP-3081: 修复启动器退出时卡死的问题
    • GP-3082: 修复整合包 NeoForge 版本识别不正确的问题
    • GP-3117: 修复 下载 - 游戏 选择游戏版本后窗口标题重复的问题
    • GP-3126: 修复无法正确读取微软账户 Token 过期时间的问题
    • GP-3128: 修复 1.21 NeoForge 无法下载的问题
    • GP-3130: 修复 1.8 及 1.9 可能无法安装 OptiFine 的问题
    • GP-3133、GP-3136: 修复 1.7.10-pre4 版本 Forge 安装问题
    • GP-3160: 修复游戏启动过程中部分情况下点击取消按钮会导致启动器出错的问题
    • GP-3197: 修复部分平台无法运行 1.14 ~ 1.14.2 的问题
    • GP-3198: 修复无法同时安装 LiteLoader 与 Forge 的问题
    • GC-85b68ad: 修复 Linux 系统上无法找到 Mojang 提供的 Java 的问题

HMCL 3.5.8

  • 启动器
    • GP-2947: 更新模组和整合包翻译信息
    • GP-2951: 优化了启动器长期运行后的性能表现
    • GP-2942: 游戏版本的图标现在支持 JPG、GIF 等格式
    • GP-2950: 启动器启动后,将自动加载同目录下的 font.ttffont.otf
  • 下载
    • GP-2958: 还原对 MCBBS 的鸣谢。谢谢你,MCBBS!
    • GP-3031: 适配新版本 NeoForge 模组,修复部分模组无法被正确识别的问题
    • GP-3045: 支持自动安装 Java 21
  • 错误修复
    • GP-2943: 修复了高版本启动器内皮肤预览与游戏内真实皮肤不匹配的问题
    • GP-2986: 修复了微软登录部分情况下会错误提示“没有购买记录”的问题
    • GP-2989: 修复部分情况下,整合包导入会失败的问题
    • GP-2994: 修复自动安装界面 NeoForge 图标在高分辨率屏幕上会很模糊的问题

HMCL 3.5.7

  • 启动器
    • GP-2929、GP-2904、GP-2915: 更新翻译
    • GP-2905: 更改语言选项添加重启后生效的提示
    • GP-2885: 在 Linux 系统上且处于未知桌面环境时,禁用删除至回收站功能
    • GP-2889: 删除 Mojang 登录支持
    • GP-2897: 主界面移除联机大厅按钮,添加引导用户进入官方 QQ 群的按钮
    • GP-2888: 移除设置 - 赞助页面
    • GP-2862: 默认不进行降级更新(手动切换更新源时依然会正常提示)
  • 下载
    • GP-2921: 允许使用系统属性禁用系统代理
    • GP-2917: 不再尝试下载 .pack.xz 文件
    • GP-2921: 当系统属性 java.net.useSystemProxies 被设置为 false 时不再使用系统代理
    • GP-2912: 当下载失败时,打印重定向链至日志
    • GP-2916: 在 CurseForge 下载源中搜索时始终会按照模组标题与关键词的相似性排序
    • GP-2886: 自动下载 Java 支持下载 Java 21
  • 外观
    • GP-2856: 当加载网络背景图片超时时回退至默认背景,解决启动时卡死的问题
  • 整合包
    • GP-2881: 修复无法安装带有 NeoForge 的 Modrinth 整合包的问题

错误修复:

  • GP-2908 [重要]: 修复微软账户登录失败的问题
  • GP-2939: 修复游戏启动时包装命令会被添加两次的问题的问题
  • GP-2936: 修复无法读取远古版本版本号的问题
  • GP-2919: 修复 Minecraft 1.6 之前的版本没有声音的问题
  • GP-2920: 修复了在 CurseForge 下载源中使用中文搜索无法呈现结果的问题
  • GP-2933: 修复高版本变更离线皮肤可能不生效的问题
  • GP-2928: 修复自动更新整合包导出页面教程链接错误问题
  • GP-2926: 修复保存 ETag 索引可能写入不全的问题
  • GP-2804: 修复游戏非正常退出提示界面文字编码显示错误的问题
  • GP-2906: 修复未初始化 FileDownloadProvider 的问题
  • GP-2869: 修复下载 Java 不会尝试备用下载源的问题
  • GP-2871: 修复导出启动脚本时无法正确处理“游戏启动前执行命令”和“游戏结束后执行命令”的问题,现在会预解析命令

HMCL 3.5.6

  • GP-2864: 改善在非 Windows 平台任务栏图标的质量
  • GP-2859: 修复 Forge 和 NeoForge 安装失败的问题
  • GP-2840: 修复 Linux RISC-V 64 平台的支持
  • GP-2846: 修复使用 Java 19+ 启动游戏时,游戏 JVM 字符编码参数错误导致控制台乱码的问题
  • GP-2857: 修复搜索页面搜索结果为空,即总页面为 0 时点击最后一页按钮会跳转到不存在的页面导致无法正常使用的问题,现在会自动禁用该按钮
  • GP-2858: 修复 Windows 下自定义命令中使用 $INST_DIR 等带有反斜杠的内容会错误触发转义导致路径错误的问题
  • GP-2859: 修复启动器在版本 JSON 缺失 Patches 信息时无法获得游戏版本,导致游戏启动参数重复、管理版本表现不正确等问题
  • GP-2836: 更新启动器发布页至官网,而不是 MCBBS
  • GP-2700: 优化游戏版本比较规则,现在模组下载界面能够正常排序 Minecraft 正式版、快照版或其他版本了
  • GP-2805: 默认开启自动选择并发数
  • GC-9361719、GC-420d77d、GP-2839: 移除 MCBBS 的下载源和鸣谢文本,介于其下载源已不再可用
  • GP-2801: 添加部分 CurseForge 的分类翻译文本
  • GP-2742: 支持在游戏崩溃提示界面显示 Fabric Loader 给出的警告信息
  • GP-2813: 当日志中含有部分常见报错信息时,即使进程退出代码为 0 也显示游戏崩溃提示界面
  • GP-2828: 支持检测 Forge 模组重复导致的游戏崩溃
  • GP-2834: 支持检测 Forge 安装不完整导致的游戏崩溃
  • GP-2785: 支持检测 JVM 堆内存不足导致的游戏崩溃
  • GP-2790: 支持检测 Forge 与高版本 Java 不兼容导致的游戏崩溃
  • GP-2760: 更新对 Linux RISC-V 64 系统的支持
  • GP-2745: 修复只会从 MCBBS 源下载 authlib-injector 的问题
  • GP-2746: 修复部分情况下修改并发下载数量会导致启动器崩溃的问题
  • GP-2756: 修复网络下载缓存当缓存索引文件所在目录不存在时会导致下载失败的问题
  • GP-2758: 修复 HMCL 背景网络图片 URL 输入框会持续触发网络请求的问题,现在仅会在输入结束后加载图片
  • GP-2768: 修复自动安装界面错误提示 Quilt 与 Fabric API 不兼容的问题,现在两者能够同时安装了
  • GP-2770: 修复 CurseForge 整合包启动时检测游戏完整性极其缓慢的问题,并支持显示进度条;修复光影包会被错误的安装至模组文件夹的问题
  • GP-2775: 修复本地 NeoForge 模组被错误地识别为 Forge 模组的问题
  • GP-2788: 修复选中使用非默认皮肤的离线账户时,启动器主页头像会被错误地显示为默认皮肤头像的问题,现在正常显示用户选择的皮肤头像
  • GP-2789: 修复皮肤预览界面 Alex 皮肤被显示为 Classic 模型的问题,现在会使用 Slim 模型
  • GP-2791: 修复世界管理界面下载按钮图标不正确的问题,使更加贴切其功能
  • GP-2799: 修复由低版本 HMCL 升级后,窗口位置不会显示在正中央的问题
  • GP-2810: 修复本地模组搜索功能无法正确处理大小写,导致有大写字母的模组永远不可能被搜索到的问题
  • GP-2811: 修复 Java 8 上 JavaFX 不存在时英文提示不正确的问题
  • GP-2827: 修复启动器主窗口隐藏后从日志窗口复制内容导致启动器崩溃的问题
  • GP-2835: 修复关于界面上启动器图标仍为旧版图标的问题
  • 完善 Quilt 支持
  • 添加了对 NeoForge 的支持
  • 打开启动器时会验证 JavaFX 完整性
  • 放弃 EXE 版本与 Windows XP 的兼容性,如果需要可以使用 JAR 版本(当前版本的 EXE 版本并未放弃,在不久的将来会构建不支持 Windows XP 的 HMCLauncher 并分发。如果是从旧版本通过启动器更新升级到最新版本,则 HMCLauncher 并不会被覆盖修改,仍然支持 Windows XP)
  • 支持从 Modrinth 更新模组,会比对 CurseForge 和 Modrinth 取最新版本
  • 支持在模组管理和模组搜索中显示所支持的模组加载器
  • 支持日志窗口中的复制操作,选中要复制的行,按 Ctrl+C 即可
  • 日志窗口默认显示行数调整至 1000
  • 添加光影包文件夹和日志文件夹打开按钮
  • 在离线账户创建时对不合法的账户名做出警告
  • 游戏安装界面现在会隐藏不可用的模组加载器
  • 现在系统 GLFW 和系统 OpenAL 也可在 Windows 上使用
  • 在出现 InternalError 的时候提示用户 Java 损坏
  • 添加了翻页按钮,用户可以按照 50 个一页分页查找
  • 在从 CurseForge 上按照“名称”搜索排序时能正确按照相关度显示
  • 在中文搜索时会额外按照中文相关度排序
  • 移动依赖信息显示到模组/整合包/资源包文件详情界面,分依赖类型显示文件依赖详情
  • 资源选择页面会根据所选版本的模组加载器、游戏版本推荐最新的合适资源
  • 整合包安装界面添加跳转至搜索整合包页面的按钮
  • 将阿里镜像源替换至腾讯云镜像源
  • 不默认修改 forceUnicodeFont 游戏设置
  • 优化文件详情无效依赖的提示
  • 更新了启动器图标
  • 新增 OptiFine 图标
  • 支持查看 NBT 文件,将 NBT 文件拖动至主页面即可查看
  • 添加龙芯新世界支持
  • 添加了更多的日志分析规则
  • 支持导出待更新模组列表
  • 支持导出游戏运行栈文件
  • 适配高版本自动进入服务器功能
  • 对多个语言文件进行了更新和修正
  • 标题黑白颜色跟随主题设置
  • 优化游戏进程被 SIGKILL 信号终止时的提示
  • 网络请求支持 Gzip 解压
  • 等待启动游戏时显示假进度条
  • 记忆窗口位置,打开程序时会按照上次的窗口位置
  • 在模组管理页面点击搜索按钮时自动将光标定位到输入框
  • 将网络超时设置为 8000 毫秒
  • 支持在 Linux/FreeBSD 删除操作时移动至回收站
  • 优化日志性能
  • 支持复制账户的 UUID
  • 支持 FreeBSD x86-64
  • 添加帮助按钮

HMCL 3.5.5

  • 启动器
    • 拒绝在被 Fractureiser 病毒感染的设备上启动 HMCL(若检测到将会提示并退出,详情
    • 检测 HMCL 是否处于 macOS 上的 App Translocation(macOS 使用了 App Translocation 机制,可能会自动将 HMCL 移动至 /private/var/folders 中的临时文件夹内,导致用户关闭 HMCL 后游戏数据和设置丢失)
    • 日志分析窗口中显示物理内存大小
    • 更新 Minecraft 购买链接
    • 优化 SSL 异常报错信息
    • 添加更多日志分析规则
    • 更新游戏版本号检测性能
    • 添加隐藏测试版提示开关
    • 在 Linux 上支持 MESA_LOADER_DRIVER_OVERRIDE 环境变量,适配 Zink 驱动程序
    • 更新翻译
  • 下载
    • 更新搜索版本号
  • 游戏设置
    • 添加删除游戏资源文件按钮
    • 将版本高级设置拆分至单独页面中
    • 添加环境变量设置
    • 添加渲染器设置
  • 跨平台 添加 Linux RISC-V 64 平台支持

错误修复:

  • 修复日志分析窗口的渲染问题
  • 修复在 Minecraft 1.20 不能正常使用游戏内聊天功能的问题
  • 修复在 Windows on ARM 平台上的启动问题
  • 修复使用系统 GLFW 选项对 1.19+ 不生效的问题
  • 修复无法使用 macOS aarch64 JRE 启动部分版本的问题
  • 修复一些崩溃问题

HMCL 3.5.4

  • 启动器
    • 多人联机功能暂时下线维护 详情
    • 不再支持添加 Mojang 账户 迁移至微软账户
    • 默认在用户文件夹中存储账户信息,提高安全性
    • 优化性能与资源占用,解决卡顿问题
    • 优化文本提示
    • 优化自动内存分配功能
    • 优化游戏 JVM 参数,改善游戏性能
    • 优化自动选择 Java 功能
    • 优化自动下载 Java 功能
    • 优化微软账户登录功能
    • 支持 Gif 格式背景图
    • 优化高分辨率屏幕上图标的显示效果
    • 更新反馈页面
    • 默认加入 Little Skin 登录选项
    • 为 Linux 提供 sh 格式构建
    • 新添加 JVM 选项 -Dhmcl.home,允许用户自行指定 HMCL_DIRECTORY
  • 下载
    • 支持整合包下载页使用中文搜索
    • 支持下载安装 Modrinth 整合包
    • 支持 Quilt 自动安装
    • 默认将搜索排序修改为“热度”
  • 游戏设置
    • 默认开启“自动选择合适的 Java”
    • 添加世界信息界面,允许玩家在启动器内查看详细世界信息以及修改世界设置
    • 添加模组列表搜索
    • 优化自动内存分配
  • 跨平台
    • 适配 Windows ARM64 平台
    • 适配 Linux LoongArch64(旧世界)平台
    • 适配 Linux ARM32 平台
    • 适配 Linux ARM64 平台
    • 适配 MacOS ARM64 平台

此外,本版本包含数百项错误修复,详情请查看测试版更新日志

HMCL 3.5.3

  • 启动器
    • 支持多人联机
    • 自动选择新添加的 Authlib-injector 服务器
    • 添加修改离线账户皮肤的功能,允许使用本地图片和 LittleSkin 等皮肤站
    • 自动检测系统内安装的 OpenJDK,包括 Liberica/Microsoft/Zulu/AdoptOpenJDK
    • 允许修改启动器字体
    • 游戏崩溃时提供崩溃分析报告
    • 添加帮助页面
    • 更换默认背景图
    • 修复微软登录页可能白屏的问题
    • 任意页面按 ESC 键可返回上一页
    • 修复启动器打开时提示找不到 DST ROOT CA X3 证书的问题
    • 修复对系统平台的识别错误导致部分平台不能正确下载 JavaFX 的问题
    • 修复 Log4j 远程代码执行漏洞
  • 游戏启动
    • 支持官方启动器为 Minecraft 启动参数提供的一些占位符
    • 兼容 TLauncher 游戏客户端
    • 如果在 macOS/Windows ARM 设备上使用 HMCL,HMCL 会优先使用 x86 的 JDK 运行游戏
    • 解决 Java 16 下部分 mod 不能正常运行的问题
    • 修复 Windows 下打开使用 Unicode UTF-8 提供全球语言支持选项后启动器无法打开的问题
    • 修复不能启动 BakaXL 安装后的游戏的问题
    • 修复不能正常启动 Minecraft 1.5 及以下版本的问题(需要手动删除 options.txt)
  • 下载
    • 启动 Minecraft 1.17 及以上版本时自动下载官方提供的 Java 16
    • 支持 CurseForge 整合包、Mod、资源包、地图 下载
    • 支持 1.17 Forge 的自动安装与游戏启动
    • 支持 1.17 下 OptiFine 与 Forge 同时安装
    • 添加模组批量更新功能
    • 添加自动选择下载源的功能
    • 允许修改默认的下载并发数
  • 游戏设置
    • 允许在 Java 自定义参数内覆盖启动器默认提供的启动参数,而不需要再禁止启动器生成默认参数
    • 允许在 Minecraft 自定义参数内使用 ${game_directory} 等占位符
    • 改进版本管理和游戏设置的界面
    • 添加修改游戏进程优先级的功能
    • 支持自动选择游戏内存大小
    • 添加查看模组详细介绍及打开其官方页面的功能
    • 添加 Linux 下使用系统 GLFW 及 OpenAL 的功能
    • 自定义本地库路径,允许 M1 设备运行 ARM 版本的 Minecraft
    • 添加自动选择 Java 选项,省去提示用户需要更改 Java 版本的步骤
  • 整合包
    • 支持使用 Fabric 作为 Mod 加载器的 CurseForge 整合包
    • 支持我的世界中文论坛整合包规范第二版,兼容 CurseForge 整合包格式,允许导入 MultiMC
    • 修复安装整合包时可能崩溃的问题
    • 修复 MCBBS 整合包实现不符合规范的问题

HMCL 3.3.188

  • 启动器
    • 修改界面
    • 更新俄语翻译
    • 改善游戏下载速度
    • 添加复制游戏实例功能
    • 支持微软正版账户登录
    • 自动设置游戏的默认语言为中文
    • 兼容 Java11+,在 Java 11+ 上运行时会自动下载 JavaFX
    • 配置文件会优先选择启动器同目录而不是工作目录
    • 支持 Authlib-injector 账户上传皮肤
    • 支持 Authlib-injector 服务器用邮箱以外的账户登录
    • 上传皮肤时自动检测 Steve、Alex 模型
    • 刷新账户时将显示进度条
    • 自定义本地库路径,允许 M1 设备运行 ARM 版本的 Minecraft
    • 启动 Minecraft 1.17 时自动下载官方提供的 Java 16
    • 允许第三方修改 HMCL 的 BMCLAPI 下载源,从而支持第三方下载源
    • 自动检测系统内安装的 OpenJDK,包括 Liberica/Microsoft/Zulu/AdoptOpenJDK
    • 修复启动 Minecraft 1.0 时不会停止等待游戏启动的问题
    • 修复首次打开整合包会弹出 3 个新建账户窗口的问题
    • 修复运行在 Java 12+ 时列表和下拉菜单不能正常显示的问题
    • 修复鼠标指针不正常的问题
    • 修复添加外置登录的正版账号后会与普通正版账号冲突的问题
    • 修复因为线程过多导致在 macOS 系统上运行崩溃的问题
    • 修复重命名游戏版本点击移动窗口而不是移动光标的问题
    • 尝试修复在游戏启动后启动器直接关闭时导致游戏卡死的问题
    • 修复启动器设置 HTTP 代理后,游戏无法访问网络的问题
    • 修复下载支持库文件失败时启动器崩溃的问题
    • 修复不能识别部分数据包的问题
    • 修复 Windows 下打开使用 Unicode UTF-8 提供全球语言支持选项后启动器无法打开的问题
    • 解决 Java 16 下部分 mod 不能正常运行的问题
  • 整合包
    • 更新游戏整合包后会显示新的版本号
    • 支持我的世界中文论坛整合包标准
    • 修复更新整合包下载地址不能使用在线下载自动更新整合包的问题
    • 修复服务端自动更新整合包不能更新游戏、Forge 版本的问题

HMCL 3.3.172

  • 启动器
    • 修改界面
    • 更新俄语翻译
    • 改善游戏下载速度
    • 添加复制游戏实例功能
    • 添加清理缓存文件夹按钮
    • 修改默认下载源为 MCBBS
    • 提升与 ServerSync 的兼容性
    • 添加为正版账号上传皮肤的功能
    • 支持调整并记住启动器窗口大小
    • 在日志窗口添加导出游戏日志功能
    • 现在会校验资源索引文件的完整性
    • 现在启动器代理设置对启动后的游戏有效
    • 在启动游戏、安装游戏等界面显示总下载速度
    • 游戏崩溃后显示游戏崩溃报告而不是游戏日志
    • 允许在启动游戏按钮上滑动鼠标滚轮切换游戏
    • 在删除 Mod、世界、数据包时弹出删除确认提示
    • 允许使用在启动器同目录下的 authlib-injector.jar 文件
    • 在游戏崩溃后的第二次启动时自动检查资源和支持库文件是否完整
    • 添加启动器的 JVM 参数 -Dhmcl.font.override=fontfamily 以允许 Linux 用户更换字体以解决白屏问题
    • 修复部分整合包无法修改启动时游戏窗口大小的问题
    • 修复终止游戏后启动器不会停止等待的问题
    • 修复 1.5.2 及以下版本不能下载资源文件的问题
    • 修复某些情况下启动游戏时,启动器会崩溃的问题
    • 修复进入游戏设置后无法重命名部分游戏版本的问题
    • 修复不能在 Java 17 下载 Forge 和自动更新的问题
    • 修复重命名版本时,输入不合法的新名字后的错误提示
    • 修复重命名被依赖的版本后,会破坏其他依赖这个版本的版本的问题
    • 修复在自定义游戏运行目录时,输入不合法的路径会导致崩溃的问题
    • 修复在输入特定错误的 authlib-injector 服务器地址时会导致启动器崩溃的问题
  • 自动安装
    • 在 OptiFine 库缺失时可以自动补全
    • 提升自动安装功能与其他启动器的兼容性
    • 在当前下载源下载失败后自动重试其他下载源
    • 在启动游戏、安装游戏等界面显示明确的安装步骤
    • 安装游戏向导内可直接切换下载源,而不需要返回启动器设置页面
    • 支持同时安装 Minecraft 1.14.4 及以上版本的 Forge 和 OptiFine
    • 自动安装页面将提示不兼容的第三方库,比如 Forge 和 Fabric 不兼容
    • 修复无法安装 Forge 1.12.2 2852 的问题
    • 修复在 Curse 整合包安装遗漏部分 Mod 的问题
    • 修复在 Curse 整合包安装部分成功时删除游戏的问题
    • 修复 1.5.2 及以下版本安装 Forge 后启动失败的问题
    • 修复从 MCBBS 下载源下载文件可能会下载到空文件的问题
    • 修复 1.12.2 同时安装 Forge, OptiFine 时无法进入游戏存档的问题
  • 整合包
    • 修复整合包配置丢失后整合包游戏版本不能修改配置的问题
    • 修复服务器自动更新整合包更新时可能会出现 AccessDeniedException 的问题

HMCL 3.2.149

  • 启动器
    • 改进部分错误提示
    • 更新繁体中文语言文件
    • 在主界面账户栏添加鼠标滚轮便捷切换游戏账户
    • 在主界面账户栏添加鼠标悬浮提示以查看完整游戏名
    • 修复原版游戏用熔炉图标标识的问题
    • 修复无法取消启动过程和安装过程的问题
    • 修复无法启动使用 Vivecraft 安装器新安装的游戏的问题
    • 修复启动 1.15 时不会停止等待的问题
    • 修复 Windows 下导出启动脚本对双引号的错误转义
    • 修复部分正版账号登录 1.7.10 会导致游戏崩溃的问题
    • 修复关闭 JVM 检查时仍然会检查 java.exe 是否合法的问题
    • 修复使用 BMCLAPI 不能下载 authlib-injector 和加载游戏列表的问题
  • 自动安装
    • 添加 MCBBS 下载源
    • 在资源索引文件不合法时尝试重新下载
    • 添加 Fabric 的 BMCLAPI 和 MCBBS 下载源支持
    • 现官方下载源下载 Forge 时依赖文件不再强制从 BMCLAPI 下载
    • 修复重复下载游戏依赖文件的问题
  • 整合包
    • 导出整合包时将剔除所有日志文件和 CustomSkinLoader 的缓存
    • 修复导入 HMCL 整合包时无法安装 Forge 的问题
    • 修复无法下载 Curse 整合包部分 Mod(如潘马斯)的问题
    • 修复下载 Curse 整合包 Mod 失败后会删除整合包的问题
    • 修复下载服务端整合包没有对链接转义而无法下载的问题

HMCL 3.2.139

  • 启动器
    • 添加西班牙语,更新英语、俄语翻译
    • 主页面按回车键启动游戏
    • 游戏列表内点击列表项进入游戏设置,右键列表项打开游戏管理菜单
    • 不再强制使用 java.exe
    • 日志窗口允许关闭自动滚动
    • 避免安装游戏时输入的游戏名称不符合 Windows 系统要求
    • 修复输入某些错误的 Java 路径时崩溃的问题
    • 修复浏览 Mod 列表可能出现的崩溃问题
    • 修复无法识别 Java 12、13 的问题
  • 自动安装
    • 添加 Fabric 自动安装
    • 新安装的游戏可以修改游戏版本
    • 修复 OptiFine 自动安装
    • 修复同时安装 Forge 和 OptiFine 自动安装失败的问题
    • 修复某些情况下无法安装 1.12.2 及以下版本的 Forge 的问题
    • 修复导出整合包导入时无法安装 1.13 Forge 和 OptiFine 的问题
    • 修复部分情况下无法下载 Forge 安装包的问题
    • 修复无法安装 1.14 和 1.15 游戏的问题
  • 整合包
    • 允许从给定链接下载整合包并进行安装
    • 支持导出 MultiMC 整合包
    • 修复无法下载 Curse 模组的问题
    • 修复下载 Curse 整合包失败后会删除游戏的问题
  • 服主功能

HMCL 3.2.130

  • 启动器
    • 在启动器更新时显示更新日志
    • 启动前检查是否是 Java 8~10
    • https://www.huangyuhui.net/index.php/2019/01/27/83/支持整合包自带 Java 运时
    • 在缓存目录无效时自动更改设置
    • 在登录对话框中添加注册链接
    • 将游戏依赖的动态链接库解压到 .minecraft 中而不是系统临时文件夹
    • 更新 authlib-injector
  • 自动安装
    • 只从 BMCLAPI 获取 Forge、OptiFine 列表
    • 添加 BMCLAPI 赞助信息
    • 支持 Forge 1.13 的自动安装
    • 支持 Forge、LiteLoader、OptiFine 的手动更新
    • 添加提示部分版本的 Forge 和 LiteLoader 不兼容的问题
    • 下载库文件失败时提供更友好的提示
    • 安装游戏时更新资源文件
    • 启动时下载缺失的 Minecraft 本体文件
    • 在安装游戏失败时删除不完全的游戏
  • 游戏管理
    • 支持对 Fabric 模组的管理
    • 支持数据包列表页面、模组管理面板多选
    • 添加刷新模组列表的按钮
    • 在未安装 Mod API 的情况下禁用模组管理面板
    • 忽略游戏存档名中的颜色转移符
    • 隐藏游戏版本不匹配的游戏存档
    • 添加打开存档文件夹的菜单
    • 删除在版本管理页面中的删除游戏和重命名按钮
    • 提醒用户在修改版本独立选项时需要注意游戏文件的转移
    • 支持拖拽游戏存档压缩包到游戏界面以便安装游戏存档
  • 整合包
    • 支持整合包拖拽到主页面打开安装向导
    • 支持新版 MultiMC 整合包的导入
    • 在更新整合包时进行游戏文件的备份
    • 从 Cursemeta 上下载 Curse 上被删除的 Mod 文件
  • 修复
    • 修复头像不显示头盔层的问题
    • 修复删除模组时可能导致的崩溃
    • 修复刷新数据包列表时可能的崩溃问题
    • 修复启动器皮肤预览异常的问题
    • 修复下载失败后无法删除游戏版本的问题
    • 修复刷新版本列表时的卡顿问题
    • 修复 mods 不是文件夹时无法安装模组的问题
    • 修复启动按钮无法根据背景颜色更改字体颜色的问题
    • 修复 Java 10 上 UI 错位的问题
    • 修复启动 Curse 整合包时尝试下载被禁用的模组的问题
    • 修复皮肤图片文件损坏时导致的崩溃问题
    • 修复配置文件格式不正确时导致的崩溃问题
    • 修复 Curse 整合包更新失败的问题
    • 修复自动更新弹出气泡的界面错乱问题
    • 修复下载资源文件时潜在的崩溃问题
    • 修复导入整合包时的乱码问题

更新时间:

diff --git a/contribution.html b/contribution.html new file mode 100644 index 0000000..13ad3c8 --- /dev/null +++ b/contribution.html @@ -0,0 +1 @@ +贡献指南 - HMCL 文档
diff --git a/crash-support-group.html b/crash-support-group.html new file mode 100644 index 0000000..252921d --- /dev/null +++ b/crash-support-group.html @@ -0,0 +1 @@ +加入 HMCL 报错崩溃交流群 - HMCL 文档

Hits

本文由 zkitefly 创建。

加入群聊前请注意

  • 游戏非正常退出时,请点击左下角 按钮(不是 按钮),并完整发送生成的报错压缩包
  • 遇到其他问题时,请详细说明情况并提供相关截图,以便我们提供帮助
  • 使用整合包时,请说明具体的整合包名称与版本
  • 请保持耐心,群管理和群友会协助解决问题。严禁辱骂、催促他人
  • 禁止讨论政治、色情、违法、金钱交易等敏感内容,禁止人身攻击、造谣诽谤等行为
  • 禁止刷屏、灌水、挑起争端、发泄情绪等影响群聊秩序的行为
  • 禁止使用第三方插件发送特殊消息;禁止讨论多人游戏作弊工具
  • 本群仅支持 HMCL 启动器相关问题。PCL 启动器用户请加入 978054335 群
  • 请勿重复发送文件,如需重新获取关注,请引用之前发送的消息
  • 因人数限制,已解决问题的用户会被移出群聊。如遇新问题可再次加入
  • 本群仅处理游戏崩溃相关问题,其他话题请到其他群讨论

请等待 5 秒,请认真阅读注意事项

如果你遇到了游戏非正常退出问题,欢迎加入报错崩溃交流群咨询解决方案:Minecraft 报错崩溃交流群 (666546887)

本群仅处理游戏报错崩溃问题,无关话题请前往其他群聊讨论。

由于加群人数过多,我们会移出问题已解决的用户。如果你在被移出后遇到了新的问题需要求助,你可以再次加群。

更新时间:

diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..52e1596 --- /dev/null +++ b/docs/index.html @@ -0,0 +1 @@ +文档 - HMCL 文档
diff --git a/downloads/hmcl-snapshot-update.html b/downloads/hmcl-snapshot-update.html new file mode 100644 index 0000000..f888946 --- /dev/null +++ b/downloads/hmcl-snapshot-update.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/downloads/index.html b/downloads/index.html new file mode 100644 index 0000000..7701c39 --- /dev/null +++ b/downloads/index.html @@ -0,0 +1 @@ +下载 - HMCL 文档
diff --git a/downloads/java.html b/downloads/java.html new file mode 100644 index 0000000..7997c32 --- /dev/null +++ b/downloads/java.html @@ -0,0 +1 @@ +下载 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

正在前往 Java 下载页面,请点击下载,然后等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。

没有前往?点击此处


You are going to the Java download page. Please click download after redirecting, then wait for the Java installer to finish downloading, finally open the installer and follow the prompts to install Java.

No redirect? Click here

更新时间:

diff --git a/downloads/linux/arm32.html b/downloads/linux/arm32.html new file mode 100644 index 0000000..5548633 --- /dev/null +++ b/downloads/linux/arm32.html @@ -0,0 +1 @@ +下载适用于 Linux ARM32 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。

链接

或者你也可以根据教程来添加仓库到你的软件包管理器。


Click one of the following links to download Java, and then use the package or extract it manually to install Java.

Link

Or you can add the repository to the package manager according to the instruction.

更新时间:

diff --git a/downloads/linux/arm64.html b/downloads/linux/arm64.html new file mode 100644 index 0000000..260df1d --- /dev/null +++ b/downloads/linux/arm64.html @@ -0,0 +1 @@ +下载适用于 Linux ARM64 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。

链接

或者你也可以根据教程来添加仓库到你的软件包管理器。


Click one of the following links to download Java, and then use the package or extract it manually to install Java.

Link

Or you can add the repository to the package manager according to the instruction.

更新时间:

diff --git a/downloads/linux/loongarch64.html b/downloads/linux/loongarch64.html new file mode 100644 index 0000000..4799f8e --- /dev/null +++ b/downloads/linux/loongarch64.html @@ -0,0 +1,3 @@ +下载 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

龙芯平台存在 “新世界” 和 “旧世界” 两个 ABI,不同 ABI 的 Java 暂时互不兼容。

请在终端中输入 uname -r 命令查看 Linux 内核版本:

  • 如果你的内核版本为 5.10 或更高版本,请下载新世界 Java;
  • 如果你的内核版本为 4.19,请下载旧世界 Java。

新世界

如果你正在使用新世界龙芯系统,请下载新世界 Java。

直接下载 (需自行安装):loongson25.1.5-fx-jdk25_36-linux-loongarch64-glibc2.34.tar.gz

通过包管理器安装:

  • AOSC OS/Debian/Ubuntu:

    sudo apt install default-jre
    +

    注意:Deepin 软件源中的 Java 不包含 JIT 编译器,使用它启动游戏性能将极其糟糕。我们推荐 Deepin 用户直接下载 Java,而不是使用 APT 安装。

  • ArchLinux:

    sudo pacman -S jre-openjdk
    +

旧世界

如果你正在使用旧世界龙芯系统,请下载旧世界 Java:

更新时间:

diff --git a/downloads/linux/riscv64.html b/downloads/linux/riscv64.html new file mode 100644 index 0000000..7743c6c --- /dev/null +++ b/downloads/linux/riscv64.html @@ -0,0 +1 @@ +下载适用于 Linux RISC-V 64 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。

链接

或者你也可以根据教程来添加仓库到你的软件包管理器。


Click one of the following links to download Java, and then use the package or extract it manually to install Java.

Link

Or you can add the repository to the package manager according to the instruction.

更新时间:

diff --git a/downloads/linux/x86.html b/downloads/linux/x86.html new file mode 100644 index 0000000..fa5d230 --- /dev/null +++ b/downloads/linux/x86.html @@ -0,0 +1 @@ +下载适用于 Linux x86 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。

链接

或者你也可以根据教程来添加仓库到你的软件包管理器。


Click one of the following links to download Java, and then use the package or extract it manually to install Java.

Link

Or you can add the repository to the package manager according to the instruction.

更新时间:

diff --git a/downloads/linux/x86_64.html b/downloads/linux/x86_64.html new file mode 100644 index 0000000..6682b77 --- /dev/null +++ b/downloads/linux/x86_64.html @@ -0,0 +1 @@ +下载适用于 Linux x86_64 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

点下面的链接以下载 Java ,然后使用软件包管理器或者手动解压安装。

链接

或者你也可以根据教程来添加仓库到你的软件包管理器。


Click one of the following links to download Java, and then use the package or extract it manually to install Java.

Link

Or you can add the repository to the package manager according to the instruction.

更新时间:

diff --git a/downloads/loongnix.html b/downloads/loongnix.html new file mode 100644 index 0000000..eb91d14 --- /dev/null +++ b/downloads/loongnix.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/downloads/macos/arm64.html b/downloads/macos/arm64.html new file mode 100644 index 0000000..cee14d2 --- /dev/null +++ b/downloads/macos/arm64.html @@ -0,0 +1 @@ +下载适用于 macOS ARM64 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

正在前往 Java 下载页面,请向下滚动点击 DMG 安装包下载按钮,然后等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。

macos-arm64-1

没有下载?点击此处开始下载


You are going to the Java download page. Please scroll down and click DMG download button, then wait for the Java installer to finish downloading, and finally open the installer and follow the prompts to install Java.

No redirect? Click here to start downloading

更新时间:

diff --git a/downloads/macos/x86_64.html b/downloads/macos/x86_64.html new file mode 100644 index 0000000..742f5c4 --- /dev/null +++ b/downloads/macos/x86_64.html @@ -0,0 +1 @@ +下载适用于 macOS x86_64 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

正在前往 Java 下载页面,请向下滚动点击 DMG 安装包下载按钮,然后等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。

macos-x86_64-1

没有下载?点击此处开始下载


You are going to the Java download page. Please scroll down and click DMG download button, then wait for the Java installer to finish downloading, and finally open the installer and follow the prompts to install Java.

No redirect? Click here to start downloading

更新时间:

diff --git a/downloads/windows/arm64.html b/downloads/windows/arm64.html new file mode 100644 index 0000000..538dc48 --- /dev/null +++ b/downloads/windows/arm64.html @@ -0,0 +1 @@ +下载适用于 Windows on Arm 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

Java 安装包已开始下载,请等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。

windows-x86_64-1

windows-x86_64-2

没有下载?点击此处开始下载

无法下载?点击此处开始下载(备用)


The Java installation package has started to download. Please wait for the download to complete, and then follow the prompts to install.

No redirect? Click here to start downloading

Can’t download? Click here to download (alternative)

更新时间:

diff --git a/downloads/windows/x86.html b/downloads/windows/x86.html new file mode 100644 index 0000000..c4c7c4d --- /dev/null +++ b/downloads/windows/x86.html @@ -0,0 +1 @@ +下载适用于 Windows x86 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

正在前往 Java 下载页面,请向下滚动点击 MSI 安装包下载按钮,然后等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。

windows-x86-1

windows-x86-2

windows-x86-3

没有下载?点击此处开始下载


You are going to the Java download page. Please scroll down and click MSI download button, then wait for the Java installer to finish downloading, and finally open the installer and follow the prompts to install Java.

No redirect? Click here to start downloading

更新时间:

diff --git a/downloads/windows/x86_64.html b/downloads/windows/x86_64.html new file mode 100644 index 0000000..c7c532e --- /dev/null +++ b/downloads/windows/x86_64.html @@ -0,0 +1 @@ +下载适用于 Windows x86_64 的 HMCL 和 Minecraft 依赖的 Java - HMCL 文档

Hits

本文由 未署名用户 创建。

Java 安装包已开始下载,请等待 Java 安装程序下载完成,最后启动安装程序,依照提示安装 Java。

windows-x86_64-1

windows-x86_64-2

没有下载?点击此处开始下载

无法下载?点击此处开始下载(备用)


The Java installation package has started to download. Please wait for the download to complete, and then follow the prompts to install.

No redirect? Click here to start downloading

Can’t download? Click here to download (alternative)

更新时间:

diff --git a/eula/hmcl.html b/eula/hmcl.html new file mode 100644 index 0000000..5aa96d1 --- /dev/null +++ b/eula/hmcl.html @@ -0,0 +1 @@ +Hello Minecraft! Launcher 用户协议 - HMCL 文档

Hits

本文由 未署名用户 创建。

欢迎使用黄鱼(以下简称“开发者”)提供的 Hello Minecraft! Launcher(以下简称“本软件”)软件与服务。 为了保障用户(或称“您”)的权益,特制定本用户协议书(以下简称本协议)。 请您在使用本软件前,详细阅读本协议的所有内容。开发者可能随时更新本协议,本协议一旦发生变动,开发者将会在相关页面上通告修改内容。 修改后的本协议一旦在页面上公布即有效代替原用户协议书。

请用户仔细阅读以下全部内容,当用户开始使用本软件时,则应视为用户已经详细阅读并同意本协议的全部内容,且同意遵守本协议的规定。

第一条 用户的义务

1.用户应自行配备上网的所需设备。

2.用户应自行负担上网所需支付的与此服务相关的电话、网络使用等费用。

3.用户应为其使用本软件产生的行为、事件、结果承担法律责任。

4.用户在本软件内所设置的用户名、头像等可以由用户自行设置,但是为了维护网络和谐,本软件内不允许出现包括但不限于涉及 种族/宗教、国家政治、国家领导人、淫秽/粗俗内容、诽谤/恐吓、宗教或宗教人物、工作人员、攻击性的、侮辱性的、可能引起误会地、违禁药品等内容的名称。

5.用户应遵守中华人民共和国相关法律法规(如果用户是中华人民共和国境外的使用者,还应遵守所属国家或地区的法律法规)。 用户应当自行承担其所发布的信息内容所涉及的法律责任。此外,用户不得发布下列任何内容:

1) 反对中华人民共和国宪法所确定的基本原则的;

2) 危害国家安全,泄露国家机密,颠覆国家政权,破坏国家统一的;

3) 损害国家荣誉和利益的;

4) 煽动民族仇恨、民族歧视,破坏民族团结的;

5) 破坏国家宗教政策,宣扬邪教和封建迷信的;

6) 散布谣言,扰乱社会秩序,破坏社会稳定的;

7) 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;

8) 侮辱或者诽谤他人,侵害他人合法权益的;

9) 含有中华人民共和国法律、行政法规禁止的其他内容的。

如您发布上述任何内容,则开发者有权视情节严重程度,依据本协议及法律法规,对您做出包括但不限于终止服务等处理措施;情节严重的开发者将移交有关行政管理机关给予行政处罚,或者追究您的刑事责任。

除非法律允许或开发者书面许可,用户不得从事下列任何行为:

1) 不合法、不恰当地使用本软件及服务;

2) 采取任何可能影响本软件网络服务的非正常使用行为(包括但不限于损害、攻击服务器或使服务器过度负荷等);

3) 使用本软件的名称、商标或其他知识产权;

4) 删除本软件及其副本上关于著作权的信息。

第二条 服务的中断、中止、终止

对用户服务的中止与终止

1) 用户有发布违法信息、严重违背社会公德、以及其他违反法律禁止性规定的行为,开发者应终止对用户提供服务。

2) 用户在接受本软件服务时实施不正当行为的,开发者有权终止对用户提供服务。 该不正当行为的具体情形应当在本协议中有明确约定或属于开发者事先明确告知的应被终止服务的禁止性行为;

3) 用户使用本软件的第三方修改版本的,用户应自行承担风险与法律责任。

对本软件及服务的中断、中止与终止

1) 发生下列情形之一时,开发者有权终止或中断本软件全部或部分服务,对因此造成的不便与损害,开发者对用户或第三人均不承担任何责任:

(a) 因本软件及服务自身的需要;

(b) 因服务器遭受损害、无法正常工作;

(c) 因突发性的软硬件设备与电子通信设备故障;

(d) 因网络提供商线路或其他故障;

(e) 因政策因素;

(f) 第三方原因或其他不可抗力的情形;

2) 开发者保留在其认为有必要的情况下终止或部分终止本软件及服务的权利,开发者可以采取公告的形式通知用户,但开发者不承担对用户造成的任何损失。

第三条 免责声明

1.用户理解并同意,在法律许可范围内,开发者不对本软件提供任何保证。 用户使用本软件所造成的的风险均由用户自行承担。 用户理解并同意,开发者不保证本软件及服务一定能满足用户需求,也不保证服务不会被中断,并且对本软件及服务的正确性、安全性等方面不提供任何担保。

2.用户理解并同意,本软件内存在的第三方服务,包括但不限于多人联机服务,文件下载服务、搜索服务等,均由第三方提供,开发者不对这些第三方服务的正确性、安全性、合法性等负责。 这些第三方服务与开发者和本软件无关,不代表开发者及本软件的立场。相关争议应由第三方服务提供方承担。

3.用户理解并同意,本软件不对第三方服务内容提供担保。 若用户使用第三方服务导致财产损毁、版权或知识产权被侵犯等问题,开发者概不负责,不会也不能承担任何法律责任。

第四条 知识产权

1.本软件著作权、专利权及其他知识产权,均为开发者或者指定版权方所有。

2.本软件所使用的第三方服务归相关版权方所有,包括但不限于:

1) 本软件提供的游戏下载服务由官方及第三方平台提供,版权由 Mojang AB 所有。 用户应当遵守 Minecraft 最终用户许可协议,不对下载的游戏等文件擅自分发,或实施其他被 Minecraft 最终用户许可协议所禁止的行为。

2) 本软件提供的游戏资源(模组、整合包等内容)下载服务由 CurseForge、Modrinth 等第三方平台提供,版权依照第三方平台规定处理。

3)本软件使用的其他第三方服务,版权归服务提供商所有。

3.本软件是开源软件,用户应当遵守本软件的开源协议。

4.开发者拥有用户在使用本软件过程中所产生的的任何数据信息(包括但不限于账号资料、应用程序数据及系统衍生数据等)的所有权。 用户仅有权依据本协议、相关法律法规及其他软件使用规则使用上述数据。

5.用户理解并同意,本软件提供的所有服务器上的数据均归开发者所有。开发者有权决定保留或不保留服务器上的全部或部分数据。

第五条 条款变更

开发者有权在必要的时候修改本协议。

本协议一旦发生变动,开发者将在重要页面展示修改内容,敬请定期查询。

若用户不同意本协议的修订或更新,用户可以主动停止使用本软件及服务。

若用户在本协议修订后仍继续使用本软件及服务,即表示用户同意本协议所做的所有修订或更新。

若用户在本协议修订后因未熟悉变更而引起的损失,开发者不承担任何责任。

第六条 其他规定

1.本协议适用于中华人民共和国法律,并且排除一切冲突法规规定地适用;

2.开发者不行使、未能及时行使或者充分行使本协议或者依照法律规定所享有的权利,不应被视为放弃行使该权利,也不得影响开发者在将来行使该等权利;

3.在法律许可范围内,开发者享有对本协议条款的解释权;

4.用户可以通过电子邮件投诉、举报各类违法违规行为,邮件请发送至邮箱:hmcl@huangyuhui.net。

更新时间:

diff --git a/faq.html b/faq.html new file mode 100644 index 0000000..f336886 --- /dev/null +++ b/faq.html @@ -0,0 +1 @@ +各大问题集合 - HMCL 文档

Hits

本文由 LIPiston 创建,并由 Mine-diamond 编辑。

这是一个提供给新手或小白的阅读文档,旨在用最简单的方式帮你快速上手 HMCL 启动器和 Minecraft 游戏。如需深入了解某个主题,可点击文中提供的链接查看详细文档。

如何登录账户

你需要使用微软账户购买游戏才能游玩 Minecraft,或者使用离线账户/外置账户。

你可以在 Minecraft 官网Xbox 商店 购买游戏。

完成购买后,在 HMCL 主界面左上角,点击「账户」,然后点击左侧的「微软账户」登录你的账户,或者点击「离线登录」创建一个离线账户。

如何下载游戏

使用 HMCL 下载 Minecraft 非常简单,只需几步即可完成。

如果你尚未安装任何实例(即未安装过任何游戏版本),可以直接点击 「开始游戏」。HMCL 会自动安装最新正式版 Minecraft 并启动游戏。

若想下载更多实例(首次下载也可以按此方式操作),请按以下步骤进行:

在主界面找到并点击左侧的「下载」按钮。

在下载页面,点击左侧顶部的「游戏」选项卡。这里会列出所有可用的游戏版本(版本号从上到下/由新到旧排序),选择一个你喜欢的版本。我们通常推荐最新的正式版。

点击右下角的「安装」按钮,HMCL 就会自动为你完成下载和安装。

现在回到主界面,点击右下角的 「启动游戏」 按钮,开始你的创造吧!

游戏玩法是什么

在等待游戏下载时,不妨先了解一下它的核心玩法。

作为一款沙盒游戏,简单的说,核心玩法就是 「破坏」「创造」 。你可以自由地探索世界、收集资源、建造家园、挑战怪物……

对于新手而言,下面这些官方中文 Wiki 链接是你的最佳起点:

什么是资源包

你可能听到有其他玩家讨论好看的「材质包」。

「材质包」一般是单指修改了游戏纹理的「资源包」,也是 Minecraft 1.5 及之前版本使用的称呼。

「材质」及「材质包」是以前的误译,目前的正式译名为「纹理」和「纹理包」。如果你看到有人讨论材质包,那么一般都是指纹理包。

「资源包」是指可以修改游戏中的多种资源,如纹理(贴图)、模型、音乐、音效、语言文件等的文件,能够极大地改变游戏的外观和感觉。而一个好的资源包能极大地提升你的游戏视听体验。

大致示意图

你可以在下列网站获取资源包:

什么是模组 (Mod)

你可能听说过我的世界拥有丰富的模组(Mod)资源。模组是一类能改变或增加游戏内容的强大工具,它允许你新增方块、生物、物品与机制等内容。通过安装模组,你可以获得更丰富的内容、更顺手的玩法体验和更出色的视听表现。

你可以在下列网站获取模组信息,并在 HMCL 内下载和安装:

HMCL 自动安装与使用模组教程: 跳转

安装模组后游戏报错怎么办

安装模组后游戏无法启动或崩溃是常见的情况,通常是模组冲突或缺少前置模组导致的。别担心,大部分问题都能轻松解决。

在 HMCL《自动安装与模组下载简介》的末尾讲到了常用的解决方法: 跳转

或者前往模组包报错排查手册中查看: 跳转

如果无法解决错误,尝试 寻求帮助

如何选择游戏的 Java 版本

HMCL 会自动管理 Java,并针对不同版本的游戏自动选择合适的 Java 版本。若在启动游戏时未检测到合适的 Java,HMCL 也会提示下载 Java(点击“下载”即可完成安装)。对于新手玩家,使用默认设置即可。

如果你确实需要手动安装并指定 Java 版本:

安装 Java:

  1. 进入 设置 -> Java 管理,此处会展示 HMCL 安装的或系统中已安装的 Java。
  2. 如果需要下载 Java,点击「下载 Java」,选择所需的版本,然后点击「确定」。
  3. 如果你安装了 Java 但是没有被 HMCL 识别,选择「添加 Java」,找到你需要的 Java 安装路径下的 java.exe 文件(仅 Windows)或 java 文件(仅 Linux/macOS),然后点击确定。

选择 Java:

  • 如果希望所有实例都使用同一 Java 版本,进入「设置 -> 全局游戏设置」,选择要使用的 Java。该 Java 将用于所有使用全局游戏设置的实例(一般不推荐)。
  • 如果仅需为某个实例指定 Java 版本,进入该实例的「实例管理界面 -> 游戏设置」(勾选“启用实例特定游戏设置”),然后选择要使用的 Java。该 Java 仅用于该实例的启动。

重要提示:如果你在更换 Java 后遇到任何游戏崩溃或无法启动的问题,请立即切换回 HMCL 默认的 Java 版本

更新时间:

diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..9e8ba64 Binary files /dev/null and b/favicon.ico differ diff --git a/feed.xml b/feed.xml new file mode 100644 index 0000000..e3dc6ff --- /dev/null +++ b/feed.xml @@ -0,0 +1 @@ +Jekyll2026-03-15T20:43:59+08:00https://docs.hmcl.net/feed.xmlHMCL 文档HMCL 启动器 \| 跨平台 \| 整合包管理 \| 自动安装 \| 十二年历史 \| 三亿次使用 \ No newline at end of file diff --git a/feed/docs.xml b/feed/docs.xml new file mode 100644 index 0000000..935d5ca --- /dev/null +++ b/feed/docs.xml @@ -0,0 +1,282 @@ +Jekyll2026-03-15T20:43:59+08:00https://docs.hmcl.net/feed/docs.xmlHMCL 文档 | DocsHMCL 启动器 \| 跨平台 \| 整合包管理 \| 自动安装 \| 十二年历史 \| 三亿次使用各大问题集合2025-09-19T13:40:00+08:002025-09-19T13:40:00+08:00https://docs.hmcl.net/faq +

这是一个提供给新手或小白的阅读文档,旨在用最简单的方式帮你快速上手 HMCL 启动器和 Minecraft 游戏。如需深入了解某个主题,可点击文中提供的链接查看详细文档。

+ + +

如何登录账户

+ +

你需要使用微软账户购买游戏才能游玩 Minecraft,或者使用离线账户/外置账户。

+ +

你可以在 Minecraft 官网Xbox 商店 购买游戏。

+ +

完成购买后,在 HMCL 主界面左上角,点击「账户」,然后点击左侧的「微软账户」登录你的账户,或者点击「离线登录」创建一个离线账户。

+ +

如何下载游戏

+ +

使用 HMCL 下载 Minecraft 非常简单,只需几步即可完成。

+ +

如果你尚未安装任何实例(即未安装过任何游戏版本),可以直接点击 「开始游戏」。HMCL 会自动安装最新正式版 Minecraft 并启动游戏。

+ +

若想下载更多实例(首次下载也可以按此方式操作),请按以下步骤进行:

+ +

在主界面找到并点击左侧的「下载」按钮。

+ +

+ +

在下载页面,点击左侧顶部的「游戏」选项卡。这里会列出所有可用的游戏版本(版本号从上到下/由新到旧排序),选择一个你喜欢的版本。我们通常推荐最新的正式版。

+ +

+ +

点击右下角的「安装」按钮,HMCL 就会自动为你完成下载和安装。

+ +

+ +

现在回到主界面,点击右下角的 「启动游戏」 按钮,开始你的创造吧!

+ +

+ +

游戏玩法是什么

+ +

在等待游戏下载时,不妨先了解一下它的核心玩法。

+ +

作为一款沙盒游戏,简单的说,核心玩法就是 「破坏」「创造」 。你可以自由地探索世界、收集资源、建造家园、挑战怪物……

+ +

对于新手而言,下面这些官方中文 Wiki 链接是你的最佳起点:

+ + +

什么是资源包

+ +

你可能听到有其他玩家讨论好看的「材质包」。

+ +

「材质包」一般是单指修改了游戏纹理的「资源包」,也是 Minecraft 1.5 及之前版本使用的称呼。

+ +

「材质」及「材质包」是以前的误译,目前的正式译名为「纹理」和「纹理包」。如果你看到有人讨论材质包,那么一般都是指纹理包。

+ +

「资源包」是指可以修改游戏中的多种资源,如纹理(贴图)、模型、音乐、音效、语言文件等的文件,能够极大地改变游戏的外观和感觉。而一个好的资源包能极大地提升你的游戏视听体验。

+ +

大致示意图

+ + + +

你可以在下列网站获取资源包:

+ + +

什么是模组 (Mod)

+ +

你可能听说过我的世界拥有丰富的模组(Mod)资源。模组是一类能改变或增加游戏内容的强大工具,它允许你新增方块、生物、物品与机制等内容。通过安装模组,你可以获得更丰富的内容、更顺手的玩法体验和更出色的视听表现。

+ +

你可以在下列网站获取模组信息,并在 HMCL 内下载和安装:

+ + +

HMCL 自动安装与使用模组教程: 跳转

+ +

安装模组后游戏报错怎么办

+ +

安装模组后游戏无法启动或崩溃是常见的情况,通常是模组冲突或缺少前置模组导致的。别担心,大部分问题都能轻松解决。

+ +

在 HMCL《自动安装与模组下载简介》的末尾讲到了常用的解决方法: 跳转

+ +

或者前往模组包报错排查手册中查看: 跳转

+ +

如果无法解决错误,尝试 寻求帮助

+ +

如何选择游戏的 Java 版本

+ +

HMCL 会自动管理 Java,并针对不同版本的游戏自动选择合适的 Java 版本。若在启动游戏时未检测到合适的 Java,HMCL 也会提示下载 Java(点击“下载”即可完成安装)。对于新手玩家,使用默认设置即可。

+ +

如果你确实需要手动安装并指定 Java 版本:

+ +

安装 Java:

+
    +
  1. 进入 设置 -> Java 管理,此处会展示 HMCL 安装的或系统中已安装的 Java。
  2. +
  3. 如果需要下载 Java,点击「下载 Java」,选择所需的版本,然后点击「确定」。
  4. +
  5. 如果你安装了 Java 但是没有被 HMCL 识别,选择「添加 Java」,找到你需要的 Java 安装路径下的 java.exe 文件(仅 Windows)或 java 文件(仅 Linux/macOS),然后点击确定。
  6. +
+ +

选择 Java:

+
    +
  • 如果希望所有实例都使用同一 Java 版本,进入「设置 -> 全局游戏设置」,选择要使用的 Java。该 Java 将用于所有使用全局游戏设置的实例(一般不推荐)。
  • +
  • 如果仅需为某个实例指定 Java 版本,进入该实例的「实例管理界面 -> 游戏设置」(勾选“启用实例特定游戏设置”),然后选择要使用的 Java。该 Java 仅用于该实例的启动。
  • +
+ +
+

重要提示:如果你在更换 Java 后遇到任何游戏崩溃或无法启动的问题,请立即切换回 HMCL 默认的 Java 版本

+
]]>
LIPiston
加入 HMCL 用户群2024-03-05T17:00:00+08:002024-03-05T17:00:00+08:00https://docs.hmcl.net/groups欢迎所有 Minecraft 玩家加入 HMCL 用户群,入群请遵守以下群规:

+ +
    +
  1. 禁止谈论政治相关、色情、违法犯罪、金钱往来等敏感内容,禁止辱骂、造谣诽谤、恶俗等行为,禁止讨论精神疾病、LGBT 等话题,请尊重每一个人;
  2. +
  3. 禁止刷屏、倒垃圾、引战、宣泄个人情绪、刻意误导等破坏讨论环境的行为;
  4. +
  5. 禁止上传 EXE 和 APK 文件;
  6. +
  7. 禁止使用第三方模块/插件在群聊中发送特殊消息;
  8. +
  9. 禁止讨论多人游戏中的作弊工具;
  10. +
  11. 禁止发布与 Minecraft 无关的广告,可以适当宣传服务器、整合包等相关内容,同一内容每人每周最多宣传一次;
  12. +
  13. 用户群交流主题为 Minecraft,请不要过多讨论其他游戏内容。
  14. +
+ +

用户群

+ +

+ +

以下为闲聊群,欢迎所有用户加入(同时加入多个群聊会被踢出):

+ + + +

我们会不定期清理用户群中超过三个月没有发言的非活跃成员,每次清理前我们会提前一周在群内发布公告。

+ +

报错崩溃交流群

+ +

如果你遇到了游戏非正常退出问题,欢迎加入报错崩溃交流群咨询解决方案:Minecraft 报错崩溃交流群

+ +

本群仅处理游戏报错崩溃问题,无关话题请前往其他群聊讨论。

+ +

由于加群人数过多,我们会移出问题已解决的用户。如果你在被移出后遇到了新的问题需要求助,你可以再次加群。

+ +

灵车交流群

+ +

我们为 Linux、FreeBSD 等系统以及 ARM(不包括 macOS)、RISC-V、龙芯等设备的用户建立了一个独立的交流群。 +如果你正在使用这些平台,欢迎加入 HMCL 灵车交流群:HMCL 灵车交流群 (737461713)

+ +

本群不适合一般 Windows 和 macOS 用户加入。如果你不关心上面提到的这些平台,请移步用户群

+ +

公测群

+ +

如果你关心 HMCL 最新的开发进展,愿意积极测试 HMCL 的新功能并给出反馈,欢迎加入 HMCL 公测群:HMCL 公测群 (954100320)

+ +

本群用于讨论 HMCL 的开发和测试,禁止闲聊,并且随时会清理未积极参与反馈的用户。如果你想闲聊,请移步用户群

]]>
Glavo
加入 HMCL 报错崩溃交流群2024-03-05T17:00:00+08:002024-03-05T17:00:00+08:00https://docs.hmcl.net/crash-support-group +
+
+ + + +

加入群聊前请注意

+ +
    +
  • 游戏非正常退出时,请点击左下角 按钮(不是 按钮),并完整发送生成的报错压缩包
  • +
  • 遇到其他问题时,请详细说明情况并提供相关截图,以便我们提供帮助
  • +
  • 使用整合包时,请说明具体的整合包名称与版本
  • +
  • 请保持耐心,群管理和群友会协助解决问题。严禁辱骂、催促他人
  • +
  • 禁止讨论政治、色情、违法、金钱交易等敏感内容,禁止人身攻击、造谣诽谤等行为
  • +
  • 禁止刷屏、灌水、挑起争端、发泄情绪等影响群聊秩序的行为
  • +
  • 禁止使用第三方插件发送特殊消息;禁止讨论多人游戏作弊工具
  • +
  • 本群仅支持 HMCL 启动器相关问题。PCL 启动器用户请加入 978054335 群
  • +
  • 请勿重复发送文件,如需重新获取关注,请引用之前发送的消息
  • +
  • 因人数限制,已解决问题的用户会被移出群聊。如遇新问题可再次加入
  • +
  • 本群仅处理游戏崩溃相关问题,其他话题请到其他群讨论
  • +
+ +
+ + +

请等待 5 秒,请认真阅读注意事项

+ +
+
+ + +

如果你遇到了游戏非正常退出问题,欢迎加入报错崩溃交流群咨询解决方案:Minecraft 报错崩溃交流群 (666546887)

+ +

+ +

本群仅处理游戏报错崩溃问题,无关话题请前往其他群聊讨论。

+ +

由于加群人数过多,我们会移出问题已解决的用户。如果你在被移出后遇到了新的问题需要求助,你可以再次加群。

+ + + + +]]>
zkitefly
寻求帮助2023-08-09T11:12:00+08:002023-08-09T11:12:00+08:00https://docs.hmcl.net/helpQQ 群聊 + +

Hello Minecraft! Launcher 的官方 QQ 群聊。

+ +

点击前往

+ +

Discord 频道

+ +

Hello Minecraft! Launcher 的官方 Discord 频道。

+ +

点击前往

]]>
zkitefly
贡献指南2021-10-09T23:18:02+08:002021-10-09T23:18:02+08:00https://docs.hmcl.net/contribution如果你认为你有能力为 HMCL 添加高质量的帮助文档,或希望修改错误,你可以到 https://github.com/HMCL-dev/HMCL-docs 仓库中发 Pull Request,或者提 Issue。

+ +

或者你可以进入我们的 DiscordHMCL 用户群 群以向 HMCL 反馈。

]]>
huanghongxun
\ No newline at end of file diff --git a/feed/eula.xml b/feed/eula.xml new file mode 100644 index 0000000..4ac4fba --- /dev/null +++ b/feed/eula.xml @@ -0,0 +1,123 @@ +Jekyll2026-03-15T20:43:59+08:00https://docs.hmcl.net/feed/eula.xmlHMCL 文档 | EulaHMCL 启动器 \| 跨平台 \| 整合包管理 \| 自动安装 \| 十二年历史 \| 三亿次使用Hello Minecraft! Launcher 用户协议2021-09-21T23:26:00+08:002021-09-21T23:26:00+08:00https://docs.hmcl.net/eula/hmcl欢迎使用黄鱼(以下简称“开发者”)提供的 Hello Minecraft! Launcher(以下简称“本软件”)软件与服务。 为了保障用户(或称“您”)的权益,特制定本用户协议书(以下简称本协议)。 请您在使用本软件前,详细阅读本协议的所有内容。开发者可能随时更新本协议,本协议一旦发生变动,开发者将会在相关页面上通告修改内容。 修改后的本协议一旦在页面上公布即有效代替原用户协议书。

+ +

请用户仔细阅读以下全部内容,当用户开始使用本软件时,则应视为用户已经详细阅读并同意本协议的全部内容,且同意遵守本协议的规定。

+ +

第一条 用户的义务

+ +

1.用户应自行配备上网的所需设备。

+ +

2.用户应自行负担上网所需支付的与此服务相关的电话、网络使用等费用。

+ +

3.用户应为其使用本软件产生的行为、事件、结果承担法律责任。

+ +

4.用户在本软件内所设置的用户名、头像等可以由用户自行设置,但是为了维护网络和谐,本软件内不允许出现包括但不限于涉及 种族/宗教、国家政治、国家领导人、淫秽/粗俗内容、诽谤/恐吓、宗教或宗教人物、工作人员、攻击性的、侮辱性的、可能引起误会地、违禁药品等内容的名称。

+ +

5.用户应遵守中华人民共和国相关法律法规(如果用户是中华人民共和国境外的使用者,还应遵守所属国家或地区的法律法规)。 +用户应当自行承担其所发布的信息内容所涉及的法律责任。此外,用户不得发布下列任何内容:

+ +

1) 反对中华人民共和国宪法所确定的基本原则的;

+ +

2) 危害国家安全,泄露国家机密,颠覆国家政权,破坏国家统一的;

+ +

3) 损害国家荣誉和利益的;

+ +

4) 煽动民族仇恨、民族歧视,破坏民族团结的;

+ +

5) 破坏国家宗教政策,宣扬邪教和封建迷信的;

+ +

6) 散布谣言,扰乱社会秩序,破坏社会稳定的;

+ +

7) 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;

+ +

8) 侮辱或者诽谤他人,侵害他人合法权益的;

+ +

9) 含有中华人民共和国法律、行政法规禁止的其他内容的。

+ +

如您发布上述任何内容,则开发者有权视情节严重程度,依据本协议及法律法规,对您做出包括但不限于终止服务等处理措施;情节严重的开发者将移交有关行政管理机关给予行政处罚,或者追究您的刑事责任。

+ +

除非法律允许或开发者书面许可,用户不得从事下列任何行为:

+ +

1) 不合法、不恰当地使用本软件及服务;

+ +

2) 采取任何可能影响本软件网络服务的非正常使用行为(包括但不限于损害、攻击服务器或使服务器过度负荷等);

+ +

3) 使用本软件的名称、商标或其他知识产权;

+ +

4) 删除本软件及其副本上关于著作权的信息。

+ +

第二条 服务的中断、中止、终止

+ +

对用户服务的中止与终止

+ +

1) 用户有发布违法信息、严重违背社会公德、以及其他违反法律禁止性规定的行为,开发者应终止对用户提供服务。

+ +

2) 用户在接受本软件服务时实施不正当行为的,开发者有权终止对用户提供服务。 该不正当行为的具体情形应当在本协议中有明确约定或属于开发者事先明确告知的应被终止服务的禁止性行为;

+ +

3) 用户使用本软件的第三方修改版本的,用户应自行承担风险与法律责任。

+ +

对本软件及服务的中断、中止与终止

+ +

1) 发生下列情形之一时,开发者有权终止或中断本软件全部或部分服务,对因此造成的不便与损害,开发者对用户或第三人均不承担任何责任:

+ +

(a) 因本软件及服务自身的需要;

+ +

(b) 因服务器遭受损害、无法正常工作;

+ +

(c) 因突发性的软硬件设备与电子通信设备故障;

+ +

(d) 因网络提供商线路或其他故障;

+ +

(e) 因政策因素;

+ +

(f) 第三方原因或其他不可抗力的情形;

+ +

2) 开发者保留在其认为有必要的情况下终止或部分终止本软件及服务的权利,开发者可以采取公告的形式通知用户,但开发者不承担对用户造成的任何损失。

+ +

第三条 免责声明

+ +

1.用户理解并同意,在法律许可范围内,开发者不对本软件提供任何保证。 用户使用本软件所造成的的风险均由用户自行承担。 +用户理解并同意,开发者不保证本软件及服务一定能满足用户需求,也不保证服务不会被中断,并且对本软件及服务的正确性、安全性等方面不提供任何担保。

+ +

2.用户理解并同意,本软件内存在的第三方服务,包括但不限于多人联机服务,文件下载服务、搜索服务等,均由第三方提供,开发者不对这些第三方服务的正确性、安全性、合法性等负责。 这些第三方服务与开发者和本软件无关,不代表开发者及本软件的立场。相关争议应由第三方服务提供方承担。

+ +

3.用户理解并同意,本软件不对第三方服务内容提供担保。 若用户使用第三方服务导致财产损毁、版权或知识产权被侵犯等问题,开发者概不负责,不会也不能承担任何法律责任。

+ +

第四条 知识产权

+ +

1.本软件著作权、专利权及其他知识产权,均为开发者或者指定版权方所有。

+ +

2.本软件所使用的第三方服务归相关版权方所有,包括但不限于:

+ +

1) 本软件提供的游戏下载服务由官方及第三方平台提供,版权由 Mojang AB 所有。 用户应当遵守 Minecraft 最终用户许可协议,不对下载的游戏等文件擅自分发,或实施其他被 Minecraft 最终用户许可协议所禁止的行为。

+ +

2) 本软件提供的游戏资源(模组、整合包等内容)下载服务由 CurseForge、Modrinth 等第三方平台提供,版权依照第三方平台规定处理。

+ +

3)本软件使用的其他第三方服务,版权归服务提供商所有。

+ +

3.本软件是开源软件,用户应当遵守本软件的开源协议。

+ +

4.开发者拥有用户在使用本软件过程中所产生的的任何数据信息(包括但不限于账号资料、应用程序数据及系统衍生数据等)的所有权。 用户仅有权依据本协议、相关法律法规及其他软件使用规则使用上述数据。

+ +

5.用户理解并同意,本软件提供的所有服务器上的数据均归开发者所有。开发者有权决定保留或不保留服务器上的全部或部分数据。

+ +

第五条 条款变更

+ +

开发者有权在必要的时候修改本协议。

+ +

本协议一旦发生变动,开发者将在重要页面展示修改内容,敬请定期查询。

+ +

若用户不同意本协议的修订或更新,用户可以主动停止使用本软件及服务。

+ +

若用户在本协议修订后仍继续使用本软件及服务,即表示用户同意本协议所做的所有修订或更新。

+ +

若用户在本协议修订后因未熟悉变更而引起的损失,开发者不承担任何责任。

+ +

第六条 其他规定

+ +

1.本协议适用于中华人民共和国法律,并且排除一切冲突法规规定地适用;

+ +

2.开发者不行使、未能及时行使或者充分行使本协议或者依照法律规定所享有的权利,不应被视为放弃行使该权利,也不得影响开发者在将来行使该等权利;

+ +

3.在法律许可范围内,开发者享有对本协议条款的解释权;

+ +

4.用户可以通过电子邮件投诉、举报各类违法违规行为,邮件请发送至邮箱:hmcl@huangyuhui.net。

]]>
\ No newline at end of file diff --git a/feed/launcher.xml b/feed/launcher.xml new file mode 100644 index 0000000..15becc5 --- /dev/null +++ b/feed/launcher.xml @@ -0,0 +1,1077 @@ +Jekyll2026-03-15T20:43:59+08:00https://docs.hmcl.net/feed/launcher.xmlHMCL 文档 | LauncherHMCL 启动器 \| 跨平台 \| 整合包管理 \| 自动安装 \| 十二年历史 \| 三亿次使用界面功能介绍2026-01-09T15:19:02+08:002026-01-09T15:19:02+08:00https://docs.hmcl.net/launcher/gui-features启动器预览图

+ +

启动器界面整体由顶部工具栏和页面容器构成。

+ +

顶部工具栏

+ +

顶部工具栏

+ +
+
提示
+

用户可以通过双击工具栏在最大化与普通窗口状态之间切换。

+
+ +

此区域为全局显示,共分为左右两部分。其中左侧由返回按钮(仅在二级或多级页面显示)和标题构成,右侧由帮助按钮、最小化按钮和关闭按钮构成。

+ +

返回按钮:点击后返回上一页,仅在二级或多级页面上显示,首页不显示。
+标题:通常用于显示页面名称,首页显示为启动器版本信息。
+帮助按钮:点击后跳转至文档帮助页面。
+最小化按钮:点击后最小化启动器。
+关闭按钮:点击后关闭启动器。

+ +

首页

+ +

首页

+ +

首页是启动器的起始页面,该页面由侧边导航栏、提示面板(仅限开发版和预览版)、更新面板(仅在存在可用更新时显示)和启动游戏面板构成。

+ +

侧边导航栏(首页)

+ +

侧边导航栏(首页)

+ +

此区域共分为三部分:账户分组、游戏分组及通用分组。

+ +

账户分组:该分组中包含一个列表项,该项会显示当前选定的账户头像、名称及账户类型,用户点击该项可进入账户列表页面;右键点击该项可呼出账户切换的快捷菜单。

+ +
+
提示
+

用户在该项上滚动鼠标滚轮可在不同账户之间进行快捷切换。

+
+ +

游戏分组:该分组中包含三个列表项,分别是:实例管理、实例列表及下载。

+ +
    +
  • 实例管理:该项会显示当前选定的游戏实例图标及名称。用户点击该项后进入实例管理页面;在该项上滚动鼠标滚轮可在不同游戏实例之间进行快捷切换。
  • +
  • 实例列表:用户点击该项后进入实例列表页面,用于查看和管理游戏实例。
  • +
  • 下载:用户点击该项后进入下载页面,用于下载游戏、整合包或者安装模组、资源包、光影或者世界。
  • +
+ +

通用分组:该分组中包含三个列表项,分别是:设置、多人联机及官方群组。

+ +
    +
  • 设置:用户点击该项后进入设置页面。
  • +
  • 多人联机:用户点击该项后进入多人联机页面。
  • +
  • 官方群组:用户点击该项后跳转至设置·反馈页。
  • +
+ +

提示面板

+ +

提示面板

+ +
+
提示
+

用户可通过点击右上角关闭按钮隐藏该提示。

+
+ +

仅在开发版或预览版中显示,用于提示用户当前启动器不是稳定版本。

+ +

更新面板

+ +

更新面板

+ +

仅在存在可用更新时显示,此区域用于启动器更新提示。

+ +

启动游戏面板

+ +

更新面板

+ +

此区域共分为两部分:启动(开始)游戏按钮、切换实例菜单。

+ +

启动(开始)游戏按钮:若用户当前存在实例,点击后则会启动当前应用的游戏实例;若当前不存在游戏实例,点击后会自动下载最新正式版然后启动游戏。
+切换实例菜单:点击显示快捷切换游戏实例列表菜单。

+ +

设置

+ +

设置

+ +

该页面由侧边导航栏和页面容器构成。

+ +

侧边导航栏(设置)

+ +

此区域共分为四部分:全局游戏设置、Java 管理、启动器分组及帮助分组。

+ +

全局游戏设置:用户点击该项后进入全局游戏设置页面。
+Java 管理:用户点击该项后进入 Java 管理页面。
+启动器分组:该分组中包含三个列表项,分别是:通用、外观及下载。
+帮助分组:该分组中包含三个列表项,分别是:帮助、反馈及关于。

+ +

设置-全局游戏设置

+ +

设置-全局游戏设置

]]>
离线模式下更换皮肤2025-12-05T22:25:00+08:002025-12-05T22:25:00+08:00https://docs.hmcl.net/launcher/offline-skin离线模式下更换皮肤 +

注意:

+
+

使用 Steve、Alex、本地皮肤图片文件: 可能无法加入多人联机,其他玩家可能看不到您的皮肤
+使用 LittleSkin、Blessing Skin 服务器: 多人联机下和您使用 相同方式 的玩家可以看到您的皮肤, 其他玩家不可以

+
+ +

打开HMCL, 进入 账号列表 , 点击下图离线账号的【上传皮肤】红框处:

+ +

+ +

+ +
+

默认: 使用默认随机的皮肤显示

+ +

Steve: 使用Steve (史蒂夫) 皮肤显示

+ +

Alex: 使用Alex (艾利克斯) 皮肤显示

+ +

本地皮肤图片文件LittleSkinBlessing Skin 服务器: 请见下文↓

+
+ +

本地皮肤图片文件

+ +

点击 本地皮肤图片文件 , 设置 皮肤/披风皮肤图片 路径, 点击 确认, 即可

+ +

+ +

LittleSkin

+ +

首先您需要一个LittleSkin的账号, 注册登录

+ +

然后前往 角色管理, 查看您的角色名, 如果没有, 请点击 添加新角色 进行添加

+ +

你可在 我的衣柜 修改此账户名的皮肤与披风

+ +

+ +

在HMCL中创建的离线账户的 账户名 必须和角色名相等, 如果不相等, 请 重新在HMCL中创建离线账户

+ +

+ +

确认相等后, 点击 LittleSkin 即可同步在LittleSkin上此账户名的皮肤

+ +

+ +

Blessing Skin 服务器

+ +

Blessing Skin 服务器, 进入 **角色管理 , 查看角色名 , 确认 角色名HMCL中创建的离线账号角色名 相同, 如果不相等, 请重新在HMCL中创建离线账户

+ +

你可在 我的衣柜 修改此账户名的皮肤与披风

+ +

+ +

进入 配置生成, 按下图找到 CustomSkinLoader 中的网址, 复制到HMCL中即可同步在Blessing Skin 服务器上此账户名的皮肤

+ +

+ +

]]>
qiaoshouzi
自动安装与模组下载简介2025-11-02T09:06:30+08:002025-11-02T09:06:30+08:00https://docs.hmcl.net/launcher/auto-installing要为 Minecraft 安装模组,你首先需要安装一个“模组加载器”(例如 NeoForge 或 Fabric),然后再安装你想要的模组。HMCL 为这两个步骤都提供了强大的支持。

+ +

在安装前,最关键的一点是兼容性。请记住以下核心原则:

+ +
    +
  • 通常,你只能为单个游戏实例安装一种模组加载器。
  • +
  • 你下载的模组,必须同时兼容你的游戏版本(如 1.20.4)和模组加载器(如 Fabric)。
  • +
+ +

简单来说,为游戏安装模组总共分三步,本指南将带你逐一完成:

+
    +
  1. 开启版本隔离,为模组创建一个独立干净的环境。
  2. +
  3. 安装模组加载器(如 Forge, Fabric)。
  4. +
  5. 安装你喜欢的模组。
  6. +
+ +

启用版本隔离

+ +

在安装模组之前,必须开启版本隔离以隔离为不同实例安装的模组:

+ +

在 HMCL 主界面,点击「设置」,在「全局游戏设置」选项卡中,找到「版本隔离」,点击「版本隔离」,选择「各实例独立」即可

+ +

Working_Directory

+ +

更详细的介绍见 全局版本隔离

+ +

安装模组加载器

+ +

模组加载器简介

+ +

常见的模组加载器有以下几个:

+ +

Forge,NeoForge,Fabric,Quilt,Cleanroom,LiteLoader 是 6 个常见的 Mod 加载器。
+Fabric API,QSL/QFAPI 是两个随 FabricQuilt 的官方 API(实际是模组)。

+ +

兼容性:

+
    +
  • LiteLoaderForge 是兼容的 (Forge 较新版本和 LiteLoader 较老版本可能不兼容),可以同时安装
  • +
  • 其它所有模组加载器几乎互不兼容,即你无法同时安装两个模组加载器
  • +
+ +

Fabric与Quilt 说明:
+非常多的 Fabric Mod 需要 Fabric API 作为前置模组, Quilt Mod 需要 QSL/QFAPI 作为前置模组。
+在安装 FabricQuilt 加载器时候如果没有其它原因,建议安装 Fabric APIQSL/QFAPI , 否则很多 Fabric ModQuilt Mod 则有可能无法被加载!

+ +

安装新实例时安装模组加载器

+ +

当你在安装新的游戏客户端时候, 会看到其中有该版本支持的模组加载器安装选项,点击你想安装的模组加载器(根据你想安装模组所支持的加载器进行选择)

+ +

AutoInstaller_ModLoader

+ +
    +
  • 点击你想要的加载器(如 Fabric)。
  • +
  • 在弹出的版本选择页面,若无特殊需求,选择最新稳定版(通常是第一个)。
  • +
  • 如果你选择 FabricQuilt,最好同时安装Fabric APIQSL/QFAPI
  • +
  • 点击「安装」即可。
  • +
+ +

为已有实例安装或更换模组加载器

+ +

如果你想为已安装好的纯净版游戏添加加载器,或者更换、更新加载器版本:

+ +
    +
  1. 在 HMCL 主界面,点击「实例管理」,然后选择你想要修改的游戏实例。
  2. +
  3. 在左侧菜单中,点击「自动安装」。
  4. +
+ +

Auto_Install_Page

+ +
    +
  • +安装:点击你想要的加载器图标(如 Forge),选择版本(推荐最新版),然后点击安装。
  • +
  • +更新:点击已安装的加载器,选择一个更新的版本,然后点击安装。
  • +
  • +删除:点击加载器右侧的「X」按钮即可删除。
  • +
  • +更换:先删除旧的加载器,再安装新的。
  • +
+ +
+

注意:此处的自动安装页面不支持安装 Fabric APIQSL/QFAPI。请将它们当作普通模组进行安装。

+
+ +

安装模组

+ +

安装好加载器后,就可以开始添加模组了。你可以在下列网站获取模组信息,并在 HMCL 内下载和安装:

+
    +
  • +MC 百科 - 中文社区,资料详尽。
  • +
  • +CurseForge - 最大的模组发布站之一。
  • +
  • +Modrinth - 新兴的现代化模组发布站。
  • +
+ +

在安装任何模组前,请先确认三件事:

+
    +
  1. +游戏版本:模组是否支持你当前的游戏版本?(例如, 1.20.4)
  2. +
  3. +加载器类型:模组是给 Forge、Fabric 还是其它模组加载器用的?
  4. +
  5. +前置模组:模组是否需要其他模组作为前置?(模组页面通常会说明)
  6. +
+ +

自动安装 (推荐)

+ +

HMCL 内置了 CurseForge 和 Modrinth 的搜索和下载功能,非常方便。

+ +
    +
  1. 在 HMCL 主界面,点击「下载」->「模组」。
  2. +
  3. 在搜索框输入模组名(支持中英文),然后点击搜索。如果搜不到,可以尝试切换右上角的下载源。
  4. +
  5. 点击你想要的模组,进入版本列表页面。
  6. +
  7. 根据游戏版本加载器,找到你需要的版本,点击并选择「安装到当前实例」。
  8. +
  9. 如果该模组有前置,HMCL 会自动提示,请先安装所有前置模组(但是请不要重复安装前置模组)。
  10. +
+ +

注:点击模组下载页面 上方的蓝色的链接可以到对应的网站查看模组的信息,这会告诉你模组的功能和有可能会提示你一些注意事项

+ +

注意: 请查看你要下载的模组是否正常你要安装的游戏版本以及模组加载器,否则模组无法被正常加载!

+ +

AddingModAutomatically

+ +

安装OptiFine 或其它光影模组

+ +

光影的安装方式略有不同,请参考专门的指南 光影安装

+ +

手动安装

+ +

当你在网站或其它位置手动下载了模组文件,你可以参照以下步骤完成安装:

+ +

一般的 Mod 文件后缀为 jar 或者 litemod,请确认后缀是正确的。其中jar为大多数模组加载器支持的格式,litemodLiteLoader支持。

+ +

通过模组管理页面

+ +
    +
  1. 进入「实例管理」-> 选择你的游戏实例 ->「模组管理」。
  2. +
  3. 点击「添加模组」并选择你的模组文件,或直接将文件拖拽到窗口内即可。
  4. +
+ +

通过模组文件夹安装

+ +
    +
  1. 进入「实例管理」-> 选择你的游戏实例 ->「浏览」->「模组文件夹」。
  2. +
  3. 这会打开该实例的 mods 文件夹。
  4. +
  5. 将你下载的 .jar 模组文件复制或移动到这个文件夹里。 +(如果 mods 文件夹不存在,请自行创建一个。)
  6. +
+ +

AddingModManually

+ +

安装 Mod 后游戏报错/无法启动

+ +

造成游戏报错的原因有很多, 比如 Mod 之间不兼容, Fabric API 的版本过高, 缺少前置 Mod 等等。

+ +

第一步:基础检查(最常见问题)

+
    +
  • +查看 HMCL 错误报告:新版 HMCL 会直接提示大部分常见错误,这是你的首选信息来源。
  • +
  • +检查兼容性:确认模组版本、游戏版本、模组加载器三者是否匹配。
  • +
  • +检查前置模组:是否忘记安装必要的API(如 Fabric API)或其他前置模组?
  • +
+ +

第二步:自己排查

+
    +
  • +使用“二分法”:在“模组管理”页面,先禁用一半的模组,看游戏能否启动或出错。如果可以,说明问题出在被禁用的那一半里。不断重复此过程,直到找到引发问题的具体模组。
  • +
  • +查看日志文件:如果你有能力,可以自行查看游戏日志来定位问题。
  • +
+ +

第三步:有效求助 +如果无法自行解决,你需要向社区求助。但请记住,一个有效的求助包含完整的日志文件

+ +

如何正确求助

+
    +
  1. 在游戏崩溃后,点击 HMCL 弹出的错误窗口上的「导出游戏日志」按钮,它会生成一个 minecraft-exported-crash-info-时间戳.zip 文件。
  2. +
  3. 带着这个文件去社区、论坛或群里提问,并具体描述你遇到的问题。
  4. +
+ +
+

重要:对于向他人求助,千万不要只截图,不要只说“游戏出错怎么办”这种及其笼统的话语。没有日志,谁也帮不了你。

+
+ +

CrashReportPage

+ +

补充:常见模组加载器简单介绍和支持版本一览

+ +

模组加载器简单介绍:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
模组加载器简单介绍
Forge icon Forge老牌的模组加载器,功能强大,支持的模组众多,推荐在1.21之前安装。
NeoForge icon NeoForge1.20.1后Forge的继任者,推荐在1.21版本后安装NeoForge。
Fabric icon Fabric轻型模组加载器,非常适合安装优化模组或纯净生存增强类模组。
Quilt icon QuiltFabric的一个分支,同样轻量。
+Fabric api icon Fabric API
QSL/QFAPI icon QSL/QFAPI +
由于FabricQuilt比较轻功能有限,因此提供了增强功能的api,很多模组依赖于此api。
Cleanroom icon Cleanroom1.12.2版本Forge的一个优化代替,提供了相对更强的功能,仅支持1.12.2。
LiteLoader icon LiteLoader轻量模组加载器,为Forge的轻量代替,现在已停止维护。
+ +

支持版本一览:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
模组加载器最老版本最新版本
+Forge icon Forge1.5.2游戏最新版本
+NeoForge icon NeoForge1.20.1游戏最新版本
+Fabric icon Fabric1.16.3游戏最新版本
+Fabric api icon Fabric api1.16.3游戏最新版本
+Quilt icon Quilt1.16.3游戏最新版本
+QSL/QFAPI icon QSL/QFAPI1.18.21.21
+Cleanroom icon Cleanroom1.12.2 
+LiteLoader icon LiteLoader1.5.21.12.2
]]>
asdqp233,Mine-diamond
JVM 选项与环境变量2025-04-20T23:18:02+08:002025-04-20T23:18:02+08:00https://docs.hmcl.net/launcher/jvm-options-and-envJVM 选项 + +

HMCL 提供了一些 JVM 选项用于调试目的。你可以通过在启动 HMCL 时添加这些参数来使用这些功能。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数描述
-Dhmcl.home=<path>覆盖 HMCL 全局数据文件夹路径
-Dhmcl.dir=<path>覆盖 HMCL 工作路径下的 .hmcl 文件夹路径
-Dhmcl.self_integrity_check.disable=true禁用启动器更新时的本体完整性检查
-Dhmcl.bmclapi.override=<url>自定义 BMCLAPI 的 API Root 地址(默认为 https://bmclapi2.bangbang93.com
-Dhmcl.font.override=<font family>指定启动器使用的字族
-Dhmcl.version.override=<version>手动指定启动器版本号
-Dhmcl.update_source.override=<url>自定义 HMCL 更新源地址
-Dhmcl.authlibinjector.location=<path>指定本地 authlib-injector 路径,不从网络下载
-Dhmcl.openjfx.repo=<maven repository url>添加用于下载 OpenJFX 的自定义 Maven 仓库地址(默认为 https://repo1.maven.org/maven2
-Dhmcl.native.encoding=<encoding>指定系统原生编码
-Dhmcl.microsoft.auth.id=<App ID>自定义 Microsoft OAuth 应用程序 ID
-Dhmcl.microsoft.auth.secret=<App Secret>自定义 Microsoft OAuth 应用程序密钥
-Dhmcl.curseforge.apikey=<key>自定义 CurseForge API 密钥
-Dhmcl.discoapi.override=<url>自定义 DiscoAPI 的 API Root 地址(默认为 https://api.foojay.io/disco/v3.0
-Dhmcl.native.backend=<auto/jna/none>指定 HMCL 的本地后端类型。可选值:
- auto:自动选择(Windows 7+ 使用 JNA,其他系统不使用)
- jna:强制使用 JNA(如果 JNA 不可用会抛出异常)
- none:禁用 JNA
默认值:auto +
-Dhmcl.hardware.fastfetch=<true/false>是否使用 fastfetch 获取设备信息。默认值:true +
+ +

环境变量

+ +

HMCL/HMCLauncher 也支持一些环境变量来配置启动器的行为。你可以在系统环境变量中添加这些变量。

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
参数描述
HMCL_JAVA_OPTS自定义 HMCLauncher 所使用的 JVM 启动参数(默认为 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15-Xmx1G -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15
HMCL_JAVA_HOME自定义 HMCLauncher 所使用的 Java 路径
HMCL_FONT指定启动器使用的字族
HMCL_JRES添加 HMCL 所使用的 Java 路径,支持写入多个路径
+ +

如何使用 JVM 选项

+ +

你可以通过以下几种方式使用这些 JVM 选项。

+ +

方法一:直接在命令行中添加

+ +

在启动 HMCL 时通过命令行添加参数,例如:

+ +
java -Dhmcl.home="D:/Games/HMCL" -jar HMCL.jar
+
+ +

方法二:创建启动脚本

+ +
    +
  1. Windows 用户可以创建 .cmd 文件: +
    +
    @echo off
    +java -Dhmcl.font.override="Microsoft YaHei" -jar HMCL.jar
    +pause
    +
    +
  2. +
  3. Linux/macOS 用户可以创建 .sh 文件: +
    +
    #!/bin/bash
    +java -Dhmcl.font.override="Noto Sans CJK SC" -jar HMCL.jar
    +
    +
  4. +
+ +

使用注意事项

+ +
    +
  • 可以同时使用多个参数,只需要用空格分隔
  • +
  • 包含空格的参数值需要用半角引号包裹
  • +
  • 确保 JVM 参数位于 -jar HMCL.jar 之前
  • +
+ +

如何使用环境变量

+ +

Windows 设置环境变量

+ +
    +
  1. 右键点击“此电脑”/“这台电脑”/“我的电脑”,选择“属性”
  2. +
  3. 点击“高级系统设置”
  4. +
  5. 点击“环境变量”
  6. +
  7. 在“用户变量”或“系统变量”中点击“新建”
  8. +
  9. 输入变量名(如 HMCL_JAVA_HOME)和变量值
  10. +
  11. 点击“确定”保存
  12. +
+ +

示例值:

+
变量名: HMCL_JAVA_HOME
+变量值: C:\Program Files\Java\jdk-17
+
+ +

Linux/macOS 设置环境变量

+ +
    +
  1. 编辑你的 Shell 配置文件(比如 ~/.bashrc~/.zshrc 等)
  2. +
  3. 添加 export 语句:
  4. +
+ +
export HMCL_JAVA_HOME="/usr/lib/jvm/java-17-openjdk"
+export HMCL_JAVA_OPTS="-XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15"
+
+ +
    +
  1. 保存文件并重新加载配置: +
    +
    source ~/.bashrc  # 或 `source ~/.zshrc`
    +
    +
  2. +
+ +

使用注意事项

+ +
    +
  • 设置环境变量后需要重启 HMCL 才能生效
  • +
  • 如果同时设置了 JVM 参数和环境变量,JVM 参数优先级更高
  • +
  • Windows 用户注意使用半角分号(;)分隔多个路径
  • +
  • Linux/macOS 用户注意使用半角冒号(:)分隔多个路径
  • +
]]>
使用密码登录微软账户2024-07-21T17:50:00+08:002024-07-21T17:50:00+08:00https://docs.hmcl.net/launcher/use-password-login-microsoft-account为什么使用密码登录 + +

我们发现,某些账户在尝试通过非密码方式登录时,可能会遇到设备代码流授权问题,从而无法成功登录。而建议这些用户改用密码登录后,他们的登录成功率显著提高。

+ +

如何使用密码登录微软账户

+ +
    +
  • 在执行登录操作时,注意检查登录页面是否有“其他登录方式”的选项。一旦看到此选项,立即点击进行选择。
  • +
+ +

点击“其他登录方法”选项

+ +
    +
  • 在登录页面,系统会询问您希望采用哪种登录方式。此时,需要选择“使用我的密码”,然后输入密码完成登录。
  • +
+ +

如果没有“使用我的密码”选项,或者忘记了密码,请看 下方教程

+ +

选择“使用我的密码”

+ +

添加/更改密码

+ +

部分账户可能并未设置密码登录,或者忘记了密码,请按照以下步骤进行操作:

+ +
    +
  • +

    前往 添加/更改密码 页面;

    +
  • +
  • +

    在该页面按照指示添加密码即可。若忘记密码,可选择该页面“忘记密码了?”选项进行找回密码操作。

    +
  • +
+ +

添加密码

+ +

修改密码

+ +

完成上述操作后再按照 上方教程 操作即可使用密码登录微软账户。

]]>
zkitefly
设置项详解2023-06-09T10:26:00+08:002023-06-09T10:26:00+08:00https://docs.hmcl.net/launcher/set-item-details引言 + +

本篇文章将从”全局游戏设置”, “通用”, “外观”与”下载”这几个维度, 详细的为您介绍HMCL设置中各个选项的作用, 对于一些能够”见名知意”的条目, 在本篇文章中不过多讨论.

+ +

约束与注意

+ +

本篇文章是在 HMCL-3.5.3.230 版本中编写的, 如果您使用的是旧版本, 请注意有些选项可能不存在.

+ + + +

全局游戏设置

+ +

这是 HMCL 中的第一个设置项, 也是最重要的设置项之一, 它决定了 HMCL 在启动游戏时的行为.

+ +

Java路径

+ +

众所周知, Minecraft 是由 Java 编写的, 因此在启动游戏时 HMCL 需要知道 Java(JRE1) 的安装路径才能启动游戏.

+ +

由于 HMCL 本身就是一个 Java 程序, 一般能正常启动 HMCL 就能至少在计算机上找到一个 JRE. 但也会由于一些未知因素导致无法找到 JRE, 这时, 就需要手动指定 JRE 的安装路径.

+ +

我们先来讨论能够自动识别的情况:

+ +

在 HMCL 启动时, 会根据注册表项, 环境变量, 以及 HMCL 自身的启动路径2来寻找 JRE. 如果找到了, 就会在 “Java路径” 这一栏显示出来, 并且在启动游戏时使用这个路径.

+ +

上述的情况几乎涵盖了所有, 如果你希望 HMCL 能够自动找到 Java, 就应该使用这些技巧配置好你的计算机环境.

+ +

接下来我们讨论不能自动识别的情况:

+ +

通常我们安装解压版本的 JRE 都不会被 HMCL 自动找到, 这时, 就需要手动指定 JRE 的安装路径. 你可以展开 “Java路径” 条目(通常是点击条目右侧的三角), 在展开的下拉列表中选中”自定义”条目后点击右侧的文件夹图标, 在弹出的对话框中选择你 Java 可执行文件的路径.

+ +

自动选择合适的 Java

+ +

在1.16.5版本后, Minecraft 的最低支持 Java 版本从 8 提升到了 16. HMCL 可以在已添加的版本中找到最合适的 Java 版本, 并在启动游戏时使用这个版本. 整个过程不需要人力介入.

+ +

版本隔离

+ +

这是当前主流启动器都支持的功能, 这个功能能够在尽可能共享依赖库的前提下, 将不同的游戏版本隔离开来, 避免你安装的模组加载器被应用在错误的版本上或是加载到不兼容的版本, 同时最大程度的减少磁盘占用.

+ +

此功能的底层原理不在此处过多赘述, 对于用户来说最大的区别就是游戏的实际目录发生了改变, 例如: 提取游戏日志的方式3被改变了

+ +

原本游戏目录默认应该在 .minecraft 文件夹, 但在开启版本隔离后, 你实际的游戏目录被切换到了 .minecraft/versions/游戏版本名称, 这会给一些新手或是习惯于使用正版启动器的玩家带来额外的困惑.

+ +

通常来说, 只要你玩的不是未修改过的版本, 都应该打开版本隔离避免引发错误, 这也能在你删除某个游戏版本时将日志等数据一并清除.

+ +

游戏内存

+ +

这与你计算机上的 RAM 存储器容量有关, 一般来说选择 “自动分配内存” 选项会得到一个相对合适的值. 但也许会有一些 CPU 性能较差希望用内存来交换的玩家愿意分配更多的内存.

+ +

但我告诉您, 这里只是在调整 JVM4 能够使用的最大内存容量, 只有在模组 / Minecraft 官方开发者没有手动控制 GC5 行为的时候, 才能如你预期的通过内存交换 CPU 时间

+ +

启动器可见性

+ +

这个条目有 4 个选项, 分别是:

+ +
    +
  • 游戏启动后结束启动器
  • +
  • 游戏启动后隐藏启动器
  • +
  • 保持启动器可见
  • +
  • 隐藏启动器并在游戏结束后重新打开
  • +
+ +

游戏启动后结束启动器

+ +

这个选项特别推荐低性能机器使用, 这能节约一些计算机消耗. 代价是启动器无法很好的捕捉您的游戏崩溃信息与日志.

+ +

游戏启动后隐藏启动器

+ +

这个选项会在您游戏崩溃时收集您计算机上的相关崩溃信息以供向相关开发人员进行反馈. 代价是需要额外消耗一些计算机资源.

+ +

保持启动器可见

+ +

这个选项会在整个游戏过程中保持启动器可见, 这会在需要同时启动多个游戏的时候起到帮助. 代价是要消耗更多的计算机资源.

+ +

隐藏启动器并在游戏结束后重新打开

+ +

如果您需要频繁的在不同版本中切换游戏, 例如测试您的模组兼容性, 评估各版本之间的信息, 那么这个选项将会起到一定的帮助作用.

+ +

游戏参数

+ +

关于这点, 我没有找到更多的, 能与游戏同时使用的启动参数

+ +

JVM参数

+ +

调整JVM参数能够更细腻的控制 JVM 的行为, 例如是否压缩指针(用 CPU 换内存), 是否频繁 GC(还是用 CPU 换内存)等等, 这些一般都可以通过类似于这篇文章6这样进行调整. 不过要注意的一点是, JVM 参数是由实际实现决定的, 是否使用以及是否支持还要看具体的 JVM 实现.

+ +

本地库路径

+ +

在一些例如M1芯片之类的设备上, 通用库类可能都不能正常的工作, 要使用版本特殊提供的库类才能令其正常的工作, 你可以使用这个选项对其进行替换

+ +

GLFW

+ +

GLFW是一个轻量级的C语言库,用于创建和管理 OpenGL 在多个操作系统中的上下文,处理用户输入,以及获取时间和帧缓冲。它支持多个窗口、全屏模式、窗口模式、多个输入设备和剪贴板。GLFW是一个独立于操作系统的库,可以在 Windows, MacOS, Linux 等多个平台上使用。

+ +

在Linux下,系统自带的窗口管理器(例如 xorg)通常已经包含了可以与 OpenGL 集成的窗口管理器。因此,使用系统自带的窗口管理器可以避免与其他项目的库冲突,并确保对于系统提供的功能和特性有最好的支持。此外,使用系统自带的窗口管理器也能够最大限度地减少安装和配置上的复杂性。

+ +

故此, Linux 玩家推荐使用系统自带的

+ +

OpenAL

+ +

OpenAL 是一个跨平台的 3D 音频 API,可以用于在多个操作系统上播放音效和音乐。它支持的特性包括定位、重放、3D 效果、回声、滤波等。可以使用 OpenAL 提供的函数对声源和听者的位置、方向、速度等进行控制,以实现 3D 音频效果。

+ +

在 Linux 下 OpenAL 通常可以与 ALSA(高级 Linux 音频体系结构)或 PulseAudio(一种现代的音频子系统)进行集成。使用系统自带的音频支持库,可以确保应用程序与底层音频硬件和设备之间的兼容性,并提供最佳的音频性能和功能。此外使用 OpenAL 也可以让应用程序具有跨平台的特性,可以在多个操作系统上使用相同的代码和资源来实现音频效果。

+ +

故此 Linux 用户推荐使用系统自带的

+ +

通用

+ +

这里提供了一些 HMCL 的通用参数, 例如启动器是否自动检查更新, 文件下载的缓存目录存放位置, 程序界面的显示语言等. 这些基本都属于 “见名知意” 的范畴, 不需要过多讨论.

+ +

外观

+ +

这里提供了一些 HMCL 的外观参数, 例如启动器的主题颜色, 动画显示, 背景图片, 字体等. 这些基本都属于 “见名知意” 的范畴, 不需要过多讨论.

+ +

下载

+ +

下载源

+ +

由于网络环境问题, 在之前下载 Minecraft 可能是一件麻烦事, 但在现在, 我们有了 BMCLAPI7 项目, 该项目无偿为大陆地区用户提供 Minecraft 相关文件的镜像. 但有可能存在延迟, 可以按照自己的需求进行选择.

+ +

下载并发数

+ +

提高下载并发数能够最大限度的利用您的网络, 但这不是越高越好的. 提高并发数量会对您的计算机和下载源都带来更高的负载, 由于木桶效应的存在, 本地下行带宽, 下载源上行带宽, 您的磁盘读写速度等这过程中的任何一环都会成为下载途中的瓶颈, 所以不要盲目提高并发数, 推荐的家庭带宽并发数在 8~16 之间.

+ +

代理设置

+ +

用于解决部分网络不佳或需要连接特殊网段的工具, 能够连接到内网服务器之类的.

+ +

特别鸣谢

+ +
    +
  • huangyuhui
  • +
  • GitHub Copilot
  • +
+ +

参考文章

+ + + + +]]>
MemoryShadow
同时安装 Fabric &amp; OptiFine2023-01-04T11:30:00+08:002023-01-04T11:30:00+08:00https://docs.hmcl.net/launcher/fabric_and_optifine_install在 HMCL 的自动安装中,如果先选择了 Fabric 或 OptiFine ,HMCL 就会提示他们互不兼容。

+ +

但在本文档中,通过一些简单的操作就可以同时安装 Fabric & OptiFine 的客户端。

+ +

原理是安装 OptiFabric 这个 Fabric 模组,该模组的作用是采用官方的 OptiFine 并在运行时与 Fabric 兼容来实现这一点。

+ +

如果你使用 OptiFine 纯粹是为了提高性能、使用缩放按钮或动态照明,那么还有其他模组可以单独实现这些功能,具有更可靠的兼容性。

+ +

操作方法

+ +

1.先选择一个版本,并选择 Fabric ,并安装。

+ +

安装fabric客户端

+ +

注:如果你想放置其他的 Fabric 模组,建议一并安装 Fabric API ,有些 Fabric 模组会依赖他。

+ +

2.获取并安装 OptiFabric 模组 & OptiFine

+ +

获取

+ + + +

MC百科下载页面(推荐)

+ +

MC百科下载页面

+ +

CurseForge页面 下载操作:

+ +

CurseForge页面下载操作

+ +

HMCL 模组搜索下载操作:

+ +

1

+ +

2

+ +

3

+ +

4

+ +

注:如果你在HMCL模组搜索中下载时,另存该模组,那么就需要按照下面的模组安装方法来安装。

+ +
    +
  • 2)获取 OptiFine ,可以在他的 页面 或非官方 中文页面 中可以下载
  • +
+ +

OptiFine 页面 操作:

+ +

OptiFine页面操作

+ +

OptiFine 非官方 中文页面 操作:

+ + + +

安装

+ +

进入 要安装模组的游戏版本 的 游戏管理 ,切换到 模组管理 ,在这个页面将 OptiFabric 模组 & OptiFine 添加即可

+ +

安装模组

+ +

然后在 模组管理 中检查是否有 OptiFabric 模组 & OptiFine !

+ +

检查完后,至此就完成啦,直接启动游戏即可。

]]>
zkitefly
光影2021-10-09T23:18:02+08:002021-10-09T23:18:02+08:00https://docs.hmcl.net/launcher/shader安装 OptiFine + +

方式一: 全新安装

+ +

当你在安装新的游戏客户端时候,会看到有个 OptiFine 的选项。

+ +

OptiFine_Install

+ +

点开之后会看到有 3 个复选框,一般而言,正式版 会比 测试版 更加稳定。选择安装 正式版 ,如果没有 正式版 那么再考虑 测试版

+ +

OptiFine_Selection

+ +

选择完合适的版本之后就可以点击右下角的安装继续进行安装。

+ +

方式二: 修改/升级已安装版本

+ +

在对应的游戏版本管理页面,点击 自动安装 ,你会看到有个 OptiFine 的选项。

+ +

OptiFine_AutoInstaller

+ +

点开之后选择合适的版本然后等待安装完成即可。 +目前,如果要在 Fabric 使用 OptiFine ,需要通过 方式四 安装。

+ +

方式三:官网安装

+ +

OptiFine 官网上下载合适版本的 OptiFine (下载完应为 OptiFine_<游戏版本>_<OptiFine版本>.jar ) 。

+ +

双击打开或者使用 java -jar 文件名 的方式打开,然后你就会看到这个界面。

+ +

Path_Selection

+ +

选择自己游戏的 .minecraft 目录(默认安装到 \AppData\Roaming\.minecraft 目录下),然后点击 Install 按钮,之后你在 HMCL 的版本列表中就可以找到含有 OptiFine 名字的客户端,启动即可。

+ +

如果未找到,请确认你是否已安装对应的版本的客户端,且 命名为对应版本号 的原本游戏客户端。

+ +

方式四:OptiFine 与 Mod 加载器共存

+ +

OptiFine 官网上下载的 Jar 文件本身也可作为 Mod 被加载,可以用 Java 运行下载的文件并导出 Mod 版本。Mod 安装具体方法见 Mod 安装教程

+ +

注意:

+ +
    +
  1. +

    Fabric 和 OptiFine 本身并不能共存,必须同时安装 OptiFabric (一个 Fabric Mod ) 。 + OptiFabric 目前 1.17 仅支持 OptiFine HD U G9Fabric 最高支持的版本为 0.11.7

    +
  2. +
  3. +

    Forge 和 OptiFine 会出现不兼容的情况,但大多数情况下,Forge 和 OptiFine 是相互支持的。在 OptiFine 官网下载页面 可以查看OptiFine与Forge的兼容情况,位置见下图的红框位置。

    +
  4. +
+ +

OptiFine_Compatibility

+ +
    +
  1. 若出现不兼容的情况,请使用 OptiForge (一个 Forge Mod ) 或者等待OptiFine兼容Forge解决。
  2. +
+ +

安装Oculus(一个 Forge Mod)

+ +

在高版本的OptiFine中,OptiFine与mod的兼容性较差,以及对性能提升较小,所以可以安装Oculus,但Oculus与OptiFine不兼容,注意依赖关系,Oculus需要前置Rubidium

+ +

Oculus

+ +

相关链接: Oculus Curseforge Oculus Modrinth Rubidium Curseforge Rubidium Modrinth

+ +

安装Iris Shaders(一个Fabric/Quilt Mod)

+ +

在Fabric中,也可以安装Iris Shaders来安装光影,注意依赖关系,Iris Shaders需要前置Sodium

+ +

Iris

+ +

相关链接: Iris Shaders官网 Iris Shaders Modrinth Iris Shaders Curseforge(不再更新,请到官网或Modrinth下载最新版本) Sodium Modrinth Sodium Curseforge(不再更新,请在Modrinth下载)

+ +

安装光影包

+ +

一般光影是一个 Zip 格式的文件,将光影文件放入 \.minecraft\shaderpacks 文件夹中即可 (没有这个文件夹就自己新建一个) 。如果开了版本隔离,那么文件夹是 \.minecraft\version\<客户端名称>\shaderpacks。若你不知道游戏文件夹在哪,在HMCL中打开游戏文件夹。

+ +

Game_Dir

+ +

如果你不知道版本隔离是啥,也不会创建文件夹,那么请打开游戏,依次点击 设置—视频设置—光影—光影包文件夹 ,在里面放入光影包,然后点击你要加载的光影,最后点击 完成 即可

+ +

Shader_Settings

+ +

注意:光影对于电脑配置的要求比较高,如果开了光影之后出现游戏画面很卡的情况,请升级电脑配置、使用低配置光影或者关闭光影。

]]>
全局版本隔离2021-10-09T23:18:02+08:002025-12-03T14:31:42+08:00https://docs.hmcl.net/launcher/isolation请注意该方法会改变默认的游戏文件结构。

+ +

使用方式

+ +

进入 hmcl 的 设置

+ +

+ +

在全局游戏设置中找到 版本隔离 并设置为 各实例独立

+ +

+ +

这时候 minecraft 的文件结构就会有所改变,如下方

+ +
.minecraft
+├── asstes
+├── libraries
+└── versions
+    └── 1.16.5-optifine
+        ├── 1.16.5-optifine.jar
+        ├── saves
+        ├── resourcepacks
+        ├── logs
+        ├── mods
+        └── ...
+
+ +

并非在 .minecraft 文件夹中存储一切的 mod 和 资源包而是各版本的资源互相独立

+ +

这样你就可以在一个目录下,安装多个客户端

+ +

往后的使用

+ +

在做完版本隔离的设置后,hmcl 的快速打开各个游戏文件夹的功能就会显得十分好用。

+ +

+ +

善用该功能也可为你的磁盘剩下不少的空间,现在反思过来其实都差不多

]]>
LIPiston
数据包制作指南2021-08-22T23:18:02+08:002021-08-22T23:18:02+08:00https://docs.hmcl.net/launcher/datapack本指南只介绍如何制作一个 HMCL 可导入的数据包压缩包。

+ +

建议

+ +

始终建议你使用多数据包格式制作数据包压缩包,因为 HMCL 会删除重名的数据包,因此可以借此完成更新功能,只要直接导入新的多数据包格式的压缩包就可以完成更新你制作的数据包。

+ +

多数据包

+ +

如果你的数据包被分离成多个部分供玩家选择是否启用,或者需要自带资源包,那么你需要制作多数据包格式的压缩包。

+ +

多数据包文件(只能是一个 .zip 文件)格式例子如下:

+
crafting++.zip
+\
+* datapacks
+  |\
+  | * block_sky_domain (一个合法的数据包)
+  | * crafting_machine
+  | * craftingpp
+  | * tradepp
+  | * utilitypp
+  |
+* resources.zip (如果你的数据包需要附带材质)
+  \
+    * assets
+      \
+        * ...
+
+ +

其中,datapacks 下的文件格式和 .minecraft/saves/New World/datapacks 的一样,因此可直接手动打包你本地的 datapacks 文件夹, +就可以直接导入 HMCL 了。如果还需要资源文件,请在压缩包内附带上。

+ +

此外,resources.zip 文件的格式和 .minecraft/saves/New World/resources.zip 的格式一样, +导入数据包时,启动器将会合并世界附带的默认资源包和你的数据包附带的资源包,如果有重复的文件,旧的文件将被覆盖。 +如果你的服务器使用了包含资源包的数据包,那么请在服务器上完成这个操作,接着玩家下载服务器资源包即可。

+ +

单数据包

+

如果你的数据包不需要资源文件,那么你直接打包 datapacks/<你的数据包名称> 文件夹,即可直接导入 HMCL。

+ +

单数据包文件(只能是一个 .zip 文件)格式例子如下:

+
RealisticGlassPane.zip
+\
+* pack.mcmeta
+* data
+  \
+    * 一些文件
+
+ +

HMCL 将会将你打包好的数据包压缩包直接复制到 datapacks 文件夹,不会解压(因为原版游戏支持读取压缩包)。

]]>
huanghongxun
\ No newline at end of file diff --git a/feed/modpack.xml b/feed/modpack.xml new file mode 100644 index 0000000..735376c --- /dev/null +++ b/feed/modpack.xml @@ -0,0 +1,753 @@ +Jekyll2026-03-15T20:43:59+08:00https://docs.hmcl.net/feed/modpack.xmlHMCL 文档 | ModpackHMCL 启动器 \| 跨平台 \| 整合包管理 \| 自动安装 \| 十二年历史 \| 三亿次使用模组包报错排查手册2025-05-24T13:39:36+08:002025-05-24T13:39:36+08:00https://docs.hmcl.net/modpack/error-handbook文件夹结构 + +

首先我们需要先认识Minecraft的文件夹结构
+如果你开启了 版本隔离 那么你的文件夹结构如下

+
.minecraft
+|*assets         # 游戏资源文件夹,存放纹理、声音等资源
+|*libraries      # 依赖库文件夹,存放运行游戏所需的各种库
+|*versions       # 版本文件夹,包含所有已安装的Minecraft版本
+    \1.16.5-optifine
+        |1.16.5-optifine.jar   # 该版本的主程序jar文件
+        |*saves               # 存档文件夹,仅该版本可见
+        |*resourcepacks        # 资源包文件夹,仅该版本可见
+        |*logs                # 日志文件夹,仅该版本可见
+        |*mods                # 模组文件夹,仅该版本可见
+        |*config              # 配置文件夹,仅该版本可见
+        |*crash-reports       # 崩溃报告文件夹,仅该版本可见
+        ...
+
+ +

如果你没有开启则是这样

+
.minecraft
+|*assets         # 游戏资源文件夹,存放纹理、声音等资源
+|*libraries      # 依赖库文件夹,存放运行游戏所需的各种库
+|*saves          # 存档文件夹,所有版本共用
+|*resourcepacks  # 资源包文件夹,所有版本共用
+|*logs           # 日志文件夹,所有版本共用
+|*mods           # 模组文件夹,所有版本共用
+|*config         # 配置文件夹,所有版本共用
+|*crash-reports  # 崩溃报告文件夹,所有版本共用
+|*versions       # 版本文件夹,包含所有已安装的Minecraft版本
+    \1.16.5-optifine
+        |1.16.5-optifine.jar   # 该版本的主程序jar文件
+        ...
+
+ +

我们极力推荐您打开版本隔离,因为这样能避免模组之间的一部分冲突 跳转

+ +

简单排查

+ +

在遇到报错时,您可以通过以下两种方式进行初步分析:

+ +
    +
  1. +

    使用社区分析工具
    + 访问 CrashMC 报错分析器,将崩溃报告内容粘贴进去,工具会自动分析常见问题并给出建议。

    +
  2. +
  3. +

    借助 AI 辅助分析
    + 可以将崩溃日志粘贴到 DeepSeek Chat,让 AI 帮助你解读报错内容和可能的解决方法。

    +
  4. +
  5. +

    进入 HMCL 汉医堂 + 可以在 HMCL 急诊群中向群友们寻求帮助,他们通常有丰富的经验,能够协助你分析报错并提供解决方案。

    + +
    +

    qq : 666546887

    +
    +
  6. +
+ +

这三种方式都能帮助您快速定位问题,提高排查效率。

+ +

求助他人

+ +

游戏崩的时候会有个窗口,里面可以导出一个压缩包,可以发给别人让别人帮你看,你千万别截图那个窗口 *磕头

+ +

报错示例截图 +在向他人求助时,建议将 .minecraft 文件夹下的 crash-reports 文件夹和 logs 文件夹中的相关文件(如最新的崩溃报告和日志文件)一并打包发送。
+这样可以让对方更全面地了解你的运行环境和报错详情,从而更高效地帮助你分析和解决问题。请注意,发送前可先检查日志内容,避免泄露个人隐私信息。

]]>
LIPiston
配置客户端自动更新 (Nginx)2023-01-11T14:13:45+08:002023-01-11T14:13:45+08:00https://docs.hmcl.net/modpack/serverpack3 +

阅读本文前,请先阅读此文章

+ + +

前置知识

+ +

阅读本文你需要具有以下知识储备:

+ +
    +
  1. 掌握基础本的 linux 命令操作,比如 cd ls
  2. +
  3. 拥有一个 linux 服务器(好像不算知识)
  4. +
+ +

Nginx 安装

+ +

这里很基础(但是坑比较多)略过,可以看以下参考文档。

+ +
+

https://zhuanlan.zhihu.com/p/515069497

+
+ +

新建静态资源文件夹

+ +

我为了省事直接在/根目录下新建了一个 MinecraftClientStatic 文件夹,以后需要作为静态资源的文件都丢这里面。

+ +

命令:

+ +
# 到更目录
+cd /
+# 新建文件夹
+mkdir MinecraftClientStatic
+# 防止nginx无法访问,配置文件夹访问权限
+chmod 777 MinecraftClientStatic
+# 进入文件夹
+cd MinecraftClientStatic
+# 新建一个测试用的文件
+touch helloMC.html
+# 给文件权限
+chmod 777 helloMC.html
+# 编辑html内容
+vim helloMC.html
+
+ +

这里为了测试静态资源是否配置成功,需要新建一个 helloMC.html 的静态测试文件,可以在这个文件内随意写两行字。

+ +

例如:

+ +
<!-- helloMC.html -->
+<h1>hello static!</h1>
+
+ +

也可以整点炫的(可选):

+ +
<!-- helloMC.html -->
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>MC客户端静态资源</title>
+        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
+        <style>
+            @font-face{
+                font-family:'calligraffittiregular';
+                src:url("fonts/calligraffitti-regular-webfont.ttf")
+            }
+            
+            * {
+                margin: 0;
+                padding: 0;
+            }
+            
+            body {
+                overflow: hidden;
+            }
+            
+            #content{
+                position: absolute;
+                color: white;
+                top: 30%;
+                left: 50%;
+                margin-left: -121px;
+            }
+            
+            p{
+                font-family: calligraffittiregular
+            }
+            
+        </style>
+    </head>
+
+    <body>
+        <div id="content">
+            <p style="font-size:  40px;font-weight: 1000;">MinecraftClientStatic</p>
+        </div>
+        <canvas id="hacker" style="width:100%;height:100%;">请使用最新的浏览器</canvas>
+    </body>
+
+</html>
+<script type="text/javascript">
+    window.onload = function() {
+        var color_array = ['#00FF00','#00FF99','#00FFCC','#00FFFF','#00BBFF','#0066FF','#0000FF','#5500FF','#7700FF','#9900FF','#CC00FF','#FF00FF'];
+        var i=0;
+        var color;
+        function changColor() {
+            color = color_array[i];
+            console.log(i++);
+            console.log(color);
+            if(i>color_array.length-1){
+                i=0;
+            }
+            setTimeout(changColor, 2000);
+        }
+    
+        var hacker = document.getElementById("hacker");
+        var width = hacker.width = screen.width;
+        var height = hacker.height = screen.height;
+        var ctx = hacker.getContext('2d');
+        var num = Math.ceil(width / 12);
+        var y = Array(num).join(0).split('');
+        var draw = function() {
+            ctx.fillStyle = 'rgba(0,0,0,.05)';
+            ctx.fillRect(0, 0, width, height);
+            ctx.fillStyle = color;
+            ctx.font = '12px Microsoft YaHei';
+            y.map(function(y1,i){
+                var text = String.fromCharCode(65 + Math.random() * 62);
+                var x = i * 12;  
+                var y1 = y[i];
+                ctx.fillText(text, x, y1);
+                y[i] = ( y1 > Math.random() * 10 * height ? 0 : parseInt(y[i]) + 12 );
+            })
+        }
+
+        Run();
+
+        function Run() {
+            changColor();
+            Game_Interval = setInterval(draw, 50);
+        }
+    }
+</script>
+
+ +

分配次级域名(可选)

+ +
+

如果你没有域名,那么这里可以跳过,后面需要域名的地方直接使用服务器ip地址

+
+ +

假设我们的域名是 buggzd.com

+ +

在域名解析新建一个 A 记录(地址为 ipv6 时应使用 AAAA 记录),此处以 minecraft.buggzd.com 为例,配置记录名称为 minecraft 配置记录地址为服务器地址,如下图所示。

+ +

image.png

+ +

这是我们就有了一个子域名 minecraft.buggzd.com 添加完成后可以使用 cmdping 一下这个域名minecraft.buggzd.com 如果返回了正确的ip地址就是已经分配成功了。

+ +
ping minecraft.buggzd.com
+
+ +

配置 nginx.conf

+ +

查找 nginx 配置文件目录:(如果这里没有 nginx 指令,那么说明你 nginx 安装没有成功)

+ +
nginx -t
+
+ +

输出

+ +
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
+
+ +

这里 /etc/nginx/nginx.conf 就是 Nginx 配置文件的路径,然后 cdnginx 配置目录。

+ +
cd /etc/nginx
+# 编写配置文件
+vim nginx.conf
+
+ +

因为之前配置过博客反向代理 nginx.conf 会带有之前的配置记录不要把他们搞乱,理清层级关系很重要

+ +
# 这是 nginx.conf 的层级目录
+# 每个 nginx.conf 配置文件都只有一个 http 块,所以如果之前配置过 nginx
+# 就只需要粘贴 server 块里的内容,把 server 块放到 http 块内部。
+http {
+    server { ... }
+    server { ... }
+    server { ... }
+}
+
+ +

需要填写的配置:

+ +
http {
+    server {
+        # 需要监听的端口号,可以不动
+        listen 80;       
+        # 这里需要把localhost改为上面分配好的域名
+        server_name  minecraft.buggzd.com;
+        location / {
+            # root后面是对应的静态资源文件夹的位置
+            root /MinecraftClientStatic;
+            # 这里是默认加载的首页 html ,这里放的是刚刚新建的测试文件
+            # 它是从 root 目录文件夹内开始查找的,所以不要写 /MinecraftClientStatic/helloMC.html
+            index helloMC.html;
+        }
+    }
+}
+
+ +
+

Q:上面的配置干了什么事?
+A:比如你访问 http://minecraft.buggzd.com/test.png 时,nginx 会访问本地的 /MinecraftClientStatic/test.png 然后返回。

+
+ +

当正确编写完 nginx.conf 需要让 nginx 重新加载一下配置文件。

+ +
nginx -s reload
+
+ +

然后直接访问刚刚配置的域名 minecraft.buggzd.com 默认会跳转到编写好的 helloMC.html 页面,你也可以访问 http://minecraft.buggzd.com/helloMC.html

+ +

image.png

+ +

当页面出现 helloMC.html 的内容时,说明已经配置成功了! +放张图片到静态资源文件夹试试。

+ +

image.png

+ +

访问成功,没问题!

+ +

导出整合包

+ +

image.png

+ +

选择服务器自动更新整合包

+ +

image.png

+ +

整合包下载链接前缀:填静态资源服务器的地址。 +我们需要先去静态资源文件夹下新建一个 modepack 文件夹(也就是 /MinecraftClientStatic/modepack

+ +
cd /MinecraftClientStatic
+mkdir modepack
+
+ +

然后整合包下载链接前缀这里填写 http://minecraft.buggzd.com/modepack

+ +

image.png

+ +

上传整合包到静态资源服务器

+ +

假设我们刚刚打包的整合包名称为 client1.0.zip +我们把 client1.0.zip 通过 ftp 上传到服务器中,然后使用解压命令将这个整合包解压到 /MinecraftClientStatic/modepack 文件夹中。

+ +
# 假设我们把client1.0.zip上传到了/home/ftp文件夹中
+# 把 /home/ftp/client1.0.zip 解压到 /minecraftClientStatic/modepack
+unzip /home/ftp/client1.0.zip -d /minecraftClientStatic/modepack
+
+ +

解压完以后我们查看一下

+ +
ls /minecraftClientStatic/modepack
+
+ +

服务器返回:

+ +
overrides server-manifest.json
+
+ +

其中 overrides 是一个文件夹 server-manifest.json 是整合包配置文件。

+ +

客户端初始化

+ +

第一次使用客户端需要在一个空文件夹以 newClientPackage 为例,在文件夹中放一个 hmcl 启动器,打开 hmcl 导入刚刚做好的 client1.0.zip 整合包。 +然后就可以把这个文件夹 newClientPackage 打包成一个 zip 发给玩家了,以后玩家每次打开 hmcl 登录时,启动器就会自动向静态资源服务器中查询整合包配置信息,当发现更新时会自动下载。 +当缺少 mod 时会自动下载静态资源服务器上的 mod

+ +

image.png

+ +

更新客户端

+ +

目前HMCL版本更新的步骤是这样的:

+ +
    +
  1. 启动器对比本地的 mod 和服务器的 mod 名称,如发现本地不存在的 mod 则会从服务器上下载。
  2. +
  3. mod 的名称相同时,启动器会继续对比文件 MD5 哈希值,如果不匹配则重新下载。
  4. +
  5. 在获得更新的时启动器会对比一次本地的文件,如果旧版本的模组在新版本中消失了,启动器会自动将本地的这个模组删除。
  6. +
  7. 非远端服务器更新资源不会被更新删除,换句话说就是如果是玩家自己魔改整合包,往里面放的 mod 是不会被删除的。
  8. +
+ +

当想要添加新的 mod 时需要在添加之后重新导出整合包如 client2.0.zip 导出的整合包版本号增加,然后重新上传整合包到静态资源服务器。

+ +
cd /minecraftClientStatic
+# 建议直接删除该目录然后重新新建
+rm modepack -R
+# 重新新建modepack文件夹
+mkdir modepack
+# 解压新的客户端整合包
+unzip /home/ftp/client2.0.zip -d /minecraftClientStatic/modepack
+
+ +

玩家启动 hmcl 后,启动器会检测到版本更新并自动更新模组。

+ +

参考资料

+ +]]>
buggzd
整合包自带 Java 教程2021-10-09T23:18:02+08:002021-10-09T23:18:02+08:00https://docs.hmcl.net/modpack/bundled-java背景 + +

想必有些服务器主为此头疼了许久。由于玩家的电脑环境多变,甚至可能仍然有安装着 Java 7 的电脑而无法启动 1.12.2 以上的游戏或者含有 Mod 的客户端。因此服务器主希望能在整合包中自带一个 Java 运行时(或者叫 JRE),从而取代电脑自带的 JVM。接下来本文将介绍两种方法。

+ +

名词解释

+
    +
  • +JRE Java Runtime Environment的缩写。通常可以认为是玩家所使用的 Java +下文所指代的 Java 和 JRE 均可以认为是此版本。
  • +
+ +

方法一:使用最新版本(推荐)

+ +

EXE 版本

+ +

EXE 版本在 Windows 系统下打开会首先检查同级文件夹下的 jre-arm64jre-x64jre-x86 文件夹。

+ +

检查顺序从上到下依次是:

+
    +
  • +jre-arm64 (ARM 64 位)
  • +
  • +jre-x64 (x86 64 位)
  • +
  • +jre-x86 (x86 32 位)
  • +
+ +

启动优先级如下:

+
    +
  • 如果玩家电脑的操作系统是x86 32位的,HMCL 将会优先使用 jre-x86 启动 HMCL。
  • +
  • 如果玩家电脑的操作系统是x86 64位的,HMCL 将会优先使用 jre-x64 启动 HMCL。
  • +
  • 如果玩家电脑的操作系统是ARM 64位的,HMCL 将会优先使用 jre-arm64 启动 HMCL。
  • +
+ +

如果你不打算兼容ARM 64位x86 32位操作系统的玩家(让 HMCL 使用系统 JRE 环境),那么你的整合包内只需要携带 jre-x64 即可。

+ +

如果你想在任何情况下使用同一个 Java 启动 HMCL,只需要携带 jre-x86 即可,此时无论玩家电脑的操作系统是什么架构都会尝试使用该 Java。

+ +

如果没有对应的版本,将会尝试使用系统自带的版本启动。

+ +

注意

+ +

使用 x86 32位的 Java 很可能会导致游戏出错、内存不够等问题。我们推荐您配备 x86 64位的 Java 而不是 x86 32位

+ +

Shell (.sh)版本

+ +

SH 版本在支持 Bash 的系统下打开会首先检查同级文件夹下的 jre-loongarch64jre-arm32jre-arm64jre-x64jre-x86 文件夹。

+ +

检查顺序从上到下依次是:

+
    +
  • +jre-x64 (x86 64 位)
  • +
  • +jre-x86 (x86 32 位)
  • +
  • +jre-arm64 (ARM 64 位)
  • +
  • +jre-arm32 (ARM 32 位)
  • +
  • +jre-loongarch64 (Loongarch 64 位)
  • +
+ +

会根据玩家电脑的操作系统架构选择对应文件夹内的 Java 运行时启动 HMCL。

+ +

如果你想在x86 32位x86 64位下使用同一个 Java 启动 HMCL,只需要携带 jre-x86 即可,此时如果玩家电脑的操作系统是x86 32位x86 64位则会尝试使用该 Java 启动 HMCL。

+ +

如果没有对应的版本,将会尝试使用系统自带的版本启动。

+ +

注意

+ +

在启动器内更新升级本体时,只会更新本体部分,并不会将 EXE外壳 或 SH 外壳(即 HMCLauncher)更新,因此建议在制作整合包时重新下载 EXE 或 SH 版本以确保能正常使用该功能。

+ +

方法二:创建快捷方式

+ +

对于在 Windows 下使用 JAR 版本启动 HMCL 的可以采用方法二。

+ +

目录结构

+ +

首先我们假设整合包根文件夹是 tutorial(这个文件夹名字可以取别的),该文件夹内应该包含如下的文件:

+ +

+ +

其中,.minecraft 是 Minecraft 文件夹,jre-x64 是你的 Java 运行时,我们分别来看看这两个文件夹的内容:

+ +

+ +

上图是 .minecraft 文件夹的内容,里面包含着 assetslibrariesversions 等传统的文件夹。以及 HMCL.jar,这个文件是 HMCL 启动器的 jar 文件,可以在 https://hmcl.huangyuhui.net/download 里面下载 macOS 或者 Linux 版本(这两个版本的文件后缀名都是 jar,实际上是完全一样的东西,也可以在 Windows 系统上双击运行,没有平台限制)。

+ +

这个启动器文件我们接下来会使用到,借助整合包自带的 Java 运行时启动 HMCL。

+ +

注意:HMCL 本体文件 HMCL.jar 请务必保持该文件名,HMCL-3.2.117.jar 等带有版本号的文件名是不可以的

+ +

+ +

上图是 jre-x64 文件夹的内容,一看就是一个 JRE 的文件夹。

+ +

创建快捷方式

+ +

接下来我们创建一个快捷方式来使得 HMCL 通过 jre-x64 文件夹里的 Java 运行时启动,并使得 Minecraft 也通过该 Java 运行时启动。

+ +

+ +

tutorial 文件夹内右击空白区域打开快捷菜单,创建快捷方式。

+ +

+ +

在弹出的窗口中(如上图所示),在输入框内输入:cmd /c start .\jre-x64\bin\javaw.exe -jar .\.minecraft\HMCL.jar,其中 jre-x64.minecraft\HMCL.jar 根据实际情况修改,jre-x64 是你的 Java 运行时的路径,.minecraft\HMCL.jar 是 HMCL 本体文件。

+ +

+ +

接着给快捷方式取个名字就好了(如上图所示,开始游戏 是我取的名字)。

+ +

生成好快捷方式后我们还要编辑一下属性,右键 开始游戏 这个新创建的快捷方式(如果你取了别的名字请选中那个文件编辑其属性),在弹出的快捷菜单中选择属性,会打开快捷方式的属性窗口如下图所示:

+ +

+ +

将起始位置内的文字删除干净,留空即可。保存退出该窗口。

+ +

完成

+ +

现在这个开始游戏的快捷方式就可以直接使用的,你可以双击该快捷方式打开 HMCL,HMCL 在启动游戏的时候也会直接使用你指定的 Java 运行时。

+ +

一些疑问

+ +

1Q:这些 Java 文件夹中具体该放些什么,直接复制就行了吗?

+ +

1A:是的,复制 jre 内的所有东西就行,可以根据下图参考:

+ +

+ +

——————————————————————————————————————————————————

+ +

2Q:去哪里找 Java?

+ +

2A:有很多的Java提供选择,如 Liberica JDKMicrosoft JDKOracle JDK中文 Java 镜像站Oracle openJDK

+ +

只需要在下载时下载.zip 压缩包文件,且将压缩包内的所有内容放入对应文件夹即可

]]>
配置客户端自动更新(宝塔面板)2021-08-22T23:18:02+08:002021-08-22T23:18:02+08:00https://docs.hmcl.net/modpack/serverpack2备注 + +
+

文章原作者:hy黑影
+转载:Zkitfly
+部分内容进行了稍作打磨
+本教程转载自 https://www.mcbbs.net/thread-1103864-1-1.html

+
+ +

前言

+ +
    +
  • 我自己开设的服务器有很多不同的子服,每个子服的客户端版本呢都不相同,我又希望能整合到一个客户端里面;找了一圈发现那些辅助更新程序只能更新单个客户端版本,而且界面不太美观;甚至一度想自己开发启动器………
  • +
  • 这篇帖子的灵感来自于 HMCL 启动器的一个功能 导出服务器自动更新整合包,我觉得可以利用这个功能来代替一些自动更新的辅助程序。
  • +
  • 整个功能的实现需要:一台有公网IP的服务器、一个客户端整合包、HMCL启动器;如果你都没有,那就换成RMB10元
  • +
  • 本篇教程默认读者为 萌新,即没有接触过HTTP服务器,网络应用开发,不懂linux系统,惧怕控制台程序 +
  • +
+ +

教程

+ +

第一步-租服务器(▲如果你有公网IP的服务器,请跳过这一步)

+ +
    +
  • 百度搜索 腾讯云学生机阿里云学生机 +
  • +
  • 可以看到有10元/月 的套餐,如果是阿里云的话选轻量型应用服务器,腾讯云就只有一个套餐
  • +
  • 系统请选择CentOS 8.0 64位,其他保持默认即可
  • +
  • 再次确认是否是十元,是的话直接购买;不是的话可能是你已经买过学生套餐
  • +
  • 第一次购买可能需要实名认证,按照提示操作即可,不需要担心安全问题,都是可靠的大公司
  • +
+ +

第二步-安装宝塔面板——CentOS 8.0系统

+ +
    +
  • +

    以腾讯云举例,阿里云同理

    +
  • +
  • +

    打开控制台面板,找到刚才租的学生机

    + +

    +
  • +
  • +

    选择重置密码

    + +

    +
  • +
  • +

    点击右侧登入按钮,按照说明填写你刚刚重置的密码;之后应该会看到类似这样的提示

    + +

    +
  • +
  • +

    不要慌,冷静。如果下面的部分教程失效请去宝塔面板官网,点击Linux->立即安装

    + +

    +
  • +
  • +

    回到控制台面板,我们需要开放一些通道让面板通过,选择安全组

    + +

    +
  • +
  • +

    点击修改规则,再点击添加规则

    +
  • +
  • +

    图1:

    + +

    +
  • +
  • +

    图2:

    + +

    +
  • +
  • +

    按照图中所写添加,想要安全的话按照图1,懒的话按照图2

    +
  • +
  • +

    回到那个黑黑的界面里输入 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ,按下回车

    +
  • +
  • +

    这时会刷一大片大的英文,等他停下来的时候仔细看,最后一行在问你要不要安装(就是最后显示y/n),输入y并按下回车

    +
  • +
  • +

    耐心等待五分钟左右,直到出现这个字样

    + +

    +
  • +
  • +

    复制外网面板地址,在打开的页面中,用户名输入username后面的内容,密码输入password后面的内容

    +
  • +
  • +

    点击登入,到此为止面板按照完成

    +
  • +
+ +

第三步-搭建HTTP静态文件服务器

+ +
    +
  • +

    打开刚刚的宝塔面板,一般都会有提示安装套件,选择nginx套装安装

    +
  • +
  • +

    等待安装完成后,选择网站,点击添加网站

    + +

    +
  • +
  • +

    在弹出的页面填写网站IP,就是地址栏里面的那个;比如:我的是 https://233.88.233.44:8888/site ,那么我就填233.88.233.44

    +
  • +
  • +

    另外,租vps的同学请找服务商索要ip地址和开放的端口,比如我要到的是123.21.123.21:6666,那我就把这个填上去

    + +

    +
  • +
  • +

    其他保持不变,到此为止你已经搭建好了HTTP静态文件服务器✔

    +
  • +
+ +

第四步-制作整合包

+ +
    +
  • +

    使用HMCL打开你的MC客户端

    +
  • +
  • +

    选择你的游戏版本,点击导出整合包

    + +

    +
  • +
  • +

    选择服务器自动更新整合包

    +
  • +
  • +

    填写相关信息:

    + +

    +
  • +
  • +

    整合包下载链接前缀:比如我刚刚在【第三步-搭建HTTP静态文件服务器】宝塔里填的是233.88.233.44,我希望能有版本区分,这个版本代号是a;那么我就填https://233.88.233.44/a, vps注意,端口号也要写▲

    +
  • +
  • +

    版本号写1.0 ,以后更新就写2.0以此类推

    +
  • +
  • +

    点击下一步,导出完成

    +
  • +
+ +

第五步-上传整合包

+ +
    +
  • +

    打开宝塔面板,选择文件,找到相应的目录,在相应IP目录下新建文件夹;比如我刚刚写的版本代号是a,那我就新建a这个文件夹

    + +

    +
  • +
  • +

    在新建的文件夹里上传刚刚导出的整合包,并解压;成功后如下图

    + +

    +
  • +
  • +

    要是更新整合包,请在解压时将该【a】这个文件夹内的文件覆盖处理

    +
  • +
+ +

第六步-分发整合包

+ +
    +
  • 大公告成,现在可以把刚刚导出的这个整合包上传分享给玩家了!
  • +
+ +

第七步-检测整合包

+ +
    +
  • 为了防止一些手滑现象导致整合包可能会出现一些问题,你可以在分发整合包前先测试一下要准备分发的整合包
  • +
+ +

后续

+ +
    +
  • 以后每次更新客户端只要重复第四步第五步玩家重启客户端后就会自动接收更新 +
  • +
  • 版本号要记得更新
  • +
  • 默认的更新方式不会删除玩家自己加入的模组,但会下载玩家删除的模组
  • +
  • 更新覆盖的是整合包导出时的所有数据
  • +
  • 每次更新会从整合包提供的链接下载 server-manifest.json 来校验玩家本地的整合包。若校验到整合包里没有匹配这个名字的文件或整合包里这个文件匹配名字但哈希值不匹配,就会下载该文件,不会下载匹配名字且哈希值匹配的文件
  • +
  • 出网带宽1MB我觉得够用了,除非你想让玩家自己下载全部内容(就是将整合包分发给他人前删除所有模组,玩家启动时就会开始下载回来,这样的好处是可见的整合包大小变小了)
  • +
]]>
服务端自动更新整合包制作教程2021-08-22T23:18:02+08:002025-12-06T09:37:00+08:00https://docs.hmcl.net/modpack/serverpackHMCL 允许服务器管理员借助服务端自动更新整合包来实现自动分发整合包更新,这将大大方便有需要频繁更新游戏客户端 Mod、配置等信息的服务器管理员。

+ +

HMCL 需要服务器管理员额外提供一个 HTTP 服务器(只需要能提供静态文件服务,比如 Apache 和 Nginx 皆可)来提供检查整合包更新并允许 HMCL 下载更新文件。

+ +

第一步:导出整合包

+ +

在 HMCL 中右键做好的客户端版本,选择导出整合包

+ +

+ +

选择导出为服务器自动更新整合包

+ +

+ +

填写整合包信息,整合包下载链接前缀如何填写请看下文

+ +

+ +

选择需要包含在整合包内的文件后将产生整合包压缩文件

+ +

第二步:导入整合包

+ +

接着创建一个全新的空文件夹,将启动器复制进去

+ +

+ +

运行启动器,并导入刚才导出的整合包,导入完成后,这个文件夹(这里叫“新整合包”)可以打包发给玩家。

+ +

第三步:部署整合包更新服务器

+ +

你可以借助 Apache、Nginx 等支持静态文件的 HTTP 服务器软件提供文件。首先,决定好整合包下载链接前缀,比如我希望 HMCL 从远程服务器的 http://www.site.com/modpack 目录下存放整合包的更新信息,则在之前导出整合包的整合包下载前缀中填写 http://www.site.com/modpack。

+ +

+ +

上图为导出的服务器自动更新整合包压缩文件的内容,你需要将这个整合包解压到 http://www.site.com/modpack 下。也就是说,从 http://www.site.com/modpack/server-manifest.json 这个链接下载下来的文件必须和上图中整合包压缩文件中的 server-manifest.json 文件一致,并且,http://www.site.com/modpack/overrides 是一个文件夹,里面存放了整合包文件,比如:

+ +

+ +

整合包压缩文件 test.zip/overrides/mods/Advancement_Book-1.12-1.0.3.jar 文件必须可以从 http://www.site.com/modpack/overrides/mods/Advancement_Book-1.12-1.0.3.jar 该目录下载下来,且文件内容一致。那么至此更新服务器就部署完成了。

+ +

第四步:更新整合包

+ +

如果你需要更新整合包,那么将新的整合包经过第一步导出新的整合包压缩文件,并解压到类似 http://www.site.com/modpack 文件夹下即可完成新整合包的部署。

]]>
huanghongxun
\ No newline at end of file diff --git a/feed/multiplayer.xml b/feed/multiplayer.xml new file mode 100644 index 0000000..605acc3 --- /dev/null +++ b/feed/multiplayer.xml @@ -0,0 +1,38 @@ +Jekyll2026-03-15T20:43:59+08:00https://docs.hmcl.net/feed/multiplayer.xmlHMCL 文档 | MultiplayerHMCL 启动器 \| 跨平台 \| 整合包管理 \| 自动安装 \| 十二年历史 \| 三亿次使用多人联机帮助2026-03-15T20:43:59+08:002026-03-15T20:43:59+08:00https://docs.hmcl.net/multiplayer/helpTerracotta | 陶瓦联机 + + + +
+ +
+ +]]>
多人联机反馈2025-10-07T18:44:00+08:002025-12-03T16:39:00+08:00https://docs.hmcl.net/multiplayer/feedbackTerracotta | 陶瓦联机 + +
+
提示
+

欢迎您填写反馈表单

+
+ +

我们注意到了 EasyTier 项目。它提供了一种简单、安全、去中心化的异地组网方案,足以承载 Minecraft 的联机需求。 +在 EasyTier 开发团队的帮助下,我们决定重新在启动器内提供联机服务。

+ +

如要体验陶瓦联机,请遵循以下步骤: +打开 HMCL,然后您可通过 HMCL 左下角 多人联机 入口体验 Terracotta | 陶瓦联机。

+ +

目前,HMCL、PCL CE 已实现最基本的互通支持。我们欢迎其他启动器接入 Scaffolding 协议实现更完整的互通功能。

+ +

为向尽可能多的玩家免费开放基本联机功能,陶瓦联机将极大程度上基于 P2P。 +简单而言,陶瓦联机不会比市面上基于服务器中继的联机方案稳定,但其开销将远远低于其他联机方案。 +需要特别提醒的是:联机功能不会更不能取代 Minecraft: Java Edition 服务器。 +它的主要目标依然是让朋友之间能共同游玩,而不是长时间的对外开放。

+ +

最后,我想感谢一切参与到 EasyTier、Terracotta | 陶瓦联机开发和测试、为 EasyTier 提供打洞和中继服务器的社区志愿者。欢迎大家访问 easytier.cn 深入了解这一项目。

]]>
Burning_TNT
\ No newline at end of file diff --git a/groups.html b/groups.html new file mode 100644 index 0000000..e71bebd --- /dev/null +++ b/groups.html @@ -0,0 +1 @@ +加入 HMCL 用户群 - HMCL 文档

Hits

本文由 Glavo 创建,并由 8Mi_Yile zkitefly 编辑。

欢迎所有 Minecraft 玩家加入 HMCL 用户群,入群请遵守以下群规:

  1. 禁止谈论政治相关、色情、违法犯罪、金钱往来等敏感内容,禁止辱骂、造谣诽谤、恶俗等行为,禁止讨论精神疾病、LGBT 等话题,请尊重每一个人;
  2. 禁止刷屏、倒垃圾、引战、宣泄个人情绪、刻意误导等破坏讨论环境的行为;
  3. 禁止上传 EXE 和 APK 文件;
  4. 禁止使用第三方模块/插件在群聊中发送特殊消息;
  5. 禁止讨论多人游戏中的作弊工具;
  6. 禁止发布与 Minecraft 无关的广告,可以适当宣传服务器、整合包等相关内容,同一内容每人每周最多宣传一次;
  7. 用户群交流主题为 Minecraft,请不要过多讨论其他游戏内容。

用户群

以下为闲聊群,欢迎所有用户加入(同时加入多个群聊会被踢出):

我们会不定期清理用户群中超过三个月没有发言的非活跃成员,每次清理前我们会提前一周在群内发布公告。

报错崩溃交流群

如果你遇到了游戏非正常退出问题,欢迎加入报错崩溃交流群咨询解决方案:Minecraft 报错崩溃交流群

本群仅处理游戏报错崩溃问题,无关话题请前往其他群聊讨论。

由于加群人数过多,我们会移出问题已解决的用户。如果你在被移出后遇到了新的问题需要求助,你可以再次加群。

灵车交流群

我们为 Linux、FreeBSD 等系统以及 ARM(不包括 macOS)、RISC-V、龙芯等设备的用户建立了一个独立的交流群。 如果你正在使用这些平台,欢迎加入 HMCL 灵车交流群:HMCL 灵车交流群 (737461713)

本群不适合一般 Windows 和 macOS 用户加入。如果你不关心上面提到的这些平台,请移步用户群

公测群

如果你关心 HMCL 最新的开发进展,愿意积极测试 HMCL 的新功能并给出反馈,欢迎加入 HMCL 公测群:HMCL 公测群 (954100320)

本群用于讨论 HMCL 的开发和测试,禁止闲聊,并且随时会清理未积极参与反馈的用户。如果你想闲聊,请移步用户群

更新时间:

diff --git a/help.html b/help.html new file mode 100644 index 0000000..ecfec55 --- /dev/null +++ b/help.html @@ -0,0 +1 @@ +寻求帮助 - HMCL 文档
diff --git a/index.html b/index.html new file mode 100644 index 0000000..f31afa2 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +新手导航 - HMCL 文档

Notice
The articles were written in Simplified Chinese. If you want to help translate them, please send a pull request to HMCL-docs/pulls. Or you can enable your translation tool to read.
If you encounter a BUG, please send feedback in time to HMCL/issues.
You can also submit your suggestions here.

注意

如果您遇到 BUG,请及时在 HMCL/issues 发送反馈。
您也可以在这里提交您的建议。

问题集合

  1. 常见问题
  2. 启动器使用相关
  3. 整合包帮助
  4. 多人联机帮助

使用者帮助

  1. 版本隔离
    本文可以帮助你更好的分离版本间的地图、模组等内容。
  2. 设置离线皮肤
    本文将告诉你如何设置一个属于自己的离线皮肤。
  3. HMCL 的自动安装使用教程
    本文将告诉你如何用 HMCL 安装 Forge、Fabric、Fabric API、LiteLoader、Optifine 以及 模组 等。
  4. 安装光影
    本文将告诉你如何安装光影。
  5. 设置项详解
    这篇文章针对 HMCL 的各个设置项进行了详细的解释。

开发者帮助

  1. 制作 HMCL 格式的数据包
    本文将告诉你如何制作 HMCL 能够识别的数据包(Datapacks)。
  2. 制作整合包
    本文将告诉你如何制作整合包。
  3. 添加默认 authlib-injector 验证服务器
    本文将告诉你如何设置默认的验证服务器。

更新日志

  1. 稳定版
  2. 开发版

其他

  1. 用户协议
  2. 贡献指南
  3. 项目官网
  4. 项目仓库
  5. 文档仓库
diff --git a/index.json b/index.json new file mode 100644 index 0000000..feff758 --- /dev/null +++ b/index.json @@ -0,0 +1 @@ +[{"title":"启动器","items":[{"title":"Authlib-Injector 服务器设置指南","subtitle":"配置默认的验证服务器","url":"https://docs.hmcl.net/launcher/authlib-injector.html"},{"title":"数据包制作指南","subtitle":"制作可以由 HMCL 导入的数据包","url":"https://docs.hmcl.net/launcher/datapack.html"},{"title":"全局版本隔离","subtitle":"避免多个游戏版本的存档、模组和配置冲突","url":"https://docs.hmcl.net/launcher/isolation.html"},{"title":"光影","subtitle":"光影的安装方法,包括 OptiFine、Oculus 和 Iris Shaders","url":"https://docs.hmcl.net/launcher/shader.html"},{"title":"同时安装 Fabric & OptiFine","subtitle":"本文介绍了如何在 HMCL 中同时安装 OptiFine 和 Fabric","url":"https://docs.hmcl.net/launcher/fabric_and_optifine_install.html"},{"title":"设置项详解","subtitle":"HMCL 各项设置的详细说明,包括全局游戏设置、外观、下载等","url":"https://docs.hmcl.net/launcher/set-item-details.html"},{"title":"使用密码登录微软账户","subtitle":"本文介绍了如何使用密码登录微软账户及修改密码","url":"https://docs.hmcl.net/launcher/use-password-login-microsoft-account.html"},{"title":"JVM 选项与环境变量","subtitle":"配置 JVM 参数和环境变量的说明","url":"https://docs.hmcl.net/launcher/jvm-options-and-env.html"},{"title":"自动安装与模组下载简介","subtitle":"安装 Forge、Fabric、LiteLoader、OptiFine 及模组的教程","url":"https://docs.hmcl.net/launcher/auto-installing.html"},{"title":"离线模式下更换皮肤","subtitle":"使用本地皮肤文件、LittleSkin 或 Blessing Skin 设置离线皮肤","url":"https://docs.hmcl.net/launcher/offline-skin.html"},{"title":"界面功能介绍","subtitle":"本文整理了启动器部分界面的功能介绍","url":"https://docs.hmcl.net/launcher/gui-features.html"}]},{"title":"整合包","items":[{"title":"服务端自动更新整合包制作教程","subtitle":"创建可自动更新的服务器整合包","url":"https://docs.hmcl.net/modpack/serverpack.html"},{"title":"配置客户端自动更新(宝塔面板)","subtitle":"本文介绍了如何使用宝塔面板配置客户端自动更新","url":"https://docs.hmcl.net/modpack/serverpack2.html"},{"title":"整合包自带 Java 教程","subtitle":"本文介绍了如何在整合包配置中自带 Java 环境","url":"https://docs.hmcl.net/modpack/bundled-java.html"},{"title":"配置客户端自动更新 (Nginx)","subtitle":"本文介绍了如何使用 Nginx 服务器配置客户端自动更新","url":"https://docs.hmcl.net/modpack/serverpack3.html"},{"title":"模组包报错排查手册","subtitle":"排查和解决整合包相关问题","url":"https://docs.hmcl.net/modpack/error-handbook.html"}]}] diff --git a/launcher/authlib-injector.html b/launcher/authlib-injector.html new file mode 100644 index 0000000..e642052 --- /dev/null +++ b/launcher/authlib-injector.html @@ -0,0 +1,6 @@ +Authlib-Injector 服务器设置指南 - HMCL 文档

Hits

本文由 huanghongxun 创建。

背景

使用 authlib-injector 认证的服主可以通过本教程提供的方法使 HMCL 默认在打开时弹窗要求创建对应认证服务器的账户。

方法

在 HMCL 启动器同级目录下创建 authlib-injectors.json 文件,此时文件夹目录结构如下图所示:

(注意,请确保打包后的整合包不包含 hmcl.json 文件,否则无法生效。该文件默认为隐藏状态,需开启隐藏文件显示)

authlib-injectors.json 文件的示例如下

{
+    "urls": [
+        "https://example.yggdrasil.yushi.moe/"
+    ]
+}
+

更新时间:

diff --git a/launcher/auto-installing.html b/launcher/auto-installing.html new file mode 100644 index 0000000..16ade20 --- /dev/null +++ b/launcher/auto-installing.html @@ -0,0 +1 @@ +自动安装与模组下载简介 - HMCL 文档

Hits

本文由 asdqp233,Mine-diamond 创建。

要为 Minecraft 安装模组,你首先需要安装一个“模组加载器”(例如 NeoForge 或 Fabric),然后再安装你想要的模组。HMCL 为这两个步骤都提供了强大的支持。

在安装前,最关键的一点是兼容性。请记住以下核心原则:

  • 通常,你只能为单个游戏实例安装一种模组加载器。
  • 你下载的模组,必须同时兼容你的游戏版本(如 1.20.4)和模组加载器(如 Fabric)。

简单来说,为游戏安装模组总共分三步,本指南将带你逐一完成:

  1. 开启版本隔离,为模组创建一个独立干净的环境。
  2. 安装模组加载器(如 Forge, Fabric)。
  3. 安装你喜欢的模组。

启用版本隔离

在安装模组之前,必须开启版本隔离以隔离为不同实例安装的模组:

在 HMCL 主界面,点击「设置」,在「全局游戏设置」选项卡中,找到「版本隔离」,点击「版本隔离」,选择「各实例独立」即可

Working_Directory

更详细的介绍见 全局版本隔离

安装模组加载器

模组加载器简介

常见的模组加载器有以下几个:

Forge,NeoForge,Fabric,Quilt,Cleanroom,LiteLoader 是 6 个常见的 Mod 加载器。
Fabric API,QSL/QFAPI 是两个随 FabricQuilt 的官方 API(实际是模组)。

兼容性:

  • LiteLoaderForge 是兼容的 (Forge 较新版本和 LiteLoader 较老版本可能不兼容),可以同时安装
  • 其它所有模组加载器几乎互不兼容,即你无法同时安装两个模组加载器

Fabric与Quilt 说明:
非常多的 Fabric Mod 需要 Fabric API 作为前置模组, Quilt Mod 需要 QSL/QFAPI 作为前置模组。
在安装 FabricQuilt 加载器时候如果没有其它原因,建议安装 Fabric APIQSL/QFAPI , 否则很多 Fabric ModQuilt Mod 则有可能无法被加载!

安装新实例时安装模组加载器

当你在安装新的游戏客户端时候, 会看到其中有该版本支持的模组加载器安装选项,点击你想安装的模组加载器(根据你想安装模组所支持的加载器进行选择)

AutoInstaller_ModLoader

  • 点击你想要的加载器(如 Fabric)。
  • 在弹出的版本选择页面,若无特殊需求,选择最新稳定版(通常是第一个)。
  • 如果你选择 FabricQuilt,最好同时安装Fabric APIQSL/QFAPI
  • 点击「安装」即可。

为已有实例安装或更换模组加载器

如果你想为已安装好的纯净版游戏添加加载器,或者更换、更新加载器版本:

  1. 在 HMCL 主界面,点击「实例管理」,然后选择你想要修改的游戏实例。
  2. 在左侧菜单中,点击「自动安装」。

Auto_Install_Page

  • 安装:点击你想要的加载器图标(如 Forge),选择版本(推荐最新版),然后点击安装。
  • 更新:点击已安装的加载器,选择一个更新的版本,然后点击安装。
  • 删除:点击加载器右侧的「X」按钮即可删除。
  • 更换:先删除旧的加载器,再安装新的。

注意:此处的自动安装页面不支持安装 Fabric APIQSL/QFAPI。请将它们当作普通模组进行安装。

安装模组

安装好加载器后,就可以开始添加模组了。你可以在下列网站获取模组信息,并在 HMCL 内下载和安装:

  • MC 百科 - 中文社区,资料详尽。
  • CurseForge - 最大的模组发布站之一。
  • Modrinth - 新兴的现代化模组发布站。

在安装任何模组前,请先确认三件事:

  1. 游戏版本:模组是否支持你当前的游戏版本?(例如, 1.20.4)
  2. 加载器类型:模组是给 Forge、Fabric 还是其它模组加载器用的?
  3. 前置模组:模组是否需要其他模组作为前置?(模组页面通常会说明)

自动安装 (推荐)

HMCL 内置了 CurseForge 和 Modrinth 的搜索和下载功能,非常方便。

  1. 在 HMCL 主界面,点击「下载」->「模组」。
  2. 在搜索框输入模组名(支持中英文),然后点击搜索。如果搜不到,可以尝试切换右上角的下载源。
  3. 点击你想要的模组,进入版本列表页面。
  4. 根据游戏版本加载器,找到你需要的版本,点击并选择「安装到当前实例」。
  5. 如果该模组有前置,HMCL 会自动提示,请先安装所有前置模组(但是请不要重复安装前置模组)。

注:点击模组下载页面 上方的蓝色的链接可以到对应的网站查看模组的信息,这会告诉你模组的功能和有可能会提示你一些注意事项

注意: 请查看你要下载的模组是否正常你要安装的游戏版本以及模组加载器,否则模组无法被正常加载!

AddingModAutomatically

安装OptiFine 或其它光影模组

光影的安装方式略有不同,请参考专门的指南 光影安装

手动安装

当你在网站或其它位置手动下载了模组文件,你可以参照以下步骤完成安装:

一般的 Mod 文件后缀为 jar 或者 litemod,请确认后缀是正确的。其中jar为大多数模组加载器支持的格式,litemodLiteLoader支持。

通过模组管理页面

  1. 进入「实例管理」-> 选择你的游戏实例 ->「模组管理」。
  2. 点击「添加模组」并选择你的模组文件,或直接将文件拖拽到窗口内即可。

通过模组文件夹安装

  1. 进入「实例管理」-> 选择你的游戏实例 ->「浏览」->「模组文件夹」。
  2. 这会打开该实例的 mods 文件夹。
  3. 将你下载的 .jar 模组文件复制或移动到这个文件夹里。 (如果 mods 文件夹不存在,请自行创建一个。)

AddingModManually

安装 Mod 后游戏报错/无法启动

造成游戏报错的原因有很多, 比如 Mod 之间不兼容, Fabric API 的版本过高, 缺少前置 Mod 等等。

第一步:基础检查(最常见问题)

  • 查看 HMCL 错误报告:新版 HMCL 会直接提示大部分常见错误,这是你的首选信息来源。
  • 检查兼容性:确认模组版本、游戏版本、模组加载器三者是否匹配。
  • 检查前置模组:是否忘记安装必要的API(如 Fabric API)或其他前置模组?

第二步:自己排查

  • 使用“二分法”:在“模组管理”页面,先禁用一半的模组,看游戏能否启动或出错。如果可以,说明问题出在被禁用的那一半里。不断重复此过程,直到找到引发问题的具体模组。
  • 查看日志文件:如果你有能力,可以自行查看游戏日志来定位问题。

第三步:有效求助 如果无法自行解决,你需要向社区求助。但请记住,一个有效的求助包含完整的日志文件

如何正确求助

  1. 在游戏崩溃后,点击 HMCL 弹出的错误窗口上的「导出游戏日志」按钮,它会生成一个 minecraft-exported-crash-info-时间戳.zip 文件。
  2. 带着这个文件去社区、论坛或群里提问,并具体描述你遇到的问题。

重要:对于向他人求助,千万不要只截图,不要只说“游戏出错怎么办”这种及其笼统的话语。没有日志,谁也帮不了你。

CrashReportPage

补充:常见模组加载器简单介绍和支持版本一览

模组加载器简单介绍:

模组加载器简单介绍
Forge icon Forge老牌的模组加载器,功能强大,支持的模组众多,推荐在1.21之前安装。
NeoForge icon NeoForge1.20.1后Forge的继任者,推荐在1.21版本后安装NeoForge。
Fabric icon Fabric轻型模组加载器,非常适合安装优化模组或纯净生存增强类模组。
Quilt icon QuiltFabric的一个分支,同样轻量。
Fabric api icon Fabric API
QSL/QFAPI icon QSL/QFAPI
由于FabricQuilt比较轻功能有限,因此提供了增强功能的api,很多模组依赖于此api。
Cleanroom icon Cleanroom1.12.2版本Forge的一个优化代替,提供了相对更强的功能,仅支持1.12.2。
LiteLoader icon LiteLoader轻量模组加载器,为Forge的轻量代替,现在已停止维护。

支持版本一览:

模组加载器最老版本最新版本
Forge icon Forge1.5.2游戏最新版本
NeoForge icon NeoForge1.20.1游戏最新版本
Fabric icon Fabric1.16.3游戏最新版本
Fabric api icon Fabric api1.16.3游戏最新版本
Quilt icon Quilt1.16.3游戏最新版本
QSL/QFAPI icon QSL/QFAPI1.18.21.21
Cleanroom icon Cleanroom1.12.2 
LiteLoader icon LiteLoader1.5.21.12.2

更新时间:

diff --git a/launcher/datapack.html b/launcher/datapack.html new file mode 100644 index 0000000..2f81037 --- /dev/null +++ b/launcher/datapack.html @@ -0,0 +1,22 @@ +数据包制作指南 - HMCL 文档

Hits

本文由 huanghongxun 创建。

本指南只介绍如何制作一个 HMCL 可导入的数据包压缩包。

建议

始终建议你使用多数据包格式制作数据包压缩包,因为 HMCL 会删除重名的数据包,因此可以借此完成更新功能,只要直接导入新的多数据包格式的压缩包就可以完成更新你制作的数据包。

多数据包

如果你的数据包被分离成多个部分供玩家选择是否启用,或者需要自带资源包,那么你需要制作多数据包格式的压缩包。

多数据包文件(只能是一个 .zip 文件)格式例子如下:

crafting++.zip
+\
+* datapacks
+  |\
+  | * block_sky_domain (一个合法的数据包)
+  | * crafting_machine
+  | * craftingpp
+  | * tradepp
+  | * utilitypp
+  |
+* resources.zip (如果你的数据包需要附带材质)
+  \
+    * assets
+      \
+        * ...
+

其中,datapacks 下的文件格式和 .minecraft/saves/New World/datapacks 的一样,因此可直接手动打包你本地的 datapacks 文件夹, 就可以直接导入 HMCL 了。如果还需要资源文件,请在压缩包内附带上。

此外,resources.zip 文件的格式和 .minecraft/saves/New World/resources.zip 的格式一样, 导入数据包时,启动器将会合并世界附带的默认资源包和你的数据包附带的资源包,如果有重复的文件,旧的文件将被覆盖。 如果你的服务器使用了包含资源包的数据包,那么请在服务器上完成这个操作,接着玩家下载服务器资源包即可。

单数据包

如果你的数据包不需要资源文件,那么你直接打包 datapacks/<你的数据包名称> 文件夹,即可直接导入 HMCL。

单数据包文件(只能是一个 .zip 文件)格式例子如下:

RealisticGlassPane.zip
+\
+* pack.mcmeta
+* data
+  \
+    * 一些文件
+

HMCL 将会将你打包好的数据包压缩包直接复制到 datapacks 文件夹,不会解压(因为原版游戏支持读取压缩包)。

更新时间:

diff --git a/launcher/fabric_and_optifine_install.html b/launcher/fabric_and_optifine_install.html new file mode 100644 index 0000000..47bec8f --- /dev/null +++ b/launcher/fabric_and_optifine_install.html @@ -0,0 +1 @@ +同时安装 Fabric & OptiFine - HMCL 文档

Hits

本文由 zkitefly 创建。

在 HMCL 的自动安装中,如果先选择了 Fabric 或 OptiFine ,HMCL 就会提示他们互不兼容。

但在本文档中,通过一些简单的操作就可以同时安装 Fabric & OptiFine 的客户端。

原理是安装 OptiFabric 这个 Fabric 模组,该模组的作用是采用官方的 OptiFine 并在运行时与 Fabric 兼容来实现这一点。

如果你使用 OptiFine 纯粹是为了提高性能、使用缩放按钮或动态照明,那么还有其他模组可以单独实现这些功能,具有更可靠的兼容性。

操作方法

1.先选择一个版本,并选择 Fabric ,并安装。

安装fabric客户端

注:如果你想放置其他的 Fabric 模组,建议一并安装 Fabric API ,有些 Fabric 模组会依赖他。

2.获取并安装 OptiFabric 模组 & OptiFine

获取

MC百科下载页面(推荐)

MC百科下载页面

CurseForge页面 下载操作:

CurseForge页面下载操作

HMCL 模组搜索下载操作:

1

2

3

4

注:如果你在HMCL模组搜索中下载时,另存该模组,那么就需要按照下面的模组安装方法来安装。

OptiFine 页面 操作:

OptiFine页面操作

OptiFine 非官方 中文页面 操作:

安装

进入 要安装模组的游戏版本 的 游戏管理 ,切换到 模组管理 ,在这个页面将 OptiFabric 模组 & OptiFine 添加即可

安装模组

然后在 模组管理 中检查是否有 OptiFabric 模组 & OptiFine !

检查完后,至此就完成啦,直接启动游戏即可。

更新时间:

diff --git a/launcher/global-version-isolation.html b/launcher/global-version-isolation.html new file mode 100644 index 0000000..6df78c2 --- /dev/null +++ b/launcher/global-version-isolation.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/launcher/gui-features.html b/launcher/gui-features.html new file mode 100644 index 0000000..c639296 --- /dev/null +++ b/launcher/gui-features.html @@ -0,0 +1 @@ +界面功能介绍 - HMCL 文档

Hits

本文由 未署名用户 创建。

启动器预览图

启动器界面整体由顶部工具栏和页面容器构成。

顶部工具栏

顶部工具栏

提示

用户可以通过双击工具栏在最大化与普通窗口状态之间切换。

此区域为全局显示,共分为左右两部分。其中左侧由返回按钮(仅在二级或多级页面显示)和标题构成,右侧由帮助按钮、最小化按钮和关闭按钮构成。

返回按钮:点击后返回上一页,仅在二级或多级页面上显示,首页不显示。
标题:通常用于显示页面名称,首页显示为启动器版本信息。
帮助按钮:点击后跳转至文档帮助页面。
最小化按钮:点击后最小化启动器。
关闭按钮:点击后关闭启动器。

首页

首页

首页是启动器的起始页面,该页面由侧边导航栏、提示面板(仅限开发版和预览版)、更新面板(仅在存在可用更新时显示)和启动游戏面板构成。

侧边导航栏(首页)

侧边导航栏(首页)

此区域共分为三部分:账户分组、游戏分组及通用分组。

账户分组:该分组中包含一个列表项,该项会显示当前选定的账户头像、名称及账户类型,用户点击该项可进入账户列表页面;右键点击该项可呼出账户切换的快捷菜单。

提示

用户在该项上滚动鼠标滚轮可在不同账户之间进行快捷切换。

游戏分组:该分组中包含三个列表项,分别是:实例管理、实例列表及下载。

  • 实例管理:该项会显示当前选定的游戏实例图标及名称。用户点击该项后进入实例管理页面;在该项上滚动鼠标滚轮可在不同游戏实例之间进行快捷切换。
  • 实例列表:用户点击该项后进入实例列表页面,用于查看和管理游戏实例。
  • 下载:用户点击该项后进入下载页面,用于下载游戏、整合包或者安装模组、资源包、光影或者世界。

通用分组:该分组中包含三个列表项,分别是:设置、多人联机及官方群组。

  • 设置:用户点击该项后进入设置页面。
  • 多人联机:用户点击该项后进入多人联机页面。
  • 官方群组:用户点击该项后跳转至设置·反馈页。

提示面板

提示面板

提示

用户可通过点击右上角关闭按钮隐藏该提示。

仅在开发版或预览版中显示,用于提示用户当前启动器不是稳定版本。

更新面板

更新面板

仅在存在可用更新时显示,此区域用于启动器更新提示。

启动游戏面板

更新面板

此区域共分为两部分:启动(开始)游戏按钮、切换实例菜单。

启动(开始)游戏按钮:若用户当前存在实例,点击后则会启动当前应用的游戏实例;若当前不存在游戏实例,点击后会自动下载最新正式版然后启动游戏。
切换实例菜单:点击显示快捷切换游戏实例列表菜单。

设置

设置

该页面由侧边导航栏和页面容器构成。

侧边导航栏(设置)

此区域共分为四部分:全局游戏设置、Java 管理、启动器分组及帮助分组。

全局游戏设置:用户点击该项后进入全局游戏设置页面。
Java 管理:用户点击该项后进入 Java 管理页面。
启动器分组:该分组中包含三个列表项,分别是:通用、外观及下载。
帮助分组:该分组中包含三个列表项,分别是:帮助、反馈及关于。

设置-全局游戏设置

设置-全局游戏设置

更新时间:

diff --git a/launcher/index.html b/launcher/index.html new file mode 100644 index 0000000..2a661bd --- /dev/null +++ b/launcher/index.html @@ -0,0 +1 @@ +启动器 - HMCL 文档

启动器

光影

光影的安装方法,包括 OptiFine、Oculus 和 Iris Shaders

设置项详解

HMCL 各项设置的详细说明,包括全局游戏设置、外观、下载等

diff --git a/launcher/isolation.html b/launcher/isolation.html new file mode 100644 index 0000000..b78f355 --- /dev/null +++ b/launcher/isolation.html @@ -0,0 +1,12 @@ +全局版本隔离 - HMCL 文档

Hits

本文由 LIPiston 创建。

请注意该方法会改变默认的游戏文件结构。

使用方式

进入 hmcl 的 设置

在全局游戏设置中找到 版本隔离 并设置为 各实例独立

这时候 minecraft 的文件结构就会有所改变,如下方

.minecraft
+├── asstes
+├── libraries
+└── versions
+    └── 1.16.5-optifine
+        ├── 1.16.5-optifine.jar
+        ├── saves
+        ├── resourcepacks
+        ├── logs
+        ├── mods
+        └── ...
+

并非在 .minecraft 文件夹中存储一切的 mod 和 资源包而是各版本的资源互相独立

这样你就可以在一个目录下,安装多个客户端

往后的使用

在做完版本隔离的设置后,hmcl 的快速打开各个游戏文件夹的功能就会显得十分好用。

善用该功能也可为你的磁盘剩下不少的空间,现在反思过来其实都差不多

更新时间:

diff --git a/launcher/jvm-options-and-env.html b/launcher/jvm-options-and-env.html new file mode 100644 index 0000000..7b984de --- /dev/null +++ b/launcher/jvm-options-and-env.html @@ -0,0 +1,12 @@ +JVM 选项与环境变量 - HMCL 文档

Hits

本文由 未署名用户 创建。

JVM 选项

HMCL 提供了一些 JVM 选项用于调试目的。你可以通过在启动 HMCL 时添加这些参数来使用这些功能。

参数描述
-Dhmcl.home=<path>覆盖 HMCL 全局数据文件夹路径
-Dhmcl.dir=<path>覆盖 HMCL 工作路径下的 .hmcl 文件夹路径
-Dhmcl.self_integrity_check.disable=true禁用启动器更新时的本体完整性检查
-Dhmcl.bmclapi.override=<url>自定义 BMCLAPI 的 API Root 地址(默认为 https://bmclapi2.bangbang93.com
-Dhmcl.font.override=<font family>指定启动器使用的字族
-Dhmcl.version.override=<version>手动指定启动器版本号
-Dhmcl.update_source.override=<url>自定义 HMCL 更新源地址
-Dhmcl.authlibinjector.location=<path>指定本地 authlib-injector 路径,不从网络下载
-Dhmcl.openjfx.repo=<maven repository url>添加用于下载 OpenJFX 的自定义 Maven 仓库地址(默认为 https://repo1.maven.org/maven2
-Dhmcl.native.encoding=<encoding>指定系统原生编码
-Dhmcl.microsoft.auth.id=<App ID>自定义 Microsoft OAuth 应用程序 ID
-Dhmcl.microsoft.auth.secret=<App Secret>自定义 Microsoft OAuth 应用程序密钥
-Dhmcl.curseforge.apikey=<key>自定义 CurseForge API 密钥
-Dhmcl.discoapi.override=<url>自定义 DiscoAPI 的 API Root 地址(默认为 https://api.foojay.io/disco/v3.0
-Dhmcl.native.backend=<auto/jna/none>指定 HMCL 的本地后端类型。可选值:
- auto:自动选择(Windows 7+ 使用 JNA,其他系统不使用)
- jna:强制使用 JNA(如果 JNA 不可用会抛出异常)
- none:禁用 JNA
默认值:auto
-Dhmcl.hardware.fastfetch=<true/false>是否使用 fastfetch 获取设备信息。默认值:true

环境变量

HMCL/HMCLauncher 也支持一些环境变量来配置启动器的行为。你可以在系统环境变量中添加这些变量。

参数描述
HMCL_JAVA_OPTS自定义 HMCLauncher 所使用的 JVM 启动参数(默认为 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15-Xmx1G -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15
HMCL_JAVA_HOME自定义 HMCLauncher 所使用的 Java 路径
HMCL_FONT指定启动器使用的字族
HMCL_JRES添加 HMCL 所使用的 Java 路径,支持写入多个路径

如何使用 JVM 选项

你可以通过以下几种方式使用这些 JVM 选项。

方法一:直接在命令行中添加

在启动 HMCL 时通过命令行添加参数,例如:

java -Dhmcl.home="D:/Games/HMCL" -jar HMCL.jar
+

方法二:创建启动脚本

  1. Windows 用户可以创建 .cmd 文件:
    @echo off
    +java -Dhmcl.font.override="Microsoft YaHei" -jar HMCL.jar
    +pause
    +
  2. Linux/macOS 用户可以创建 .sh 文件:
    #!/bin/bash
    +java -Dhmcl.font.override="Noto Sans CJK SC" -jar HMCL.jar
    +

使用注意事项

  • 可以同时使用多个参数,只需要用空格分隔
  • 包含空格的参数值需要用半角引号包裹
  • 确保 JVM 参数位于 -jar HMCL.jar 之前

如何使用环境变量

Windows 设置环境变量

  1. 右键点击“此电脑”/“这台电脑”/“我的电脑”,选择“属性”
  2. 点击“高级系统设置”
  3. 点击“环境变量”
  4. 在“用户变量”或“系统变量”中点击“新建”
  5. 输入变量名(如 HMCL_JAVA_HOME)和变量值
  6. 点击“确定”保存

示例值:

变量名: HMCL_JAVA_HOME
+变量值: C:\Program Files\Java\jdk-17
+

Linux/macOS 设置环境变量

  1. 编辑你的 Shell 配置文件(比如 ~/.bashrc~/.zshrc 等)
  2. 添加 export 语句:
export HMCL_JAVA_HOME="/usr/lib/jvm/java-17-openjdk"
+export HMCL_JAVA_OPTS="-XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15"
+
  1. 保存文件并重新加载配置:
    source ~/.bashrc  # 或 `source ~/.zshrc`
    +

使用注意事项

  • 设置环境变量后需要重启 HMCL 才能生效
  • 如果同时设置了 JVM 参数和环境变量,JVM 参数优先级更高
  • Windows 用户注意使用半角分号(;)分隔多个路径
  • Linux/macOS 用户注意使用半角冒号(:)分隔多个路径

更新时间:

diff --git a/launcher/offline-skin.html b/launcher/offline-skin.html new file mode 100644 index 0000000..f6b4869 --- /dev/null +++ b/launcher/offline-skin.html @@ -0,0 +1 @@ +离线模式下更换皮肤 - HMCL 文档

Hits

本文由 qiaoshouzi 创建,并由 kitefly TyMxy 编辑。

离线模式下更换皮肤

注意:

使用 Steve、Alex、本地皮肤图片文件: 可能无法加入多人联机,其他玩家可能看不到您的皮肤
使用 LittleSkin、Blessing Skin 服务器: 多人联机下和您使用 相同方式 的玩家可以看到您的皮肤, 其他玩家不可以

打开HMCL, 进入 账号列表 , 点击下图离线账号的【上传皮肤】红框处:

默认: 使用默认随机的皮肤显示

Steve: 使用Steve (史蒂夫) 皮肤显示

Alex: 使用Alex (艾利克斯) 皮肤显示

本地皮肤图片文件LittleSkinBlessing Skin 服务器: 请见下文↓

本地皮肤图片文件

点击 本地皮肤图片文件 , 设置 皮肤/披风皮肤图片 路径, 点击 确认, 即可

LittleSkin

首先您需要一个LittleSkin的账号, 注册登录

然后前往 角色管理, 查看您的角色名, 如果没有, 请点击 添加新角色 进行添加

你可在 我的衣柜 修改此账户名的皮肤与披风

在HMCL中创建的离线账户的 账户名 必须和角色名相等, 如果不相等, 请 重新在HMCL中创建离线账户

确认相等后, 点击 LittleSkin 即可同步在LittleSkin上此账户名的皮肤

Blessing Skin 服务器

Blessing Skin 服务器, 进入 **角色管理 , 查看角色名 , 确认 角色名HMCL中创建的离线账号角色名 相同, 如果不相等, 请重新在HMCL中创建离线账户

你可在 我的衣柜 修改此账户名的皮肤与披风

进入 配置生成, 按下图找到 CustomSkinLoader 中的网址, 复制到HMCL中即可同步在Blessing Skin 服务器上此账户名的皮肤

更新时间:

diff --git a/launcher/set-item-details.html b/launcher/set-item-details.html new file mode 100644 index 0000000..c1df72e --- /dev/null +++ b/launcher/set-item-details.html @@ -0,0 +1 @@ +设置项详解 - HMCL 文档

Hits

本文由 MemoryShadow 创建。

引言

本篇文章将从”全局游戏设置”, “通用”, “外观”与”下载”这几个维度, 详细的为您介绍HMCL设置中各个选项的作用, 对于一些能够”见名知意”的条目, 在本篇文章中不过多讨论.

约束与注意

本篇文章是在 HMCL-3.5.3.230 版本中编写的, 如果您使用的是旧版本, 请注意有些选项可能不存在.

全局游戏设置

这是 HMCL 中的第一个设置项, 也是最重要的设置项之一, 它决定了 HMCL 在启动游戏时的行为.

Java路径

众所周知, Minecraft 是由 Java 编写的, 因此在启动游戏时 HMCL 需要知道 Java(JRE1) 的安装路径才能启动游戏.

由于 HMCL 本身就是一个 Java 程序, 一般能正常启动 HMCL 就能至少在计算机上找到一个 JRE. 但也会由于一些未知因素导致无法找到 JRE, 这时, 就需要手动指定 JRE 的安装路径.

我们先来讨论能够自动识别的情况:

在 HMCL 启动时, 会根据注册表项, 环境变量, 以及 HMCL 自身的启动路径2来寻找 JRE. 如果找到了, 就会在 “Java路径” 这一栏显示出来, 并且在启动游戏时使用这个路径.

上述的情况几乎涵盖了所有, 如果你希望 HMCL 能够自动找到 Java, 就应该使用这些技巧配置好你的计算机环境.

接下来我们讨论不能自动识别的情况:

通常我们安装解压版本的 JRE 都不会被 HMCL 自动找到, 这时, 就需要手动指定 JRE 的安装路径. 你可以展开 “Java路径” 条目(通常是点击条目右侧的三角), 在展开的下拉列表中选中”自定义”条目后点击右侧的文件夹图标, 在弹出的对话框中选择你 Java 可执行文件的路径.

自动选择合适的 Java

在1.16.5版本后, Minecraft 的最低支持 Java 版本从 8 提升到了 16. HMCL 可以在已添加的版本中找到最合适的 Java 版本, 并在启动游戏时使用这个版本. 整个过程不需要人力介入.

版本隔离

这是当前主流启动器都支持的功能, 这个功能能够在尽可能共享依赖库的前提下, 将不同的游戏版本隔离开来, 避免你安装的模组加载器被应用在错误的版本上或是加载到不兼容的版本, 同时最大程度的减少磁盘占用.

此功能的底层原理不在此处过多赘述, 对于用户来说最大的区别就是游戏的实际目录发生了改变, 例如: 提取游戏日志的方式3被改变了

原本游戏目录默认应该在 .minecraft 文件夹, 但在开启版本隔离后, 你实际的游戏目录被切换到了 .minecraft/versions/游戏版本名称, 这会给一些新手或是习惯于使用正版启动器的玩家带来额外的困惑.

通常来说, 只要你玩的不是未修改过的版本, 都应该打开版本隔离避免引发错误, 这也能在你删除某个游戏版本时将日志等数据一并清除.

游戏内存

这与你计算机上的 RAM 存储器容量有关, 一般来说选择 “自动分配内存” 选项会得到一个相对合适的值. 但也许会有一些 CPU 性能较差希望用内存来交换的玩家愿意分配更多的内存.

但我告诉您, 这里只是在调整 JVM4 能够使用的最大内存容量, 只有在模组 / Minecraft 官方开发者没有手动控制 GC5 行为的时候, 才能如你预期的通过内存交换 CPU 时间

启动器可见性

这个条目有 4 个选项, 分别是:

  • 游戏启动后结束启动器
  • 游戏启动后隐藏启动器
  • 保持启动器可见
  • 隐藏启动器并在游戏结束后重新打开

游戏启动后结束启动器

这个选项特别推荐低性能机器使用, 这能节约一些计算机消耗. 代价是启动器无法很好的捕捉您的游戏崩溃信息与日志.

游戏启动后隐藏启动器

这个选项会在您游戏崩溃时收集您计算机上的相关崩溃信息以供向相关开发人员进行反馈. 代价是需要额外消耗一些计算机资源.

保持启动器可见

这个选项会在整个游戏过程中保持启动器可见, 这会在需要同时启动多个游戏的时候起到帮助. 代价是要消耗更多的计算机资源.

隐藏启动器并在游戏结束后重新打开

如果您需要频繁的在不同版本中切换游戏, 例如测试您的模组兼容性, 评估各版本之间的信息, 那么这个选项将会起到一定的帮助作用.

游戏参数

关于这点, 我没有找到更多的, 能与游戏同时使用的启动参数

JVM参数

调整JVM参数能够更细腻的控制 JVM 的行为, 例如是否压缩指针(用 CPU 换内存), 是否频繁 GC(还是用 CPU 换内存)等等, 这些一般都可以通过类似于这篇文章6这样进行调整. 不过要注意的一点是, JVM 参数是由实际实现决定的, 是否使用以及是否支持还要看具体的 JVM 实现.

本地库路径

在一些例如M1芯片之类的设备上, 通用库类可能都不能正常的工作, 要使用版本特殊提供的库类才能令其正常的工作, 你可以使用这个选项对其进行替换

GLFW

GLFW是一个轻量级的C语言库,用于创建和管理 OpenGL 在多个操作系统中的上下文,处理用户输入,以及获取时间和帧缓冲。它支持多个窗口、全屏模式、窗口模式、多个输入设备和剪贴板。GLFW是一个独立于操作系统的库,可以在 Windows, MacOS, Linux 等多个平台上使用。

在Linux下,系统自带的窗口管理器(例如 xorg)通常已经包含了可以与 OpenGL 集成的窗口管理器。因此,使用系统自带的窗口管理器可以避免与其他项目的库冲突,并确保对于系统提供的功能和特性有最好的支持。此外,使用系统自带的窗口管理器也能够最大限度地减少安装和配置上的复杂性。

故此, Linux 玩家推荐使用系统自带的

OpenAL

OpenAL 是一个跨平台的 3D 音频 API,可以用于在多个操作系统上播放音效和音乐。它支持的特性包括定位、重放、3D 效果、回声、滤波等。可以使用 OpenAL 提供的函数对声源和听者的位置、方向、速度等进行控制,以实现 3D 音频效果。

在 Linux 下 OpenAL 通常可以与 ALSA(高级 Linux 音频体系结构)或 PulseAudio(一种现代的音频子系统)进行集成。使用系统自带的音频支持库,可以确保应用程序与底层音频硬件和设备之间的兼容性,并提供最佳的音频性能和功能。此外使用 OpenAL 也可以让应用程序具有跨平台的特性,可以在多个操作系统上使用相同的代码和资源来实现音频效果。

故此 Linux 用户推荐使用系统自带的

通用

这里提供了一些 HMCL 的通用参数, 例如启动器是否自动检查更新, 文件下载的缓存目录存放位置, 程序界面的显示语言等. 这些基本都属于 “见名知意” 的范畴, 不需要过多讨论.

外观

这里提供了一些 HMCL 的外观参数, 例如启动器的主题颜色, 动画显示, 背景图片, 字体等. 这些基本都属于 “见名知意” 的范畴, 不需要过多讨论.

下载

下载源

由于网络环境问题, 在之前下载 Minecraft 可能是一件麻烦事, 但在现在, 我们有了 BMCLAPI7 项目, 该项目无偿为大陆地区用户提供 Minecraft 相关文件的镜像. 但有可能存在延迟, 可以按照自己的需求进行选择.

下载并发数

提高下载并发数能够最大限度的利用您的网络, 但这不是越高越好的. 提高并发数量会对您的计算机和下载源都带来更高的负载, 由于木桶效应的存在, 本地下行带宽, 下载源上行带宽, 您的磁盘读写速度等这过程中的任何一环都会成为下载途中的瓶颈, 所以不要盲目提高并发数, 推荐的家庭带宽并发数在 8~16 之间.

代理设置

用于解决部分网络不佳或需要连接特殊网段的工具, 能够连接到内网服务器之类的.

特别鸣谢

  • huangyuhui
  • GitHub Copilot

参考文章

更新时间:

diff --git a/launcher/shader.html b/launcher/shader.html new file mode 100644 index 0000000..d82c2d1 --- /dev/null +++ b/launcher/shader.html @@ -0,0 +1 @@ +光影 - HMCL 文档

Hits

本文由 未署名用户 创建,并由 hejiehao 编辑。

安装 OptiFine

方式一: 全新安装

当你在安装新的游戏客户端时候,会看到有个 OptiFine 的选项。

OptiFine_Install

点开之后会看到有 3 个复选框,一般而言,正式版 会比 测试版 更加稳定。选择安装 正式版 ,如果没有 正式版 那么再考虑 测试版

OptiFine_Selection

选择完合适的版本之后就可以点击右下角的安装继续进行安装。

方式二: 修改/升级已安装版本

在对应的游戏版本管理页面,点击 自动安装 ,你会看到有个 OptiFine 的选项。

OptiFine_AutoInstaller

点开之后选择合适的版本然后等待安装完成即可。 目前,如果要在 Fabric 使用 OptiFine ,需要通过 方式四 安装。

方式三:官网安装

OptiFine 官网上下载合适版本的 OptiFine (下载完应为 OptiFine_<游戏版本>_<OptiFine版本>.jar ) 。

双击打开或者使用 java -jar 文件名 的方式打开,然后你就会看到这个界面。

Path_Selection

选择自己游戏的 .minecraft 目录(默认安装到 \AppData\Roaming\.minecraft 目录下),然后点击 Install 按钮,之后你在 HMCL 的版本列表中就可以找到含有 OptiFine 名字的客户端,启动即可。

如果未找到,请确认你是否已安装对应的版本的客户端,且 命名为对应版本号 的原本游戏客户端。

方式四:OptiFine 与 Mod 加载器共存

OptiFine 官网上下载的 Jar 文件本身也可作为 Mod 被加载,可以用 Java 运行下载的文件并导出 Mod 版本。Mod 安装具体方法见 Mod 安装教程

注意:

  1. Fabric 和 OptiFine 本身并不能共存,必须同时安装 OptiFabric (一个 Fabric Mod ) 。 OptiFabric 目前 1.17 仅支持 OptiFine HD U G9Fabric 最高支持的版本为 0.11.7

  2. Forge 和 OptiFine 会出现不兼容的情况,但大多数情况下,Forge 和 OptiFine 是相互支持的。在 OptiFine 官网下载页面 可以查看OptiFine与Forge的兼容情况,位置见下图的红框位置。

OptiFine_Compatibility

  1. 若出现不兼容的情况,请使用 OptiForge (一个 Forge Mod ) 或者等待OptiFine兼容Forge解决。

安装Oculus(一个 Forge Mod)

在高版本的OptiFine中,OptiFine与mod的兼容性较差,以及对性能提升较小,所以可以安装Oculus,但Oculus与OptiFine不兼容,注意依赖关系,Oculus需要前置Rubidium

Oculus

相关链接: Oculus Curseforge Oculus Modrinth Rubidium Curseforge Rubidium Modrinth

安装Iris Shaders(一个Fabric/Quilt Mod)

在Fabric中,也可以安装Iris Shaders来安装光影,注意依赖关系,Iris Shaders需要前置Sodium

Iris

相关链接: Iris Shaders官网 Iris Shaders Modrinth Iris Shaders Curseforge(不再更新,请到官网或Modrinth下载最新版本) Sodium Modrinth Sodium Curseforge(不再更新,请在Modrinth下载)

安装光影包

一般光影是一个 Zip 格式的文件,将光影文件放入 \.minecraft\shaderpacks 文件夹中即可 (没有这个文件夹就自己新建一个) 。如果开了版本隔离,那么文件夹是 \.minecraft\version\<客户端名称>\shaderpacks。若你不知道游戏文件夹在哪,在HMCL中打开游戏文件夹。

Game_Dir

如果你不知道版本隔离是啥,也不会创建文件夹,那么请打开游戏,依次点击 设置—视频设置—光影—光影包文件夹 ,在里面放入光影包,然后点击你要加载的光影,最后点击 完成 即可

Shader_Settings

注意:光影对于电脑配置的要求比较高,如果开了光影之后出现游戏画面很卡的情况,请升级电脑配置、使用低配置光影或者关闭光影。

更新时间:

diff --git a/launcher/use-password-login-microsoft-account.html b/launcher/use-password-login-microsoft-account.html new file mode 100644 index 0000000..5828a70 --- /dev/null +++ b/launcher/use-password-login-microsoft-account.html @@ -0,0 +1 @@ +使用密码登录微软账户 - HMCL 文档

Hits

本文由 zkitefly 创建。

为什么使用密码登录

我们发现,某些账户在尝试通过非密码方式登录时,可能会遇到设备代码流授权问题,从而无法成功登录。而建议这些用户改用密码登录后,他们的登录成功率显著提高。

如何使用密码登录微软账户

  • 在执行登录操作时,注意检查登录页面是否有“其他登录方式”的选项。一旦看到此选项,立即点击进行选择。

点击“其他登录方法”选项

  • 在登录页面,系统会询问您希望采用哪种登录方式。此时,需要选择“使用我的密码”,然后输入密码完成登录。

如果没有“使用我的密码”选项,或者忘记了密码,请看 下方教程

选择“使用我的密码”

添加/更改密码

部分账户可能并未设置密码登录,或者忘记了密码,请按照以下步骤进行操作:

  • 前往 添加/更改密码 页面;

  • 在该页面按照指示添加密码即可。若忘记密码,可选择该页面“忘记密码了?”选项进行找回密码操作。

添加密码

修改密码

完成上述操作后再按照 上方教程 操作即可使用密码登录微软账户。

更新时间:

diff --git a/modpack/bundled-java.html b/modpack/bundled-java.html new file mode 100644 index 0000000..4cdfbd5 --- /dev/null +++ b/modpack/bundled-java.html @@ -0,0 +1 @@ +整合包自带 Java 教程 - HMCL 文档

Hits

本文由 未署名用户 创建。

背景

想必有些服务器主为此头疼了许久。由于玩家的电脑环境多变,甚至可能仍然有安装着 Java 7 的电脑而无法启动 1.12.2 以上的游戏或者含有 Mod 的客户端。因此服务器主希望能在整合包中自带一个 Java 运行时(或者叫 JRE),从而取代电脑自带的 JVM。接下来本文将介绍两种方法。

名词解释

  • JRE Java Runtime Environment的缩写。通常可以认为是玩家所使用的 Java 下文所指代的 Java 和 JRE 均可以认为是此版本。

方法一:使用最新版本(推荐)

EXE 版本

EXE 版本在 Windows 系统下打开会首先检查同级文件夹下的 jre-arm64jre-x64jre-x86 文件夹。

检查顺序从上到下依次是:

  • jre-arm64 (ARM 64 位)
  • jre-x64 (x86 64 位)
  • jre-x86 (x86 32 位)

启动优先级如下:

  • 如果玩家电脑的操作系统是x86 32位的,HMCL 将会优先使用 jre-x86 启动 HMCL。
  • 如果玩家电脑的操作系统是x86 64位的,HMCL 将会优先使用 jre-x64 启动 HMCL。
  • 如果玩家电脑的操作系统是ARM 64位的,HMCL 将会优先使用 jre-arm64 启动 HMCL。

如果你不打算兼容ARM 64位x86 32位操作系统的玩家(让 HMCL 使用系统 JRE 环境),那么你的整合包内只需要携带 jre-x64 即可。

如果你想在任何情况下使用同一个 Java 启动 HMCL,只需要携带 jre-x86 即可,此时无论玩家电脑的操作系统是什么架构都会尝试使用该 Java。

如果没有对应的版本,将会尝试使用系统自带的版本启动。

注意

使用 x86 32位的 Java 很可能会导致游戏出错、内存不够等问题。我们推荐您配备 x86 64位的 Java 而不是 x86 32位

Shell (.sh)版本

SH 版本在支持 Bash 的系统下打开会首先检查同级文件夹下的 jre-loongarch64jre-arm32jre-arm64jre-x64jre-x86 文件夹。

检查顺序从上到下依次是:

  • jre-x64 (x86 64 位)
  • jre-x86 (x86 32 位)
  • jre-arm64 (ARM 64 位)
  • jre-arm32 (ARM 32 位)
  • jre-loongarch64 (Loongarch 64 位)

会根据玩家电脑的操作系统架构选择对应文件夹内的 Java 运行时启动 HMCL。

如果你想在x86 32位x86 64位下使用同一个 Java 启动 HMCL,只需要携带 jre-x86 即可,此时如果玩家电脑的操作系统是x86 32位x86 64位则会尝试使用该 Java 启动 HMCL。

如果没有对应的版本,将会尝试使用系统自带的版本启动。

注意

在启动器内更新升级本体时,只会更新本体部分,并不会将 EXE外壳 或 SH 外壳(即 HMCLauncher)更新,因此建议在制作整合包时重新下载 EXE 或 SH 版本以确保能正常使用该功能。

方法二:创建快捷方式

对于在 Windows 下使用 JAR 版本启动 HMCL 的可以采用方法二。

目录结构

首先我们假设整合包根文件夹是 tutorial(这个文件夹名字可以取别的),该文件夹内应该包含如下的文件:

其中,.minecraft 是 Minecraft 文件夹,jre-x64 是你的 Java 运行时,我们分别来看看这两个文件夹的内容:

上图是 .minecraft 文件夹的内容,里面包含着 assetslibrariesversions 等传统的文件夹。以及 HMCL.jar,这个文件是 HMCL 启动器的 jar 文件,可以在 https://hmcl.huangyuhui.net/download 里面下载 macOS 或者 Linux 版本(这两个版本的文件后缀名都是 jar,实际上是完全一样的东西,也可以在 Windows 系统上双击运行,没有平台限制)。

这个启动器文件我们接下来会使用到,借助整合包自带的 Java 运行时启动 HMCL。

注意:HMCL 本体文件 HMCL.jar 请务必保持该文件名,HMCL-3.2.117.jar 等带有版本号的文件名是不可以的

上图是 jre-x64 文件夹的内容,一看就是一个 JRE 的文件夹。

创建快捷方式

接下来我们创建一个快捷方式来使得 HMCL 通过 jre-x64 文件夹里的 Java 运行时启动,并使得 Minecraft 也通过该 Java 运行时启动。

tutorial 文件夹内右击空白区域打开快捷菜单,创建快捷方式。

在弹出的窗口中(如上图所示),在输入框内输入:cmd /c start .\jre-x64\bin\javaw.exe -jar .\.minecraft\HMCL.jar,其中 jre-x64.minecraft\HMCL.jar 根据实际情况修改,jre-x64 是你的 Java 运行时的路径,.minecraft\HMCL.jar 是 HMCL 本体文件。

接着给快捷方式取个名字就好了(如上图所示,开始游戏 是我取的名字)。

生成好快捷方式后我们还要编辑一下属性,右键 开始游戏 这个新创建的快捷方式(如果你取了别的名字请选中那个文件编辑其属性),在弹出的快捷菜单中选择属性,会打开快捷方式的属性窗口如下图所示:

将起始位置内的文字删除干净,留空即可。保存退出该窗口。

完成

现在这个开始游戏的快捷方式就可以直接使用的,你可以双击该快捷方式打开 HMCL,HMCL 在启动游戏的时候也会直接使用你指定的 Java 运行时。

一些疑问

1Q:这些 Java 文件夹中具体该放些什么,直接复制就行了吗?

1A:是的,复制 jre 内的所有东西就行,可以根据下图参考:

——————————————————————————————————————————————————

2Q:去哪里找 Java?

2A:有很多的Java提供选择,如 Liberica JDKMicrosoft JDKOracle JDK中文 Java 镜像站Oracle openJDK

只需要在下载时下载.zip 压缩包文件,且将压缩包内的所有内容放入对应文件夹即可

更新时间:

diff --git a/modpack/error-handbook.html b/modpack/error-handbook.html new file mode 100644 index 0000000..369f968 --- /dev/null +++ b/modpack/error-handbook.html @@ -0,0 +1,27 @@ +模组包报错排查手册 - HMCL 文档

Hits

本文由 LIPiston 创建。

文件夹结构

首先我们需要先认识Minecraft的文件夹结构
如果你开启了 版本隔离 那么你的文件夹结构如下

.minecraft
+|*assets         # 游戏资源文件夹,存放纹理、声音等资源
+|*libraries      # 依赖库文件夹,存放运行游戏所需的各种库
+|*versions       # 版本文件夹,包含所有已安装的Minecraft版本
+    \1.16.5-optifine
+        |1.16.5-optifine.jar   # 该版本的主程序jar文件
+        |*saves               # 存档文件夹,仅该版本可见
+        |*resourcepacks        # 资源包文件夹,仅该版本可见
+        |*logs                # 日志文件夹,仅该版本可见
+        |*mods                # 模组文件夹,仅该版本可见
+        |*config              # 配置文件夹,仅该版本可见
+        |*crash-reports       # 崩溃报告文件夹,仅该版本可见
+        ...
+

如果你没有开启则是这样

.minecraft
+|*assets         # 游戏资源文件夹,存放纹理、声音等资源
+|*libraries      # 依赖库文件夹,存放运行游戏所需的各种库
+|*saves          # 存档文件夹,所有版本共用
+|*resourcepacks  # 资源包文件夹,所有版本共用
+|*logs           # 日志文件夹,所有版本共用
+|*mods           # 模组文件夹,所有版本共用
+|*config         # 配置文件夹,所有版本共用
+|*crash-reports  # 崩溃报告文件夹,所有版本共用
+|*versions       # 版本文件夹,包含所有已安装的Minecraft版本
+    \1.16.5-optifine
+        |1.16.5-optifine.jar   # 该版本的主程序jar文件
+        ...
+

我们极力推荐您打开版本隔离,因为这样能避免模组之间的一部分冲突 跳转

简单排查

在遇到报错时,您可以通过以下两种方式进行初步分析:

  1. 使用社区分析工具
    访问 CrashMC 报错分析器,将崩溃报告内容粘贴进去,工具会自动分析常见问题并给出建议。

  2. 借助 AI 辅助分析
    可以将崩溃日志粘贴到 DeepSeek Chat,让 AI 帮助你解读报错内容和可能的解决方法。

  3. 进入 HMCL 汉医堂 可以在 HMCL 急诊群中向群友们寻求帮助,他们通常有丰富的经验,能够协助你分析报错并提供解决方案。

    qq : 666546887

这三种方式都能帮助您快速定位问题,提高排查效率。

求助他人

游戏崩的时候会有个窗口,里面可以导出一个压缩包,可以发给别人让别人帮你看,你千万别截图那个窗口 *磕头

报错示例截图 在向他人求助时,建议将 .minecraft 文件夹下的 crash-reports 文件夹和 logs 文件夹中的相关文件(如最新的崩溃报告和日志文件)一并打包发送。
这样可以让对方更全面地了解你的运行环境和报错详情,从而更高效地帮助你分析和解决问题。请注意,发送前可先检查日志内容,避免泄露个人隐私信息。

更新时间:

diff --git a/modpack/index.html b/modpack/index.html new file mode 100644 index 0000000..833d783 --- /dev/null +++ b/modpack/index.html @@ -0,0 +1 @@ +整合包 - HMCL 文档

整合包

diff --git a/modpack/serverpack.html b/modpack/serverpack.html new file mode 100644 index 0000000..3f6efb3 --- /dev/null +++ b/modpack/serverpack.html @@ -0,0 +1 @@ +服务端自动更新整合包制作教程 - HMCL 文档

Hits

本文由 huanghongxun 创建。

HMCL 允许服务器管理员借助服务端自动更新整合包来实现自动分发整合包更新,这将大大方便有需要频繁更新游戏客户端 Mod、配置等信息的服务器管理员。

HMCL 需要服务器管理员额外提供一个 HTTP 服务器(只需要能提供静态文件服务,比如 Apache 和 Nginx 皆可)来提供检查整合包更新并允许 HMCL 下载更新文件。

第一步:导出整合包

在 HMCL 中右键做好的客户端版本,选择导出整合包

选择导出为服务器自动更新整合包

填写整合包信息,整合包下载链接前缀如何填写请看下文

选择需要包含在整合包内的文件后将产生整合包压缩文件

第二步:导入整合包

接着创建一个全新的空文件夹,将启动器复制进去

运行启动器,并导入刚才导出的整合包,导入完成后,这个文件夹(这里叫“新整合包”)可以打包发给玩家。

第三步:部署整合包更新服务器

你可以借助 Apache、Nginx 等支持静态文件的 HTTP 服务器软件提供文件。首先,决定好整合包下载链接前缀,比如我希望 HMCL 从远程服务器的 http://www.site.com/modpack 目录下存放整合包的更新信息,则在之前导出整合包的整合包下载前缀中填写 http://www.site.com/modpack。

上图为导出的服务器自动更新整合包压缩文件的内容,你需要将这个整合包解压到 http://www.site.com/modpack 下。也就是说,从 http://www.site.com/modpack/server-manifest.json 这个链接下载下来的文件必须和上图中整合包压缩文件中的 server-manifest.json 文件一致,并且,http://www.site.com/modpack/overrides 是一个文件夹,里面存放了整合包文件,比如:

整合包压缩文件 test.zip/overrides/mods/Advancement_Book-1.12-1.0.3.jar 文件必须可以从 http://www.site.com/modpack/overrides/mods/Advancement_Book-1.12-1.0.3.jar 该目录下载下来,且文件内容一致。那么至此更新服务器就部署完成了。

第四步:更新整合包

如果你需要更新整合包,那么将新的整合包经过第一步导出新的整合包压缩文件,并解压到类似 http://www.site.com/modpack 文件夹下即可完成新整合包的部署。

更新时间:

diff --git a/modpack/serverpack2.html b/modpack/serverpack2.html new file mode 100644 index 0000000..6c46cfe --- /dev/null +++ b/modpack/serverpack2.html @@ -0,0 +1 @@ +配置客户端自动更新(宝塔面板) - HMCL 文档

Hits

本文由 未署名用户 创建。

备注

文章原作者:hy黑影
转载:Zkitfly
部分内容进行了稍作打磨
本教程转载自 https://www.mcbbs.net/thread-1103864-1-1.html

前言

  • 我自己开设的服务器有很多不同的子服,每个子服的客户端版本呢都不相同,我又希望能整合到一个客户端里面;找了一圈发现那些辅助更新程序只能更新单个客户端版本,而且界面不太美观;甚至一度想自己开发启动器………
  • 这篇帖子的灵感来自于 HMCL 启动器的一个功能 导出服务器自动更新整合包,我觉得可以利用这个功能来代替一些自动更新的辅助程序。
  • 整个功能的实现需要:一台有公网IP的服务器、一个客户端整合包、HMCL启动器;如果你都没有,那就换成RMB10元
  • 本篇教程默认读者为 萌新,即没有接触过HTTP服务器,网络应用开发,不懂linux系统,惧怕控制台程序

教程

第一步-租服务器(▲如果你有公网IP的服务器,请跳过这一步)

  • 百度搜索 腾讯云学生机阿里云学生机
  • 可以看到有10元/月 的套餐,如果是阿里云的话选轻量型应用服务器,腾讯云就只有一个套餐
  • 系统请选择CentOS 8.0 64位,其他保持默认即可
  • 再次确认是否是十元,是的话直接购买;不是的话可能是你已经买过学生套餐
  • 第一次购买可能需要实名认证,按照提示操作即可,不需要担心安全问题,都是可靠的大公司

第二步-安装宝塔面板——CentOS 8.0系统

  • 以腾讯云举例,阿里云同理

  • 打开控制台面板,找到刚才租的学生机

  • 选择重置密码

  • 点击右侧登入按钮,按照说明填写你刚刚重置的密码;之后应该会看到类似这样的提示

  • 不要慌,冷静。如果下面的部分教程失效请去宝塔面板官网,点击Linux->立即安装

  • 回到控制台面板,我们需要开放一些通道让面板通过,选择安全组

  • 点击修改规则,再点击添加规则

  • 图1:

  • 图2:

  • 按照图中所写添加,想要安全的话按照图1,懒的话按照图2

  • 回到那个黑黑的界面里输入 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ,按下回车

  • 这时会刷一大片大的英文,等他停下来的时候仔细看,最后一行在问你要不要安装(就是最后显示y/n),输入y并按下回车

  • 耐心等待五分钟左右,直到出现这个字样

  • 复制外网面板地址,在打开的页面中,用户名输入username后面的内容,密码输入password后面的内容

  • 点击登入,到此为止面板按照完成

第三步-搭建HTTP静态文件服务器

  • 打开刚刚的宝塔面板,一般都会有提示安装套件,选择nginx套装安装

  • 等待安装完成后,选择网站,点击添加网站

  • 在弹出的页面填写网站IP,就是地址栏里面的那个;比如:我的是 https://233.88.233.44:8888/site ,那么我就填233.88.233.44

  • 另外,租vps的同学请找服务商索要ip地址和开放的端口,比如我要到的是123.21.123.21:6666,那我就把这个填上去

  • 其他保持不变,到此为止你已经搭建好了HTTP静态文件服务器✔

第四步-制作整合包

  • 使用HMCL打开你的MC客户端

  • 选择你的游戏版本,点击导出整合包

  • 选择服务器自动更新整合包

  • 填写相关信息:

  • 整合包下载链接前缀:比如我刚刚在【第三步-搭建HTTP静态文件服务器】宝塔里填的是233.88.233.44,我希望能有版本区分,这个版本代号是a;那么我就填https://233.88.233.44/a, vps注意,端口号也要写▲

  • 版本号写1.0 ,以后更新就写2.0以此类推

  • 点击下一步,导出完成

第五步-上传整合包

  • 打开宝塔面板,选择文件,找到相应的目录,在相应IP目录下新建文件夹;比如我刚刚写的版本代号是a,那我就新建a这个文件夹

  • 在新建的文件夹里上传刚刚导出的整合包,并解压;成功后如下图

  • 要是更新整合包,请在解压时将该【a】这个文件夹内的文件覆盖处理

第六步-分发整合包

  • 大公告成,现在可以把刚刚导出的这个整合包上传分享给玩家了!

第七步-检测整合包

  • 为了防止一些手滑现象导致整合包可能会出现一些问题,你可以在分发整合包前先测试一下要准备分发的整合包

后续

  • 以后每次更新客户端只要重复第四步第五步玩家重启客户端后就会自动接收更新
  • 版本号要记得更新
  • 默认的更新方式不会删除玩家自己加入的模组,但会下载玩家删除的模组
  • 更新覆盖的是整合包导出时的所有数据
  • 每次更新会从整合包提供的链接下载 server-manifest.json 来校验玩家本地的整合包。若校验到整合包里没有匹配这个名字的文件或整合包里这个文件匹配名字但哈希值不匹配,就会下载该文件,不会下载匹配名字且哈希值匹配的文件
  • 出网带宽1MB我觉得够用了,除非你想让玩家自己下载全部内容(就是将整合包分发给他人前删除所有模组,玩家启动时就会开始下载回来,这样的好处是可见的整合包大小变小了)

更新时间:

diff --git a/modpack/serverpack3.html b/modpack/serverpack3.html new file mode 100644 index 0000000..ad2012c --- /dev/null +++ b/modpack/serverpack3.html @@ -0,0 +1,149 @@ +配置客户端自动更新 (Nginx) - HMCL 文档

Hits

本文由 buggzd 创建。

阅读本文前,请先阅读此文章

前置知识

阅读本文你需要具有以下知识储备:

  1. 掌握基础本的 linux 命令操作,比如 cd ls
  2. 拥有一个 linux 服务器(好像不算知识)

Nginx 安装

这里很基础(但是坑比较多)略过,可以看以下参考文档。

https://zhuanlan.zhihu.com/p/515069497

新建静态资源文件夹

我为了省事直接在/根目录下新建了一个 MinecraftClientStatic 文件夹,以后需要作为静态资源的文件都丢这里面。

命令:

# 到更目录
+cd /
+# 新建文件夹
+mkdir MinecraftClientStatic
+# 防止nginx无法访问,配置文件夹访问权限
+chmod 777 MinecraftClientStatic
+# 进入文件夹
+cd MinecraftClientStatic
+# 新建一个测试用的文件
+touch helloMC.html
+# 给文件权限
+chmod 777 helloMC.html
+# 编辑html内容
+vim helloMC.html
+

这里为了测试静态资源是否配置成功,需要新建一个 helloMC.html 的静态测试文件,可以在这个文件内随意写两行字。

例如:

<!-- helloMC.html -->
+<h1>hello static!</h1>
+

也可以整点炫的(可选):

<!-- helloMC.html -->
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>MC客户端静态资源</title>
+        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
+        <style>
+            @font-face{
+                font-family:'calligraffittiregular';
+                src:url("fonts/calligraffitti-regular-webfont.ttf")
+            }
+            
+            * {
+                margin: 0;
+                padding: 0;
+            }
+            
+            body {
+                overflow: hidden;
+            }
+            
+            #content{
+                position: absolute;
+                color: white;
+                top: 30%;
+                left: 50%;
+                margin-left: -121px;
+            }
+            
+            p{
+                font-family: calligraffittiregular
+            }
+            
+        </style>
+    </head>
+
+    <body>
+        <div id="content">
+            <p style="font-size:  40px;font-weight: 1000;">MinecraftClientStatic</p>
+        </div>
+        <canvas id="hacker" style="width:100%;height:100%;">请使用最新的浏览器</canvas>
+    </body>
+
+</html>
+<script type="text/javascript">
+    window.onload = function() {
+        var color_array = ['#00FF00','#00FF99','#00FFCC','#00FFFF','#00BBFF','#0066FF','#0000FF','#5500FF','#7700FF','#9900FF','#CC00FF','#FF00FF'];
+        var i=0;
+        var color;
+        function changColor() {
+            color = color_array[i];
+            console.log(i++);
+            console.log(color);
+            if(i>color_array.length-1){
+                i=0;
+            }
+            setTimeout(changColor, 2000);
+        }
+    
+        var hacker = document.getElementById("hacker");
+        var width = hacker.width = screen.width;
+        var height = hacker.height = screen.height;
+        var ctx = hacker.getContext('2d');
+        var num = Math.ceil(width / 12);
+        var y = Array(num).join(0).split('');
+        var draw = function() {
+            ctx.fillStyle = 'rgba(0,0,0,.05)';
+            ctx.fillRect(0, 0, width, height);
+            ctx.fillStyle = color;
+            ctx.font = '12px Microsoft YaHei';
+            y.map(function(y1,i){
+                var text = String.fromCharCode(65 + Math.random() * 62);
+                var x = i * 12;  
+                var y1 = y[i];
+                ctx.fillText(text, x, y1);
+                y[i] = ( y1 > Math.random() * 10 * height ? 0 : parseInt(y[i]) + 12 );
+            })
+        }
+
+        Run();
+
+        function Run() {
+            changColor();
+            Game_Interval = setInterval(draw, 50);
+        }
+    }
+</script>
+

分配次级域名(可选)

如果你没有域名,那么这里可以跳过,后面需要域名的地方直接使用服务器ip地址

假设我们的域名是 buggzd.com

在域名解析新建一个 A 记录(地址为 ipv6 时应使用 AAAA 记录),此处以 minecraft.buggzd.com 为例,配置记录名称为 minecraft 配置记录地址为服务器地址,如下图所示。

image.png

这是我们就有了一个子域名 minecraft.buggzd.com 添加完成后可以使用 cmdping 一下这个域名minecraft.buggzd.com 如果返回了正确的ip地址就是已经分配成功了。

ping minecraft.buggzd.com
+

配置 nginx.conf

查找 nginx 配置文件目录:(如果这里没有 nginx 指令,那么说明你 nginx 安装没有成功)

nginx -t
+

输出

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
+

这里 /etc/nginx/nginx.conf 就是 Nginx 配置文件的路径,然后 cdnginx 配置目录。

cd /etc/nginx
+# 编写配置文件
+vim nginx.conf
+

因为之前配置过博客反向代理 nginx.conf 会带有之前的配置记录不要把他们搞乱,理清层级关系很重要

# 这是 nginx.conf 的层级目录
+# 每个 nginx.conf 配置文件都只有一个 http 块,所以如果之前配置过 nginx
+# 就只需要粘贴 server 块里的内容,把 server 块放到 http 块内部。
+http {
+    server { ... }
+    server { ... }
+    server { ... }
+}
+

需要填写的配置:

http {
+    server {
+        # 需要监听的端口号,可以不动
+        listen 80;       
+        # 这里需要把localhost改为上面分配好的域名
+        server_name  minecraft.buggzd.com;
+        location / {
+            # root后面是对应的静态资源文件夹的位置
+            root /MinecraftClientStatic;
+            # 这里是默认加载的首页 html ,这里放的是刚刚新建的测试文件
+            # 它是从 root 目录文件夹内开始查找的,所以不要写 /MinecraftClientStatic/helloMC.html
+            index helloMC.html;
+        }
+    }
+}
+

Q:上面的配置干了什么事?
A:比如你访问 http://minecraft.buggzd.com/test.png 时,nginx 会访问本地的 /MinecraftClientStatic/test.png 然后返回。

当正确编写完 nginx.conf 需要让 nginx 重新加载一下配置文件。

nginx -s reload
+

然后直接访问刚刚配置的域名 minecraft.buggzd.com 默认会跳转到编写好的 helloMC.html 页面,你也可以访问 http://minecraft.buggzd.com/helloMC.html

image.png

当页面出现 helloMC.html 的内容时,说明已经配置成功了! 放张图片到静态资源文件夹试试。

image.png

访问成功,没问题!

导出整合包

image.png

选择服务器自动更新整合包

image.png

整合包下载链接前缀:填静态资源服务器的地址。 我们需要先去静态资源文件夹下新建一个 modepack 文件夹(也就是 /MinecraftClientStatic/modepack

cd /MinecraftClientStatic
+mkdir modepack
+

然后整合包下载链接前缀这里填写 http://minecraft.buggzd.com/modepack

image.png

上传整合包到静态资源服务器

假设我们刚刚打包的整合包名称为 client1.0.zip 我们把 client1.0.zip 通过 ftp 上传到服务器中,然后使用解压命令将这个整合包解压到 /MinecraftClientStatic/modepack 文件夹中。

# 假设我们把client1.0.zip上传到了/home/ftp文件夹中
+# 把 /home/ftp/client1.0.zip 解压到 /minecraftClientStatic/modepack
+unzip /home/ftp/client1.0.zip -d /minecraftClientStatic/modepack
+

解压完以后我们查看一下

ls /minecraftClientStatic/modepack
+

服务器返回:

overrides server-manifest.json
+

其中 overrides 是一个文件夹 server-manifest.json 是整合包配置文件。

客户端初始化

第一次使用客户端需要在一个空文件夹以 newClientPackage 为例,在文件夹中放一个 hmcl 启动器,打开 hmcl 导入刚刚做好的 client1.0.zip 整合包。 然后就可以把这个文件夹 newClientPackage 打包成一个 zip 发给玩家了,以后玩家每次打开 hmcl 登录时,启动器就会自动向静态资源服务器中查询整合包配置信息,当发现更新时会自动下载。 当缺少 mod 时会自动下载静态资源服务器上的 mod

image.png

更新客户端

目前HMCL版本更新的步骤是这样的:

  1. 启动器对比本地的 mod 和服务器的 mod 名称,如发现本地不存在的 mod 则会从服务器上下载。
  2. mod 的名称相同时,启动器会继续对比文件 MD5 哈希值,如果不匹配则重新下载。
  3. 在获得更新的时启动器会对比一次本地的文件,如果旧版本的模组在新版本中消失了,启动器会自动将本地的这个模组删除。
  4. 非远端服务器更新资源不会被更新删除,换句话说就是如果是玩家自己魔改整合包,往里面放的 mod 是不会被删除的。

当想要添加新的 mod 时需要在添加之后重新导出整合包如 client2.0.zip 导出的整合包版本号增加,然后重新上传整合包到静态资源服务器。

cd /minecraftClientStatic
+# 建议直接删除该目录然后重新新建
+rm modepack -R
+# 重新新建modepack文件夹
+mkdir modepack
+# 解压新的客户端整合包
+unzip /home/ftp/client2.0.zip -d /minecraftClientStatic/modepack
+

玩家启动 hmcl 后,启动器会检测到版本更新并自动更新模组。

参考资料

更新时间:

diff --git a/multiplayer/feedback.html b/multiplayer/feedback.html new file mode 100644 index 0000000..a9edf15 --- /dev/null +++ b/multiplayer/feedback.html @@ -0,0 +1 @@ +多人联机反馈 - HMCL 文档

Hits

本文由 Burning_TNT 创建,并由 TyMxy 编辑。

Terracotta | 陶瓦联机

提示

欢迎您填写反馈表单

我们注意到了 EasyTier 项目。它提供了一种简单、安全、去中心化的异地组网方案,足以承载 Minecraft 的联机需求。 在 EasyTier 开发团队的帮助下,我们决定重新在启动器内提供联机服务。

如要体验陶瓦联机,请遵循以下步骤: 打开 HMCL,然后您可通过 HMCL 左下角 多人联机 入口体验 Terracotta | 陶瓦联机。

目前,HMCL、PCL CE 已实现最基本的互通支持。我们欢迎其他启动器接入 Scaffolding 协议实现更完整的互通功能。

为向尽可能多的玩家免费开放基本联机功能,陶瓦联机将极大程度上基于 P2P。 简单而言,陶瓦联机不会比市面上基于服务器中继的联机方案稳定,但其开销将远远低于其他联机方案。 需要特别提醒的是:联机功能不会更不能取代 Minecraft: Java Edition 服务器。 它的主要目标依然是让朋友之间能共同游玩,而不是长时间的对外开放。

最后,我想感谢一切参与到 EasyTier、Terracotta | 陶瓦联机开发和测试、为 EasyTier 提供打洞和中继服务器的社区志愿者。欢迎大家访问 easytier.cn 深入了解这一项目。

更新时间:

diff --git a/multiplayer/help.html b/multiplayer/help.html new file mode 100644 index 0000000..e5f4b7d --- /dev/null +++ b/multiplayer/help.html @@ -0,0 +1 @@ +多人联机帮助 - HMCL 文档
diff --git a/multiplayer/index.html b/multiplayer/index.html new file mode 100644 index 0000000..8995726 --- /dev/null +++ b/multiplayer/index.html @@ -0,0 +1 @@ +多人联机 - HMCL 文档
diff --git a/redirects.json b/redirects.json new file mode 100644 index 0000000..60d0841 --- /dev/null +++ b/redirects.json @@ -0,0 +1 @@ +{"/launcher/global-version-isolation.html":"https://docs.hmcl.net/launcher/isolation.html","/downloads/loongnix.html":"https://docs.hmcl.net/downloads/linux/loongarch64.html","/downloads/hmcl-snapshot-update.html":"https://hmcl-snapshot-update.netlify.app"} \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..485cead --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +Sitemap: https://docs.hmcl.net/sitemap.xml diff --git a/settings.html b/settings.html new file mode 100644 index 0000000..ef68469 --- /dev/null +++ b/settings.html @@ -0,0 +1 @@ +设置 - HMCL 文档

Hits

本文由 未署名用户 创建。

外观

  • 颜色模式
  • 用于切换站点主题颜色模式。
  • 亮色皮肤
  • 亮色模式下应用的皮肤。
  • 暗色皮肤
  • 暗色模式下应用的皮肤。
diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..659d274 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,176 @@ + + + +https://docs.hmcl.net/changelog/dev.html +2021-08-22T23:18:02+08:00 + + +https://docs.hmcl.net/changelog/stable.html +2021-08-22T23:18:02+08:00 + + +https://docs.hmcl.net/contribution.html +2021-10-09T23:18:02+08:00 + + +https://docs.hmcl.net/help.html +2023-08-09T11:12:00+08:00 + + +https://docs.hmcl.net/crash-support-group.html +2024-03-05T17:00:00+08:00 + + +https://docs.hmcl.net/groups.html +2024-03-05T17:00:00+08:00 + + +https://docs.hmcl.net/faq.html +2025-09-19T13:40:00+08:00 + + +https://docs.hmcl.net/downloads/java.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/linux/arm32.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/linux/arm64.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/linux/x86.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/linux/x86_64.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/macos/arm64.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/macos/x86_64.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/windows/arm64.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/windows/x86.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/windows/x86_64.html +2022-12-03T17:30:00+08:00 + + +https://docs.hmcl.net/downloads/linux/loongarch64.html +2023-09-05T14:00:00+08:00 + + +https://docs.hmcl.net/downloads/linux/riscv64.html +2024-10-06T22:00:00+08:00 + + +https://docs.hmcl.net/eula/hmcl.html +2021-09-21T23:26:00+08:00 + + +https://docs.hmcl.net/launcher/authlib-injector.html +2021-08-22T23:18:02+08:00 + + +https://docs.hmcl.net/launcher/datapack.html +2021-08-22T23:18:02+08:00 + + +https://docs.hmcl.net/launcher/isolation.html +2025-12-03T14:31:42+08:00 + + +https://docs.hmcl.net/launcher/shader.html +2021-10-09T23:18:02+08:00 + + +https://docs.hmcl.net/launcher/fabric_and_optifine_install.html +2023-01-04T11:30:00+08:00 + + +https://docs.hmcl.net/launcher/set-item-details.html +2023-06-09T10:26:00+08:00 + + +https://docs.hmcl.net/launcher/use-password-login-microsoft-account.html +2024-07-21T17:50:00+08:00 + + +https://docs.hmcl.net/launcher/jvm-options-and-env.html +2025-04-20T23:18:02+08:00 + + +https://docs.hmcl.net/launcher/auto-installing.html +2025-11-02T09:06:30+08:00 + + +https://docs.hmcl.net/launcher/offline-skin.html +2025-12-05T22:25:00+08:00 + + +https://docs.hmcl.net/launcher/gui-features.html +2026-01-09T15:19:02+08:00 + + +https://docs.hmcl.net/modpack/serverpack.html +2025-12-06T09:37:00+08:00 + + +https://docs.hmcl.net/modpack/serverpack2.html +2021-08-22T23:18:02+08:00 + + +https://docs.hmcl.net/modpack/bundled-java.html +2021-10-09T23:18:02+08:00 + + +https://docs.hmcl.net/modpack/serverpack3.html +2023-01-11T14:13:45+08:00 + + +https://docs.hmcl.net/modpack/error-handbook.html +2025-05-24T13:39:36+08:00 + + +https://docs.hmcl.net/multiplayer/feedback.html +2025-12-03T16:39:00+08:00 + + +https://docs.hmcl.net/multiplayer/help.html +2026-03-15T20:43:59+08:00 + + +https://docs.hmcl.net/docs/ + + +https://docs.hmcl.net/downloads/ + + +https://docs.hmcl.net/ + + +https://docs.hmcl.net/launcher/ + + +https://docs.hmcl.net/modpack/ + + +https://docs.hmcl.net/multiplayer/ + + +https://docs.hmcl.net/settings.html + +