diff --git a/resources/js/config.js b/resources/js/config.js
index 14e150b..1794608 100644
--- a/resources/js/config.js
+++ b/resources/js/config.js
@@ -1 +1 @@
-var __DOCS_CONFIG__ = {"id":"3/B+gszitBGlNVAYxlc1MV156yatsVBDIn2","key":"j/8XkOL+X3leSu4RBumFfPT+klqoIg6SwB/oaIsp5ms.EHd20emaaCe594tlMYIGt15YCMzFPLZr7YmTEHxTvbCyh4f4DxG28zn/6WjCoHZXt0d4ehUgSeHE9a2vZ90T/A.8212","base":"/","host":"docs.blissroms.org","version":"1.0.0","useRelativePaths":true,"documentName":"index.html","appendDocumentName":false,"trailingSlash":true,"preloadSearch":false,"cacheBustingToken":"2.4.0.731222541606","cacheBustingStrategy":"query","sidebarFilterPlaceholder":"Filter","toolbarFilterPlaceholder":"Filter","showSidebarFilter":true,"filterNotFoundMsg":"No member names found containing the query \"{query}\"","maxHistoryItems":15,"homeIcon":"<path d=\"M12.97 2.59a1.5 1.5 0 00-1.94 92 0l-7.5 6.363A1.5 1.5 0 003 10.097V19.5A1.5 1.5 0 004.5 21h4.75a.75.75 0 00.75-.75V14h4v6.25c0 .414.336.75.75.75h4.75a1.5 1.5 0 001.5-1.5v-9.403a1.5 1.5 0 00-.53-1.144l-7.5-6.363z\"></path>","access":[{"value":"public","label":"Public"},{"value":"protected","label":"Protected"}],"toolbarLinks":[{"id":"fields","label":"Fields"},{"id":"properties","label":"Properties","shortLabel":"Props"},{"id":"methods","label":"Methods"},{"id":"events","label":"Events"}],"sidebar":[{"n":"/","l":"Welcome to Bliss​Roms"},{"n":"guides","l":"Guides","c":false,"o":true,"i":[{"n":"build-guide","l":"Build Bliss​Rom"},{"n":"conclusion","l":"Conclusion"},{"n":"troubleshoot","l":"Troubleshoot"}],"s":"<path fill-rule=\"evenodd\" d=\"M0 3.75A.75.75 0 01.75 3h7.497c1.566 0 2.945.8 3.751 2.014A4.496 4.496 0 0115.75 3h7.5a.75.75 0 01.75.75v15.063a.75.75 0 01-.755.75l-7.682-.052a3 3 0 00-2.142.878l-.89.891a.75.75 0 01-1.061 0l-.902-.901a3 3 0 00-2.121-.879H.75a.75.75 0 01-.75-.75v-15zm11.247 3.747a3 3 0 00-3-2.997H1.5V18h6.947a4.5 4.5 0 012.803.98l-.003-11.483zm1.503 11.485V7.5a3 3 0 013-3h6.75v13.558l-6.927-.047a4.5 4.5 0 00-2.823.971z\"/>"},{"n":"documentation","l":"Documentation","c":false,"o":true,"i":[{"n":"overlays","l":"Overlays"}],"s":"<path fill-rule=\"evenodd\" d=\"M0 4.75C0 3.784.784 3 1.75 3h20.5c.966 0 1.75.784 1.75 1.75v14.5A1.75 1.75 0 0122.25 21H1.75A1.75 1.75 0 010 19.25V4.75zm1.75-.25a.25.25 0 00-.25.25v14.5c0 .138.112.25.25.25h20.5a.25.25 0 00.25-.25V4.75a.25.25 0 00-.25-.25H1.75z\"/><path fill-rule=\"evenodd\" d=\"M5 8.75A.75.75 0 015.75 8h11.5a.75.75 0 010 1.5H5.75A.75.75 0 015 8.75zm0 4a.75.75 0 01.75-.75h5.5a.75.75 0 010 1.5h-5.5a.75.75 0 01-.75-.75z\"/>"},{"n":"maintainers","l":"Maintainers","c":false,"o":true,"i":[{"n":"code_of_conduct","l":"Code of Conduct"},{"n":"requirements","l":"Requirements"}],"s":"<path fill-rule=\"evenodd\" d=\"M3.5 8a5.5 5.5 0 118.596 4.547 9.005 9.005 0 015.9 8.18.75.75 0 01-1.5.045 7.5 7.5 0 00-14.993 0 .75.75 0 01-1.499-.044 9.005 9.005 0 015.9-8.181A5.494 5.494 0 013.5 8zM9 4a4 4 0 100 8 4 4 0 000-8z\"/><path d=\"M17.29 8c-.148 0-.292.01-.434.03a.75.75 0 11-.212-1.484 4.53 4.53 0 013.38 8.097 6.69 6.69 0 013.956 6.107.75.75 0 01-1.5 0 5.193 5.193 0 00-3.696-4.972l-.534-.16v-1.676l.41-.209A3.03 3.03 0 0017.29 8z\"/>"}],"search":{"mode":0,"minChars":2,"maxResults":20,"placeholder":"Search","hotkeys":["/"],"noResultsFoundMsg":"Sorry, no results found.","recognizeLanguages":true,"languages":[0],"preload":false}};
+var __DOCS_CONFIG__ = {"id":"i9mW8/3156187c9y+Q3dqen9/fVjCzyrJVe","key":"HwpyNS8PYb0AU1elHiJJnN2X93YMQfA5I3kgZgx+Qho.JJdjPxoctOWR4lmszhXhIfmvVVZH8k7lnCd0UZtKccYrVWvVB1Bo5KjyFvn9irO1F3GYvv94+nKK66LBLmY7FA.8280","base":"/","host":"docs.blissroms.org","version":"1.0.0","useRelativePaths":true,"documentName":"index.html","appendDocumentName":false,"trailingSlash":true,"preloadSearch":false,"cacheBustingToken":"3.0.1.739101445355","cacheBustingStrategy":"query","sidebarFilterPlaceholder":"Filter","toolbarFilterPlaceholder":"Filter","showSidebarFilter":true,"filterNotFoundMsg":"No member names found containing the query \"{query}\"","maxHistoryItems":15,"homeIcon":"<path d=\"M12.97 2.59a1.5 1.5 0 00-1.94 92 0l-7.5 6.363A1.5 1.5 0 003 10.097V19.5A1.5 1.5 0 004.5 21h4.75a.75.75 0 00.75-.75V14h4v6.25c0 .414.336.75.75.75h4.75a1.5 1.5 0 001.5-1.5v-9.403a1.5 1.5 0 00-.53-1.144l-7.5-6.363z\"></path>","access":[{"value":"public","label":"Public"},{"value":"protected","label":"Protected"}],"toolbarLinks":[{"id":"fields","label":"Fields"},{"id":"properties","label":"Properties"},{"id":"methods","label":"Methods"},{"id":"events","label":"Events"}],"sidebar":[{"n":"/","l":"Welcome to Bliss​Roms"},{"n":"guides","l":"Guides","c":false,"o":true,"i":[{"n":"build-guide","l":"Build Bliss​Rom"},{"n":"conclusion","l":"Conclusion"},{"n":"troubleshoot","l":"Troubleshoot"}],"s":"<path d=\"M0 3.75A.75.75 0 0 1 .75 3h7.497c1.566 0 2.945.8 3.751 2.014A4.495 4.495 0 0 1 15.75 3h7.5a.75.75 0 0 1 .75.75v15.063a.752.752 0 0 1-.755.75l-7.682-.052a3 3 0 0 0-2.142.878l-.89.891a.75.75 0 0 1-1.061 0l-.902-.901a2.996 2.996 0 0 0-2.121-.879H.75a.75.75 0 0 1-.75-.75Zm12.75 15.232a4.503 4.503 0 0 1 2.823-.971l6.927.047V4.5h-6.75a3 3 0 0 0-3 3ZM11.247 7.497a3 3 0 0 0-3-2.997H1.5V18h6.947c1.018 0 2.006.346 2.803.98Z\"/>"},{"n":"documentation","l":"Documentation","c":false,"o":true,"i":[{"n":"overlays","l":"Overlays"}],"s":"<path d=\"M0 4.75C0 3.784.784 3 1.75 3h20.5c.966 0 1.75.784 1.75 1.75v14.5A1.75 1.75 0 0 1 22.25 21H1.75A1.75 1.75 0 0 1 0 19.25Zm1.75-.25a.25.25 0 0 0-.25.25v14.5c0 .138.112.25.25.25h20.5a.25.25 0 0 0 .25-.25V4.75a.25.25 0 0 0-.25-.25Z\"/><path d=\"M5 8.75A.75.75 0 0 1 5.75 8h11.5a.75.75 0 0 1 0 1.5H5.75A.75.75 0 0 1 5 8.75Zm0 4a.75.75 0 0 1 .75-.75h5.5a.75.75 0 0 1 0 1.5h-5.5a.75.75 0 0 1-.75-.75Z\"/>"},{"n":"maintainers","l":"Maintainers","c":false,"o":true,"i":[{"n":"code_of_conduct","l":"Code of Conduct"},{"n":"requirements","l":"Requirements"}],"s":"<path d=\"M3.5 8a5.5 5.5 0 1 1 8.596 4.547 9.005 9.005 0 0 1 5.9 8.18.751.751 0 0 1-1.5.045 7.5 7.5 0 0 0-14.993 0 .75.75 0 0 1-1.499-.044 9.005 9.005 0 0 1 5.9-8.181A5.496 5.496 0 0 1 3.5 8ZM9 4a4 4 0 1 0 0 8 4 4 0 0 0 0-8Zm8.29 4c-.148 0-.292.01-.434.03a.75.75 0 1 1-.212-1.484 4.53 4.53 0 0 1 3.38 8.097 6.69 6.69 0 0 1 3.956 6.107.75.75 0 0 1-1.5 0 5.193 5.193 0 0 0-3.696-4.972l-.534-.16v-1.676l.41-.209A3.03 3.03 0 0 0 17.29 8Z\"/>"}],"search":{"mode":0,"minChars":2,"maxResults":20,"placeholder":"Search","hotkeys":["k"],"noResultsFoundMsg":"Sorry, no results found.","recognizeLanguages":true,"languages":[0],"preload":false},"resources":{"History_Title_Label":"History","History_ClearLink_Label":"Clear","History_NoHistory_Label":"No history items","API_AccessFilter_Label":"Access","API_ParameterSection_Label":"PARAMETERS","API_SignatureSection_Label":"SIGNATURE","API_CopyHint_Label":"Copy","API_CopyNameHint_Label":"Copy name","API_CopyLinkHint_Label":"Copy link","API_CopiedAckHint_Label":"Copied!","API_MoreOverloads_Label":"more","API_MoreDropdownItems_Label":"More","API_OptionalParameter_Label":"optional","API_DefaultParameterValue_Label":"Default value","API_InheritedFilter_Label":"Inherited","Search_Input_Placeholder":"Search","Toc_Contents_Label":"Contents","Toc_RelatedClasses_Label":"Related Classes","History_JustNowTime_Label":"just now","History_AgoTime_Label":"ago","History_YearTime_Label":"y","History_MonthTime_Label":"mo","History_DayTime_Label":"d","History_HourTime_Label":"h","History_MinuteTime_Label":"m","History_SecondTime_Label":"s"}};
diff --git a/resources/js/lunr.js b/resources/js/lunr.js
index 9910d7c..80fc20c 100644
--- a/resources/js/lunr.js
+++ b/resources/js/lunr.js
@@ -1,4 +1,4 @@
-/*! Retype v2.4.0 | retype.com | Copyright 2023. Object.NET, Inc. All rights reserved. */
+/*! Retype v3.0.1 | retype.com | Copyright 2023. Object.NET, Inc. All rights reserved. */
 
 /*! For license information please see lunr.js.LICENSE.txt */
-(()=>{var e={1336:(e,t,r)=>{var i,n;!function(){var s,o,a,u,l,c,h,d,f,p,y,m,g,x,v,w,Q,k,S,b,E,L,P,T,O,I,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(s=this,function(e){s.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i<r.length;i++){var n=r[i],s=e[n];if(Array.isArray(s))t[n]=s.slice();else{if("string"!=typeof s&&"number"!=typeof s&&"boolean"!=typeof s)throw new TypeError("clone is not deep and does not support nested objects");t[n]=s}}return t},R.FieldRef=function(e,t,r){this.docRef=e,this.fieldName=t,this._stringValue=r},R.FieldRef.joiner="/",R.FieldRef.fromString=function(e){var t=e.indexOf(R.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var r=e.slice(0,t),i=e.slice(t+1);return new R.FieldRef(i,r,e)},R.FieldRef.prototype.toString=function(){return null==this._stringValue&&(this._stringValue=this.fieldName+R.FieldRef.joiner+this.docRef),this._stringValue},R.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var t=0;t<this.length;t++)this.elements[e[t]]=!0}else this.length=0},R.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},R.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},R.Set.prototype.contains=function(e){return!!this.elements[e]},R.Set.prototype.intersect=function(e){var t,r,i,n=[];if(e===R.Set.complete)return this;if(e===R.Set.empty)return e;this.length<e.length?(t=this,r=e):(t=e,r=this),i=Object.keys(t.elements);for(var s=0;s<i.length;s++){var o=i[s];o in r.elements&&n.push(o)}return new R.Set(n)},R.Set.prototype.union=function(e){return e===R.Set.complete?R.Set.complete:e===R.Set.empty?this:new R.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},R.idf=function(e,t){var r=0;for(var i in e)"_index"!=i&&(r+=Object.keys(e[i]).length);var n=(t-r+.5)/(r+.5);return Math.log(1+Math.abs(n))},R.Token=function(e,t){this.str=e||"",this.metadata=t||{}},R.Token.prototype.toString=function(){return this.str},R.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},R.Token.prototype.clone=function(e){return e=e||function(e){return e},new R.Token(e(this.str,this.metadata),this.metadata)},R.tokenizer=function(e,t){if(null==e||null==e)return[];if(Array.isArray(e))return e.map((function(e){return new R.Token(R.utils.asString(e).toLowerCase(),R.utils.clone(t))}));for(var r=e.toString().toLowerCase(),i=r.length,n=[],s=0,o=0;s<=i;s++){var a=s-o;if(r.charAt(s).match(R.tokenizer.separator)||s==i){if(a>0){var u=R.utils.clone(t)||{};u.position=[o,a],u.index=n.length,n.push(new R.Token(r.slice(o,s),u))}o=s+1}}return n},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var r=R.Pipeline.registeredFunctions[e];if(!r)throw new Error("Cannot load unregistered function: "+e);t.add(r)})),t},R.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");r+=1,this._stack.splice(r,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");this._stack.splice(r,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r<t;r++){for(var i=this._stack[r],n=[],s=0;s<e.length;s++){var o=i(e[s],s,e);if(null!=o&&""!==o)if(Array.isArray(o))for(var a=0;a<o.length;a++)n.push(o[a]);else n.push(o)}e=n}return e},R.Pipeline.prototype.runString=function(e,t){var r=new R.Token(e,t);return this.run([r]).map((function(e){return e.toString()}))},R.Pipeline.prototype.reset=function(){this._stack=[]},R.Pipeline.prototype.toJSON=function(){return this._stack.map((function(e){return R.Pipeline.warnIfFunctionNotRegistered(e),e.label}))},R.Vector=function(e){this._magnitude=0,this.elements=e||[]},R.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,r=this.elements.length/2,i=r-t,n=Math.floor(i/2),s=this.elements[2*n];i>1&&(s<e&&(t=n),s>e&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e||s>e?2*n:s<e?2*(n+1):void 0},R.Vector.prototype.insert=function(e,t){this.upsert(e,t,(function(){throw"duplicate index"}))},R.Vector.prototype.upsert=function(e,t,r){this._magnitude=0;var i=this.positionForIndex(e);this.elements[i]==e?this.elements[i+1]=r(this.elements[i+1],t):this.elements.splice(i,0,e,t)},R.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,r=1;r<t;r+=2){var i=this.elements[r];e+=i*i}return this._magnitude=Math.sqrt(e)},R.Vector.prototype.dot=function(e){for(var t=0,r=this.elements,i=e.elements,n=r.length,s=i.length,o=0,a=0,u=0,l=0;u<n&&l<s;)(o=r[u])<(a=i[l])?u+=2:o>a?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t<this.elements.length;t+=2,r++)e[r]=this.elements[t];return e},R.Vector.prototype.toJSON=function(){return this.elements},R.stemmer=(o={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"},a={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},u="[aeiouy]",l="[^aeiou][^aeiouy]*",c=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),h=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),d=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"),f=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"),p=/^(.+?)(ss|i)es$/,y=/^(.+?)([^s])s$/,m=/^(.+?)eed$/,g=/^(.+?)(ed|ing)$/,x=/.$/,v=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),Q=new RegExp("^"+l+u+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,S=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,b=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,E=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,L=/^(.+?)(s|t)(ion)$/,P=/^(.+?)e$/,T=/ll$/,O=new RegExp("^"+l+u+"[^aeiouwxy]$"),I=function(e){var t,r,i,n,s,u,l;if(e.length<3)return e;if("y"==(i=e.substr(0,1))&&(e=i.toUpperCase()+e.substr(1)),s=y,(n=p).test(e)?e=e.replace(n,"$1$2"):s.test(e)&&(e=e.replace(s,"$1$2")),s=g,(n=m).test(e)){var I=n.exec(e);(n=c).test(I[1])&&(n=x,e=e.replace(n,""))}else s.test(e)&&(t=(I=s.exec(e))[1],(s=f).test(t)&&(u=w,l=Q,(s=v).test(e=t)?e+="e":u.test(e)?(n=x,e=e.replace(n,"")):l.test(e)&&(e+="e")));return(n=k).test(e)&&(e=(t=(I=n.exec(e))[1])+"i"),(n=S).test(e)&&(t=(I=n.exec(e))[1],r=I[2],(n=c).test(t)&&(e=t+o[r])),(n=b).test(e)&&(t=(I=n.exec(e))[1],r=I[2],(n=c).test(t)&&(e=t+a[r])),s=L,(n=E).test(e)?(t=(I=n.exec(e))[1],(n=h).test(t)&&(e=t)):s.test(e)&&(t=(I=s.exec(e))[1]+I[2],(s=h).test(t)&&(e=t)),(n=P).test(e)&&(t=(I=n.exec(e))[1],s=d,u=O,((n=h).test(t)||s.test(t)&&!u.test(t))&&(e=t)),s=h,(n=T).test(e)&&s.test(e)&&(n=x,e=e.replace(n,"")),"y"==i&&(e=i.toLowerCase()+e.substr(1)),e},function(e){return e.update(I)}),R.Pipeline.registerFunction(R.stemmer,"stemmer"),R.generateStopWordFilter=function(e){var t=e.reduce((function(e,t){return e[t]=t,e}),{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},R.stopWordFilter=R.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"]),R.Pipeline.registerFunction(R.stopWordFilter,"stopWordFilter"),R.trimmer=function(e){return e.update((function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")}))},R.Pipeline.registerFunction(R.trimmer,"trimmer"),R.TokenSet=function(){this.final=!1,this.edges={},this.id=R.TokenSet._nextId,R.TokenSet._nextId+=1},R.TokenSet._nextId=1,R.TokenSet.fromArray=function(e){for(var t=new R.TokenSet.Builder,r=0,i=e.length;r<i;r++)t.insert(e[r]);return t.finish(),t.root},R.TokenSet.fromClause=function(e){return"editDistance"in e?R.TokenSet.fromFuzzyString(e.term,e.editDistance):R.TokenSet.fromString(e.term)},R.TokenSet.fromFuzzyString=function(e,t){for(var r=new R.TokenSet,i=[{node:r,editsRemaining:t,str:e}];i.length;){var n=i.pop();if(n.str.length>0){var s,o=n.str.charAt(0);o in n.node.edges?s=n.node.edges[o]:(s=new R.TokenSet,n.node.edges[o]=s),1==n.str.length&&(s.final=!0),i.push({node:s,editsRemaining:n.editsRemaining,str:n.str.slice(1)})}if(0!=n.editsRemaining){if("*"in n.node.edges)var a=n.node.edges["*"];else a=new R.TokenSet,n.node.edges["*"]=a;if(0==n.str.length&&(a.final=!0),i.push({node:a,editsRemaining:n.editsRemaining-1,str:n.str}),n.str.length>1&&i.push({node:n.node,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)}),1==n.str.length&&(n.node.final=!0),n.str.length>=1){if("*"in n.node.edges)var u=n.node.edges["*"];else u=new R.TokenSet,n.node.edges["*"]=u;1==n.str.length&&(u.final=!0),i.push({node:u,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)})}if(n.str.length>1){var l,c=n.str.charAt(0),h=n.str.charAt(1);h in n.node.edges?l=n.node.edges[h]:(l=new R.TokenSet,n.node.edges[h]=l),1==n.str.length&&(l.final=!0),i.push({node:l,editsRemaining:n.editsRemaining-1,str:c+n.str.slice(2)})}}}return r},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,r=t,i=0,n=e.length;i<n;i++){var s=e[i],o=i==n-1;if("*"==s)t.edges[s]=t,t.final=o;else{var a=new R.TokenSet;a.final=o,t.edges[s]=a,t=a}}return r},R.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var r=t.pop(),i=Object.keys(r.node.edges),n=i.length;r.node.final&&(r.prefix.charAt(0),e.push(r.prefix));for(var s=0;s<n;s++){var o=i[s];t.push({prefix:r.prefix.concat(o),node:r.node.edges[o]})}}return e},R.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),r=t.length,i=0;i<r;i++){var n=t[i];e=e+n+this.edges[n].id}return e},R.TokenSet.prototype.intersect=function(e){for(var t=new R.TokenSet,r=void 0,i=[{qNode:e,output:t,node:this}];i.length;){r=i.pop();for(var n=Object.keys(r.qNode.edges),s=n.length,o=Object.keys(r.node.edges),a=o.length,u=0;u<s;u++)for(var l=n[u],c=0;c<a;c++){var h=o[c];if(h==l||"*"==l){var d=r.node.edges[h],f=r.qNode.edges[l],p=d.final&&f.final,y=void 0;h in r.output.edges?(y=r.output.edges[h]).final=y.final||p:((y=new R.TokenSet).final=p,r.output.edges[h]=y),i.push({qNode:f,output:y,node:d})}}}return t},R.TokenSet.Builder=function(){this.previousWord="",this.root=new R.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},R.TokenSet.Builder.prototype.insert=function(e){var t,r=0;if(e<this.previousWord)throw new Error("Out of order word insertion");for(var i=0;i<e.length&&i<this.previousWord.length&&e[i]==this.previousWord[i];i++)r++;for(this.minimize(r),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child,i=r;i<e.length;i++){var n=new R.TokenSet,s=e[i];t.edges[s]=n,this.uncheckedNodes.push({parent:t,char:s,child:n}),t=n}t.final=!0,this.previousWord=e},R.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},R.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=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()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),r=Object.create(null),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a<this.fields.length;a++)i[this.fields[a]]=new R.Vector;for(e.call(t,t),a=0;a<t.clauses.length;a++){var u,l=t.clauses[a],c=R.Set.empty;u=l.usePipeline?this.pipeline.runString(l.term,{fields:l.fields}):[l.term];for(var h=0;h<u.length;h++){var d=u[h];l.term=d;var f=R.TokenSet.fromClause(l),p=this.tokenSet.intersect(f).toArray();if(0===p.length&&l.presence===R.Query.presence.REQUIRED){for(var y=0;y<l.fields.length;y++)s[F=l.fields[y]]=R.Set.empty;break}for(var m=0;m<p.length;m++){var g=p[m],x=this.invertedIndex[g],v=x._index;for(y=0;y<l.fields.length;y++){var w=x[F=l.fields[y]],Q=Object.keys(w),k=g+"/"+F,S=new R.Set(Q);if(l.presence==R.Query.presence.REQUIRED&&(c=c.union(S),void 0===s[F]&&(s[F]=R.Set.complete)),l.presence!=R.Query.presence.PROHIBITED){if(i[F].upsert(v,l.boost,(function(e,t){return e+t})),!n[k]){for(var b=0;b<Q.length;b++){var E,L=Q[b],P=new R.FieldRef(L,F),T=w[L];void 0===(E=r[P])?r[P]=new R.MatchData(g,F,T):E.add(g,F,T)}n[k]=!0}}else void 0===o[F]&&(o[F]=R.Set.empty),o[F]=o[F].union(S)}}}if(l.presence===R.Query.presence.REQUIRED)for(y=0;y<l.fields.length;y++)s[F=l.fields[y]]=s[F].intersect(c)}var O=R.Set.complete,I=R.Set.empty;for(a=0;a<this.fields.length;a++){var F;s[F=this.fields[a]]&&(O=O.intersect(s[F])),o[F]&&(I=I.union(o[F]))}var _=Object.keys(r),N=[],j=Object.create(null);if(t.isNegated())for(_=Object.keys(this.fieldVectors),a=0;a<_.length;a++){P=_[a];var C=R.FieldRef.fromString(P);r[P]=new R.MatchData}for(a=0;a<_.length;a++){var D=(C=R.FieldRef.fromString(_[a])).docRef;if(O.contains(D)&&!I.contains(D)){var A,B=this.fieldVectors[C],z=i[C.fieldName].similarity(B);if(void 0!==(A=j[D]))A.score+=z,A.matchData.combine(r[C]);else{var V={ref:D,score:z,matchData:r[C]};j[D]=V,N.push(V)}}}return N.sort((function(e,t){return t.score-e.score}))},R.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map((function(e){return[e,this.invertedIndex[e]]}),this),t=Object.keys(this.fieldVectors).map((function(e){return[e,this.fieldVectors[e].toJSON()]}),this);return{version:R.version,fields:this.fields,fieldVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},R.Index.load=function(e){var t={},r={},i=e.fieldVectors,n=Object.create(null),s=e.invertedIndex,o=new R.TokenSet.Builder,a=R.Pipeline.load(e.pipeline);e.version!=R.version&&R.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+R.version+"' does not match serialized index '"+e.version+"'");for(var u=0;u<i.length;u++){var l=(h=i[u])[0],c=h[1];r[l]=new R.Vector(c)}for(u=0;u<s.length;u++){var h,d=(h=s[u])[0],f=h[1];o.insert(d),n[d]=f}return o.finish(),t.fields=e.fields,t.fieldVectors=r,t.invertedIndex=n,t.tokenSet=o.root,t.pipeline=a,new R.Index(t)},R.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=R.tokenizer,this.pipeline=new R.Pipeline,this.searchPipeline=new R.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},R.Builder.prototype.ref=function(e){this._ref=e},R.Builder.prototype.field=function(e,t){if(/\//.test(e))throw new RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=t||{}},R.Builder.prototype.b=function(e){this._b=e<0?0:e>1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=t||{},this.documentCount+=1;for(var n=0;n<i.length;n++){var s=i[n],o=this._fields[s].extractor,a=o?o(e):e[s],u=this.tokenizer(a,{fields:[s]}),l=this.pipeline.run(u),c=new R.FieldRef(r,s),h=Object.create(null);this.fieldTermFrequencies[c]=h,this.fieldLengths[c]=0,this.fieldLengths[c]+=l.length;for(var d=0;d<l.length;d++){var f=l[d];if(null==h[f]&&(h[f]=0),h[f]+=1,null==this.invertedIndex[f]){var p=Object.create(null);p._index=this.termIndex,this.termIndex+=1;for(var y=0;y<i.length;y++)p[i[y]]=Object.create(null);this.invertedIndex[f]=p}null==this.invertedIndex[f][s][r]&&(this.invertedIndex[f][s][r]=Object.create(null));for(var m=0;m<this.metadataWhitelist.length;m++){var g=this.metadataWhitelist[m],x=f.metadata[g];null==this.invertedIndex[f][s][r][g]&&(this.invertedIndex[f][s][r][g]=[]),this.invertedIndex[f][s][r][g].push(x)}}}},R.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),t=e.length,r={},i={},n=0;n<t;n++){var s=R.FieldRef.fromString(e[n]),o=s.fieldName;i[o]||(i[o]=0),i[o]+=1,r[o]||(r[o]=0),r[o]+=this.fieldLengths[s]}var a=Object.keys(this._fields);for(n=0;n<a.length;n++){var u=a[n];r[u]=r[u]/i[u]}this.averageFieldLength=r},R.Builder.prototype.createFieldVectors=function(){for(var e={},t=Object.keys(this.fieldTermFrequencies),r=t.length,i=Object.create(null),n=0;n<r;n++){for(var s=R.FieldRef.fromString(t[n]),o=s.fieldName,a=this.fieldLengths[s],u=new R.Vector,l=this.fieldTermFrequencies[s],c=Object.keys(l),h=c.length,d=this._fields[o].boost||1,f=this._documents[s.docRef].boost||1,p=0;p<h;p++){var y,m,g,x=c[p],v=l[x],w=this.invertedIndex[x]._index;void 0===i[x]?(y=R.idf(this.invertedIndex[x],this.documentCount),i[x]=y):y=i[x],m=y*((this._k1+1)*v)/(this._k1*(1-this._b+this._b*(a/this.averageFieldLength[o]))+v),m*=d,m*=f,g=Math.round(1e3*m)/1e3,u.insert(w,g)}e[s]=u}this.fieldVectors=e},R.Builder.prototype.createTokenSet=function(){this.tokenSet=R.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},R.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new R.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},R.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},R.MatchData=function(e,t,r){for(var i=Object.create(null),n=Object.keys(r||{}),s=0;s<n.length;s++){var o=n[s];i[o]=r[o].slice()}this.metadata=Object.create(null),void 0!==e&&(this.metadata[e]=Object.create(null),this.metadata[e][t]=i)},R.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),r=0;r<t.length;r++){var i=t[r],n=Object.keys(e.metadata[i]);null==this.metadata[i]&&(this.metadata[i]=Object.create(null));for(var s=0;s<n.length;s++){var o=n[s],a=Object.keys(e.metadata[i][o]);null==this.metadata[i][o]&&(this.metadata[i][o]=Object.create(null));for(var u=0;u<a.length;u++){var l=a[u];null==this.metadata[i][o][l]?this.metadata[i][o][l]=e.metadata[i][o][l]:this.metadata[i][o][l]=this.metadata[i][o][l].concat(e.metadata[i][o][l])}}}},R.MatchData.prototype.add=function(e,t,r){if(!(e in this.metadata))return this.metadata[e]=Object.create(null),void(this.metadata[e][t]=r);if(t in this.metadata[e])for(var i=Object.keys(r),n=0;n<i.length;n++){var s=i[n];s in this.metadata[e][t]?this.metadata[e][t][s]=this.metadata[e][t][s].concat(r[s]):this.metadata[e][t][s]=r[s]}else this.metadata[e][t]=r},R.Query=function(e){this.clauses=[],this.allFields=e},R.Query.wildcard=new String("*"),R.Query.wildcard.NONE=0,R.Query.wildcard.LEADING=1,R.Query.wildcard.TRAILING=2,R.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},R.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=R.Query.wildcard.NONE),e.wildcard&R.Query.wildcard.LEADING&&e.term.charAt(0)!=R.Query.wildcard&&(e.term="*"+e.term),e.wildcard&R.Query.wildcard.TRAILING&&e.term.slice(-1)!=R.Query.wildcard&&(e.term=e.term+"*"),"presence"in e||(e.presence=R.Query.presence.OPTIONAL),this.clauses.push(e),this},R.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=R.Query.presence.PROHIBITED)return!1;return!0},R.Query.prototype.term=function(e,t){if(Array.isArray(e))return e.forEach((function(e){this.term(e,R.utils.clone(t))}),this),this;var r=t||{};return r.term=e.toString(),this.clause(r),this},R.QueryParseError=function(e,t,r){this.name="QueryParseError",this.message=e,this.start=t,this.end=r},R.QueryParseError.prototype=new Error,R.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},R.QueryLexer.prototype.run=function(){for(var e=R.QueryLexer.lexText;e;)e=e(this)},R.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,r=this.pos,i=0;i<this.escapeCharPositions.length;i++)r=this.escapeCharPositions[i],e.push(this.str.slice(t,r)),t=r+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},R.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},R.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},R.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos<this.length},R.QueryLexer.EOS="EOS",R.QueryLexer.FIELD="FIELD",R.QueryLexer.TERM="TERM",R.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",R.QueryLexer.BOOST="BOOST",R.QueryLexer.PRESENCE="PRESENCE",R.QueryLexer.lexField=function(e){return e.backup(),e.emit(R.QueryLexer.FIELD),e.ignore(),R.QueryLexer.lexText},R.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(r+=" with value '"+t.str+"'"),new R.QueryParseError(r,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(r,t.start,t.end)}var i=e.peekLexeme();if(null==i)throw r="expecting term or field, found nothing",new R.QueryParseError(r,t.start,t.end);switch(i.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:throw r="expecting term or field, found '"+i.type+"'",new R.QueryParseError(r,i.start,i.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var r=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),i="unrecognised field '"+t.str+"', possible fields: "+r;throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.fields=[t.str];var n=e.peekLexeme();if(null==n)throw i="expecting term, found nothing",new R.QueryParseError(i,t.start,t.end);if(n.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;throw i="expecting term, found '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(null!=r)switch(r.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new R.QueryParseError(i,r.start,r.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.editDistance=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:throw i="Unexpected lexeme type '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="boost must be numeric";throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.boost=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:throw i="Unexpected lexeme type '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}else e.nextClause()}},void 0===(n="function"==typeof(i=function(){return R})?i.call(t,r,t,e):i)||(e.exports=n)}()}},t={};function r(i){var n=t[i];if(void 0!==n)return n.exports;var s=t[i]={exports:{}};return e[i](s,s.exports,r),s.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};(()=>{"use strict";r.r(i),r.d(i,{default:()=>s});var e=r(1336),t=r.n(e),n=function(){return n=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},n.apply(this,arguments)};const s={init:function(e){e(t())},createIndex:function(e){return t()((function(){var r=this;this.ref("id"),this.field("text"),t().multiLanguage&&t().languages&&this.use(t().multiLanguage.apply(t(),t().languages)),this.metadataWhitelist=["position"],this.pipeline.remove(t().stemmer),this.searchPipeline.remove(t().stemmer),e.forEach((function(e){r.add(n({id:e[0]},e[1]))}))}))},loadIndex:function(e){return t().multiLanguage&&t().languages&&t().multiLanguage.apply(t(),t().languages),t().Index.load(e)},query:function(e,r){return e.query((function(e){e.term(t().tokenizer(r),{boost:100,usePipeline:!0}),e.term(t().tokenizer(r),{boost:10,usePipeline:!1,wildcard:t().Query.wildcard.LEADING|t().Query.wildcard.TRAILING}),e.term(t().tokenizer(r),{boost:1,editDistance:1})}))}}})(),window.__DOCS_LUNR__=i})();
\ No newline at end of file
+(()=>{var e={336:(e,t,r)=>{var i,n;!function(){var s,o,a,u,l,c,h,d,f,p,y,m,g,x,v,w,Q,k,S,b,E,L,P,T,O,I,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(s=this,function(e){s.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i<r.length;i++){var n=r[i],s=e[n];if(Array.isArray(s))t[n]=s.slice();else{if("string"!=typeof s&&"number"!=typeof s&&"boolean"!=typeof s)throw new TypeError("clone is not deep and does not support nested objects");t[n]=s}}return t},R.FieldRef=function(e,t,r){this.docRef=e,this.fieldName=t,this._stringValue=r},R.FieldRef.joiner="/",R.FieldRef.fromString=function(e){var t=e.indexOf(R.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var r=e.slice(0,t),i=e.slice(t+1);return new R.FieldRef(i,r,e)},R.FieldRef.prototype.toString=function(){return null==this._stringValue&&(this._stringValue=this.fieldName+R.FieldRef.joiner+this.docRef),this._stringValue},R.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var t=0;t<this.length;t++)this.elements[e[t]]=!0}else this.length=0},R.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},R.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},R.Set.prototype.contains=function(e){return!!this.elements[e]},R.Set.prototype.intersect=function(e){var t,r,i,n=[];if(e===R.Set.complete)return this;if(e===R.Set.empty)return e;this.length<e.length?(t=this,r=e):(t=e,r=this),i=Object.keys(t.elements);for(var s=0;s<i.length;s++){var o=i[s];o in r.elements&&n.push(o)}return new R.Set(n)},R.Set.prototype.union=function(e){return e===R.Set.complete?R.Set.complete:e===R.Set.empty?this:new R.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},R.idf=function(e,t){var r=0;for(var i in e)"_index"!=i&&(r+=Object.keys(e[i]).length);var n=(t-r+.5)/(r+.5);return Math.log(1+Math.abs(n))},R.Token=function(e,t){this.str=e||"",this.metadata=t||{}},R.Token.prototype.toString=function(){return this.str},R.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},R.Token.prototype.clone=function(e){return e=e||function(e){return e},new R.Token(e(this.str,this.metadata),this.metadata)},R.tokenizer=function(e,t){if(null==e||null==e)return[];if(Array.isArray(e))return e.map((function(e){return new R.Token(R.utils.asString(e).toLowerCase(),R.utils.clone(t))}));for(var r=e.toString().toLowerCase(),i=r.length,n=[],s=0,o=0;s<=i;s++){var a=s-o;if(r.charAt(s).match(R.tokenizer.separator)||s==i){if(a>0){var u=R.utils.clone(t)||{};u.position=[o,a],u.index=n.length,n.push(new R.Token(r.slice(o,s),u))}o=s+1}}return n},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var r=R.Pipeline.registeredFunctions[e];if(!r)throw new Error("Cannot load unregistered function: "+e);t.add(r)})),t},R.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");r+=1,this._stack.splice(r,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");this._stack.splice(r,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r<t;r++){for(var i=this._stack[r],n=[],s=0;s<e.length;s++){var o=i(e[s],s,e);if(null!=o&&""!==o)if(Array.isArray(o))for(var a=0;a<o.length;a++)n.push(o[a]);else n.push(o)}e=n}return e},R.Pipeline.prototype.runString=function(e,t){var r=new R.Token(e,t);return this.run([r]).map((function(e){return e.toString()}))},R.Pipeline.prototype.reset=function(){this._stack=[]},R.Pipeline.prototype.toJSON=function(){return this._stack.map((function(e){return R.Pipeline.warnIfFunctionNotRegistered(e),e.label}))},R.Vector=function(e){this._magnitude=0,this.elements=e||[]},R.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,r=this.elements.length/2,i=r-t,n=Math.floor(i/2),s=this.elements[2*n];i>1&&(s<e&&(t=n),s>e&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e||s>e?2*n:s<e?2*(n+1):void 0},R.Vector.prototype.insert=function(e,t){this.upsert(e,t,(function(){throw"duplicate index"}))},R.Vector.prototype.upsert=function(e,t,r){this._magnitude=0;var i=this.positionForIndex(e);this.elements[i]==e?this.elements[i+1]=r(this.elements[i+1],t):this.elements.splice(i,0,e,t)},R.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,r=1;r<t;r+=2){var i=this.elements[r];e+=i*i}return this._magnitude=Math.sqrt(e)},R.Vector.prototype.dot=function(e){for(var t=0,r=this.elements,i=e.elements,n=r.length,s=i.length,o=0,a=0,u=0,l=0;u<n&&l<s;)(o=r[u])<(a=i[l])?u+=2:o>a?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t<this.elements.length;t+=2,r++)e[r]=this.elements[t];return e},R.Vector.prototype.toJSON=function(){return this.elements},R.stemmer=(o={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"},a={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},u="[aeiouy]",l="[^aeiou][^aeiouy]*",c=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),h=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),d=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"),f=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"),p=/^(.+?)(ss|i)es$/,y=/^(.+?)([^s])s$/,m=/^(.+?)eed$/,g=/^(.+?)(ed|ing)$/,x=/.$/,v=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),Q=new RegExp("^"+l+u+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,S=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,b=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,E=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,L=/^(.+?)(s|t)(ion)$/,P=/^(.+?)e$/,T=/ll$/,O=new RegExp("^"+l+u+"[^aeiouwxy]$"),I=function(e){var t,r,i,n,s,u,l;if(e.length<3)return e;if("y"==(i=e.substr(0,1))&&(e=i.toUpperCase()+e.substr(1)),s=y,(n=p).test(e)?e=e.replace(n,"$1$2"):s.test(e)&&(e=e.replace(s,"$1$2")),s=g,(n=m).test(e)){var I=n.exec(e);(n=c).test(I[1])&&(n=x,e=e.replace(n,""))}else s.test(e)&&(t=(I=s.exec(e))[1],(s=f).test(t)&&(u=w,l=Q,(s=v).test(e=t)?e+="e":u.test(e)?(n=x,e=e.replace(n,"")):l.test(e)&&(e+="e")));return(n=k).test(e)&&(e=(t=(I=n.exec(e))[1])+"i"),(n=S).test(e)&&(t=(I=n.exec(e))[1],r=I[2],(n=c).test(t)&&(e=t+o[r])),(n=b).test(e)&&(t=(I=n.exec(e))[1],r=I[2],(n=c).test(t)&&(e=t+a[r])),s=L,(n=E).test(e)?(t=(I=n.exec(e))[1],(n=h).test(t)&&(e=t)):s.test(e)&&(t=(I=s.exec(e))[1]+I[2],(s=h).test(t)&&(e=t)),(n=P).test(e)&&(t=(I=n.exec(e))[1],s=d,u=O,((n=h).test(t)||s.test(t)&&!u.test(t))&&(e=t)),s=h,(n=T).test(e)&&s.test(e)&&(n=x,e=e.replace(n,"")),"y"==i&&(e=i.toLowerCase()+e.substr(1)),e},function(e){return e.update(I)}),R.Pipeline.registerFunction(R.stemmer,"stemmer"),R.generateStopWordFilter=function(e){var t=e.reduce((function(e,t){return e[t]=t,e}),{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},R.stopWordFilter=R.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"]),R.Pipeline.registerFunction(R.stopWordFilter,"stopWordFilter"),R.trimmer=function(e){return e.update((function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")}))},R.Pipeline.registerFunction(R.trimmer,"trimmer"),R.TokenSet=function(){this.final=!1,this.edges={},this.id=R.TokenSet._nextId,R.TokenSet._nextId+=1},R.TokenSet._nextId=1,R.TokenSet.fromArray=function(e){for(var t=new R.TokenSet.Builder,r=0,i=e.length;r<i;r++)t.insert(e[r]);return t.finish(),t.root},R.TokenSet.fromClause=function(e){return"editDistance"in e?R.TokenSet.fromFuzzyString(e.term,e.editDistance):R.TokenSet.fromString(e.term)},R.TokenSet.fromFuzzyString=function(e,t){for(var r=new R.TokenSet,i=[{node:r,editsRemaining:t,str:e}];i.length;){var n=i.pop();if(n.str.length>0){var s,o=n.str.charAt(0);o in n.node.edges?s=n.node.edges[o]:(s=new R.TokenSet,n.node.edges[o]=s),1==n.str.length&&(s.final=!0),i.push({node:s,editsRemaining:n.editsRemaining,str:n.str.slice(1)})}if(0!=n.editsRemaining){if("*"in n.node.edges)var a=n.node.edges["*"];else a=new R.TokenSet,n.node.edges["*"]=a;if(0==n.str.length&&(a.final=!0),i.push({node:a,editsRemaining:n.editsRemaining-1,str:n.str}),n.str.length>1&&i.push({node:n.node,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)}),1==n.str.length&&(n.node.final=!0),n.str.length>=1){if("*"in n.node.edges)var u=n.node.edges["*"];else u=new R.TokenSet,n.node.edges["*"]=u;1==n.str.length&&(u.final=!0),i.push({node:u,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)})}if(n.str.length>1){var l,c=n.str.charAt(0),h=n.str.charAt(1);h in n.node.edges?l=n.node.edges[h]:(l=new R.TokenSet,n.node.edges[h]=l),1==n.str.length&&(l.final=!0),i.push({node:l,editsRemaining:n.editsRemaining-1,str:c+n.str.slice(2)})}}}return r},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,r=t,i=0,n=e.length;i<n;i++){var s=e[i],o=i==n-1;if("*"==s)t.edges[s]=t,t.final=o;else{var a=new R.TokenSet;a.final=o,t.edges[s]=a,t=a}}return r},R.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var r=t.pop(),i=Object.keys(r.node.edges),n=i.length;r.node.final&&(r.prefix.charAt(0),e.push(r.prefix));for(var s=0;s<n;s++){var o=i[s];t.push({prefix:r.prefix.concat(o),node:r.node.edges[o]})}}return e},R.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),r=t.length,i=0;i<r;i++){var n=t[i];e=e+n+this.edges[n].id}return e},R.TokenSet.prototype.intersect=function(e){for(var t=new R.TokenSet,r=void 0,i=[{qNode:e,output:t,node:this}];i.length;){r=i.pop();for(var n=Object.keys(r.qNode.edges),s=n.length,o=Object.keys(r.node.edges),a=o.length,u=0;u<s;u++)for(var l=n[u],c=0;c<a;c++){var h=o[c];if(h==l||"*"==l){var d=r.node.edges[h],f=r.qNode.edges[l],p=d.final&&f.final,y=void 0;h in r.output.edges?(y=r.output.edges[h]).final=y.final||p:((y=new R.TokenSet).final=p,r.output.edges[h]=y),i.push({qNode:f,output:y,node:d})}}}return t},R.TokenSet.Builder=function(){this.previousWord="",this.root=new R.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},R.TokenSet.Builder.prototype.insert=function(e){var t,r=0;if(e<this.previousWord)throw new Error("Out of order word insertion");for(var i=0;i<e.length&&i<this.previousWord.length&&e[i]==this.previousWord[i];i++)r++;for(this.minimize(r),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child,i=r;i<e.length;i++){var n=new R.TokenSet,s=e[i];t.edges[s]=n,this.uncheckedNodes.push({parent:t,char:s,child:n}),t=n}t.final=!0,this.previousWord=e},R.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},R.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=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()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),r=Object.create(null),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a<this.fields.length;a++)i[this.fields[a]]=new R.Vector;for(e.call(t,t),a=0;a<t.clauses.length;a++){var u,l=t.clauses[a],c=R.Set.empty;u=l.usePipeline?this.pipeline.runString(l.term,{fields:l.fields}):[l.term];for(var h=0;h<u.length;h++){var d=u[h];l.term=d;var f=R.TokenSet.fromClause(l),p=this.tokenSet.intersect(f).toArray();if(0===p.length&&l.presence===R.Query.presence.REQUIRED){for(var y=0;y<l.fields.length;y++)s[F=l.fields[y]]=R.Set.empty;break}for(var m=0;m<p.length;m++){var g=p[m],x=this.invertedIndex[g],v=x._index;for(y=0;y<l.fields.length;y++){var w=x[F=l.fields[y]],Q=Object.keys(w),k=g+"/"+F,S=new R.Set(Q);if(l.presence==R.Query.presence.REQUIRED&&(c=c.union(S),void 0===s[F]&&(s[F]=R.Set.complete)),l.presence!=R.Query.presence.PROHIBITED){if(i[F].upsert(v,l.boost,(function(e,t){return e+t})),!n[k]){for(var b=0;b<Q.length;b++){var E,L=Q[b],P=new R.FieldRef(L,F),T=w[L];void 0===(E=r[P])?r[P]=new R.MatchData(g,F,T):E.add(g,F,T)}n[k]=!0}}else void 0===o[F]&&(o[F]=R.Set.empty),o[F]=o[F].union(S)}}}if(l.presence===R.Query.presence.REQUIRED)for(y=0;y<l.fields.length;y++)s[F=l.fields[y]]=s[F].intersect(c)}var O=R.Set.complete,I=R.Set.empty;for(a=0;a<this.fields.length;a++){var F;s[F=this.fields[a]]&&(O=O.intersect(s[F])),o[F]&&(I=I.union(o[F]))}var _=Object.keys(r),N=[],j=Object.create(null);if(t.isNegated())for(_=Object.keys(this.fieldVectors),a=0;a<_.length;a++){P=_[a];var C=R.FieldRef.fromString(P);r[P]=new R.MatchData}for(a=0;a<_.length;a++){var D=(C=R.FieldRef.fromString(_[a])).docRef;if(O.contains(D)&&!I.contains(D)){var A,B=this.fieldVectors[C],z=i[C.fieldName].similarity(B);if(void 0!==(A=j[D]))A.score+=z,A.matchData.combine(r[C]);else{var V={ref:D,score:z,matchData:r[C]};j[D]=V,N.push(V)}}}return N.sort((function(e,t){return t.score-e.score}))},R.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map((function(e){return[e,this.invertedIndex[e]]}),this),t=Object.keys(this.fieldVectors).map((function(e){return[e,this.fieldVectors[e].toJSON()]}),this);return{version:R.version,fields:this.fields,fieldVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},R.Index.load=function(e){var t={},r={},i=e.fieldVectors,n=Object.create(null),s=e.invertedIndex,o=new R.TokenSet.Builder,a=R.Pipeline.load(e.pipeline);e.version!=R.version&&R.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+R.version+"' does not match serialized index '"+e.version+"'");for(var u=0;u<i.length;u++){var l=(h=i[u])[0],c=h[1];r[l]=new R.Vector(c)}for(u=0;u<s.length;u++){var h,d=(h=s[u])[0],f=h[1];o.insert(d),n[d]=f}return o.finish(),t.fields=e.fields,t.fieldVectors=r,t.invertedIndex=n,t.tokenSet=o.root,t.pipeline=a,new R.Index(t)},R.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=R.tokenizer,this.pipeline=new R.Pipeline,this.searchPipeline=new R.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},R.Builder.prototype.ref=function(e){this._ref=e},R.Builder.prototype.field=function(e,t){if(/\//.test(e))throw new RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=t||{}},R.Builder.prototype.b=function(e){this._b=e<0?0:e>1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=t||{},this.documentCount+=1;for(var n=0;n<i.length;n++){var s=i[n],o=this._fields[s].extractor,a=o?o(e):e[s],u=this.tokenizer(a,{fields:[s]}),l=this.pipeline.run(u),c=new R.FieldRef(r,s),h=Object.create(null);this.fieldTermFrequencies[c]=h,this.fieldLengths[c]=0,this.fieldLengths[c]+=l.length;for(var d=0;d<l.length;d++){var f=l[d];if(null==h[f]&&(h[f]=0),h[f]+=1,null==this.invertedIndex[f]){var p=Object.create(null);p._index=this.termIndex,this.termIndex+=1;for(var y=0;y<i.length;y++)p[i[y]]=Object.create(null);this.invertedIndex[f]=p}null==this.invertedIndex[f][s][r]&&(this.invertedIndex[f][s][r]=Object.create(null));for(var m=0;m<this.metadataWhitelist.length;m++){var g=this.metadataWhitelist[m],x=f.metadata[g];null==this.invertedIndex[f][s][r][g]&&(this.invertedIndex[f][s][r][g]=[]),this.invertedIndex[f][s][r][g].push(x)}}}},R.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),t=e.length,r={},i={},n=0;n<t;n++){var s=R.FieldRef.fromString(e[n]),o=s.fieldName;i[o]||(i[o]=0),i[o]+=1,r[o]||(r[o]=0),r[o]+=this.fieldLengths[s]}var a=Object.keys(this._fields);for(n=0;n<a.length;n++){var u=a[n];r[u]=r[u]/i[u]}this.averageFieldLength=r},R.Builder.prototype.createFieldVectors=function(){for(var e={},t=Object.keys(this.fieldTermFrequencies),r=t.length,i=Object.create(null),n=0;n<r;n++){for(var s=R.FieldRef.fromString(t[n]),o=s.fieldName,a=this.fieldLengths[s],u=new R.Vector,l=this.fieldTermFrequencies[s],c=Object.keys(l),h=c.length,d=this._fields[o].boost||1,f=this._documents[s.docRef].boost||1,p=0;p<h;p++){var y,m,g,x=c[p],v=l[x],w=this.invertedIndex[x]._index;void 0===i[x]?(y=R.idf(this.invertedIndex[x],this.documentCount),i[x]=y):y=i[x],m=y*((this._k1+1)*v)/(this._k1*(1-this._b+this._b*(a/this.averageFieldLength[o]))+v),m*=d,m*=f,g=Math.round(1e3*m)/1e3,u.insert(w,g)}e[s]=u}this.fieldVectors=e},R.Builder.prototype.createTokenSet=function(){this.tokenSet=R.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},R.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new R.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},R.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},R.MatchData=function(e,t,r){for(var i=Object.create(null),n=Object.keys(r||{}),s=0;s<n.length;s++){var o=n[s];i[o]=r[o].slice()}this.metadata=Object.create(null),void 0!==e&&(this.metadata[e]=Object.create(null),this.metadata[e][t]=i)},R.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),r=0;r<t.length;r++){var i=t[r],n=Object.keys(e.metadata[i]);null==this.metadata[i]&&(this.metadata[i]=Object.create(null));for(var s=0;s<n.length;s++){var o=n[s],a=Object.keys(e.metadata[i][o]);null==this.metadata[i][o]&&(this.metadata[i][o]=Object.create(null));for(var u=0;u<a.length;u++){var l=a[u];null==this.metadata[i][o][l]?this.metadata[i][o][l]=e.metadata[i][o][l]:this.metadata[i][o][l]=this.metadata[i][o][l].concat(e.metadata[i][o][l])}}}},R.MatchData.prototype.add=function(e,t,r){if(!(e in this.metadata))return this.metadata[e]=Object.create(null),void(this.metadata[e][t]=r);if(t in this.metadata[e])for(var i=Object.keys(r),n=0;n<i.length;n++){var s=i[n];s in this.metadata[e][t]?this.metadata[e][t][s]=this.metadata[e][t][s].concat(r[s]):this.metadata[e][t][s]=r[s]}else this.metadata[e][t]=r},R.Query=function(e){this.clauses=[],this.allFields=e},R.Query.wildcard=new String("*"),R.Query.wildcard.NONE=0,R.Query.wildcard.LEADING=1,R.Query.wildcard.TRAILING=2,R.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},R.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=R.Query.wildcard.NONE),e.wildcard&R.Query.wildcard.LEADING&&e.term.charAt(0)!=R.Query.wildcard&&(e.term="*"+e.term),e.wildcard&R.Query.wildcard.TRAILING&&e.term.slice(-1)!=R.Query.wildcard&&(e.term=e.term+"*"),"presence"in e||(e.presence=R.Query.presence.OPTIONAL),this.clauses.push(e),this},R.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=R.Query.presence.PROHIBITED)return!1;return!0},R.Query.prototype.term=function(e,t){if(Array.isArray(e))return e.forEach((function(e){this.term(e,R.utils.clone(t))}),this),this;var r=t||{};return r.term=e.toString(),this.clause(r),this},R.QueryParseError=function(e,t,r){this.name="QueryParseError",this.message=e,this.start=t,this.end=r},R.QueryParseError.prototype=new Error,R.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},R.QueryLexer.prototype.run=function(){for(var e=R.QueryLexer.lexText;e;)e=e(this)},R.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,r=this.pos,i=0;i<this.escapeCharPositions.length;i++)r=this.escapeCharPositions[i],e.push(this.str.slice(t,r)),t=r+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},R.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},R.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},R.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos<this.length},R.QueryLexer.EOS="EOS",R.QueryLexer.FIELD="FIELD",R.QueryLexer.TERM="TERM",R.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",R.QueryLexer.BOOST="BOOST",R.QueryLexer.PRESENCE="PRESENCE",R.QueryLexer.lexField=function(e){return e.backup(),e.emit(R.QueryLexer.FIELD),e.ignore(),R.QueryLexer.lexText},R.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(r+=" with value '"+t.str+"'"),new R.QueryParseError(r,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(r,t.start,t.end)}var i=e.peekLexeme();if(null==i)throw r="expecting term or field, found nothing",new R.QueryParseError(r,t.start,t.end);switch(i.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:throw r="expecting term or field, found '"+i.type+"'",new R.QueryParseError(r,i.start,i.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var r=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),i="unrecognised field '"+t.str+"', possible fields: "+r;throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.fields=[t.str];var n=e.peekLexeme();if(null==n)throw i="expecting term, found nothing",new R.QueryParseError(i,t.start,t.end);if(n.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;throw i="expecting term, found '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(null!=r)switch(r.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new R.QueryParseError(i,r.start,r.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.editDistance=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:throw i="Unexpected lexeme type '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="boost must be numeric";throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.boost=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:throw i="Unexpected lexeme type '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}else e.nextClause()}},void 0===(n="function"==typeof(i=function(){return R})?i.call(t,r,t,e):i)||(e.exports=n)}()}},t={};function r(i){var n=t[i];if(void 0!==n)return n.exports;var s=t[i]={exports:{}};return e[i](s,s.exports,r),s.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};(()=>{"use strict";r.r(i),r.d(i,{default:()=>s});var e=r(336),t=r.n(e),n=function(){return n=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},n.apply(this,arguments)};const s={init:function(e){e(t())},createIndex:function(e){return t()((function(){var r=this;this.ref("id"),this.field("text"),t().multiLanguage&&t().languages&&this.use(t().multiLanguage.apply(t(),t().languages)),this.metadataWhitelist=["position"],this.pipeline.remove(t().stemmer),this.searchPipeline.remove(t().stemmer),e.forEach((function(e){r.add(n({id:e[0]},e[1]))}))}))},loadIndex:function(e){return t().multiLanguage&&t().languages&&t().multiLanguage.apply(t(),t().languages),t().Index.load(e)},query:function(e,r){return e.query((function(e){e.term(t().tokenizer(r),{boost:100,usePipeline:!0}),e.term(t().tokenizer(r),{boost:10,usePipeline:!1,wildcard:t().Query.wildcard.LEADING|t().Query.wildcard.TRAILING}),e.term(t().tokenizer(r),{boost:1,editDistance:1})}))}}})(),window.__DOCS_LUNR__=i})();
\ No newline at end of file
diff --git a/resources/js/retype.js b/resources/js/retype.js
index 0e43536..af60438 100644
--- a/resources/js/retype.js
+++ b/resources/js/retype.js
@@ -1,7 +1,7 @@
-/*! Retype v2.4.0 | retype.com | Copyright 2023. Object.NET, Inc. All rights reserved. */
+/*! Retype v3.0.1 | retype.com | Copyright 2023. Object.NET, Inc. All rights reserved. */
 
 /*! For license information please see retype.js.LICENSE.txt */
-(()=>{var e={6184:(e,t,n)=>{"use strict";n.d(t,{ry:()=>he,nP:()=>fe,BL:()=>pe,Vn:()=>me}),function(){if(void 0===window.Reflect||void 0===window.customElements||window.customElements.polyfillWrapFlushCallback)return;const e=HTMLElement;window.HTMLElement=function(){return Reflect.construct(e,[],this.constructor)},HTMLElement.prototype=e.prototype,HTMLElement.prototype.constructor=HTMLElement,Object.setPrototypeOf(HTMLElement,e)}(),function(e){function t(e,t,n){throw new e("Failed to execute 'requestSubmit' on 'HTMLFormElement': "+t+".",n)}"function"!=typeof e.requestSubmit&&(e.requestSubmit=function(e){e?(function(e,n){e instanceof HTMLElement||t(TypeError,"parameter 1 is not of type 'HTMLElement'"),"submit"==e.type||t(TypeError,"The specified element is not a submit button"),e.form==n||t(DOMException,"The specified element is not owned by this form element","NotFoundError")}(e,this),e.click()):((e=document.createElement("input")).type="submit",e.hidden=!0,this.appendChild(e),e.click(),this.removeChild(e))})}(HTMLFormElement.prototype);const r=new WeakMap;function o(e){const t=function(e){const t=e instanceof Element?e:e instanceof Node?e.parentElement:null,n=t?t.closest("input, button"):null;return"submit"==(null==n?void 0:n.type)?n:null}(e.target);t&&t.form&&r.set(t.form,t)}var i,s,a,l,c,u;!function(){if("submitter"in Event.prototype)return;let e;if("SubmitEvent"in window&&/Apple Computer/.test(navigator.vendor))e=window.SubmitEvent.prototype;else{if("SubmitEvent"in window)return;e=window.Event.prototype}addEventListener("click",o,!0),Object.defineProperty(e,"submitter",{get(){if("submit"==this.type&&this.target instanceof HTMLFormElement)return r.get(this.target)}})}(),function(e){e.eager="eager",e.lazy="lazy"}(i||(i={}));class d extends HTMLElement{constructor(){super(),this.loaded=Promise.resolve(),this.delegate=new d.delegateConstructor(this)}static get observedAttributes(){return["disabled","loading","src"]}connectedCallback(){this.delegate.connect()}disconnectedCallback(){this.delegate.disconnect()}reload(){const{src:e}=this;this.src=null,this.src=e}attributeChangedCallback(e){"loading"==e?this.delegate.loadingStyleChanged():"src"==e?this.delegate.sourceURLChanged():this.delegate.disabledChanged()}get src(){return this.getAttribute("src")}set src(e){e?this.setAttribute("src",e):this.removeAttribute("src")}get loading(){return"lazy"===(this.getAttribute("loading")||"").toLowerCase()?i.lazy:i.eager}set loading(e){e?this.setAttribute("loading",e):this.removeAttribute("loading")}get disabled(){return this.hasAttribute("disabled")}set disabled(e){e?this.setAttribute("disabled",""):this.removeAttribute("disabled")}get autoscroll(){return this.hasAttribute("autoscroll")}set autoscroll(e){e?this.setAttribute("autoscroll",""):this.removeAttribute("autoscroll")}get complete(){return!this.delegate.isLoading}get isActive(){return this.ownerDocument===document&&!this.isPreview}get isPreview(){var e,t;return null===(t=null===(e=this.ownerDocument)||void 0===e?void 0:e.documentElement)||void 0===t?void 0:t.hasAttribute("data-turbo-preview")}}function f(e){return new URL(e.toString(),document.baseURI)}function h(e){let t;return e.hash?e.hash.slice(1):(t=e.href.match(/#(.*)$/))?t[1]:void 0}function p(e,t){return f((null==t?void 0:t.getAttribute("formaction"))||e.getAttribute("action")||e.action)}function m(e,t){return function(e,t){const n=function(e){return(t=e.origin+e.pathname).endsWith("/")?t:t+"/";var t}(t);return e.href===f(n).href||e.href.startsWith(n)}(e,t)&&!!(n=e,(function(e){return function(e){return e.pathname.split("/").slice(1)}(e).slice(-1)[0]}(n).match(/\.[^.]*$/)||[])[0]||"").match(/^(?:|\.(?:htm|html|xhtml))$/);var n}function v(e){const t=h(e);return null!=t?e.href.slice(0,-(t.length+1)):e.href}function g(e){return v(e)}class b{constructor(e){this.response=e}get succeeded(){return this.response.ok}get failed(){return!this.succeeded}get clientError(){return this.statusCode>=400&&this.statusCode<=499}get serverError(){return this.statusCode>=500&&this.statusCode<=599}get redirected(){return this.response.redirected}get location(){return f(this.response.url)}get isHTML(){return this.contentType&&this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/)}get statusCode(){return this.response.status}get contentType(){return this.header("Content-Type")}get responseText(){return this.response.clone().text()}get responseHTML(){return this.isHTML?this.response.clone().text():Promise.resolve(void 0)}header(e){return this.response.headers.get(e)}}function y(e,{target:t,cancelable:n,detail:r}={}){const o=new CustomEvent(e,{cancelable:n,bubbles:!0,detail:r});return t&&t.isConnected?t.dispatchEvent(o):document.documentElement.dispatchEvent(o),o}function w(){return new Promise((e=>requestAnimationFrame((()=>e()))))}function x(e=""){return(new DOMParser).parseFromString(e,"text/html")}function k(e,...t){const n=function(e,t){return e.reduce(((e,n,r)=>e+n+(null==t[r]?"":t[r])),"")}(e,t).replace(/^\n/,"").split("\n"),r=n[0].match(/^\s+/),o=r?r[0].length:0;return n.map((e=>e.slice(o))).join("\n")}function S(){return Array.apply(null,{length:36}).map(((e,t)=>8==t||13==t||18==t||23==t?"-":14==t?"4":19==t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16))).join("")}function E(e,...t){for(const n of t.map((t=>null==t?void 0:t.getAttribute(e))))if("string"==typeof n)return n;return null}function C(...e){for(const t of e)"turbo-frame"==t.localName&&t.setAttribute("busy",""),t.setAttribute("aria-busy","true")}function _(...e){for(const t of e)"turbo-frame"==t.localName&&t.removeAttribute("busy"),t.removeAttribute("aria-busy")}!function(e){e[e.get=0]="get",e[e.post=1]="post",e[e.put=2]="put",e[e.patch=3]="patch",e[e.delete=4]="delete"}(s||(s={}));class T{constructor(e,t,n,r=new URLSearchParams,o=null){this.abortController=new AbortController,this.resolveRequestPromise=e=>{},this.delegate=e,this.method=t,this.headers=this.defaultHeaders,this.body=r,this.url=n,this.target=o}get location(){return this.url}get params(){return this.url.searchParams}get entries(){return this.body?Array.from(this.body.entries()):[]}cancel(){this.abortController.abort()}async perform(){var e,t;const{fetchOptions:n}=this;null===(t=(e=this.delegate).prepareHeadersForRequest)||void 0===t||t.call(e,this.headers,this),await this.allowRequestToBeIntercepted(n);try{this.delegate.requestStarted(this);const e=await fetch(this.url.href,n);return await this.receive(e)}catch(e){if("AbortError"!==e.name)throw this.delegate.requestErrored(this,e),e}finally{this.delegate.requestFinished(this)}}async receive(e){const t=new b(e);return y("turbo:before-fetch-response",{cancelable:!0,detail:{fetchResponse:t},target:this.target}).defaultPrevented?this.delegate.requestPreventedHandlingResponse(this,t):t.succeeded?this.delegate.requestSucceededWithResponse(this,t):this.delegate.requestFailedWithResponse(this,t),t}get fetchOptions(){var e;return{method:s[this.method].toUpperCase(),credentials:"same-origin",headers:this.headers,redirect:"follow",body:this.isIdempotent?null:this.body,signal:this.abortSignal,referrer:null===(e=this.delegate.referrer)||void 0===e?void 0:e.href}}get defaultHeaders(){return{Accept:"text/html, application/xhtml+xml"}}get isIdempotent(){return this.method==s.get}get abortSignal(){return this.abortController.signal}async allowRequestToBeIntercepted(e){const t=new Promise((e=>this.resolveRequestPromise=e));y("turbo:before-fetch-request",{cancelable:!0,detail:{fetchOptions:e,url:this.url,resume:this.resolveRequestPromise},target:this.target}).defaultPrevented&&await t}}class O{constructor(e,t){this.started=!1,this.intersect=e=>{const t=e.slice(-1)[0];(null==t?void 0:t.isIntersecting)&&this.delegate.elementAppearedInViewport(this.element)},this.delegate=e,this.element=t,this.intersectionObserver=new IntersectionObserver(this.intersect)}start(){this.started||(this.started=!0,this.intersectionObserver.observe(this.element))}stop(){this.started&&(this.started=!1,this.intersectionObserver.unobserve(this.element))}}class L{constructor(e){this.templateElement=document.createElement("template"),this.templateElement.innerHTML=e}static wrap(e){return"string"==typeof e?new this(e):e}get fragment(){const e=document.createDocumentFragment();for(const t of this.foreignElements)e.appendChild(document.importNode(t,!0));return e}get foreignElements(){return this.templateChildren.reduce(((e,t)=>"turbo-stream"==t.tagName.toLowerCase()?[...e,t]:e),[])}get templateChildren(){return Array.from(this.templateElement.content.children)}}L.contentType="text/vnd.turbo-stream.html",function(e){e[e.initialized=0]="initialized",e[e.requesting=1]="requesting",e[e.waiting=2]="waiting",e[e.receiving=3]="receiving",e[e.stopping=4]="stopping",e[e.stopped=5]="stopped"}(a||(a={})),function(e){e.urlEncoded="application/x-www-form-urlencoded",e.multipart="multipart/form-data",e.plain="text/plain"}(l||(l={}));class R{constructor(e,t,n,r=!1){this.state=a.initialized,this.delegate=e,this.formElement=t,this.submitter=n,this.formData=function(e,t){const n=new FormData(e),r=null==t?void 0:t.getAttribute("name"),o=null==t?void 0:t.getAttribute("value");return r&&null!=o&&n.get(r)!=o&&n.append(r,o),n}(t,n),this.location=f(this.action),this.method==s.get&&function(e,t){const n=new URLSearchParams;for(const[e,r]of t)r instanceof File||n.append(e,r);e.search=n.toString()}(this.location,[...this.body.entries()]),this.fetchRequest=new T(this,this.method,this.location,this.body,this.formElement),this.mustRedirect=r}static confirmMethod(e,t){return confirm(e)}get method(){var e;return function(e){switch(e.toLowerCase()){case"get":return s.get;case"post":return s.post;case"put":return s.put;case"patch":return s.patch;case"delete":return s.delete}}(((null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formmethod"))||this.formElement.getAttribute("method")||"").toLowerCase())||s.get}get action(){var e;const t="string"==typeof this.formElement.action?this.formElement.action:null;return(null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formaction"))||this.formElement.getAttribute("action")||t||""}get body(){return this.enctype==l.urlEncoded||this.method==s.get?new URLSearchParams(this.stringFormData):this.formData}get enctype(){var e;return function(e){switch(e.toLowerCase()){case l.multipart:return l.multipart;case l.plain:return l.plain;default:return l.urlEncoded}}((null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formenctype"))||this.formElement.enctype)}get isIdempotent(){return this.fetchRequest.isIdempotent}get stringFormData(){return[...this.formData].reduce(((e,[t,n])=>e.concat("string"==typeof n?[[t,n]]:[])),[])}get confirmationMessage(){return this.formElement.getAttribute("data-turbo-confirm")}get needsConfirmation(){return null!==this.confirmationMessage}async start(){const{initialized:e,requesting:t}=a;if(!this.needsConfirmation||R.confirmMethod(this.confirmationMessage,this.formElement))return this.state==e?(this.state=t,this.fetchRequest.perform()):void 0}stop(){const{stopping:e,stopped:t}=a;if(this.state!=e&&this.state!=t)return this.state=e,this.fetchRequest.cancel(),!0}prepareHeadersForRequest(e,t){if(!t.isIdempotent){const t=function(e){if(null!=e){const t=(document.cookie?document.cookie.split("; "):[]).find((t=>t.startsWith(e)));if(t){const e=t.split("=").slice(1).join("=");return e?decodeURIComponent(e):void 0}}}(D("csrf-param"))||D("csrf-token");t&&(e["X-CSRF-Token"]=t),e.Accept=[L.contentType,e.Accept].join(", ")}}requestStarted(e){var t;this.state=a.waiting,null===(t=this.submitter)||void 0===t||t.setAttribute("disabled",""),y("turbo:submit-start",{target:this.formElement,detail:{formSubmission:this}}),this.delegate.formSubmissionStarted(this)}requestPreventedHandlingResponse(e,t){this.result={success:t.succeeded,fetchResponse:t}}requestSucceededWithResponse(e,t){if(t.clientError||t.serverError)this.delegate.formSubmissionFailedWithResponse(this,t);else if(this.requestMustRedirect(e)&&function(e){return 200==e.statusCode&&!e.redirected}(t)){const e=new Error("Form responses must redirect to another location");this.delegate.formSubmissionErrored(this,e)}else this.state=a.receiving,this.result={success:!0,fetchResponse:t},this.delegate.formSubmissionSucceededWithResponse(this,t)}requestFailedWithResponse(e,t){this.result={success:!1,fetchResponse:t},this.delegate.formSubmissionFailedWithResponse(this,t)}requestErrored(e,t){this.result={success:!1,error:t},this.delegate.formSubmissionErrored(this,t)}requestFinished(e){var t;this.state=a.stopped,null===(t=this.submitter)||void 0===t||t.removeAttribute("disabled"),y("turbo:submit-end",{target:this.formElement,detail:Object.assign({formSubmission:this},this.result)}),this.delegate.formSubmissionFinished(this)}requestMustRedirect(e){return!e.isIdempotent&&this.mustRedirect}}function D(e){const t=document.querySelector(`meta[name="${e}"]`);return t&&t.content}class A{constructor(e){this.element=e}get children(){return[...this.element.children]}hasAnchor(e){return null!=this.getElementForAnchor(e)}getElementForAnchor(e){return e?this.element.querySelector(`[id='${e}'], a[name='${e}']`):null}get isConnected(){return this.element.isConnected}get firstAutofocusableElement(){return this.element.querySelector("[autofocus]")}get permanentElements(){return[...this.element.querySelectorAll("[id][data-turbo-permanent]")]}getPermanentElementById(e){return this.element.querySelector(`#${e}[data-turbo-permanent]`)}getPermanentElementMapForSnapshot(e){const t={};for(const n of this.permanentElements){const{id:r}=n,o=e.getPermanentElementById(r);o&&(t[r]=[n,o])}return t}}class I{constructor(e,t){this.submitBubbled=e=>{const t=e.target;if(!e.defaultPrevented&&t instanceof HTMLFormElement&&t.closest("turbo-frame, html")==this.element){const n=e.submitter||void 0;"dialog"!=((null==n?void 0:n.getAttribute("formmethod"))||t.method)&&this.delegate.shouldInterceptFormSubmission(t,n)&&(e.preventDefault(),e.stopImmediatePropagation(),this.delegate.formSubmissionIntercepted(t,n))}},this.delegate=e,this.element=t}start(){this.element.addEventListener("submit",this.submitBubbled)}stop(){this.element.removeEventListener("submit",this.submitBubbled)}}class M{constructor(e,t){this.resolveRenderPromise=e=>{},this.resolveInterceptionPromise=e=>{},this.delegate=e,this.element=t}scrollToAnchor(e){const t=this.snapshot.getElementForAnchor(e);t?(this.scrollToElement(t),this.focusElement(t)):this.scrollToPosition({x:0,y:0})}scrollToAnchorFromLocation(e){this.scrollToAnchor(h(e))}scrollToElement(e){e.scrollIntoView()}focusElement(e){e instanceof HTMLElement&&(e.hasAttribute("tabindex")?e.focus():(e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")))}scrollToPosition({x:e,y:t}){this.scrollRoot.scrollTo(e,t)}scrollToTop(){this.scrollToPosition({x:0,y:0})}get scrollRoot(){return window}async render(e){const{isPreview:t,shouldRender:n,newSnapshot:r}=e;if(n)try{this.renderPromise=new Promise((e=>this.resolveRenderPromise=e)),this.renderer=e,this.prepareToRenderSnapshot(e);const n=new Promise((e=>this.resolveInterceptionPromise=e));this.delegate.allowsImmediateRender(r,this.resolveInterceptionPromise)||await n,await this.renderSnapshot(e),this.delegate.viewRenderedSnapshot(r,t),this.finishRenderingSnapshot(e)}finally{delete this.renderer,this.resolveRenderPromise(void 0),delete this.renderPromise}else this.invalidate()}invalidate(){this.delegate.viewInvalidated()}prepareToRenderSnapshot(e){this.markAsPreview(e.isPreview),e.prepareToRender()}markAsPreview(e){e?this.element.setAttribute("data-turbo-preview",""):this.element.removeAttribute("data-turbo-preview")}async renderSnapshot(e){await e.render()}finishRenderingSnapshot(e){e.finishRendering()}}class F extends M{invalidate(){this.element.innerHTML=""}get snapshot(){return new A(this.element)}}class P{constructor(e,t){this.clickBubbled=e=>{this.respondsToEventTarget(e.target)?this.clickEvent=e:delete this.clickEvent},this.linkClicked=e=>{this.clickEvent&&this.respondsToEventTarget(e.target)&&e.target instanceof Element&&this.delegate.shouldInterceptLinkClick(e.target,e.detail.url)&&(this.clickEvent.preventDefault(),e.preventDefault(),this.delegate.linkClickIntercepted(e.target,e.detail.url)),delete this.clickEvent},this.willVisit=()=>{delete this.clickEvent},this.delegate=e,this.element=t}start(){this.element.addEventListener("click",this.clickBubbled),document.addEventListener("turbo:click",this.linkClicked),document.addEventListener("turbo:before-visit",this.willVisit)}stop(){this.element.removeEventListener("click",this.clickBubbled),document.removeEventListener("turbo:click",this.linkClicked),document.removeEventListener("turbo:before-visit",this.willVisit)}respondsToEventTarget(e){const t=e instanceof Element?e:e instanceof Node?e.parentElement:null;return t&&t.closest("turbo-frame, html")==this.element}}class H{constructor(e,t,n,r=!0){this.currentSnapshot=e,this.newSnapshot=t,this.isPreview=n,this.willRender=r,this.promise=new Promise(((e,t)=>this.resolvingFunctions={resolve:e,reject:t}))}get shouldRender(){return!0}prepareToRender(){}finishRendering(){this.resolvingFunctions&&(this.resolvingFunctions.resolve(),delete this.resolvingFunctions)}createScriptElement(e){if("false"==e.getAttribute("data-turbo-eval"))return e;{const t=document.createElement("script");return this.cspNonce&&(t.nonce=this.cspNonce),t.textContent=e.textContent,t.async=!1,function(e,t){for(const{name:n,value:r}of[...t.attributes])e.setAttribute(n,r)}(t,e),t}}preservingPermanentElements(e){(class{constructor(e){this.permanentElementMap=e}static preservingPermanentElements(e,t){const n=new this(e);n.enter(),t(),n.leave()}enter(){for(const e in this.permanentElementMap){const[,t]=this.permanentElementMap[e];this.replaceNewPermanentElementWithPlaceholder(t)}}leave(){for(const e in this.permanentElementMap){const[t]=this.permanentElementMap[e];this.replaceCurrentPermanentElementWithClone(t),this.replacePlaceholderWithPermanentElement(t)}}replaceNewPermanentElementWithPlaceholder(e){const t=function(e){const t=document.createElement("meta");return t.setAttribute("name","turbo-permanent-placeholder"),t.setAttribute("content",e.id),t}(e);e.replaceWith(t)}replaceCurrentPermanentElementWithClone(e){const t=e.cloneNode(!0);e.replaceWith(t)}replacePlaceholderWithPermanentElement(e){const t=this.getPlaceholderById(e.id);null==t||t.replaceWith(e)}getPlaceholderById(e){return this.placeholders.find((t=>t.content==e))}get placeholders(){return[...document.querySelectorAll("meta[name=turbo-permanent-placeholder][content]")]}}).preservingPermanentElements(this.permanentElementMap,e)}focusFirstAutofocusableElement(){const e=this.connectedSnapshot.firstAutofocusableElement;(function(e){return e&&"function"==typeof e.focus})(e)&&e.focus()}get connectedSnapshot(){return this.newSnapshot.isConnected?this.newSnapshot:this.currentSnapshot}get currentElement(){return this.currentSnapshot.element}get newElement(){return this.newSnapshot.element}get permanentElementMap(){return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)}get cspNonce(){var e;return null===(e=document.head.querySelector('meta[name="csp-nonce"]'))||void 0===e?void 0:e.getAttribute("content")}}class N extends H{get shouldRender(){return!0}async render(){await w(),this.preservingPermanentElements((()=>{this.loadFrameElement()})),this.scrollFrameIntoView(),await w(),this.focusFirstAutofocusableElement(),await w(),this.activateScriptElements()}loadFrameElement(){var e;const t=document.createRange();t.selectNodeContents(this.currentElement),t.deleteContents();const n=this.newElement,r=null===(e=n.ownerDocument)||void 0===e?void 0:e.createRange();r&&(r.selectNodeContents(n),this.currentElement.appendChild(r.extractContents()))}scrollFrameIntoView(){if(this.currentElement.autoscroll||this.newElement.autoscroll){const t=this.currentElement.firstElementChild,n=("end","end"==(e=this.currentElement.getAttribute("data-autoscroll-block"))||"start"==e||"center"==e||"nearest"==e?e:"end");if(t)return t.scrollIntoView({block:n}),!0}var e;return!1}activateScriptElements(){for(const e of this.newScriptElements){const t=this.createScriptElement(e);e.replaceWith(t)}}get newScriptElements(){return this.currentElement.querySelectorAll("script")}}class j{constructor(){this.hiding=!1,this.value=0,this.visible=!1,this.trickle=()=>{this.setValue(this.value+Math.random()/100)},this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement(),this.installStylesheetElement(),this.setValue(0)}static get defaultCSS(){return k`
+(()=>{var e={184:(e,t,n)=>{"use strict";n.d(t,{BL:()=>_e,Vn:()=>Te,nP:()=>xe,ry:()=>Ce}),function(){if(void 0===window.Reflect||void 0===window.customElements||window.customElements.polyfillWrapFlushCallback)return;const e=HTMLElement;window.HTMLElement=function(){return Reflect.construct(e,[],this.constructor)},HTMLElement.prototype=e.prototype,HTMLElement.prototype.constructor=HTMLElement,Object.setPrototypeOf(HTMLElement,e)}(),function(e){function t(e,t,n){throw new e("Failed to execute 'requestSubmit' on 'HTMLFormElement': "+t+".",n)}"function"!=typeof e.requestSubmit&&(e.requestSubmit=function(e){e?(function(e,n){e instanceof HTMLElement||t(TypeError,"parameter 1 is not of type 'HTMLElement'"),"submit"==e.type||t(TypeError,"The specified element is not a submit button"),e.form==n||t(DOMException,"The specified element is not owned by this form element","NotFoundError")}(e,this),e.click()):((e=document.createElement("input")).type="submit",e.hidden=!0,this.appendChild(e),e.click(),this.removeChild(e))})}(HTMLFormElement.prototype);const r=new WeakMap;function o(e){const t=function(e){const t=e instanceof Element?e:e instanceof Node?e.parentElement:null,n=t?t.closest("input, button"):null;return"submit"==(null==n?void 0:n.type)?n:null}(e.target);t&&t.form&&r.set(t.form,t)}var i,s,a,l,c,u;!function(){if("submitter"in Event.prototype)return;let e=window.Event.prototype;if("SubmitEvent"in window&&/Apple Computer/.test(navigator.vendor))e=window.SubmitEvent.prototype;else if("SubmitEvent"in window)return;addEventListener("click",o,!0),Object.defineProperty(e,"submitter",{get(){if("submit"==this.type&&this.target instanceof HTMLFormElement)return r.get(this.target)}})}(),function(e){e.eager="eager",e.lazy="lazy"}(i||(i={}));class d extends HTMLElement{static get observedAttributes(){return["disabled","complete","loading","src"]}constructor(){super(),this.loaded=Promise.resolve(),this.delegate=new d.delegateConstructor(this)}connectedCallback(){this.delegate.connect()}disconnectedCallback(){this.delegate.disconnect()}reload(){return this.delegate.sourceURLReloaded()}attributeChangedCallback(e){"loading"==e?this.delegate.loadingStyleChanged():"complete"==e?this.delegate.completeChanged():"src"==e?this.delegate.sourceURLChanged():this.delegate.disabledChanged()}get src(){return this.getAttribute("src")}set src(e){e?this.setAttribute("src",e):this.removeAttribute("src")}get loading(){return"lazy"===(this.getAttribute("loading")||"").toLowerCase()?i.lazy:i.eager}set loading(e){e?this.setAttribute("loading",e):this.removeAttribute("loading")}get disabled(){return this.hasAttribute("disabled")}set disabled(e){e?this.setAttribute("disabled",""):this.removeAttribute("disabled")}get autoscroll(){return this.hasAttribute("autoscroll")}set autoscroll(e){e?this.setAttribute("autoscroll",""):this.removeAttribute("autoscroll")}get complete(){return!this.delegate.isLoading}get isActive(){return this.ownerDocument===document&&!this.isPreview}get isPreview(){var e,t;return null===(t=null===(e=this.ownerDocument)||void 0===e?void 0:e.documentElement)||void 0===t?void 0:t.hasAttribute("data-turbo-preview")}}function h(e){return new URL(e.toString(),document.baseURI)}function p(e){let t;return e.hash?e.hash.slice(1):(t=e.href.match(/#(.*)$/))?t[1]:void 0}function f(e,t){return h((null==t?void 0:t.getAttribute("formaction"))||e.getAttribute("action")||e.action)}function m(e,t){return function(e,t){const n=function(e){return(t=e.origin+e.pathname).endsWith("/")?t:t+"/";var t}(t);return e.href===h(n).href||e.href.startsWith(n)}(e,t)&&!!(n=e,(function(e){return function(e){return e.pathname.split("/").slice(1)}(e).slice(-1)[0]}(n).match(/\.[^.]*$/)||[])[0]||"").match(/^(?:|\.(?:htm|html|xhtml|php))$/);var n}function v(e){const t=p(e);return null!=t?e.href.slice(0,-(t.length+1)):e.href}function g(e){return v(e)}class b{constructor(e){this.response=e}get succeeded(){return this.response.ok}get failed(){return!this.succeeded}get clientError(){return this.statusCode>=400&&this.statusCode<=499}get serverError(){return this.statusCode>=500&&this.statusCode<=599}get redirected(){return this.response.redirected}get location(){return h(this.response.url)}get isHTML(){return this.contentType&&this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/)}get statusCode(){return this.response.status}get contentType(){return this.header("Content-Type")}get responseText(){return this.response.clone().text()}get responseHTML(){return this.isHTML?this.response.clone().text():Promise.resolve(void 0)}header(e){return this.response.headers.get(e)}}function y(e){if("false"==e.getAttribute("data-turbo-eval"))return e;{const t=document.createElement("script"),n=R("csp-nonce");return n&&(t.nonce=n),t.textContent=e.textContent,t.async=!1,function(e,t){for(const{name:n,value:r}of t.attributes)e.setAttribute(n,r)}(t,e),t}}function w(e,{target:t,cancelable:n,detail:r}={}){const o=new CustomEvent(e,{cancelable:n,bubbles:!0,composed:!0,detail:r});return t&&t.isConnected?t.dispatchEvent(o):document.documentElement.dispatchEvent(o),o}function S(){return new Promise((e=>requestAnimationFrame((()=>e()))))}function k(e=""){return(new DOMParser).parseFromString(e,"text/html")}function x(e,...t){const n=function(e,t){return e.reduce(((e,n,r)=>e+n+(null==t[r]?"":t[r])),"")}(e,t).replace(/^\n/,"").split("\n"),r=n[0].match(/^\s+/),o=r?r[0].length:0;return n.map((e=>e.slice(o))).join("\n")}function E(){return Array.from({length:36}).map(((e,t)=>8==t||13==t||18==t||23==t?"-":14==t?"4":19==t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16))).join("")}function C(e,...t){for(const n of t.map((t=>null==t?void 0:t.getAttribute(e))))if("string"==typeof n)return n;return null}function _(...e){for(const t of e)"turbo-frame"==t.localName&&t.setAttribute("busy",""),t.setAttribute("aria-busy","true")}function T(...e){for(const t of e)"turbo-frame"==t.localName&&t.removeAttribute("busy"),t.removeAttribute("aria-busy")}function L(e,t=2e3){return new Promise((n=>{const r=()=>{e.removeEventListener("error",r),e.removeEventListener("load",r),n()};e.addEventListener("load",r,{once:!0}),e.addEventListener("error",r,{once:!0}),setTimeout(n,t)}))}function A(e){switch(e){case"replace":return history.replaceState;case"advance":case"restore":return history.pushState}}function D(...e){const t=C("data-turbo-action",...e);return function(e){return"advance"==e||"replace"==e||"restore"==e}(t)?t:null}function O(e){return document.querySelector(`meta[name="${e}"]`)}function R(e){const t=O(e);return t&&t.content}function M(e,t){var n;if(e instanceof Element)return e.closest(t)||M(e.assignedSlot||(null===(n=e.getRootNode())||void 0===n?void 0:n.host),t)}!function(e){e[e.get=0]="get",e[e.post=1]="post",e[e.put=2]="put",e[e.patch=3]="patch",e[e.delete=4]="delete"}(s||(s={}));class I{constructor(e,t,n,r=new URLSearchParams,o=null){this.abortController=new AbortController,this.resolveRequestPromise=e=>{},this.delegate=e,this.method=t,this.headers=this.defaultHeaders,this.body=r,this.url=n,this.target=o}get location(){return this.url}get params(){return this.url.searchParams}get entries(){return this.body?Array.from(this.body.entries()):[]}cancel(){this.abortController.abort()}async perform(){const{fetchOptions:e}=this;this.delegate.prepareRequest(this),await this.allowRequestToBeIntercepted(e);try{this.delegate.requestStarted(this);const t=await fetch(this.url.href,e);return await this.receive(t)}catch(e){if("AbortError"!==e.name)throw this.willDelegateErrorHandling(e)&&this.delegate.requestErrored(this,e),e}finally{this.delegate.requestFinished(this)}}async receive(e){const t=new b(e);return w("turbo:before-fetch-response",{cancelable:!0,detail:{fetchResponse:t},target:this.target}).defaultPrevented?this.delegate.requestPreventedHandlingResponse(this,t):t.succeeded?this.delegate.requestSucceededWithResponse(this,t):this.delegate.requestFailedWithResponse(this,t),t}get fetchOptions(){var e;return{method:s[this.method].toUpperCase(),credentials:"same-origin",headers:this.headers,redirect:"follow",body:this.isSafe?null:this.body,signal:this.abortSignal,referrer:null===(e=this.delegate.referrer)||void 0===e?void 0:e.href}}get defaultHeaders(){return{Accept:"text/html, application/xhtml+xml"}}get isSafe(){return this.method===s.get}get abortSignal(){return this.abortController.signal}acceptResponseType(e){this.headers.Accept=[e,this.headers.Accept].join(", ")}async allowRequestToBeIntercepted(e){const t=new Promise((e=>this.resolveRequestPromise=e));w("turbo:before-fetch-request",{cancelable:!0,detail:{fetchOptions:e,url:this.url,resume:this.resolveRequestPromise},target:this.target}).defaultPrevented&&await t}willDelegateErrorHandling(e){return!w("turbo:fetch-request-error",{target:this.target,cancelable:!0,detail:{request:this,error:e}}).defaultPrevented}}class F{constructor(e,t){this.started=!1,this.intersect=e=>{const t=e.slice(-1)[0];(null==t?void 0:t.isIntersecting)&&this.delegate.elementAppearedInViewport(this.element)},this.delegate=e,this.element=t,this.intersectionObserver=new IntersectionObserver(this.intersect)}start(){this.started||(this.started=!0,this.intersectionObserver.observe(this.element))}stop(){this.started&&(this.started=!1,this.intersectionObserver.unobserve(this.element))}}class P{static wrap(e){return"string"==typeof e?new this(function(e){const t=document.createElement("template");return t.innerHTML=e,t.content}(e)):e}constructor(e){this.fragment=function(e){for(const t of e.querySelectorAll("turbo-stream")){const e=document.importNode(t,!0);for(const t of e.templateElement.content.querySelectorAll("script"))t.replaceWith(y(t));t.replaceWith(e)}return e}(e)}}P.contentType="text/vnd.turbo-stream.html",function(e){e[e.initialized=0]="initialized",e[e.requesting=1]="requesting",e[e.waiting=2]="waiting",e[e.receiving=3]="receiving",e[e.stopping=4]="stopping",e[e.stopped=5]="stopped"}(a||(a={})),function(e){e.urlEncoded="application/x-www-form-urlencoded",e.multipart="multipart/form-data",e.plain="text/plain"}(l||(l={}));class H{static confirmMethod(e,t,n){return Promise.resolve(confirm(e))}constructor(e,t,n,r=!1){this.state=a.initialized,this.delegate=e,this.formElement=t,this.submitter=n,this.formData=function(e,t){const n=new FormData(e),r=null==t?void 0:t.getAttribute("name"),o=null==t?void 0:t.getAttribute("value");return r&&n.append(r,o||""),n}(t,n),this.location=h(this.action),this.method==s.get&&function(e,t){const n=new URLSearchParams;for(const[e,r]of t)r instanceof File||n.append(e,r);e.search=n.toString()}(this.location,[...this.body.entries()]),this.fetchRequest=new I(this,this.method,this.location,this.body,this.formElement),this.mustRedirect=r}get method(){var e;return function(e){switch(e.toLowerCase()){case"get":return s.get;case"post":return s.post;case"put":return s.put;case"patch":return s.patch;case"delete":return s.delete}}(((null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formmethod"))||this.formElement.getAttribute("method")||"").toLowerCase())||s.get}get action(){var e;const t="string"==typeof this.formElement.action?this.formElement.action:null;return(null===(e=this.submitter)||void 0===e?void 0:e.hasAttribute("formaction"))?this.submitter.getAttribute("formaction")||"":this.formElement.getAttribute("action")||t||""}get body(){return this.enctype==l.urlEncoded||this.method==s.get?new URLSearchParams(this.stringFormData):this.formData}get enctype(){var e;return function(e){switch(e.toLowerCase()){case l.multipart:return l.multipart;case l.plain:return l.plain;default:return l.urlEncoded}}((null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formenctype"))||this.formElement.enctype)}get isSafe(){return this.fetchRequest.isSafe}get stringFormData(){return[...this.formData].reduce(((e,[t,n])=>e.concat("string"==typeof n?[[t,n]]:[])),[])}async start(){const{initialized:e,requesting:t}=a,n=C("data-turbo-confirm",this.submitter,this.formElement);if("string"!=typeof n||await H.confirmMethod(n,this.formElement,this.submitter))return this.state==e?(this.state=t,this.fetchRequest.perform()):void 0}stop(){const{stopping:e,stopped:t}=a;if(this.state!=e&&this.state!=t)return this.state=e,this.fetchRequest.cancel(),!0}prepareRequest(e){if(!e.isSafe){const t=function(e){if(null!=e){const t=(document.cookie?document.cookie.split("; "):[]).find((t=>t.startsWith(e)));if(t){const e=t.split("=").slice(1).join("=");return e?decodeURIComponent(e):void 0}}}(R("csrf-param"))||R("csrf-token");t&&(e.headers["X-CSRF-Token"]=t)}this.requestAcceptsTurboStreamResponse(e)&&e.acceptResponseType(P.contentType)}requestStarted(e){var t;this.state=a.waiting,null===(t=this.submitter)||void 0===t||t.setAttribute("disabled",""),this.setSubmitsWith(),w("turbo:submit-start",{target:this.formElement,detail:{formSubmission:this}}),this.delegate.formSubmissionStarted(this)}requestPreventedHandlingResponse(e,t){this.result={success:t.succeeded,fetchResponse:t}}requestSucceededWithResponse(e,t){if(t.clientError||t.serverError)this.delegate.formSubmissionFailedWithResponse(this,t);else if(this.requestMustRedirect(e)&&function(e){return 200==e.statusCode&&!e.redirected}(t)){const e=new Error("Form responses must redirect to another location");this.delegate.formSubmissionErrored(this,e)}else this.state=a.receiving,this.result={success:!0,fetchResponse:t},this.delegate.formSubmissionSucceededWithResponse(this,t)}requestFailedWithResponse(e,t){this.result={success:!1,fetchResponse:t},this.delegate.formSubmissionFailedWithResponse(this,t)}requestErrored(e,t){this.result={success:!1,error:t},this.delegate.formSubmissionErrored(this,t)}requestFinished(e){var t;this.state=a.stopped,null===(t=this.submitter)||void 0===t||t.removeAttribute("disabled"),this.resetSubmitterText(),w("turbo:submit-end",{target:this.formElement,detail:Object.assign({formSubmission:this},this.result)}),this.delegate.formSubmissionFinished(this)}setSubmitsWith(){if(this.submitter&&this.submitsWith)if(this.submitter.matches("button"))this.originalSubmitText=this.submitter.innerHTML,this.submitter.innerHTML=this.submitsWith;else if(this.submitter.matches("input")){const e=this.submitter;this.originalSubmitText=e.value,e.value=this.submitsWith}}resetSubmitterText(){this.submitter&&this.originalSubmitText&&(this.submitter.matches("button")?this.submitter.innerHTML=this.originalSubmitText:this.submitter.matches("input")&&(this.submitter.value=this.originalSubmitText))}requestMustRedirect(e){return!e.isSafe&&this.mustRedirect}requestAcceptsTurboStreamResponse(e){return!e.isSafe||function(e,...t){return t.some((t=>t&&t.hasAttribute(e)))}("data-turbo-stream",this.submitter,this.formElement)}get submitsWith(){var e;return null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("data-turbo-submits-with")}}class N{constructor(e){this.element=e}get activeElement(){return this.element.ownerDocument.activeElement}get children(){return[...this.element.children]}hasAnchor(e){return null!=this.getElementForAnchor(e)}getElementForAnchor(e){return e?this.element.querySelector(`[id='${e}'], a[name='${e}']`):null}get isConnected(){return this.element.isConnected}get firstAutofocusableElement(){for(const e of this.element.querySelectorAll("[autofocus]"))if(null==e.closest("[inert], :disabled, [hidden], details:not([open]), dialog:not([open])"))return e;return null}get permanentElements(){return B(this.element)}getPermanentElementById(e){return W(this.element,e)}getPermanentElementMapForSnapshot(e){const t={};for(const n of this.permanentElements){const{id:r}=n,o=e.getPermanentElementById(r);o&&(t[r]=[n,o])}return t}}function W(e,t){return e.querySelector(`#${t}[data-turbo-permanent]`)}function B(e){return e.querySelectorAll("[id][data-turbo-permanent]")}class V{constructor(e,t){this.started=!1,this.submitCaptured=()=>{this.eventTarget.removeEventListener("submit",this.submitBubbled,!1),this.eventTarget.addEventListener("submit",this.submitBubbled,!1)},this.submitBubbled=e=>{if(!e.defaultPrevented){const t=e.target instanceof HTMLFormElement?e.target:void 0,n=e.submitter||void 0;t&&function(e,t){return"dialog"!=((null==t?void 0:t.getAttribute("formmethod"))||e.getAttribute("method"))}(t,n)&&function(e,t){if((null==t?void 0:t.hasAttribute("formtarget"))||e.hasAttribute("target")){const n=(null==t?void 0:t.getAttribute("formtarget"))||e.target;for(const e of document.getElementsByName(n))if(e instanceof HTMLIFrameElement)return!1;return!0}return!0}(t,n)&&this.delegate.willSubmitForm(t,n)&&(e.preventDefault(),e.stopImmediatePropagation(),this.delegate.formSubmitted(t,n))}},this.delegate=e,this.eventTarget=t}start(){this.started||(this.eventTarget.addEventListener("submit",this.submitCaptured,!0),this.started=!0)}stop(){this.started&&(this.eventTarget.removeEventListener("submit",this.submitCaptured,!0),this.started=!1)}}class j{constructor(e,t){this.resolveRenderPromise=e=>{},this.resolveInterceptionPromise=e=>{},this.delegate=e,this.element=t}scrollToAnchor(e){const t=this.snapshot.getElementForAnchor(e);t?(this.scrollToElement(t),this.focusElement(t)):this.scrollToPosition({x:0,y:0})}scrollToAnchorFromLocation(e){this.scrollToAnchor(p(e))}scrollToElement(e){e.scrollIntoView()}focusElement(e){e instanceof HTMLElement&&(e.hasAttribute("tabindex")?e.focus():(e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")))}scrollToPosition({x:e,y:t}){this.scrollRoot.scrollTo(e,t)}scrollToTop(){this.scrollToPosition({x:0,y:0})}get scrollRoot(){return window}async render(e){const{isPreview:t,shouldRender:n,newSnapshot:r}=e;if(n)try{this.renderPromise=new Promise((e=>this.resolveRenderPromise=e)),this.renderer=e,await this.prepareToRenderSnapshot(e);const n=new Promise((e=>this.resolveInterceptionPromise=e)),o={resume:this.resolveInterceptionPromise,render:this.renderer.renderElement};this.delegate.allowsImmediateRender(r,o)||await n,await this.renderSnapshot(e),this.delegate.viewRenderedSnapshot(r,t),this.delegate.preloadOnLoadLinksForView(this.element),this.finishRenderingSnapshot(e)}finally{delete this.renderer,this.resolveRenderPromise(void 0),delete this.renderPromise}else this.invalidate(e.reloadReason)}invalidate(e){this.delegate.viewInvalidated(e)}async prepareToRenderSnapshot(e){this.markAsPreview(e.isPreview),await e.prepareToRender()}markAsPreview(e){e?this.element.setAttribute("data-turbo-preview",""):this.element.removeAttribute("data-turbo-preview")}async renderSnapshot(e){await e.render()}finishRenderingSnapshot(e){e.finishRendering()}}class z extends j{missing(){this.element.innerHTML='<strong class="turbo-frame-error">Content missing</strong>'}get snapshot(){return new N(this.element)}}class q{constructor(e,t){this.clickBubbled=e=>{this.respondsToEventTarget(e.target)?this.clickEvent=e:delete this.clickEvent},this.linkClicked=e=>{this.clickEvent&&this.respondsToEventTarget(e.target)&&e.target instanceof Element&&this.delegate.shouldInterceptLinkClick(e.target,e.detail.url,e.detail.originalEvent)&&(this.clickEvent.preventDefault(),e.preventDefault(),this.delegate.linkClickIntercepted(e.target,e.detail.url,e.detail.originalEvent)),delete this.clickEvent},this.willVisit=e=>{delete this.clickEvent},this.delegate=e,this.element=t}start(){this.element.addEventListener("click",this.clickBubbled),document.addEventListener("turbo:click",this.linkClicked),document.addEventListener("turbo:before-visit",this.willVisit)}stop(){this.element.removeEventListener("click",this.clickBubbled),document.removeEventListener("turbo:click",this.linkClicked),document.removeEventListener("turbo:before-visit",this.willVisit)}respondsToEventTarget(e){const t=e instanceof Element?e:e instanceof Node?e.parentElement:null;return t&&t.closest("turbo-frame, html")==this.element}}class ${constructor(e,t){this.started=!1,this.clickCaptured=()=>{this.eventTarget.removeEventListener("click",this.clickBubbled,!1),this.eventTarget.addEventListener("click",this.clickBubbled,!1)},this.clickBubbled=e=>{if(e instanceof MouseEvent&&this.clickEventIsSignificant(e)){const t=e.composedPath&&e.composedPath()[0]||e.target,n=this.findLinkFromClickTarget(t);if(n&&function(e){if(e.hasAttribute("target")){for(const t of document.getElementsByName(e.target))if(t instanceof HTMLIFrameElement)return!1;return!0}return!0}(n)){const t=this.getLocationForLink(n);this.delegate.willFollowLinkToLocation(n,t,e)&&(e.preventDefault(),this.delegate.followedLinkToLocation(n,t))}}},this.delegate=e,this.eventTarget=t}start(){this.started||(this.eventTarget.addEventListener("click",this.clickCaptured,!0),this.started=!0)}stop(){this.started&&(this.eventTarget.removeEventListener("click",this.clickCaptured,!0),this.started=!1)}clickEventIsSignificant(e){return!(e.target&&e.target.isContentEditable||e.defaultPrevented||e.which>1||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)}findLinkFromClickTarget(e){return M(e,"a[href]:not([target^=_]):not([download])")}getLocationForLink(e){return h(e.getAttribute("href")||"")}}class Z{constructor(e,t){this.delegate=e,this.linkInterceptor=new $(this,t)}start(){this.linkInterceptor.start()}stop(){this.linkInterceptor.stop()}willFollowLinkToLocation(e,t,n){return this.delegate.willSubmitFormLinkToLocation(e,t,n)&&e.hasAttribute("data-turbo-method")}followedLinkToLocation(e,t){const n=document.createElement("form");for(const[e,r]of t.searchParams)n.append(Object.assign(document.createElement("input"),{type:"hidden",name:e,value:r}));const r=Object.assign(t,{search:""});n.setAttribute("data-turbo","true"),n.setAttribute("action",r.href),n.setAttribute("hidden","");const o=e.getAttribute("data-turbo-method");o&&n.setAttribute("method",o);const i=e.getAttribute("data-turbo-frame");i&&n.setAttribute("data-turbo-frame",i);const s=D(e);s&&n.setAttribute("data-turbo-action",s);const a=e.getAttribute("data-turbo-confirm");a&&n.setAttribute("data-turbo-confirm",a),e.hasAttribute("data-turbo-stream")&&n.setAttribute("data-turbo-stream",""),this.delegate.submittedFormLinkToLocation(e,t,n),document.body.appendChild(n),n.addEventListener("turbo:submit-end",(()=>n.remove()),{once:!0}),requestAnimationFrame((()=>n.requestSubmit()))}}class U{static async preservingPermanentElements(e,t,n){const r=new this(e,t);r.enter(),await n(),r.leave()}constructor(e,t){this.delegate=e,this.permanentElementMap=t}enter(){for(const e in this.permanentElementMap){const[t,n]=this.permanentElementMap[e];this.delegate.enteringBardo(t,n),this.replaceNewPermanentElementWithPlaceholder(n)}}leave(){for(const e in this.permanentElementMap){const[t]=this.permanentElementMap[e];this.replaceCurrentPermanentElementWithClone(t),this.replacePlaceholderWithPermanentElement(t),this.delegate.leavingBardo(t)}}replaceNewPermanentElementWithPlaceholder(e){const t=function(e){const t=document.createElement("meta");return t.setAttribute("name","turbo-permanent-placeholder"),t.setAttribute("content",e.id),t}(e);e.replaceWith(t)}replaceCurrentPermanentElementWithClone(e){const t=e.cloneNode(!0);e.replaceWith(t)}replacePlaceholderWithPermanentElement(e){const t=this.getPlaceholderById(e.id);null==t||t.replaceWith(e)}getPlaceholderById(e){return this.placeholders.find((t=>t.content==e))}get placeholders(){return[...document.querySelectorAll("meta[name=turbo-permanent-placeholder][content]")]}}class K{constructor(e,t,n,r,o=!0){this.activeElement=null,this.currentSnapshot=e,this.newSnapshot=t,this.isPreview=r,this.willRender=o,this.renderElement=n,this.promise=new Promise(((e,t)=>this.resolvingFunctions={resolve:e,reject:t}))}get shouldRender(){return!0}get reloadReason(){}prepareToRender(){}finishRendering(){this.resolvingFunctions&&(this.resolvingFunctions.resolve(),delete this.resolvingFunctions)}async preservingPermanentElements(e){await U.preservingPermanentElements(this,this.permanentElementMap,e)}focusFirstAutofocusableElement(){const e=this.connectedSnapshot.firstAutofocusableElement;(function(e){return e&&"function"==typeof e.focus})(e)&&e.focus()}enteringBardo(e){this.activeElement||e.contains(this.currentSnapshot.activeElement)&&(this.activeElement=this.currentSnapshot.activeElement)}leavingBardo(e){e.contains(this.activeElement)&&this.activeElement instanceof HTMLElement&&(this.activeElement.focus(),this.activeElement=null)}get connectedSnapshot(){return this.newSnapshot.isConnected?this.newSnapshot:this.currentSnapshot}get currentElement(){return this.currentSnapshot.element}get newElement(){return this.newSnapshot.element}get permanentElementMap(){return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)}}class Y extends K{static renderElement(e,t){var n;const r=document.createRange();r.selectNodeContents(e),r.deleteContents();const o=t,i=null===(n=o.ownerDocument)||void 0===n?void 0:n.createRange();i&&(i.selectNodeContents(o),e.appendChild(i.extractContents()))}constructor(e,t,n,r,o,i=!0){super(t,n,r,o,i),this.delegate=e}get shouldRender(){return!0}async render(){await S(),this.preservingPermanentElements((()=>{this.loadFrameElement()})),this.scrollFrameIntoView(),await S(),this.focusFirstAutofocusableElement(),await S(),this.activateScriptElements()}loadFrameElement(){this.delegate.willRenderFrame(this.currentElement,this.newElement),this.renderElement(this.currentElement,this.newElement)}scrollFrameIntoView(){if(this.currentElement.autoscroll||this.newElement.autoscroll){const t=this.currentElement.firstElementChild,n=("end","end"==(e=this.currentElement.getAttribute("data-autoscroll-block"))||"start"==e||"center"==e||"nearest"==e?e:"end"),r=function(e,t){return"auto"==e||"smooth"==e?e:"auto"}(this.currentElement.getAttribute("data-autoscroll-behavior"));if(t)return t.scrollIntoView({block:n,behavior:r}),!0}var e;return!1}activateScriptElements(){for(const e of this.newScriptElements){const t=y(e);e.replaceWith(t)}}get newScriptElements(){return this.currentElement.querySelectorAll("script")}}class G{static get defaultCSS(){return x`
       .turbo-progress-bar {
         position: fixed;
         display: block;
@@ -9,13 +9,13 @@
         left: 0;
         height: 3px;
         background: #0076ff;
-        z-index: 9999;
+        z-index: 2147483647;
         transition:
-          width ${j.animationDuration}ms ease-out,
-          opacity ${j.animationDuration/2}ms ${j.animationDuration/2}ms ease-in;
+          width ${G.animationDuration}ms ease-out,
+          opacity ${G.animationDuration/2}ms ${G.animationDuration/2}ms ease-in;
         transform: translate3d(0, 0, 0);
       }
-    `}show(){this.visible||(this.visible=!0,this.installProgressElement(),this.startTrickling())}hide(){this.visible&&!this.hiding&&(this.hiding=!0,this.fadeProgressElement((()=>{this.uninstallProgressElement(),this.stopTrickling(),this.visible=!1,this.hiding=!1})))}setValue(e){this.value=e,this.refresh()}installStylesheetElement(){document.head.insertBefore(this.stylesheetElement,document.head.firstChild)}installProgressElement(){this.progressElement.style.width="0",this.progressElement.style.opacity="1",document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()}fadeProgressElement(e){this.progressElement.style.opacity="0",setTimeout(e,1.5*j.animationDuration)}uninstallProgressElement(){this.progressElement.parentNode&&document.documentElement.removeChild(this.progressElement)}startTrickling(){this.trickleInterval||(this.trickleInterval=window.setInterval(this.trickle,j.animationDuration))}stopTrickling(){window.clearInterval(this.trickleInterval),delete this.trickleInterval}refresh(){requestAnimationFrame((()=>{this.progressElement.style.width=10+90*this.value+"%"}))}createStylesheetElement(){const e=document.createElement("style");return e.type="text/css",e.textContent=j.defaultCSS,e}createProgressElement(){const e=document.createElement("div");return e.className="turbo-progress-bar",e}}j.animationDuration=300;class W extends A{constructor(){super(...arguments),this.detailsByOuterHTML=this.children.filter((e=>!function(e){return"noscript"==e.tagName.toLowerCase()}(e))).map((e=>function(e){return e.hasAttribute("nonce")&&e.setAttribute("nonce",""),e}(e))).reduce(((e,t)=>{const{outerHTML:n}=t,r=n in e?e[n]:{type:B(t),tracked:z(t),elements:[]};return Object.assign(Object.assign({},e),{[n]:Object.assign(Object.assign({},r),{elements:[...r.elements,t]})})}),{})}get trackedElementSignature(){return Object.keys(this.detailsByOuterHTML).filter((e=>this.detailsByOuterHTML[e].tracked)).join("")}getScriptElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot("script",e)}getStylesheetElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot("stylesheet",e)}getElementsMatchingTypeNotInSnapshot(e,t){return Object.keys(this.detailsByOuterHTML).filter((e=>!(e in t.detailsByOuterHTML))).map((e=>this.detailsByOuterHTML[e])).filter((({type:t})=>t==e)).map((({elements:[e]})=>e))}get provisionalElements(){return Object.keys(this.detailsByOuterHTML).reduce(((e,t)=>{const{type:n,tracked:r,elements:o}=this.detailsByOuterHTML[t];return null!=n||r?o.length>1?[...e,...o.slice(1)]:e:[...e,...o]}),[])}getMetaValue(e){const t=this.findMetaElementByName(e);return t?t.getAttribute("content"):null}findMetaElementByName(e){return Object.keys(this.detailsByOuterHTML).reduce(((t,n)=>{const{elements:[r]}=this.detailsByOuterHTML[n];return function(e,t){return"meta"==e.tagName.toLowerCase()&&e.getAttribute("name")==t}(r,e)?r:t}),void 0)}}function B(e){return function(e){return"script"==e.tagName.toLowerCase()}(e)?"script":function(e){const t=e.tagName.toLowerCase();return"style"==t||"link"==t&&"stylesheet"==e.getAttribute("rel")}(e)?"stylesheet":void 0}function z(e){return"reload"==e.getAttribute("data-turbo-track")}class V extends A{constructor(e,t){super(e),this.headSnapshot=t}static fromHTMLString(e=""){return this.fromDocument(x(e))}static fromElement(e){return this.fromDocument(e.ownerDocument)}static fromDocument({head:e,body:t}){return new this(t,new W(e))}clone(){return new V(this.element.cloneNode(!0),this.headSnapshot)}get headElement(){return this.headSnapshot.element}get rootLocation(){var e;return f(null!==(e=this.getSetting("root"))&&void 0!==e?e:"/")}get cacheControlValue(){return this.getSetting("cache-control")}get isPreviewable(){return"no-preview"!=this.cacheControlValue}get isCacheable(){return"no-cache"!=this.cacheControlValue}get isVisitable(){return"reload"!=this.getSetting("visit-control")}getSetting(e){return this.headSnapshot.getMetaValue(`turbo-${e}`)}}!function(e){e.visitStart="visitStart",e.requestStart="requestStart",e.requestEnd="requestEnd",e.visitEnd="visitEnd"}(c||(c={})),function(e){e.initialized="initialized",e.started="started",e.canceled="canceled",e.failed="failed",e.completed="completed"}(u||(u={}));const q={action:"advance",historyChanged:!1,visitCachedSnapshot:()=>{},willRender:!0};var $,U;!function(e){e[e.networkFailure=0]="networkFailure",e[e.timeoutFailure=-1]="timeoutFailure",e[e.contentTypeMismatch=-2]="contentTypeMismatch"}($||($={}));class Z{constructor(e,t,n,r={}){this.identifier=S(),this.timingMetrics={},this.followedRedirect=!1,this.historyChanged=!1,this.scrolled=!1,this.snapshotCached=!1,this.state=u.initialized,this.delegate=e,this.location=t,this.restorationIdentifier=n||S();const{action:o,historyChanged:i,referrer:s,snapshotHTML:a,response:l,visitCachedSnapshot:c,willRender:d}=Object.assign(Object.assign({},q),r);this.action=o,this.historyChanged=i,this.referrer=s,this.snapshotHTML=a,this.response=l,this.isSamePage=this.delegate.locationWithActionIsSamePage(this.location,this.action),this.visitCachedSnapshot=c,this.willRender=d,this.scrolled=!d}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get history(){return this.delegate.history}get restorationData(){return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)}get silent(){return this.isSamePage}start(){this.state==u.initialized&&(this.recordTimingMetric(c.visitStart),this.state=u.started,this.adapter.visitStarted(this),this.delegate.visitStarted(this))}cancel(){this.state==u.started&&(this.request&&this.request.cancel(),this.cancelRender(),this.state=u.canceled)}complete(){this.state==u.started&&(this.recordTimingMetric(c.visitEnd),this.state=u.completed,this.adapter.visitCompleted(this),this.delegate.visitCompleted(this),this.followRedirect())}fail(){this.state==u.started&&(this.state=u.failed,this.adapter.visitFailed(this))}changeHistory(){var e;if(!this.historyChanged){const t=this.location.href===(null===(e=this.referrer)||void 0===e?void 0:e.href)?"replace":this.action,n=this.getHistoryMethodForAction(t);this.history.update(n,this.location,this.restorationIdentifier),this.historyChanged=!0}}issueRequest(){this.hasPreloadedResponse()?this.simulateRequest():this.shouldIssueRequest()&&!this.request&&(this.request=new T(this,s.get,this.location),this.request.perform())}simulateRequest(){this.response&&(this.startRequest(),this.recordResponse(),this.finishRequest())}startRequest(){this.recordTimingMetric(c.requestStart),this.adapter.visitRequestStarted(this)}recordResponse(e=this.response){if(this.response=e,e){const{statusCode:t}=e;Y(t)?this.adapter.visitRequestCompleted(this):this.adapter.visitRequestFailedWithStatusCode(this,t)}}finishRequest(){this.recordTimingMetric(c.requestEnd),this.adapter.visitRequestFinished(this)}loadResponse(){if(this.response){const{statusCode:e,responseHTML:t}=this.response;this.render((async()=>{this.cacheSnapshot(),this.view.renderPromise&&await this.view.renderPromise,Y(e)&&null!=t?(await this.view.renderPage(V.fromHTMLString(t),!1,this.willRender),this.adapter.visitRendered(this),this.complete()):(await this.view.renderError(V.fromHTMLString(t)),this.adapter.visitRendered(this),this.fail())}))}}getCachedSnapshot(){const e=this.view.getCachedSnapshotForLocation(this.location)||this.getPreloadedSnapshot();if(e&&(!h(this.location)||e.hasAnchor(h(this.location)))&&("restore"==this.action||e.isPreviewable))return e}getPreloadedSnapshot(){if(this.snapshotHTML)return V.fromHTMLString(this.snapshotHTML)}hasCachedSnapshot(){return null!=this.getCachedSnapshot()}loadCachedSnapshot(){const e=this.getCachedSnapshot();if(e){const t=this.shouldIssueRequest();this.render((async()=>{this.cacheSnapshot(),this.isSamePage?this.adapter.visitRendered(this):(this.view.renderPromise&&await this.view.renderPromise,await this.view.renderPage(e,t,this.willRender),this.adapter.visitRendered(this),t||this.complete())}))}}followRedirect(){var e;this.redirectedToLocation&&!this.followedRedirect&&(null===(e=this.response)||void 0===e?void 0:e.redirected)&&(this.adapter.visitProposedToLocation(this.redirectedToLocation,{action:"replace",response:this.response}),this.followedRedirect=!0)}goToSamePageAnchor(){this.isSamePage&&this.render((async()=>{this.cacheSnapshot(),this.adapter.visitRendered(this)}))}requestStarted(){this.startRequest()}requestPreventedHandlingResponse(e,t){}async requestSucceededWithResponse(e,t){const n=await t.responseHTML,{redirected:r,statusCode:o}=t;null==n?this.recordResponse({statusCode:$.contentTypeMismatch,redirected:r}):(this.redirectedToLocation=t.redirected?t.location:void 0,this.recordResponse({statusCode:o,responseHTML:n,redirected:r}))}async requestFailedWithResponse(e,t){const n=await t.responseHTML,{redirected:r,statusCode:o}=t;null==n?this.recordResponse({statusCode:$.contentTypeMismatch,redirected:r}):this.recordResponse({statusCode:o,responseHTML:n,redirected:r})}requestErrored(e,t){this.recordResponse({statusCode:$.networkFailure,redirected:!1})}requestFinished(){this.finishRequest()}performScroll(){this.scrolled||("restore"==this.action?this.scrollToRestoredPosition()||this.scrollToAnchor()||this.view.scrollToTop():this.scrollToAnchor()||this.view.scrollToTop(),this.isSamePage&&this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation,this.location),this.scrolled=!0)}scrollToRestoredPosition(){const{scrollPosition:e}=this.restorationData;if(e)return this.view.scrollToPosition(e),!0}scrollToAnchor(){const e=h(this.location);if(null!=e)return this.view.scrollToAnchor(e),!0}recordTimingMetric(e){this.timingMetrics[e]=(new Date).getTime()}getTimingMetrics(){return Object.assign({},this.timingMetrics)}getHistoryMethodForAction(e){switch(e){case"replace":return history.replaceState;case"advance":case"restore":return history.pushState}}hasPreloadedResponse(){return"object"==typeof this.response}shouldIssueRequest(){return!this.isSamePage&&("restore"==this.action?!this.hasCachedSnapshot():this.willRender)}cacheSnapshot(){this.snapshotCached||(this.view.cacheSnapshot().then((e=>e&&this.visitCachedSnapshot(e))),this.snapshotCached=!0)}async render(e){this.cancelRender(),await new Promise((e=>{this.frame=requestAnimationFrame((()=>e()))})),await e(),delete this.frame,this.performScroll()}cancelRender(){this.frame&&(cancelAnimationFrame(this.frame),delete this.frame)}}function Y(e){return e>=200&&e<300}class G{constructor(e){this.progressBar=new j,this.showProgressBar=()=>{this.progressBar.show()},this.session=e}visitProposedToLocation(e,t){this.navigator.startVisit(e,S(),t)}visitStarted(e){e.loadCachedSnapshot(),e.issueRequest(),e.changeHistory(),e.goToSamePageAnchor()}visitRequestStarted(e){this.progressBar.setValue(0),e.hasCachedSnapshot()||"restore"!=e.action?this.showVisitProgressBarAfterDelay():this.showProgressBar()}visitRequestCompleted(e){e.loadResponse()}visitRequestFailedWithStatusCode(e,t){switch(t){case $.networkFailure:case $.timeoutFailure:case $.contentTypeMismatch:return this.reload();default:return e.loadResponse()}}visitRequestFinished(e){this.progressBar.setValue(1),this.hideVisitProgressBar()}visitCompleted(e){}pageInvalidated(){this.reload()}visitFailed(e){}visitRendered(e){}formSubmissionStarted(e){this.progressBar.setValue(0),this.showFormProgressBarAfterDelay()}formSubmissionFinished(e){this.progressBar.setValue(1),this.hideFormProgressBar()}showVisitProgressBarAfterDelay(){this.visitProgressBarTimeout=window.setTimeout(this.showProgressBar,this.session.progressBarDelay)}hideVisitProgressBar(){this.progressBar.hide(),null!=this.visitProgressBarTimeout&&(window.clearTimeout(this.visitProgressBarTimeout),delete this.visitProgressBarTimeout)}showFormProgressBarAfterDelay(){null==this.formProgressBarTimeout&&(this.formProgressBarTimeout=window.setTimeout(this.showProgressBar,this.session.progressBarDelay))}hideFormProgressBar(){this.progressBar.hide(),null!=this.formProgressBarTimeout&&(window.clearTimeout(this.formProgressBarTimeout),delete this.formProgressBarTimeout)}reload(){window.location.reload()}get navigator(){return this.session.navigator}}class J{constructor(){this.started=!1}start(){this.started||(this.started=!0,addEventListener("turbo:before-cache",this.removeStaleElements,!1))}stop(){this.started&&(this.started=!1,removeEventListener("turbo:before-cache",this.removeStaleElements,!1))}removeStaleElements(){const e=[...document.querySelectorAll('[data-turbo-cache="false"]')];for(const t of e)t.remove()}}class K{constructor(e){this.started=!1,this.submitCaptured=()=>{removeEventListener("submit",this.submitBubbled,!1),addEventListener("submit",this.submitBubbled,!1)},this.submitBubbled=e=>{if(!e.defaultPrevented){const t=e.target instanceof HTMLFormElement?e.target:void 0,n=e.submitter||void 0;t&&"dialog"!=((null==n?void 0:n.getAttribute("formmethod"))||t.getAttribute("method"))&&this.delegate.willSubmitForm(t,n)&&(e.preventDefault(),this.delegate.formSubmitted(t,n))}},this.delegate=e}start(){this.started||(addEventListener("submit",this.submitCaptured,!0),this.started=!0)}stop(){this.started&&(removeEventListener("submit",this.submitCaptured,!0),this.started=!1)}}class X{constructor(e){this.element=e,this.linkInterceptor=new P(this,e),this.formInterceptor=new I(this,e)}start(){this.linkInterceptor.start(),this.formInterceptor.start()}stop(){this.linkInterceptor.stop(),this.formInterceptor.stop()}shouldInterceptLinkClick(e,t){return this.shouldRedirect(e)}linkClickIntercepted(e,t){const n=this.findFrameElement(e);n&&n.delegate.linkClickIntercepted(e,t)}shouldInterceptFormSubmission(e,t){return this.shouldSubmit(e,t)}formSubmissionIntercepted(e,t){const n=this.findFrameElement(e,t);n&&(n.removeAttribute("reloadable"),n.delegate.formSubmissionIntercepted(e,t))}shouldSubmit(e,t){var n;const r=p(e,t),o=this.element.ownerDocument.querySelector('meta[name="turbo-root"]'),i=f(null!==(n=null==o?void 0:o.content)&&void 0!==n?n:"/");return this.shouldRedirect(e,t)&&m(r,i)}shouldRedirect(e,t){const n=this.findFrameElement(e,t);return!!n&&n!=e.closest("turbo-frame")}findFrameElement(e,t){const n=(null==t?void 0:t.getAttribute("data-turbo-frame"))||e.getAttribute("data-turbo-frame");if(n&&"_top"!=n){const e=this.element.querySelector(`#${n}:not([disabled])`);if(e instanceof d)return e}}}class Q{constructor(e){this.restorationIdentifier=S(),this.restorationData={},this.started=!1,this.pageLoaded=!1,this.onPopState=e=>{if(this.shouldHandlePopState()){const{turbo:t}=e.state||{};if(t){this.location=new URL(window.location.href);const{restorationIdentifier:e}=t;this.restorationIdentifier=e,this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location,e)}}},this.onPageLoad=async e=>{await Promise.resolve(),this.pageLoaded=!0},this.delegate=e}start(){this.started||(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0,this.replace(new URL(window.location.href)))}stop(){this.started&&(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1)}push(e,t){this.update(history.pushState,e,t)}replace(e,t){this.update(history.replaceState,e,t)}update(e,t,n=S()){const r={turbo:{restorationIdentifier:n}};e.call(history,r,"",t.href),this.location=t,this.restorationIdentifier=n}getRestorationDataForIdentifier(e){return this.restorationData[e]||{}}updateRestorationData(e){const{restorationIdentifier:t}=this,n=this.restorationData[t];this.restorationData[t]=Object.assign(Object.assign({},n),e)}assumeControlOfScrollRestoration(){var e;this.previousScrollRestoration||(this.previousScrollRestoration=null!==(e=history.scrollRestoration)&&void 0!==e?e:"auto",history.scrollRestoration="manual")}relinquishControlOfScrollRestoration(){this.previousScrollRestoration&&(history.scrollRestoration=this.previousScrollRestoration,delete this.previousScrollRestoration)}shouldHandlePopState(){return this.pageIsLoaded()}pageIsLoaded(){return this.pageLoaded||"complete"==document.readyState}}class ee{constructor(e){this.started=!1,this.clickCaptured=()=>{removeEventListener("click",this.clickBubbled,!1),addEventListener("click",this.clickBubbled,!1)},this.clickBubbled=e=>{if(this.clickEventIsSignificant(e)){const t=e.composedPath&&e.composedPath()[0]||e.target,n=this.findLinkFromClickTarget(t);if(n){const t=this.getLocationForLink(n);this.delegate.willFollowLinkToLocation(n,t)&&(e.preventDefault(),this.delegate.followedLinkToLocation(n,t))}}},this.delegate=e}start(){this.started||(addEventListener("click",this.clickCaptured,!0),this.started=!0)}stop(){this.started&&(removeEventListener("click",this.clickCaptured,!0),this.started=!1)}clickEventIsSignificant(e){return!(e.target&&e.target.isContentEditable||e.defaultPrevented||e.which>1||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)}findLinkFromClickTarget(e){if(e instanceof Element)return e.closest("a[href]:not([target^=_]):not([download])")}getLocationForLink(e){return f(e.getAttribute("href")||"")}}function te(e){return"advance"==e||"replace"==e||"restore"==e}class ne{constructor(e){this.delegate=e}proposeVisit(e,t={}){this.delegate.allowsVisitingLocationWithAction(e,t.action)&&(m(e,this.view.snapshot.rootLocation)?this.delegate.visitProposedToLocation(e,t):window.location.href=e.toString())}startVisit(e,t,n={}){this.stop(),this.currentVisit=new Z(this,f(e),t,Object.assign({referrer:this.location},n)),this.currentVisit.start()}submitForm(e,t){this.stop(),this.formSubmission=new R(this,e,t,!0),this.formSubmission.start()}stop(){this.formSubmission&&(this.formSubmission.stop(),delete this.formSubmission),this.currentVisit&&(this.currentVisit.cancel(),delete this.currentVisit)}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get history(){return this.delegate.history}formSubmissionStarted(e){"function"==typeof this.adapter.formSubmissionStarted&&this.adapter.formSubmissionStarted(e)}async formSubmissionSucceededWithResponse(e,t){if(e==this.formSubmission){const n=await t.responseHTML;if(n){e.method!=s.get&&this.view.clearSnapshotCache();const{statusCode:r,redirected:o}=t,i={action:this.getActionForFormSubmission(e),response:{statusCode:r,responseHTML:n,redirected:o}};this.proposeVisit(t.location,i)}}}async formSubmissionFailedWithResponse(e,t){const n=await t.responseHTML;if(n){const e=V.fromHTMLString(n);t.serverError?await this.view.renderError(e):await this.view.renderPage(e),this.view.scrollToTop(),this.view.clearSnapshotCache()}}formSubmissionErrored(e,t){console.error(t)}formSubmissionFinished(e){"function"==typeof this.adapter.formSubmissionFinished&&this.adapter.formSubmissionFinished(e)}visitStarted(e){this.delegate.visitStarted(e)}visitCompleted(e){this.delegate.visitCompleted(e)}locationWithActionIsSamePage(e,t){const n=h(e),r=h(this.view.lastRenderedLocation),o="restore"===t&&void 0===n;return"replace"!==t&&v(e)===v(this.view.lastRenderedLocation)&&(o||null!=n&&n!==r)}visitScrolledToSamePageLocation(e,t){this.delegate.visitScrolledToSamePageLocation(e,t)}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}getActionForFormSubmission(e){const{formElement:t,submitter:n}=e,r=E("data-turbo-action",n,t);return te(r)?r:"advance"}}!function(e){e[e.initial=0]="initial",e[e.loading=1]="loading",e[e.interactive=2]="interactive",e[e.complete=3]="complete"}(U||(U={}));class re{constructor(e){this.stage=U.initial,this.started=!1,this.interpretReadyState=()=>{const{readyState:e}=this;"interactive"==e?this.pageIsInteractive():"complete"==e&&this.pageIsComplete()},this.pageWillUnload=()=>{this.delegate.pageWillUnload()},this.delegate=e}start(){this.started||(this.stage==U.initial&&(this.stage=U.loading),document.addEventListener("readystatechange",this.interpretReadyState,!1),addEventListener("pagehide",this.pageWillUnload,!1),this.started=!0)}stop(){this.started&&(document.removeEventListener("readystatechange",this.interpretReadyState,!1),removeEventListener("pagehide",this.pageWillUnload,!1),this.started=!1)}pageIsInteractive(){this.stage==U.loading&&(this.stage=U.interactive,this.delegate.pageBecameInteractive())}pageIsComplete(){this.pageIsInteractive(),this.stage==U.interactive&&(this.stage=U.complete,this.delegate.pageLoaded())}get readyState(){return document.readyState}}class oe{constructor(e){this.started=!1,this.onScroll=()=>{this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},this.delegate=e}start(){this.started||(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)}stop(){this.started&&(removeEventListener("scroll",this.onScroll,!1),this.started=!1)}updatePosition(e){this.delegate.scrollPositionChanged(e)}}class ie{constructor(e){this.sources=new Set,this.started=!1,this.inspectFetchResponse=e=>{const t=function(e){var t;const n=null===(t=e.detail)||void 0===t?void 0:t.fetchResponse;if(n instanceof b)return n}(e);t&&function(e){var t;return(null!==(t=e.contentType)&&void 0!==t?t:"").startsWith(L.contentType)}(t)&&(e.preventDefault(),this.receiveMessageResponse(t))},this.receiveMessageEvent=e=>{this.started&&"string"==typeof e.data&&this.receiveMessageHTML(e.data)},this.delegate=e}start(){this.started||(this.started=!0,addEventListener("turbo:before-fetch-response",this.inspectFetchResponse,!1))}stop(){this.started&&(this.started=!1,removeEventListener("turbo:before-fetch-response",this.inspectFetchResponse,!1))}connectStreamSource(e){this.streamSourceIsConnected(e)||(this.sources.add(e),e.addEventListener("message",this.receiveMessageEvent,!1))}disconnectStreamSource(e){this.streamSourceIsConnected(e)&&(this.sources.delete(e),e.removeEventListener("message",this.receiveMessageEvent,!1))}streamSourceIsConnected(e){return this.sources.has(e)}async receiveMessageResponse(e){const t=await e.responseHTML;t&&this.receiveMessageHTML(t)}receiveMessageHTML(e){this.delegate.receivedMessageFromStream(new L(e))}}class se extends H{async render(){this.replaceHeadAndBody(),this.activateScriptElements()}replaceHeadAndBody(){const{documentElement:e,head:t,body:n}=document;e.replaceChild(this.newHead,t),e.replaceChild(this.newElement,n)}activateScriptElements(){for(const e of this.scriptElements){const t=e.parentNode;if(t){const n=this.createScriptElement(e);t.replaceChild(n,e)}}}get newHead(){return this.newSnapshot.headSnapshot.element}get scriptElements(){return[...document.documentElement.querySelectorAll("script")]}}class ae extends H{get shouldRender(){return this.newSnapshot.isVisitable&&this.trackedElementsAreIdentical}prepareToRender(){this.mergeHead()}async render(){this.willRender&&this.replaceBody()}finishRendering(){super.finishRendering(),this.isPreview||this.focusFirstAutofocusableElement()}get currentHeadSnapshot(){return this.currentSnapshot.headSnapshot}get newHeadSnapshot(){return this.newSnapshot.headSnapshot}get newElement(){return this.newSnapshot.element}mergeHead(){this.copyNewHeadStylesheetElements(),this.copyNewHeadScriptElements(),this.removeCurrentHeadProvisionalElements(),this.copyNewHeadProvisionalElements()}replaceBody(){this.preservingPermanentElements((()=>{this.activateNewBody(),this.assignNewBody()}))}get trackedElementsAreIdentical(){return this.currentHeadSnapshot.trackedElementSignature==this.newHeadSnapshot.trackedElementSignature}copyNewHeadStylesheetElements(){for(const e of this.newHeadStylesheetElements)document.head.appendChild(e)}copyNewHeadScriptElements(){for(const e of this.newHeadScriptElements)document.head.appendChild(this.createScriptElement(e))}removeCurrentHeadProvisionalElements(){for(const e of this.currentHeadProvisionalElements)document.head.removeChild(e)}copyNewHeadProvisionalElements(){for(const e of this.newHeadProvisionalElements)document.head.appendChild(e)}activateNewBody(){document.adoptNode(this.newElement),this.activateNewBodyScriptElements()}activateNewBodyScriptElements(){for(const e of this.newBodyScriptElements){const t=this.createScriptElement(e);e.replaceWith(t)}}assignNewBody(){document.body&&this.newElement instanceof HTMLBodyElement?document.body.replaceWith(this.newElement):document.documentElement.appendChild(this.newElement)}get newHeadStylesheetElements(){return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)}get newHeadScriptElements(){return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)}get currentHeadProvisionalElements(){return this.currentHeadSnapshot.provisionalElements}get newHeadProvisionalElements(){return this.newHeadSnapshot.provisionalElements}get newBodyScriptElements(){return this.newElement.querySelectorAll("script")}}class le{constructor(e){this.keys=[],this.snapshots={},this.size=e}has(e){return g(e)in this.snapshots}get(e){if(this.has(e)){const t=this.read(e);return this.touch(e),t}}put(e,t){return this.write(e,t),this.touch(e),t}clear(){this.snapshots={}}read(e){return this.snapshots[g(e)]}write(e,t){this.snapshots[g(e)]=t}touch(e){const t=g(e),n=this.keys.indexOf(t);n>-1&&this.keys.splice(n,1),this.keys.unshift(t),this.trim()}trim(){for(const e of this.keys.splice(this.size))delete this.snapshots[e]}}class ce extends M{constructor(){super(...arguments),this.snapshotCache=new le(10),this.lastRenderedLocation=new URL(location.href)}renderPage(e,t=!1,n=!0){const r=new ae(this.snapshot,e,t,n);return this.render(r)}renderError(e){const t=new se(this.snapshot,e,!1);return this.render(t)}clearSnapshotCache(){this.snapshotCache.clear()}async cacheSnapshot(){if(this.shouldCacheSnapshot){this.delegate.viewWillCacheSnapshot();const{snapshot:e,lastRenderedLocation:t}=this;await new Promise((e=>setTimeout((()=>e()),0)));const n=e.clone();return this.snapshotCache.put(t,n),n}}getCachedSnapshotForLocation(e){return this.snapshotCache.get(e)}get snapshot(){return V.fromElement(this.element)}get shouldCacheSnapshot(){return this.snapshot.isCacheable}}function ue(e){Object.defineProperties(e,de)}const de={absoluteURL:{get(){return this.toString()}}},fe=new class{constructor(){this.navigator=new ne(this),this.history=new Q(this),this.view=new ce(this,document.documentElement),this.adapter=new G(this),this.pageObserver=new re(this),this.cacheObserver=new J,this.linkClickObserver=new ee(this),this.formSubmitObserver=new K(this),this.scrollObserver=new oe(this),this.streamObserver=new ie(this),this.frameRedirector=new X(document.documentElement),this.drive=!0,this.enabled=!0,this.progressBarDelay=500,this.started=!1}start(){this.started||(this.pageObserver.start(),this.cacheObserver.start(),this.linkClickObserver.start(),this.formSubmitObserver.start(),this.scrollObserver.start(),this.streamObserver.start(),this.frameRedirector.start(),this.history.start(),this.started=!0,this.enabled=!0)}disable(){this.enabled=!1}stop(){this.started&&(this.pageObserver.stop(),this.cacheObserver.stop(),this.linkClickObserver.stop(),this.formSubmitObserver.stop(),this.scrollObserver.stop(),this.streamObserver.stop(),this.frameRedirector.stop(),this.history.stop(),this.started=!1)}registerAdapter(e){this.adapter=e}visit(e,t={}){this.navigator.proposeVisit(f(e),t)}connectStreamSource(e){this.streamObserver.connectStreamSource(e)}disconnectStreamSource(e){this.streamObserver.disconnectStreamSource(e)}renderStreamMessage(e){document.documentElement.appendChild(L.wrap(e).fragment)}clearCache(){this.view.clearSnapshotCache()}setProgressBarDelay(e){this.progressBarDelay=e}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}historyPoppedToLocationWithRestorationIdentifier(e,t){this.enabled?this.navigator.startVisit(e,t,{action:"restore",historyChanged:!0}):this.adapter.pageInvalidated()}scrollPositionChanged(e){this.history.updateRestorationData({scrollPosition:e})}willFollowLinkToLocation(e,t){return this.elementDriveEnabled(e)&&m(t,this.snapshot.rootLocation)&&this.applicationAllowsFollowingLinkToLocation(e,t)}followedLinkToLocation(e,t){const n=this.getActionForLink(e);this.convertLinkWithMethodClickToFormSubmission(e)||this.visit(t.href,{action:n})}convertLinkWithMethodClickToFormSubmission(e){const t=e.getAttribute("data-turbo-method");if(t){const n=document.createElement("form");n.method=t,n.action=e.getAttribute("href")||"undefined",n.hidden=!0,e.hasAttribute("data-turbo-confirm")&&n.setAttribute("data-turbo-confirm",e.getAttribute("data-turbo-confirm"));const r=this.getTargetFrameForLink(e);return r?(n.setAttribute("data-turbo-frame",r),n.addEventListener("turbo:submit-start",(()=>n.remove()))):n.addEventListener("submit",(()=>n.remove())),document.body.appendChild(n),y("submit",{cancelable:!0,target:n})}return!1}allowsVisitingLocationWithAction(e,t){return this.locationWithActionIsSamePage(e,t)||this.applicationAllowsVisitingLocation(e)}visitProposedToLocation(e,t){ue(e),this.adapter.visitProposedToLocation(e,t)}visitStarted(e){ue(e.location),e.silent||this.notifyApplicationAfterVisitingLocation(e.location,e.action)}visitCompleted(e){this.notifyApplicationAfterPageLoad(e.getTimingMetrics())}locationWithActionIsSamePage(e,t){return this.navigator.locationWithActionIsSamePage(e,t)}visitScrolledToSamePageLocation(e,t){this.notifyApplicationAfterVisitingSamePageLocation(e,t)}willSubmitForm(e,t){const n=p(e,t);return this.elementDriveEnabled(e)&&(!t||this.elementDriveEnabled(t))&&m(f(n),this.snapshot.rootLocation)}formSubmitted(e,t){this.navigator.submitForm(e,t)}pageBecameInteractive(){this.view.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()}pageLoaded(){this.history.assumeControlOfScrollRestoration()}pageWillUnload(){this.history.relinquishControlOfScrollRestoration()}receivedMessageFromStream(e){this.renderStreamMessage(e)}viewWillCacheSnapshot(){var e;(null===(e=this.navigator.currentVisit)||void 0===e?void 0:e.silent)||this.notifyApplicationBeforeCachingSnapshot()}allowsImmediateRender({element:e},t){return!this.notifyApplicationBeforeRender(e,t).defaultPrevented}viewRenderedSnapshot(e,t){this.view.lastRenderedLocation=this.history.location,this.notifyApplicationAfterRender()}viewInvalidated(){this.adapter.pageInvalidated()}frameLoaded(e){this.notifyApplicationAfterFrameLoad(e)}frameRendered(e,t){this.notifyApplicationAfterFrameRender(e,t)}applicationAllowsFollowingLinkToLocation(e,t){return!this.notifyApplicationAfterClickingLinkToLocation(e,t).defaultPrevented}applicationAllowsVisitingLocation(e){return!this.notifyApplicationBeforeVisitingLocation(e).defaultPrevented}notifyApplicationAfterClickingLinkToLocation(e,t){return y("turbo:click",{target:e,detail:{url:t.href},cancelable:!0})}notifyApplicationBeforeVisitingLocation(e){return y("turbo:before-visit",{detail:{url:e.href},cancelable:!0})}notifyApplicationAfterVisitingLocation(e,t){return C(document.documentElement),y("turbo:visit",{detail:{url:e.href,action:t}})}notifyApplicationBeforeCachingSnapshot(){return y("turbo:before-cache")}notifyApplicationBeforeRender(e,t){return y("turbo:before-render",{detail:{newBody:e,resume:t},cancelable:!0})}notifyApplicationAfterRender(){return y("turbo:render")}notifyApplicationAfterPageLoad(e={}){return _(document.documentElement),y("turbo:load",{detail:{url:this.location.href,timing:e}})}notifyApplicationAfterVisitingSamePageLocation(e,t){dispatchEvent(new HashChangeEvent("hashchange",{oldURL:e.toString(),newURL:t.toString()}))}notifyApplicationAfterFrameLoad(e){return y("turbo:frame-load",{target:e})}notifyApplicationAfterFrameRender(e,t){return y("turbo:frame-render",{detail:{fetchResponse:e},target:t,cancelable:!0})}elementDriveEnabled(e){const t=null==e?void 0:e.closest("[data-turbo]");return this.drive?!t||"false"!=t.getAttribute("data-turbo"):!!t&&"true"==t.getAttribute("data-turbo")}getActionForLink(e){const t=e.getAttribute("data-turbo-action");return te(t)?t:"advance"}getTargetFrameForLink(e){const t=e.getAttribute("data-turbo-frame");if(t)return t;{const t=e.closest("turbo-frame");if(t)return t.id}}get snapshot(){return this.view.snapshot}},{navigator:he}=fe;function pe(){fe.start()}function me(e,t){fe.visit(e,t)}var ve=Object.freeze({__proto__:null,navigator:he,session:fe,PageRenderer:ae,PageSnapshot:V,start:pe,registerAdapter:function(e){fe.registerAdapter(e)},visit:me,connectStreamSource:function(e){fe.connectStreamSource(e)},disconnectStreamSource:function(e){fe.disconnectStreamSource(e)},renderStreamMessage:function(e){fe.renderStreamMessage(e)},clearCache:function(){fe.clearCache()},setProgressBarDelay:function(e){fe.setProgressBarDelay(e)},setConfirmMethod:function(e){R.confirmMethod=e}});class ge{constructor(e){this.visitCachedSnapshot=({element:e})=>{var t;const{id:n,clone:r}=this;null===(t=e.querySelector("#"+n))||void 0===t||t.replaceWith(r)},this.clone=e.cloneNode(!0),this.id=e.id}}function be(e){if(null!=e){const t=document.getElementById(e);if(t instanceof d)return t}}function ye(e,t){if(e){const r=e.getAttribute("src");if(null!=r&&null!=t&&(n=t,f(r).href==f(n).href))throw new Error(`Matching <turbo-frame id="${e.id}"> element has a source URL which references itself`);if(e.ownerDocument!==document&&(e=document.importNode(e,!0)),e instanceof d)return e.connectedCallback(),e.disconnectedCallback(),e}var n}const we={after(){this.targetElements.forEach((e=>{var t;return null===(t=e.parentElement)||void 0===t?void 0:t.insertBefore(this.templateContent,e.nextSibling)}))},append(){this.removeDuplicateTargetChildren(),this.targetElements.forEach((e=>e.append(this.templateContent)))},before(){this.targetElements.forEach((e=>{var t;return null===(t=e.parentElement)||void 0===t?void 0:t.insertBefore(this.templateContent,e)}))},prepend(){this.removeDuplicateTargetChildren(),this.targetElements.forEach((e=>e.prepend(this.templateContent)))},remove(){this.targetElements.forEach((e=>e.remove()))},replace(){this.targetElements.forEach((e=>e.replaceWith(this.templateContent)))},update(){this.targetElements.forEach((e=>{e.innerHTML="",e.append(this.templateContent)}))}};class xe extends HTMLElement{async connectedCallback(){try{await this.render()}catch(e){console.error(e)}finally{this.disconnect()}}async render(){var e;return null!==(e=this.renderPromise)&&void 0!==e?e:this.renderPromise=(async()=>{this.dispatchEvent(this.beforeRenderEvent)&&(await w(),this.performAction())})()}disconnect(){try{this.remove()}catch(e){}}removeDuplicateTargetChildren(){this.duplicateChildren.forEach((e=>e.remove()))}get duplicateChildren(){var e;const t=this.targetElements.flatMap((e=>[...e.children])).filter((e=>!!e.id)),n=[...null===(e=this.templateContent)||void 0===e?void 0:e.children].filter((e=>!!e.id)).map((e=>e.id));return t.filter((e=>n.includes(e.id)))}get performAction(){if(this.action){const e=we[this.action];if(e)return e;this.raise("unknown action")}this.raise("action attribute is missing")}get targetElements(){return this.target?this.targetElementsById:this.targets?this.targetElementsByQuery:void this.raise("target or targets attribute is missing")}get templateContent(){return this.templateElement.content.cloneNode(!0)}get templateElement(){if(this.firstElementChild instanceof HTMLTemplateElement)return this.firstElementChild;this.raise("first child element must be a <template> element")}get action(){return this.getAttribute("action")}get target(){return this.getAttribute("target")}get targets(){return this.getAttribute("targets")}raise(e){throw new Error(`${this.description}: ${e}`)}get description(){var e,t;return null!==(t=(null!==(e=this.outerHTML.match(/<[^>]+>/))&&void 0!==e?e:[])[0])&&void 0!==t?t:"<turbo-stream>"}get beforeRenderEvent(){return new CustomEvent("turbo:before-stream-render",{bubbles:!0,cancelable:!0})}get targetElementsById(){var e;const t=null===(e=this.ownerDocument)||void 0===e?void 0:e.getElementById(this.target);return null!==t?[t]:[]}get targetElementsByQuery(){var e;const t=null===(e=this.ownerDocument)||void 0===e?void 0:e.querySelectorAll(this.targets);return 0!==t.length?Array.prototype.slice.call(t):[]}}d.delegateConstructor=class{constructor(e){this.fetchResponseLoaded=e=>{},this.currentFetchRequest=null,this.resolveVisitPromise=()=>{},this.connected=!1,this.hasBeenLoaded=!1,this.settingSourceURL=!1,this.element=e,this.view=new F(this,this.element),this.appearanceObserver=new O(this,this.element),this.linkInterceptor=new P(this,this.element),this.formInterceptor=new I(this,this.element)}connect(){this.connected||(this.connected=!0,this.reloadable=!1,this.loadingStyle==i.lazy&&this.appearanceObserver.start(),this.linkInterceptor.start(),this.formInterceptor.start(),this.sourceURLChanged())}disconnect(){this.connected&&(this.connected=!1,this.appearanceObserver.stop(),this.linkInterceptor.stop(),this.formInterceptor.stop())}disabledChanged(){this.loadingStyle==i.eager&&this.loadSourceURL()}sourceURLChanged(){(this.loadingStyle==i.eager||this.hasBeenLoaded)&&this.loadSourceURL()}loadingStyleChanged(){this.loadingStyle==i.lazy?this.appearanceObserver.start():(this.appearanceObserver.stop(),this.loadSourceURL())}async loadSourceURL(){if(!this.settingSourceURL&&this.enabled&&this.isActive&&(this.reloadable||this.sourceURL!=this.currentURL)){const e=this.currentURL;if(this.currentURL=this.sourceURL,this.sourceURL)try{this.element.loaded=this.visit(f(this.sourceURL)),this.appearanceObserver.stop(),await this.element.loaded,this.hasBeenLoaded=!0}catch(t){throw this.currentURL=e,t}}}async loadResponse(e){(e.redirected||e.succeeded&&e.isHTML)&&(this.sourceURL=e.response.url);try{const t=await e.responseHTML;if(t){const{body:n}=x(t),r=new A(await this.extractForeignFrameElement(n)),o=new N(this.view.snapshot,r,!1,!1);this.view.renderPromise&&await this.view.renderPromise,await this.view.render(o),fe.frameRendered(e,this.element),fe.frameLoaded(this.element),this.fetchResponseLoaded(e)}}catch(e){console.error(e),this.view.invalidate()}finally{this.fetchResponseLoaded=()=>{}}}elementAppearedInViewport(e){this.loadSourceURL()}shouldInterceptLinkClick(e,t){return!e.hasAttribute("data-turbo-method")&&this.shouldInterceptNavigation(e)}linkClickIntercepted(e,t){this.reloadable=!0,this.navigateFrame(e,t)}shouldInterceptFormSubmission(e,t){return this.shouldInterceptNavigation(e,t)}formSubmissionIntercepted(e,t){this.formSubmission&&this.formSubmission.stop(),this.reloadable=!1,this.formSubmission=new R(this,e,t);const{fetchRequest:n}=this.formSubmission;this.prepareHeadersForRequest(n.headers,n),this.formSubmission.start()}prepareHeadersForRequest(e,t){e["Turbo-Frame"]=this.id}requestStarted(e){C(this.element)}requestPreventedHandlingResponse(e,t){this.resolveVisitPromise()}async requestSucceededWithResponse(e,t){await this.loadResponse(t),this.resolveVisitPromise()}requestFailedWithResponse(e,t){console.error(t),this.resolveVisitPromise()}requestErrored(e,t){console.error(t),this.resolveVisitPromise()}requestFinished(e){_(this.element)}formSubmissionStarted({formElement:e}){C(e,this.findFrameElement(e))}formSubmissionSucceededWithResponse(e,t){const n=this.findFrameElement(e.formElement,e.submitter);this.proposeVisitIfNavigatedWithAction(n,e.formElement,e.submitter),n.delegate.loadResponse(t)}formSubmissionFailedWithResponse(e,t){this.element.delegate.loadResponse(t)}formSubmissionErrored(e,t){console.error(t)}formSubmissionFinished({formElement:e}){_(e,this.findFrameElement(e))}allowsImmediateRender(e,t){return!0}viewRenderedSnapshot(e,t){}viewInvalidated(){}async visit(e){var t;const n=new T(this,s.get,e,new URLSearchParams,this.element);return null===(t=this.currentFetchRequest)||void 0===t||t.cancel(),this.currentFetchRequest=n,new Promise((e=>{this.resolveVisitPromise=()=>{this.resolveVisitPromise=()=>{},this.currentFetchRequest=null,e()},n.perform()}))}navigateFrame(e,t,n){const r=this.findFrameElement(e,n);this.proposeVisitIfNavigatedWithAction(r,e,n),r.setAttribute("reloadable",""),r.src=t}proposeVisitIfNavigatedWithAction(e,t,n){const r=E("data-turbo-action",n,t,e);if(te(r)){const{visitCachedSnapshot:t}=new ge(e);e.delegate.fetchResponseLoaded=n=>{if(e.src){const{statusCode:o,redirected:i}=n,s={statusCode:o,redirected:i,responseHTML:e.ownerDocument.documentElement.outerHTML};fe.visit(e.src,{action:r,response:s,visitCachedSnapshot:t,willRender:!1})}}}}findFrameElement(e,t){var n;return null!==(n=be(E("data-turbo-frame",t,e)||this.element.getAttribute("target")))&&void 0!==n?n:this.element}async extractForeignFrameElement(e){let t;const n=CSS.escape(this.id);try{if(t=ye(e.querySelector(`turbo-frame#${n}`),this.currentURL))return t;if(t=ye(e.querySelector(`turbo-frame[src][recurse~=${n}]`),this.currentURL))return await t.loaded,await this.extractForeignFrameElement(t);console.error(`Response has no matching <turbo-frame id="${n}"> element`)}catch(e){console.error(e)}return new d}formActionIsVisitable(e,t){return m(f(p(e,t)),this.rootLocation)}shouldInterceptNavigation(e,t){const n=E("data-turbo-frame",t,e)||this.element.getAttribute("target");if(e instanceof HTMLFormElement&&!this.formActionIsVisitable(e,t))return!1;if(!this.enabled||"_top"==n)return!1;if(n){const e=be(n);if(e)return!e.disabled}return!(!fe.elementDriveEnabled(e)||t&&!fe.elementDriveEnabled(t))}get id(){return this.element.id}get enabled(){return!this.element.disabled}get sourceURL(){if(this.element.src)return this.element.src}get reloadable(){return this.findFrameElement(this.element).hasAttribute("reloadable")}set reloadable(e){const t=this.findFrameElement(this.element);e?t.setAttribute("reloadable",""):t.removeAttribute("reloadable")}set sourceURL(e){this.settingSourceURL=!0,this.element.src=null!=e?e:null,this.currentURL=this.element.src,this.settingSourceURL=!1}get loadingStyle(){return this.element.loading}get isLoading(){return void 0!==this.formSubmission||void 0!==this.resolveVisitPromise()}get isActive(){return this.element.isActive&&this.connected}get rootLocation(){var e;const t=this.element.ownerDocument.querySelector('meta[name="turbo-root"]');return f(null!==(e=null==t?void 0:t.content)&&void 0!==e?e:"/")}},customElements.define("turbo-frame",d),customElements.define("turbo-stream",xe),(()=>{let e=document.currentScript;if(e&&!e.hasAttribute("data-turbo-suppress-warning"))for(;e=e.parentElement;)if(e==document.body)return console.warn(k`
+    `}constructor(){this.hiding=!1,this.value=0,this.visible=!1,this.trickle=()=>{this.setValue(this.value+Math.random()/100)},this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement(),this.installStylesheetElement(),this.setValue(0)}show(){this.visible||(this.visible=!0,this.installProgressElement(),this.startTrickling())}hide(){this.visible&&!this.hiding&&(this.hiding=!0,this.fadeProgressElement((()=>{this.uninstallProgressElement(),this.stopTrickling(),this.visible=!1,this.hiding=!1})))}setValue(e){this.value=e,this.refresh()}installStylesheetElement(){document.head.insertBefore(this.stylesheetElement,document.head.firstChild)}installProgressElement(){this.progressElement.style.width="0",this.progressElement.style.opacity="1",document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()}fadeProgressElement(e){this.progressElement.style.opacity="0",setTimeout(e,1.5*G.animationDuration)}uninstallProgressElement(){this.progressElement.parentNode&&document.documentElement.removeChild(this.progressElement)}startTrickling(){this.trickleInterval||(this.trickleInterval=window.setInterval(this.trickle,G.animationDuration))}stopTrickling(){window.clearInterval(this.trickleInterval),delete this.trickleInterval}refresh(){requestAnimationFrame((()=>{this.progressElement.style.width=10+90*this.value+"%"}))}createStylesheetElement(){const e=document.createElement("style");return e.type="text/css",e.textContent=G.defaultCSS,this.cspNonce&&(e.nonce=this.cspNonce),e}createProgressElement(){const e=document.createElement("div");return e.className="turbo-progress-bar",e}get cspNonce(){return R("csp-nonce")}}G.animationDuration=300;class X extends N{constructor(){super(...arguments),this.detailsByOuterHTML=this.children.filter((e=>!function(e){return"noscript"==e.localName}(e))).map((e=>function(e){return e.hasAttribute("nonce")&&e.setAttribute("nonce",""),e}(e))).reduce(((e,t)=>{const{outerHTML:n}=t,r=n in e?e[n]:{type:J(t),tracked:Q(t),elements:[]};return Object.assign(Object.assign({},e),{[n]:Object.assign(Object.assign({},r),{elements:[...r.elements,t]})})}),{})}get trackedElementSignature(){return Object.keys(this.detailsByOuterHTML).filter((e=>this.detailsByOuterHTML[e].tracked)).join("")}getScriptElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot("script",e)}getStylesheetElementsNotInSnapshot(e){return this.getElementsMatchingTypeNotInSnapshot("stylesheet",e)}getElementsMatchingTypeNotInSnapshot(e,t){return Object.keys(this.detailsByOuterHTML).filter((e=>!(e in t.detailsByOuterHTML))).map((e=>this.detailsByOuterHTML[e])).filter((({type:t})=>t==e)).map((({elements:[e]})=>e))}get provisionalElements(){return Object.keys(this.detailsByOuterHTML).reduce(((e,t)=>{const{type:n,tracked:r,elements:o}=this.detailsByOuterHTML[t];return null!=n||r?o.length>1?[...e,...o.slice(1)]:e:[...e,...o]}),[])}getMetaValue(e){const t=this.findMetaElementByName(e);return t?t.getAttribute("content"):null}findMetaElementByName(e){return Object.keys(this.detailsByOuterHTML).reduce(((t,n)=>{const{elements:[r]}=this.detailsByOuterHTML[n];return function(e,t){return"meta"==e.localName&&e.getAttribute("name")==t}(r,e)?r:t}),void 0)}}function J(e){return function(e){return"script"==e.localName}(e)?"script":function(e){const t=e.localName;return"style"==t||"link"==t&&"stylesheet"==e.getAttribute("rel")}(e)?"stylesheet":void 0}function Q(e){return"reload"==e.getAttribute("data-turbo-track")}class ee extends N{static fromHTMLString(e=""){return this.fromDocument(k(e))}static fromElement(e){return this.fromDocument(e.ownerDocument)}static fromDocument({head:e,body:t}){return new this(t,new X(e))}constructor(e,t){super(e),this.headSnapshot=t}clone(){const e=this.element.cloneNode(!0),t=this.element.querySelectorAll("select"),n=e.querySelectorAll("select");for(const[e,r]of t.entries()){const t=n[e];for(const e of t.selectedOptions)e.selected=!1;for(const e of r.selectedOptions)t.options[e.index].selected=!0}for(const t of e.querySelectorAll('input[type="password"]'))t.value="";return new ee(e,this.headSnapshot)}get headElement(){return this.headSnapshot.element}get rootLocation(){var e;return h(null!==(e=this.getSetting("root"))&&void 0!==e?e:"/")}get cacheControlValue(){return this.getSetting("cache-control")}get isPreviewable(){return"no-preview"!=this.cacheControlValue}get isCacheable(){return"no-cache"!=this.cacheControlValue}get isVisitable(){return"reload"!=this.getSetting("visit-control")}getSetting(e){return this.headSnapshot.getMetaValue(`turbo-${e}`)}}!function(e){e.visitStart="visitStart",e.requestStart="requestStart",e.requestEnd="requestEnd",e.visitEnd="visitEnd"}(c||(c={})),function(e){e.initialized="initialized",e.started="started",e.canceled="canceled",e.failed="failed",e.completed="completed"}(u||(u={}));const te={action:"advance",historyChanged:!1,visitCachedSnapshot:()=>{},willRender:!0,updateHistory:!0,shouldCacheSnapshot:!0,acceptsStreamResponse:!1};var ne,re;!function(e){e[e.networkFailure=0]="networkFailure",e[e.timeoutFailure=-1]="timeoutFailure",e[e.contentTypeMismatch=-2]="contentTypeMismatch"}(ne||(ne={}));class oe{constructor(e,t,n,r={}){this.identifier=E(),this.timingMetrics={},this.followedRedirect=!1,this.historyChanged=!1,this.scrolled=!1,this.shouldCacheSnapshot=!0,this.acceptsStreamResponse=!1,this.snapshotCached=!1,this.state=u.initialized,this.delegate=e,this.location=t,this.restorationIdentifier=n||E();const{action:o,historyChanged:i,referrer:s,snapshot:a,snapshotHTML:l,response:c,visitCachedSnapshot:d,willRender:h,updateHistory:p,shouldCacheSnapshot:f,acceptsStreamResponse:m}=Object.assign(Object.assign({},te),r);this.action=o,this.historyChanged=i,this.referrer=s,this.snapshot=a,this.snapshotHTML=l,this.response=c,this.isSamePage=this.delegate.locationWithActionIsSamePage(this.location,this.action),this.visitCachedSnapshot=d,this.willRender=h,this.updateHistory=p,this.scrolled=!h,this.shouldCacheSnapshot=f,this.acceptsStreamResponse=m}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get history(){return this.delegate.history}get restorationData(){return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)}get silent(){return this.isSamePage}start(){this.state==u.initialized&&(this.recordTimingMetric(c.visitStart),this.state=u.started,this.adapter.visitStarted(this),this.delegate.visitStarted(this))}cancel(){this.state==u.started&&(this.request&&this.request.cancel(),this.cancelRender(),this.state=u.canceled)}complete(){this.state==u.started&&(this.recordTimingMetric(c.visitEnd),this.state=u.completed,this.followRedirect(),this.followedRedirect||(this.adapter.visitCompleted(this),this.delegate.visitCompleted(this)))}fail(){this.state==u.started&&(this.state=u.failed,this.adapter.visitFailed(this))}changeHistory(){var e;if(!this.historyChanged&&this.updateHistory){const t=A(this.location.href===(null===(e=this.referrer)||void 0===e?void 0:e.href)?"replace":this.action);this.history.update(t,this.location,this.restorationIdentifier),this.historyChanged=!0}}issueRequest(){this.hasPreloadedResponse()?this.simulateRequest():this.shouldIssueRequest()&&!this.request&&(this.request=new I(this,s.get,this.location),this.request.perform())}simulateRequest(){this.response&&(this.startRequest(),this.recordResponse(),this.finishRequest())}startRequest(){this.recordTimingMetric(c.requestStart),this.adapter.visitRequestStarted(this)}recordResponse(e=this.response){if(this.response=e,e){const{statusCode:t}=e;ie(t)?this.adapter.visitRequestCompleted(this):this.adapter.visitRequestFailedWithStatusCode(this,t)}}finishRequest(){this.recordTimingMetric(c.requestEnd),this.adapter.visitRequestFinished(this)}loadResponse(){if(this.response){const{statusCode:e,responseHTML:t}=this.response;this.render((async()=>{this.shouldCacheSnapshot&&this.cacheSnapshot(),this.view.renderPromise&&await this.view.renderPromise,ie(e)&&null!=t?(await this.view.renderPage(ee.fromHTMLString(t),!1,this.willRender,this),this.performScroll(),this.adapter.visitRendered(this),this.complete()):(await this.view.renderError(ee.fromHTMLString(t),this),this.adapter.visitRendered(this),this.fail())}))}}getCachedSnapshot(){const e=this.view.getCachedSnapshotForLocation(this.location)||this.getPreloadedSnapshot();if(e&&(!p(this.location)||e.hasAnchor(p(this.location)))&&("restore"==this.action||e.isPreviewable))return e}getPreloadedSnapshot(){if(this.snapshotHTML)return ee.fromHTMLString(this.snapshotHTML)}hasCachedSnapshot(){return null!=this.getCachedSnapshot()}loadCachedSnapshot(){const e=this.getCachedSnapshot();if(e){const t=this.shouldIssueRequest();this.render((async()=>{this.cacheSnapshot(),this.isSamePage?this.adapter.visitRendered(this):(this.view.renderPromise&&await this.view.renderPromise,await this.view.renderPage(e,t,this.willRender,this),this.performScroll(),this.adapter.visitRendered(this),t||this.complete())}))}}followRedirect(){var e;this.redirectedToLocation&&!this.followedRedirect&&(null===(e=this.response)||void 0===e?void 0:e.redirected)&&(this.adapter.visitProposedToLocation(this.redirectedToLocation,{action:"replace",response:this.response,shouldCacheSnapshot:!1,willRender:!1}),this.followedRedirect=!0)}goToSamePageAnchor(){this.isSamePage&&this.render((async()=>{this.cacheSnapshot(),this.performScroll(),this.changeHistory(),this.adapter.visitRendered(this)}))}prepareRequest(e){this.acceptsStreamResponse&&e.acceptResponseType(P.contentType)}requestStarted(){this.startRequest()}requestPreventedHandlingResponse(e,t){}async requestSucceededWithResponse(e,t){const n=await t.responseHTML,{redirected:r,statusCode:o}=t;null==n?this.recordResponse({statusCode:ne.contentTypeMismatch,redirected:r}):(this.redirectedToLocation=t.redirected?t.location:void 0,this.recordResponse({statusCode:o,responseHTML:n,redirected:r}))}async requestFailedWithResponse(e,t){const n=await t.responseHTML,{redirected:r,statusCode:o}=t;null==n?this.recordResponse({statusCode:ne.contentTypeMismatch,redirected:r}):this.recordResponse({statusCode:o,responseHTML:n,redirected:r})}requestErrored(e,t){this.recordResponse({statusCode:ne.networkFailure,redirected:!1})}requestFinished(){this.finishRequest()}performScroll(){this.scrolled||this.view.forceReloaded||("restore"==this.action?this.scrollToRestoredPosition()||this.scrollToAnchor()||this.view.scrollToTop():this.scrollToAnchor()||this.view.scrollToTop(),this.isSamePage&&this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation,this.location),this.scrolled=!0)}scrollToRestoredPosition(){const{scrollPosition:e}=this.restorationData;if(e)return this.view.scrollToPosition(e),!0}scrollToAnchor(){const e=p(this.location);if(null!=e)return this.view.scrollToAnchor(e),!0}recordTimingMetric(e){this.timingMetrics[e]=(new Date).getTime()}getTimingMetrics(){return Object.assign({},this.timingMetrics)}getHistoryMethodForAction(e){switch(e){case"replace":return history.replaceState;case"advance":case"restore":return history.pushState}}hasPreloadedResponse(){return"object"==typeof this.response}shouldIssueRequest(){return!this.isSamePage&&("restore"==this.action?!this.hasCachedSnapshot():this.willRender)}cacheSnapshot(){this.snapshotCached||(this.view.cacheSnapshot(this.snapshot).then((e=>e&&this.visitCachedSnapshot(e))),this.snapshotCached=!0)}async render(e){this.cancelRender(),await new Promise((e=>{this.frame=requestAnimationFrame((()=>e()))})),await e(),delete this.frame}cancelRender(){this.frame&&(cancelAnimationFrame(this.frame),delete this.frame)}}function ie(e){return e>=200&&e<300}class se{constructor(e){this.progressBar=new G,this.showProgressBar=()=>{this.progressBar.show()},this.session=e}visitProposedToLocation(e,t){this.navigator.startVisit(e,(null==t?void 0:t.restorationIdentifier)||E(),t)}visitStarted(e){this.location=e.location,e.loadCachedSnapshot(),e.issueRequest(),e.goToSamePageAnchor()}visitRequestStarted(e){this.progressBar.setValue(0),e.hasCachedSnapshot()||"restore"!=e.action?this.showVisitProgressBarAfterDelay():this.showProgressBar()}visitRequestCompleted(e){e.loadResponse()}visitRequestFailedWithStatusCode(e,t){switch(t){case ne.networkFailure:case ne.timeoutFailure:case ne.contentTypeMismatch:return this.reload({reason:"request_failed",context:{statusCode:t}});default:return e.loadResponse()}}visitRequestFinished(e){this.progressBar.setValue(1),this.hideVisitProgressBar()}visitCompleted(e){}pageInvalidated(e){this.reload(e)}visitFailed(e){}visitRendered(e){}formSubmissionStarted(e){this.progressBar.setValue(0),this.showFormProgressBarAfterDelay()}formSubmissionFinished(e){this.progressBar.setValue(1),this.hideFormProgressBar()}showVisitProgressBarAfterDelay(){this.visitProgressBarTimeout=window.setTimeout(this.showProgressBar,this.session.progressBarDelay)}hideVisitProgressBar(){this.progressBar.hide(),null!=this.visitProgressBarTimeout&&(window.clearTimeout(this.visitProgressBarTimeout),delete this.visitProgressBarTimeout)}showFormProgressBarAfterDelay(){null==this.formProgressBarTimeout&&(this.formProgressBarTimeout=window.setTimeout(this.showProgressBar,this.session.progressBarDelay))}hideFormProgressBar(){this.progressBar.hide(),null!=this.formProgressBarTimeout&&(window.clearTimeout(this.formProgressBarTimeout),delete this.formProgressBarTimeout)}reload(e){var t;w("turbo:reload",{detail:e}),window.location.href=(null===(t=this.location)||void 0===t?void 0:t.toString())||window.location.href}get navigator(){return this.session.navigator}}class ae{constructor(){this.selector="[data-turbo-temporary]",this.deprecatedSelector="[data-turbo-cache=false]",this.started=!1,this.removeTemporaryElements=e=>{for(const e of this.temporaryElements)e.remove()}}start(){this.started||(this.started=!0,addEventListener("turbo:before-cache",this.removeTemporaryElements,!1))}stop(){this.started&&(this.started=!1,removeEventListener("turbo:before-cache",this.removeTemporaryElements,!1))}get temporaryElements(){return[...document.querySelectorAll(this.selector),...this.temporaryElementsWithDeprecation]}get temporaryElementsWithDeprecation(){const e=document.querySelectorAll(this.deprecatedSelector);return e.length&&console.warn(`The ${this.deprecatedSelector} selector is deprecated and will be removed in a future version. Use ${this.selector} instead.`),[...e]}}class le{constructor(e,t){this.session=e,this.element=t,this.linkInterceptor=new q(this,t),this.formSubmitObserver=new V(this,t)}start(){this.linkInterceptor.start(),this.formSubmitObserver.start()}stop(){this.linkInterceptor.stop(),this.formSubmitObserver.stop()}shouldInterceptLinkClick(e,t,n){return this.shouldRedirect(e)}linkClickIntercepted(e,t,n){const r=this.findFrameElement(e);r&&r.delegate.linkClickIntercepted(e,t,n)}willSubmitForm(e,t){return null==e.closest("turbo-frame")&&this.shouldSubmit(e,t)&&this.shouldRedirect(e,t)}formSubmitted(e,t){const n=this.findFrameElement(e,t);n&&n.delegate.formSubmitted(e,t)}shouldSubmit(e,t){var n;const r=f(e,t),o=this.element.ownerDocument.querySelector('meta[name="turbo-root"]'),i=h(null!==(n=null==o?void 0:o.content)&&void 0!==n?n:"/");return this.shouldRedirect(e,t)&&m(r,i)}shouldRedirect(e,t){if(e instanceof HTMLFormElement?this.session.submissionIsNavigatable(e,t):this.session.elementIsNavigatable(e)){const n=this.findFrameElement(e,t);return!!n&&n!=e.closest("turbo-frame")}return!1}findFrameElement(e,t){const n=(null==t?void 0:t.getAttribute("data-turbo-frame"))||e.getAttribute("data-turbo-frame");if(n&&"_top"!=n){const e=this.element.querySelector(`#${n}:not([disabled])`);if(e instanceof d)return e}}}class ce{constructor(e){this.restorationIdentifier=E(),this.restorationData={},this.started=!1,this.pageLoaded=!1,this.onPopState=e=>{if(this.shouldHandlePopState()){const{turbo:t}=e.state||{};if(t){this.location=new URL(window.location.href);const{restorationIdentifier:e}=t;this.restorationIdentifier=e,this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location,e)}}},this.onPageLoad=async e=>{await Promise.resolve(),this.pageLoaded=!0},this.delegate=e}start(){this.started||(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0,this.replace(new URL(window.location.href)))}stop(){this.started&&(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1)}push(e,t){this.update(history.pushState,e,t)}replace(e,t){this.update(history.replaceState,e,t)}update(e,t,n=E()){const r={turbo:{restorationIdentifier:n}};e.call(history,r,"",t.href),this.location=t,this.restorationIdentifier=n}getRestorationDataForIdentifier(e){return this.restorationData[e]||{}}updateRestorationData(e){const{restorationIdentifier:t}=this,n=this.restorationData[t];this.restorationData[t]=Object.assign(Object.assign({},n),e)}assumeControlOfScrollRestoration(){var e;this.previousScrollRestoration||(this.previousScrollRestoration=null!==(e=history.scrollRestoration)&&void 0!==e?e:"auto",history.scrollRestoration="manual")}relinquishControlOfScrollRestoration(){this.previousScrollRestoration&&(history.scrollRestoration=this.previousScrollRestoration,delete this.previousScrollRestoration)}shouldHandlePopState(){return this.pageIsLoaded()}pageIsLoaded(){return this.pageLoaded||"complete"==document.readyState}}class ue{constructor(e){this.delegate=e}proposeVisit(e,t={}){this.delegate.allowsVisitingLocationWithAction(e,t.action)&&(m(e,this.view.snapshot.rootLocation)?this.delegate.visitProposedToLocation(e,t):window.location.href=e.toString())}startVisit(e,t,n={}){this.stop(),this.currentVisit=new oe(this,h(e),t,Object.assign({referrer:this.location},n)),this.currentVisit.start()}submitForm(e,t){this.stop(),this.formSubmission=new H(this,e,t,!0),this.formSubmission.start()}stop(){this.formSubmission&&(this.formSubmission.stop(),delete this.formSubmission),this.currentVisit&&(this.currentVisit.cancel(),delete this.currentVisit)}get adapter(){return this.delegate.adapter}get view(){return this.delegate.view}get history(){return this.delegate.history}formSubmissionStarted(e){"function"==typeof this.adapter.formSubmissionStarted&&this.adapter.formSubmissionStarted(e)}async formSubmissionSucceededWithResponse(e,t){if(e==this.formSubmission){const n=await t.responseHTML;if(n){const r=e.isSafe;r||this.view.clearSnapshotCache();const{statusCode:o,redirected:i}=t,s={action:this.getActionForFormSubmission(e),shouldCacheSnapshot:r,response:{statusCode:o,responseHTML:n,redirected:i}};this.proposeVisit(t.location,s)}}}async formSubmissionFailedWithResponse(e,t){const n=await t.responseHTML;if(n){const e=ee.fromHTMLString(n);t.serverError?await this.view.renderError(e,this.currentVisit):await this.view.renderPage(e,!1,!0,this.currentVisit),this.view.scrollToTop(),this.view.clearSnapshotCache()}}formSubmissionErrored(e,t){console.error(t)}formSubmissionFinished(e){"function"==typeof this.adapter.formSubmissionFinished&&this.adapter.formSubmissionFinished(e)}visitStarted(e){this.delegate.visitStarted(e)}visitCompleted(e){this.delegate.visitCompleted(e)}locationWithActionIsSamePage(e,t){const n=p(e),r=p(this.view.lastRenderedLocation),o="restore"===t&&void 0===n;return"replace"!==t&&v(e)===v(this.view.lastRenderedLocation)&&(o||null!=n&&n!==r)}visitScrolledToSamePageLocation(e,t){this.delegate.visitScrolledToSamePageLocation(e,t)}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}getActionForFormSubmission({submitter:e,formElement:t}){return D(e,t)||"advance"}}!function(e){e[e.initial=0]="initial",e[e.loading=1]="loading",e[e.interactive=2]="interactive",e[e.complete=3]="complete"}(re||(re={}));class de{constructor(e){this.stage=re.initial,this.started=!1,this.interpretReadyState=()=>{const{readyState:e}=this;"interactive"==e?this.pageIsInteractive():"complete"==e&&this.pageIsComplete()},this.pageWillUnload=()=>{this.delegate.pageWillUnload()},this.delegate=e}start(){this.started||(this.stage==re.initial&&(this.stage=re.loading),document.addEventListener("readystatechange",this.interpretReadyState,!1),addEventListener("pagehide",this.pageWillUnload,!1),this.started=!0)}stop(){this.started&&(document.removeEventListener("readystatechange",this.interpretReadyState,!1),removeEventListener("pagehide",this.pageWillUnload,!1),this.started=!1)}pageIsInteractive(){this.stage==re.loading&&(this.stage=re.interactive,this.delegate.pageBecameInteractive())}pageIsComplete(){this.pageIsInteractive(),this.stage==re.interactive&&(this.stage=re.complete,this.delegate.pageLoaded())}get readyState(){return document.readyState}}class he{constructor(e){this.started=!1,this.onScroll=()=>{this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},this.delegate=e}start(){this.started||(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)}stop(){this.started&&(removeEventListener("scroll",this.onScroll,!1),this.started=!1)}updatePosition(e){this.delegate.scrollPositionChanged(e)}}class pe{render({fragment:e}){U.preservingPermanentElements(this,function(e){const t=B(document.documentElement),n={};for(const r of t){const{id:t}=r;for(const o of e.querySelectorAll("turbo-stream")){const e=W(o.templateElement.content,t);e&&(n[t]=[r,e])}}return n}(e),(()=>document.documentElement.appendChild(e)))}enteringBardo(e,t){t.replaceWith(e.cloneNode(!0))}leavingBardo(){}}class fe{constructor(e){this.sources=new Set,this.started=!1,this.inspectFetchResponse=e=>{const t=function(e){var t;const n=null===(t=e.detail)||void 0===t?void 0:t.fetchResponse;if(n instanceof b)return n}(e);t&&function(e){var t;return(null!==(t=e.contentType)&&void 0!==t?t:"").startsWith(P.contentType)}(t)&&(e.preventDefault(),this.receiveMessageResponse(t))},this.receiveMessageEvent=e=>{this.started&&"string"==typeof e.data&&this.receiveMessageHTML(e.data)},this.delegate=e}start(){this.started||(this.started=!0,addEventListener("turbo:before-fetch-response",this.inspectFetchResponse,!1))}stop(){this.started&&(this.started=!1,removeEventListener("turbo:before-fetch-response",this.inspectFetchResponse,!1))}connectStreamSource(e){this.streamSourceIsConnected(e)||(this.sources.add(e),e.addEventListener("message",this.receiveMessageEvent,!1))}disconnectStreamSource(e){this.streamSourceIsConnected(e)&&(this.sources.delete(e),e.removeEventListener("message",this.receiveMessageEvent,!1))}streamSourceIsConnected(e){return this.sources.has(e)}async receiveMessageResponse(e){const t=await e.responseHTML;t&&this.receiveMessageHTML(t)}receiveMessageHTML(e){this.delegate.receivedMessageFromStream(P.wrap(e))}}class me extends K{static renderElement(e,t){const{documentElement:n,body:r}=document;n.replaceChild(t,r)}async render(){this.replaceHeadAndBody(),this.activateScriptElements()}replaceHeadAndBody(){const{documentElement:e,head:t}=document;e.replaceChild(this.newHead,t),this.renderElement(this.currentElement,this.newElement)}activateScriptElements(){for(const e of this.scriptElements){const t=e.parentNode;if(t){const n=y(e);t.replaceChild(n,e)}}}get newHead(){return this.newSnapshot.headSnapshot.element}get scriptElements(){return document.documentElement.querySelectorAll("script")}}class ve extends K{static renderElement(e,t){document.body&&t instanceof HTMLBodyElement?document.body.replaceWith(t):document.documentElement.appendChild(t)}get shouldRender(){return this.newSnapshot.isVisitable&&this.trackedElementsAreIdentical}get reloadReason(){return this.newSnapshot.isVisitable?this.trackedElementsAreIdentical?void 0:{reason:"tracked_element_mismatch"}:{reason:"turbo_visit_control_is_reload"}}async prepareToRender(){await this.mergeHead()}async render(){this.willRender&&await this.replaceBody()}finishRendering(){super.finishRendering(),this.isPreview||this.focusFirstAutofocusableElement()}get currentHeadSnapshot(){return this.currentSnapshot.headSnapshot}get newHeadSnapshot(){return this.newSnapshot.headSnapshot}get newElement(){return this.newSnapshot.element}async mergeHead(){const e=this.mergeProvisionalElements(),t=this.copyNewHeadStylesheetElements();this.copyNewHeadScriptElements(),await e,await t}async replaceBody(){await this.preservingPermanentElements((async()=>{this.activateNewBody(),await this.assignNewBody()}))}get trackedElementsAreIdentical(){return this.currentHeadSnapshot.trackedElementSignature==this.newHeadSnapshot.trackedElementSignature}async copyNewHeadStylesheetElements(){const e=[];for(const t of this.newHeadStylesheetElements)e.push(L(t)),document.head.appendChild(t);await Promise.all(e)}copyNewHeadScriptElements(){for(const e of this.newHeadScriptElements)document.head.appendChild(y(e))}async mergeProvisionalElements(){const e=[...this.newHeadProvisionalElements];for(const t of this.currentHeadProvisionalElements)this.isCurrentElementInElementList(t,e)||document.head.removeChild(t);for(const t of e)document.head.appendChild(t)}isCurrentElementInElementList(e,t){for(const[n,r]of t.entries()){if("TITLE"==e.tagName){if("TITLE"!=r.tagName)continue;if(e.innerHTML==r.innerHTML)return t.splice(n,1),!0}if(r.isEqualNode(e))return t.splice(n,1),!0}return!1}removeCurrentHeadProvisionalElements(){for(const e of this.currentHeadProvisionalElements)document.head.removeChild(e)}copyNewHeadProvisionalElements(){for(const e of this.newHeadProvisionalElements)document.head.appendChild(e)}activateNewBody(){document.adoptNode(this.newElement),this.activateNewBodyScriptElements()}activateNewBodyScriptElements(){for(const e of this.newBodyScriptElements){const t=y(e);e.replaceWith(t)}}async assignNewBody(){await this.renderElement(this.currentElement,this.newElement)}get newHeadStylesheetElements(){return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)}get newHeadScriptElements(){return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)}get currentHeadProvisionalElements(){return this.currentHeadSnapshot.provisionalElements}get newHeadProvisionalElements(){return this.newHeadSnapshot.provisionalElements}get newBodyScriptElements(){return this.newElement.querySelectorAll("script")}}class ge{constructor(e){this.keys=[],this.snapshots={},this.size=e}has(e){return g(e)in this.snapshots}get(e){if(this.has(e)){const t=this.read(e);return this.touch(e),t}}put(e,t){return this.write(e,t),this.touch(e),t}clear(){this.snapshots={}}read(e){return this.snapshots[g(e)]}write(e,t){this.snapshots[g(e)]=t}touch(e){const t=g(e),n=this.keys.indexOf(t);n>-1&&this.keys.splice(n,1),this.keys.unshift(t),this.trim()}trim(){for(const e of this.keys.splice(this.size))delete this.snapshots[e]}}class be extends j{constructor(){super(...arguments),this.snapshotCache=new ge(10),this.lastRenderedLocation=new URL(location.href),this.forceReloaded=!1}renderPage(e,t=!1,n=!0,r){const o=new ve(this.snapshot,e,ve.renderElement,t,n);return o.shouldRender?null==r||r.changeHistory():this.forceReloaded=!0,this.render(o)}renderError(e,t){null==t||t.changeHistory();const n=new me(this.snapshot,e,me.renderElement,!1);return this.render(n)}clearSnapshotCache(){this.snapshotCache.clear()}async cacheSnapshot(e=this.snapshot){if(e.isCacheable){this.delegate.viewWillCacheSnapshot();const{lastRenderedLocation:t}=this;await new Promise((e=>setTimeout((()=>e()),0)));const n=e.clone();return this.snapshotCache.put(t,n),n}}getCachedSnapshotForLocation(e){return this.snapshotCache.get(e)}get snapshot(){return ee.fromElement(this.element)}}class ye{constructor(e){this.selector="a[data-turbo-preload]",this.delegate=e}get snapshotCache(){return this.delegate.navigator.view.snapshotCache}start(){if("loading"===document.readyState)return document.addEventListener("DOMContentLoaded",(()=>{this.preloadOnLoadLinksForView(document.body)}));this.preloadOnLoadLinksForView(document.body)}preloadOnLoadLinksForView(e){for(const t of e.querySelectorAll(this.selector))this.preloadURL(t)}async preloadURL(e){const t=new URL(e.href);if(!this.snapshotCache.has(t))try{const e=await fetch(t.toString(),{headers:{"VND.PREFETCH":"true",Accept:"text/html"}}),n=await e.text(),r=ee.fromHTMLString(n);this.snapshotCache.put(t,r)}catch(e){}}}function we(e){Object.defineProperties(e,Se)}const Se={absoluteURL:{get(){return this.toString()}}},ke={after(){this.targetElements.forEach((e=>{var t;return null===(t=e.parentElement)||void 0===t?void 0:t.insertBefore(this.templateContent,e.nextSibling)}))},append(){this.removeDuplicateTargetChildren(),this.targetElements.forEach((e=>e.append(this.templateContent)))},before(){this.targetElements.forEach((e=>{var t;return null===(t=e.parentElement)||void 0===t?void 0:t.insertBefore(this.templateContent,e)}))},prepend(){this.removeDuplicateTargetChildren(),this.targetElements.forEach((e=>e.prepend(this.templateContent)))},remove(){this.targetElements.forEach((e=>e.remove()))},replace(){this.targetElements.forEach((e=>e.replaceWith(this.templateContent)))},update(){this.targetElements.forEach((e=>{e.innerHTML="",e.append(this.templateContent)}))}},xe=new class{constructor(){this.navigator=new ue(this),this.history=new ce(this),this.preloader=new ye(this),this.view=new be(this,document.documentElement),this.adapter=new se(this),this.pageObserver=new de(this),this.cacheObserver=new ae,this.linkClickObserver=new $(this,window),this.formSubmitObserver=new V(this,document),this.scrollObserver=new he(this),this.streamObserver=new fe(this),this.formLinkClickObserver=new Z(this,document.documentElement),this.frameRedirector=new le(this,document.documentElement),this.streamMessageRenderer=new pe,this.drive=!0,this.enabled=!0,this.progressBarDelay=500,this.started=!1,this.formMode="on"}start(){this.started||(this.pageObserver.start(),this.cacheObserver.start(),this.formLinkClickObserver.start(),this.linkClickObserver.start(),this.formSubmitObserver.start(),this.scrollObserver.start(),this.streamObserver.start(),this.frameRedirector.start(),this.history.start(),this.preloader.start(),this.started=!0,this.enabled=!0)}disable(){this.enabled=!1}stop(){this.started&&(this.pageObserver.stop(),this.cacheObserver.stop(),this.formLinkClickObserver.stop(),this.linkClickObserver.stop(),this.formSubmitObserver.stop(),this.scrollObserver.stop(),this.streamObserver.stop(),this.frameRedirector.stop(),this.history.stop(),this.started=!1)}registerAdapter(e){this.adapter=e}visit(e,t={}){const n=t.frame?document.getElementById(t.frame):null;n instanceof d?(n.src=e.toString(),n.loaded):this.navigator.proposeVisit(h(e),t)}connectStreamSource(e){this.streamObserver.connectStreamSource(e)}disconnectStreamSource(e){this.streamObserver.disconnectStreamSource(e)}renderStreamMessage(e){this.streamMessageRenderer.render(P.wrap(e))}clearCache(){this.view.clearSnapshotCache()}setProgressBarDelay(e){this.progressBarDelay=e}setFormMode(e){this.formMode=e}get location(){return this.history.location}get restorationIdentifier(){return this.history.restorationIdentifier}historyPoppedToLocationWithRestorationIdentifier(e,t){this.enabled?this.navigator.startVisit(e,t,{action:"restore",historyChanged:!0}):this.adapter.pageInvalidated({reason:"turbo_disabled"})}scrollPositionChanged(e){this.history.updateRestorationData({scrollPosition:e})}willSubmitFormLinkToLocation(e,t){return this.elementIsNavigatable(e)&&m(t,this.snapshot.rootLocation)}submittedFormLinkToLocation(){}willFollowLinkToLocation(e,t,n){return this.elementIsNavigatable(e)&&m(t,this.snapshot.rootLocation)&&this.applicationAllowsFollowingLinkToLocation(e,t,n)}followedLinkToLocation(e,t){const n=this.getActionForLink(e),r=e.hasAttribute("data-turbo-stream");this.visit(t.href,{action:n,acceptsStreamResponse:r})}allowsVisitingLocationWithAction(e,t){return this.locationWithActionIsSamePage(e,t)||this.applicationAllowsVisitingLocation(e)}visitProposedToLocation(e,t){we(e),this.adapter.visitProposedToLocation(e,t)}visitStarted(e){e.acceptsStreamResponse||_(document.documentElement),we(e.location),e.silent||this.notifyApplicationAfterVisitingLocation(e.location,e.action)}visitCompleted(e){T(document.documentElement),this.notifyApplicationAfterPageLoad(e.getTimingMetrics())}locationWithActionIsSamePage(e,t){return this.navigator.locationWithActionIsSamePage(e,t)}visitScrolledToSamePageLocation(e,t){this.notifyApplicationAfterVisitingSamePageLocation(e,t)}willSubmitForm(e,t){const n=f(e,t);return this.submissionIsNavigatable(e,t)&&m(h(n),this.snapshot.rootLocation)}formSubmitted(e,t){this.navigator.submitForm(e,t)}pageBecameInteractive(){this.view.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()}pageLoaded(){this.history.assumeControlOfScrollRestoration()}pageWillUnload(){this.history.relinquishControlOfScrollRestoration()}receivedMessageFromStream(e){this.renderStreamMessage(e)}viewWillCacheSnapshot(){var e;(null===(e=this.navigator.currentVisit)||void 0===e?void 0:e.silent)||this.notifyApplicationBeforeCachingSnapshot()}allowsImmediateRender({element:e},t){const n=this.notifyApplicationBeforeRender(e,t),{defaultPrevented:r,detail:{render:o}}=n;return this.view.renderer&&o&&(this.view.renderer.renderElement=o),!r}viewRenderedSnapshot(e,t){this.view.lastRenderedLocation=this.history.location,this.notifyApplicationAfterRender()}preloadOnLoadLinksForView(e){this.preloader.preloadOnLoadLinksForView(e)}viewInvalidated(e){this.adapter.pageInvalidated(e)}frameLoaded(e){this.notifyApplicationAfterFrameLoad(e)}frameRendered(e,t){this.notifyApplicationAfterFrameRender(e,t)}applicationAllowsFollowingLinkToLocation(e,t,n){return!this.notifyApplicationAfterClickingLinkToLocation(e,t,n).defaultPrevented}applicationAllowsVisitingLocation(e){return!this.notifyApplicationBeforeVisitingLocation(e).defaultPrevented}notifyApplicationAfterClickingLinkToLocation(e,t,n){return w("turbo:click",{target:e,detail:{url:t.href,originalEvent:n},cancelable:!0})}notifyApplicationBeforeVisitingLocation(e){return w("turbo:before-visit",{detail:{url:e.href},cancelable:!0})}notifyApplicationAfterVisitingLocation(e,t){return w("turbo:visit",{detail:{url:e.href,action:t}})}notifyApplicationBeforeCachingSnapshot(){return w("turbo:before-cache")}notifyApplicationBeforeRender(e,t){return w("turbo:before-render",{detail:Object.assign({newBody:e},t),cancelable:!0})}notifyApplicationAfterRender(){return w("turbo:render")}notifyApplicationAfterPageLoad(e={}){return w("turbo:load",{detail:{url:this.location.href,timing:e}})}notifyApplicationAfterVisitingSamePageLocation(e,t){dispatchEvent(new HashChangeEvent("hashchange",{oldURL:e.toString(),newURL:t.toString()}))}notifyApplicationAfterFrameLoad(e){return w("turbo:frame-load",{target:e})}notifyApplicationAfterFrameRender(e,t){return w("turbo:frame-render",{detail:{fetchResponse:e},target:t,cancelable:!0})}submissionIsNavigatable(e,t){if("off"==this.formMode)return!1;{const n=!t||this.elementIsNavigatable(t);return"optin"==this.formMode?n&&null!=e.closest('[data-turbo="true"]'):n&&this.elementIsNavigatable(e)}}elementIsNavigatable(e){const t=M(e,"[data-turbo]"),n=M(e,"turbo-frame");return this.drive||n?!t||"false"!=t.getAttribute("data-turbo"):!!t&&"true"==t.getAttribute("data-turbo")}getActionForLink(e){return D(e)||"advance"}get snapshot(){return this.view.snapshot}},Ee=new class{constructor(e){this.session=e}clear(){this.session.clearCache()}resetCacheControl(){this.setCacheControl("")}exemptPageFromCache(){this.setCacheControl("no-cache")}exemptPageFromPreview(){this.setCacheControl("no-preview")}setCacheControl(e){!function(e,t){let n=O(e);n||(n=document.createElement("meta"),n.setAttribute("name",e),document.head.appendChild(n)),n.setAttribute("content",t)}("turbo-cache-control",e)}}(xe),{navigator:Ce}=xe;function _e(){xe.start()}function Te(e,t){xe.visit(e,t)}function Le(e){xe.connectStreamSource(e)}function Ae(e){xe.disconnectStreamSource(e)}var De=Object.freeze({__proto__:null,navigator:Ce,session:xe,cache:Ee,PageRenderer:ve,PageSnapshot:ee,FrameRenderer:Y,start:_e,registerAdapter:function(e){xe.registerAdapter(e)},visit:Te,connectStreamSource:Le,disconnectStreamSource:Ae,renderStreamMessage:function(e){xe.renderStreamMessage(e)},clearCache:function(){console.warn("Please replace `Turbo.clearCache()` with `Turbo.cache.clear()`. The top-level function is deprecated and will be removed in a future version of Turbo.`"),xe.clearCache()},setProgressBarDelay:function(e){xe.setProgressBarDelay(e)},setConfirmMethod:function(e){H.confirmMethod=e},setFormMode:function(e){xe.setFormMode(e)},StreamActions:ke});class Oe extends Error{}function Re(e){if(null!=e){const t=document.getElementById(e);if(t instanceof d)return t}}function Me(e,t){if(e){const r=e.getAttribute("src");if(null!=r&&null!=t&&(n=t,h(r).href==h(n).href))throw new Error(`Matching <turbo-frame id="${e.id}"> element has a source URL which references itself`);if(e.ownerDocument!==document&&(e=document.importNode(e,!0)),e instanceof d)return e.connectedCallback(),e.disconnectedCallback(),e}var n}class Ie extends HTMLElement{static async renderElement(e){await e.performAction()}async connectedCallback(){try{await this.render()}catch(e){console.error(e)}finally{this.disconnect()}}async render(){var e;return null!==(e=this.renderPromise)&&void 0!==e?e:this.renderPromise=(async()=>{const e=this.beforeRenderEvent;this.dispatchEvent(e)&&(await S(),await e.detail.render(this))})()}disconnect(){try{this.remove()}catch(e){}}removeDuplicateTargetChildren(){this.duplicateChildren.forEach((e=>e.remove()))}get duplicateChildren(){var e;const t=this.targetElements.flatMap((e=>[...e.children])).filter((e=>!!e.id)),n=[...(null===(e=this.templateContent)||void 0===e?void 0:e.children)||[]].filter((e=>!!e.id)).map((e=>e.id));return t.filter((e=>n.includes(e.id)))}get performAction(){if(this.action){const e=ke[this.action];if(e)return e;this.raise("unknown action")}this.raise("action attribute is missing")}get targetElements(){return this.target?this.targetElementsById:this.targets?this.targetElementsByQuery:void this.raise("target or targets attribute is missing")}get templateContent(){return this.templateElement.content.cloneNode(!0)}get templateElement(){if(null===this.firstElementChild){const e=this.ownerDocument.createElement("template");return this.appendChild(e),e}if(this.firstElementChild instanceof HTMLTemplateElement)return this.firstElementChild;this.raise("first child element must be a <template> element")}get action(){return this.getAttribute("action")}get target(){return this.getAttribute("target")}get targets(){return this.getAttribute("targets")}raise(e){throw new Error(`${this.description}: ${e}`)}get description(){var e,t;return null!==(t=(null!==(e=this.outerHTML.match(/<[^>]+>/))&&void 0!==e?e:[])[0])&&void 0!==t?t:"<turbo-stream>"}get beforeRenderEvent(){return new CustomEvent("turbo:before-stream-render",{bubbles:!0,cancelable:!0,detail:{newStream:this,render:Ie.renderElement}})}get targetElementsById(){var e;const t=null===(e=this.ownerDocument)||void 0===e?void 0:e.getElementById(this.target);return null!==t?[t]:[]}get targetElementsByQuery(){var e;const t=null===(e=this.ownerDocument)||void 0===e?void 0:e.querySelectorAll(this.targets);return 0!==t.length?Array.prototype.slice.call(t):[]}}class Fe extends HTMLElement{constructor(){super(...arguments),this.streamSource=null}connectedCallback(){this.streamSource=this.src.match(/^ws{1,2}:/)?new WebSocket(this.src):new EventSource(this.src),Le(this.streamSource)}disconnectedCallback(){this.streamSource&&Ae(this.streamSource)}get src(){return this.getAttribute("src")||""}}d.delegateConstructor=class{constructor(e){this.fetchResponseLoaded=e=>{},this.currentFetchRequest=null,this.resolveVisitPromise=()=>{},this.connected=!1,this.hasBeenLoaded=!1,this.ignoredAttributes=new Set,this.action=null,this.visitCachedSnapshot=({element:e})=>{const t=e.querySelector("#"+this.element.id);t&&this.previousFrameElement&&t.replaceChildren(...this.previousFrameElement.children),delete this.previousFrameElement},this.element=e,this.view=new z(this,this.element),this.appearanceObserver=new F(this,this.element),this.formLinkClickObserver=new Z(this,this.element),this.linkInterceptor=new q(this,this.element),this.restorationIdentifier=E(),this.formSubmitObserver=new V(this,this.element)}connect(){this.connected||(this.connected=!0,this.loadingStyle==i.lazy?this.appearanceObserver.start():this.loadSourceURL(),this.formLinkClickObserver.start(),this.linkInterceptor.start(),this.formSubmitObserver.start())}disconnect(){this.connected&&(this.connected=!1,this.appearanceObserver.stop(),this.formLinkClickObserver.stop(),this.linkInterceptor.stop(),this.formSubmitObserver.stop())}disabledChanged(){this.loadingStyle==i.eager&&this.loadSourceURL()}sourceURLChanged(){this.isIgnoringChangesTo("src")||(this.element.isConnected&&(this.complete=!1),(this.loadingStyle==i.eager||this.hasBeenLoaded)&&this.loadSourceURL())}sourceURLReloaded(){const{src:e}=this.element;return this.ignoringChangesToAttribute("complete",(()=>{this.element.removeAttribute("complete")})),this.element.src=null,this.element.src=e,this.element.loaded}completeChanged(){this.isIgnoringChangesTo("complete")||this.loadSourceURL()}loadingStyleChanged(){this.loadingStyle==i.lazy?this.appearanceObserver.start():(this.appearanceObserver.stop(),this.loadSourceURL())}async loadSourceURL(){this.enabled&&this.isActive&&!this.complete&&this.sourceURL&&(this.element.loaded=this.visit(h(this.sourceURL)),this.appearanceObserver.stop(),await this.element.loaded,this.hasBeenLoaded=!0)}async loadResponse(e){(e.redirected||e.succeeded&&e.isHTML)&&(this.sourceURL=e.response.url);try{const t=await e.responseHTML;if(t){const n=k(t);ee.fromDocument(n).isVisitable?await this.loadFrameResponse(e,n):await this.handleUnvisitableFrameResponse(e)}}finally{this.fetchResponseLoaded=()=>{}}}elementAppearedInViewport(e){this.proposeVisitIfNavigatedWithAction(e,e),this.loadSourceURL()}willSubmitFormLinkToLocation(e){return this.shouldInterceptNavigation(e)}submittedFormLinkToLocation(e,t,n){const r=this.findFrameElement(e);r&&n.setAttribute("data-turbo-frame",r.id)}shouldInterceptLinkClick(e,t,n){return this.shouldInterceptNavigation(e)}linkClickIntercepted(e,t){this.navigateFrame(e,t)}willSubmitForm(e,t){return e.closest("turbo-frame")==this.element&&this.shouldInterceptNavigation(e,t)}formSubmitted(e,t){this.formSubmission&&this.formSubmission.stop(),this.formSubmission=new H(this,e,t);const{fetchRequest:n}=this.formSubmission;this.prepareRequest(n),this.formSubmission.start()}prepareRequest(e){var t;e.headers["Turbo-Frame"]=this.id,(null===(t=this.currentNavigationElement)||void 0===t?void 0:t.hasAttribute("data-turbo-stream"))&&e.acceptResponseType(P.contentType)}requestStarted(e){_(this.element)}requestPreventedHandlingResponse(e,t){this.resolveVisitPromise()}async requestSucceededWithResponse(e,t){await this.loadResponse(t),this.resolveVisitPromise()}async requestFailedWithResponse(e,t){await this.loadResponse(t),this.resolveVisitPromise()}requestErrored(e,t){console.error(t),this.resolveVisitPromise()}requestFinished(e){T(this.element)}formSubmissionStarted({formElement:e}){_(e,this.findFrameElement(e))}formSubmissionSucceededWithResponse(e,t){const n=this.findFrameElement(e.formElement,e.submitter);n.delegate.proposeVisitIfNavigatedWithAction(n,e.formElement,e.submitter),n.delegate.loadResponse(t),e.isSafe||xe.clearCache()}formSubmissionFailedWithResponse(e,t){this.element.delegate.loadResponse(t),xe.clearCache()}formSubmissionErrored(e,t){console.error(t)}formSubmissionFinished({formElement:e}){T(e,this.findFrameElement(e))}allowsImmediateRender({element:e},t){const n=w("turbo:before-frame-render",{target:this.element,detail:Object.assign({newFrame:e},t),cancelable:!0}),{defaultPrevented:r,detail:{render:o}}=n;return this.view.renderer&&o&&(this.view.renderer.renderElement=o),!r}viewRenderedSnapshot(e,t){}preloadOnLoadLinksForView(e){xe.preloadOnLoadLinksForView(e)}viewInvalidated(){}willRenderFrame(e,t){this.previousFrameElement=e.cloneNode(!0)}async loadFrameResponse(e,t){const n=await this.extractForeignFrameElement(t.body);if(n){const t=new N(n),r=new Y(this,this.view.snapshot,t,Y.renderElement,!1,!1);this.view.renderPromise&&await this.view.renderPromise,this.changeHistory(),await this.view.render(r),this.complete=!0,xe.frameRendered(e,this.element),xe.frameLoaded(this.element),this.fetchResponseLoaded(e)}else this.willHandleFrameMissingFromResponse(e)&&this.handleFrameMissingFromResponse(e)}async visit(e){var t;const n=new I(this,s.get,e,new URLSearchParams,this.element);return null===(t=this.currentFetchRequest)||void 0===t||t.cancel(),this.currentFetchRequest=n,new Promise((e=>{this.resolveVisitPromise=()=>{this.resolveVisitPromise=()=>{},this.currentFetchRequest=null,e()},n.perform()}))}navigateFrame(e,t,n){const r=this.findFrameElement(e,n);r.delegate.proposeVisitIfNavigatedWithAction(r,e,n),this.withCurrentNavigationElement(e,(()=>{r.src=t}))}proposeVisitIfNavigatedWithAction(e,t,n){if(this.action=D(n,t,e),this.action){const t=ee.fromElement(e).clone(),{visitCachedSnapshot:n}=e.delegate;e.delegate.fetchResponseLoaded=r=>{if(e.src){const{statusCode:o,redirected:i}=r,s={response:{statusCode:o,redirected:i,responseHTML:e.ownerDocument.documentElement.outerHTML},visitCachedSnapshot:n,willRender:!1,updateHistory:!1,restorationIdentifier:this.restorationIdentifier,snapshot:t};this.action&&(s.action=this.action),xe.visit(e.src,s)}}}}changeHistory(){if(this.action){const e=A(this.action);xe.history.update(e,h(this.element.src||""),this.restorationIdentifier)}}async handleUnvisitableFrameResponse(e){console.warn(`The response (${e.statusCode}) from <turbo-frame id="${this.element.id}"> is performing a full page visit due to turbo-visit-control.`),await this.visitResponse(e.response)}willHandleFrameMissingFromResponse(e){this.element.setAttribute("complete","");const t=e.response;return!w("turbo:frame-missing",{target:this.element,detail:{response:t,visit:async(e,t={})=>{e instanceof Response?this.visitResponse(e):xe.visit(e,t)}},cancelable:!0}).defaultPrevented}handleFrameMissingFromResponse(e){this.view.missing(),this.throwFrameMissingError(e)}throwFrameMissingError(e){const t=`The response (${e.statusCode}) did not contain the expected <turbo-frame id="${this.element.id}"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;throw new Oe(t)}async visitResponse(e){const t=new b(e),n=await t.responseHTML,{location:r,redirected:o,statusCode:i}=t;return xe.visit(r,{response:{redirected:o,statusCode:i,responseHTML:n}})}findFrameElement(e,t){var n;return null!==(n=Re(C("data-turbo-frame",t,e)||this.element.getAttribute("target")))&&void 0!==n?n:this.element}async extractForeignFrameElement(e){let t;const n=CSS.escape(this.id);try{if(t=Me(e.querySelector(`turbo-frame#${n}`),this.sourceURL),t)return t;if(t=Me(e.querySelector(`turbo-frame[src][recurse~=${n}]`),this.sourceURL),t)return await t.loaded,await this.extractForeignFrameElement(t)}catch(e){return console.error(e),new d}return null}formActionIsVisitable(e,t){return m(h(f(e,t)),this.rootLocation)}shouldInterceptNavigation(e,t){const n=C("data-turbo-frame",t,e)||this.element.getAttribute("target");if(e instanceof HTMLFormElement&&!this.formActionIsVisitable(e,t))return!1;if(!this.enabled||"_top"==n)return!1;if(n){const e=Re(n);if(e)return!e.disabled}return!(!xe.elementIsNavigatable(e)||t&&!xe.elementIsNavigatable(t))}get id(){return this.element.id}get enabled(){return!this.element.disabled}get sourceURL(){if(this.element.src)return this.element.src}set sourceURL(e){this.ignoringChangesToAttribute("src",(()=>{this.element.src=null!=e?e:null}))}get loadingStyle(){return this.element.loading}get isLoading(){return void 0!==this.formSubmission||void 0!==this.resolveVisitPromise()}get complete(){return this.element.hasAttribute("complete")}set complete(e){this.ignoringChangesToAttribute("complete",(()=>{e?this.element.setAttribute("complete",""):this.element.removeAttribute("complete")}))}get isActive(){return this.element.isActive&&this.connected}get rootLocation(){var e;const t=this.element.ownerDocument.querySelector('meta[name="turbo-root"]');return h(null!==(e=null==t?void 0:t.content)&&void 0!==e?e:"/")}isIgnoringChangesTo(e){return this.ignoredAttributes.has(e)}ignoringChangesToAttribute(e,t){this.ignoredAttributes.add(e),t(),this.ignoredAttributes.delete(e)}withCurrentNavigationElement(e,t){this.currentNavigationElement=e,t(),delete this.currentNavigationElement}},void 0===customElements.get("turbo-frame")&&customElements.define("turbo-frame",d),void 0===customElements.get("turbo-stream")&&customElements.define("turbo-stream",Ie),void 0===customElements.get("turbo-stream-source")&&customElements.define("turbo-stream-source",Fe),(()=>{let e=document.currentScript;if(e&&!e.hasAttribute("data-turbo-suppress-warning"))for(e=e.parentElement;e;){if(e==document.body)return console.warn(x`
         You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!
 
         Load your application’s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.
@@ -24,4 +24,4 @@
 
         ——
         Suppress this warning by adding a "data-turbo-suppress-warning" attribute to: %s
-      `,e.outerHTML)})(),window.Turbo=ve,pe()},2262:(e,t,n)=>{"use strict";n.d(t,{Bj:()=>i,qq:()=>y,Fl:()=>Ge,ZM:()=>qe,cE:()=>x,B:()=>s,nZ:()=>l,X3:()=>Te,PG:()=>Ee,$y:()=>Ce,dq:()=>Me,yT:()=>_e,Xl:()=>Le,EB:()=>c,Jd:()=>C,WL:()=>ze,qj:()=>ye,OT:()=>xe,iH:()=>Fe,lk:()=>_,Um:()=>we,YS:()=>ke,XI:()=>Pe,sT:()=>k,IU:()=>Oe,Vh:()=>Ze,BK:()=>$e,j:()=>T,X$:()=>L,oR:()=>je,SU:()=>We});var r=n(3577);let o;class i{constructor(e=!1){this.active=!0,this.effects=[],this.cleanups=[],!e&&o&&(this.parent=o,this.index=(o.scopes||(o.scopes=[])).push(this)-1)}run(e){if(this.active)try{return o=this,e()}finally{o=this.parent}}on(){o=this}off(){o=this.parent}stop(e){if(this.active){let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);if(this.parent&&!e){const e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.active=!1}}}function s(e){return new i(e)}function a(e,t=o){t&&t.active&&t.effects.push(e)}function l(){return o}function c(e){o&&o.cleanups.push(e)}const u=e=>{const t=new Set(e);return t.w=0,t.n=0,t},d=e=>(e.w&v)>0,f=e=>(e.n&v)>0,h=new WeakMap;let p,m=0,v=1;const g=Symbol(""),b=Symbol("");class y{constructor(e,t=null,n){this.fn=e,this.scheduler=t,this.active=!0,this.deps=[],this.parent=void 0,a(this,n)}run(){if(!this.active)return this.fn();let e=p,t=S;for(;e;){if(e===this)return;e=e.parent}try{return this.parent=p,p=this,S=!0,v=1<<++m,m<=30?(({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=v})(this):w(this),this.fn()}finally{m<=30&&(e=>{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r<t.length;r++){const o=t[r];d(o)&&!f(o)?o.delete(e):t[n++]=o,o.w&=~v,o.n&=~v}t.length=n}})(this),v=1<<--m,p=this.parent,S=t,this.parent=void 0}}stop(){this.active&&(w(this),this.onStop&&this.onStop(),this.active=!1)}}function w(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}function x(e,t){e.effect&&(e=e.effect.fn);const n=new y(e);t&&((0,r.l7)(n,t),t.scope&&a(n,t.scope)),t&&t.lazy||n.run();const o=n.run.bind(n);return o.effect=n,o}function k(e){e.effect.stop()}let S=!0;const E=[];function C(){E.push(S),S=!1}function _(){const e=E.pop();S=void 0===e||e}function T(e,t,n){if(S&&p){let t=h.get(e);t||h.set(e,t=new Map);let r=t.get(n);r||t.set(n,r=u()),O(r)}}function O(e,t){let n=!1;m<=30?f(e)||(e.n|=v,n=!d(e)):n=!e.has(p),n&&(e.add(p),p.deps.push(e))}function L(e,t,n,o,i,s){const a=h.get(e);if(!a)return;let l=[];if("clear"===t)l=[...a.values()];else if("length"===n&&(0,r.kJ)(e))a.forEach(((e,t)=>{("length"===t||t>=o)&&l.push(e)}));else switch(void 0!==n&&l.push(a.get(n)),t){case"add":(0,r.kJ)(e)?(0,r.S0)(n)&&l.push(a.get("length")):(l.push(a.get(g)),(0,r._N)(e)&&l.push(a.get(b)));break;case"delete":(0,r.kJ)(e)||(l.push(a.get(g)),(0,r._N)(e)&&l.push(a.get(b)));break;case"set":(0,r._N)(e)&&l.push(a.get(g))}if(1===l.length)l[0]&&R(l[0]);else{const e=[];for(const t of l)t&&e.push(...t);R(u(e))}}function R(e,t){for(const t of(0,r.kJ)(e)?e:[...e])(t!==p||t.allowRecurse)&&(t.scheduler?t.scheduler():t.run())}const D=(0,r.fY)("__proto__,__v_isRef,__isVue"),A=new Set(Object.getOwnPropertyNames(Symbol).map((e=>Symbol[e])).filter(r.yk)),I=j(),M=j(!1,!0),F=j(!0),P=j(!0,!0),H=N();function N(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=Oe(this);for(let e=0,t=this.length;e<t;e++)T(n,0,e+"");const r=n[t](...e);return-1===r||!1===r?n[t](...e.map(Oe)):r}})),["push","pop","shift","unshift","splice"].forEach((t=>{e[t]=function(...e){C();const n=Oe(this)[t].apply(this,e);return _(),n}})),e}function j(e=!1,t=!1){return function(n,o,i){if("__v_isReactive"===o)return!e;if("__v_isReadonly"===o)return e;if("__v_isShallow"===o)return t;if("__v_raw"===o&&i===(e?t?be:ge:t?ve:me).get(n))return n;const s=(0,r.kJ)(n);if(!e&&s&&(0,r.RI)(H,o))return Reflect.get(H,o,i);const a=Reflect.get(n,o,i);return((0,r.yk)(o)?A.has(o):D(o))?a:(e||T(n,0,o),t?a:Me(a)?s&&(0,r.S0)(o)?a:a.value:(0,r.Kn)(a)?e?xe(a):ye(a):a)}}const W=z(),B=z(!0);function z(e=!1){return function(t,n,o,i){let s=t[n];if(Ce(s)&&Me(s)&&!Me(o))return!1;if(!e&&!Ce(o)&&(_e(o)||(o=Oe(o),s=Oe(s)),!(0,r.kJ)(t)&&Me(s)&&!Me(o)))return s.value=o,!0;const a=(0,r.kJ)(t)&&(0,r.S0)(n)?Number(n)<t.length:(0,r.RI)(t,n),l=Reflect.set(t,n,o,i);return t===Oe(i)&&(a?(0,r.aU)(o,s)&&L(t,"set",n,o):L(t,"add",n,o)),l}}const V={get:I,set:W,deleteProperty:function(e,t){const n=(0,r.RI)(e,t),o=(e[t],Reflect.deleteProperty(e,t));return o&&n&&L(e,"delete",t,void 0),o},has:function(e,t){const n=Reflect.has(e,t);return(0,r.yk)(t)&&A.has(t)||T(e,0,t),n},ownKeys:function(e){return T(e,0,(0,r.kJ)(e)?"length":g),Reflect.ownKeys(e)}},q={get:F,set:(e,t)=>!0,deleteProperty:(e,t)=>!0},$=(0,r.l7)({},V,{get:M,set:B}),U=(0,r.l7)({},q,{get:P}),Z=e=>e,Y=e=>Reflect.getPrototypeOf(e);function G(e,t,n=!1,r=!1){const o=Oe(e=e.__v_raw),i=Oe(t);t!==i&&!n&&T(o,0,t),!n&&T(o,0,i);const{has:s}=Y(o),a=r?Z:n?De:Re;return s.call(o,t)?a(e.get(t)):s.call(o,i)?a(e.get(i)):void(e!==o&&e.get(t))}function J(e,t=!1){const n=this.__v_raw,r=Oe(n),o=Oe(e);return e!==o&&!t&&T(r,0,e),!t&&T(r,0,o),e===o?n.has(e):n.has(e)||n.has(o)}function K(e,t=!1){return e=e.__v_raw,!t&&T(Oe(e),0,g),Reflect.get(e,"size",e)}function X(e){e=Oe(e);const t=Oe(this);return Y(t).has.call(t,e)||(t.add(e),L(t,"add",e,e)),this}function Q(e,t){t=Oe(t);const n=Oe(this),{has:o,get:i}=Y(n);let s=o.call(n,e);s||(e=Oe(e),s=o.call(n,e));const a=i.call(n,e);return n.set(e,t),s?(0,r.aU)(t,a)&&L(n,"set",e,t):L(n,"add",e,t),this}function ee(e){const t=Oe(this),{has:n,get:r}=Y(t);let o=n.call(t,e);o||(e=Oe(e),o=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return o&&L(t,"delete",e,void 0),i}function te(){const e=Oe(this),t=0!==e.size,n=e.clear();return t&&L(e,"clear",void 0,void 0),n}function ne(e,t){return function(n,r){const o=this,i=o.__v_raw,s=Oe(i),a=t?Z:e?De:Re;return!e&&T(s,0,g),i.forEach(((e,t)=>n.call(r,a(e),a(t),o)))}}function re(e,t,n){return function(...o){const i=this.__v_raw,s=Oe(i),a=(0,r._N)(s),l="entries"===e||e===Symbol.iterator&&a,c="keys"===e&&a,u=i[e](...o),d=n?Z:t?De:Re;return!t&&T(s,0,c?b:g),{next(){const{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:l?[d(e[0]),d(e[1])]:d(e),done:t}},[Symbol.iterator](){return this}}}}function oe(e){return function(...t){return"delete"!==e&&this}}function ie(){const e={get(e){return G(this,e)},get size(){return K(this)},has:J,add:X,set:Q,delete:ee,clear:te,forEach:ne(!1,!1)},t={get(e){return G(this,e,!1,!0)},get size(){return K(this)},has:J,add:X,set:Q,delete:ee,clear:te,forEach:ne(!1,!0)},n={get(e){return G(this,e,!0)},get size(){return K(this,!0)},has(e){return J.call(this,e,!0)},add:oe("add"),set:oe("set"),delete:oe("delete"),clear:oe("clear"),forEach:ne(!0,!1)},r={get(e){return G(this,e,!0,!0)},get size(){return K(this,!0)},has(e){return J.call(this,e,!0)},add:oe("add"),set:oe("set"),delete:oe("delete"),clear:oe("clear"),forEach:ne(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((o=>{e[o]=re(o,!1,!1),n[o]=re(o,!0,!1),t[o]=re(o,!1,!0),r[o]=re(o,!0,!0)})),[e,n,t,r]}const[se,ae,le,ce]=ie();function ue(e,t){const n=t?e?ce:le:e?ae:se;return(t,o,i)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get((0,r.RI)(n,o)&&o in t?n:t,o,i)}const de={get:ue(!1,!1)},fe={get:ue(!1,!0)},he={get:ue(!0,!1)},pe={get:ue(!0,!0)},me=new WeakMap,ve=new WeakMap,ge=new WeakMap,be=new WeakMap;function ye(e){return Ce(e)?e:Se(e,!1,V,de,me)}function we(e){return Se(e,!1,$,fe,ve)}function xe(e){return Se(e,!0,q,he,ge)}function ke(e){return Se(e,!0,U,pe,be)}function Se(e,t,n,o,i){if(!(0,r.Kn)(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const s=i.get(e);if(s)return s;const a=(l=e).__v_skip||!Object.isExtensible(l)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((0,r.W7)(l));var l;if(0===a)return e;const c=new Proxy(e,2===a?o:n);return i.set(e,c),c}function Ee(e){return Ce(e)?Ee(e.__v_raw):!(!e||!e.__v_isReactive)}function Ce(e){return!(!e||!e.__v_isReadonly)}function _e(e){return!(!e||!e.__v_isShallow)}function Te(e){return Ee(e)||Ce(e)}function Oe(e){const t=e&&e.__v_raw;return t?Oe(t):e}function Le(e){return(0,r.Nj)(e,"__v_skip",!0),e}const Re=e=>(0,r.Kn)(e)?ye(e):e,De=e=>(0,r.Kn)(e)?xe(e):e;function Ae(e){S&&p&&O((e=Oe(e)).dep||(e.dep=u()))}function Ie(e,t){(e=Oe(e)).dep&&R(e.dep)}function Me(e){return!(!e||!0!==e.__v_isRef)}function Fe(e){return He(e,!1)}function Pe(e){return He(e,!0)}function He(e,t){return Me(e)?e:new Ne(e,t)}class Ne{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:Oe(e),this._value=t?e:Re(e)}get value(){return Ae(this),this._value}set value(e){e=this.__v_isShallow?e:Oe(e),(0,r.aU)(e,this._rawValue)&&(this._rawValue=e,this._value=this.__v_isShallow?e:Re(e),Ie(this))}}function je(e){Ie(e)}function We(e){return Me(e)?e.value:e}const Be={get:(e,t,n)=>We(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Me(o)&&!Me(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function ze(e){return Ee(e)?e:new Proxy(e,Be)}class Ve{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Ae(this)),(()=>Ie(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function qe(e){return new Ve(e)}function $e(e){const t=(0,r.kJ)(e)?new Array(e.length):{};for(const n in e)t[n]=Ze(e,n);return t}class Ue{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}}function Ze(e,t,n){const r=e[t];return Me(r)?r:new Ue(e,t,n)}class Ye{constructor(e,t,n,r){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new y(e,(()=>{this._dirty||(this._dirty=!0,Ie(this))})),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=Oe(this);return Ae(e),!e._dirty&&e._cacheable||(e._dirty=!1,e._value=e.effect.run()),e._value}set value(e){this._setter(e)}}function Ge(e,t,n=!1){let o,i;const s=(0,r.mf)(e);return s?(o=e,i=r.dG):(o=e.get,i=e.set),new Ye(o,i,s||!i,n)}Promise.resolve()},6252:(e,t,n)=>{"use strict";n.d(t,{Bj:()=>r.Bj,qq:()=>r.qq,ZM:()=>r.ZM,cE:()=>r.cE,B:()=>r.B,nZ:()=>r.nZ,X3:()=>r.X3,PG:()=>r.PG,$y:()=>r.$y,dq:()=>r.dq,yT:()=>r.yT,Xl:()=>r.Xl,EB:()=>r.EB,WL:()=>r.WL,qj:()=>r.qj,OT:()=>r.OT,iH:()=>r.iH,Um:()=>r.Um,YS:()=>r.YS,XI:()=>r.XI,sT:()=>r.sT,IU:()=>r.IU,Vh:()=>r.Vh,BK:()=>r.BK,oR:()=>r.oR,SU:()=>r.SU,_A:()=>o._A,kC:()=>o.kC,C_:()=>o.C_,vs:()=>o.vs,j5:()=>o.j5,zw:()=>o.zw,hR:()=>o.hR,P$:()=>be,sv:()=>Yt,HY:()=>Ut,Ob:()=>Re,qG:()=>Gt,n4:()=>Q,lR:()=>Nt,xv:()=>Zt,$d:()=>u,KU:()=>c,Ho:()=>vn,ry:()=>xr,Fl:()=>tr,j4:()=>sn,kq:()=>yn,iD:()=>on,_:()=>hn,Eo:()=>Rt,p1:()=>ur,Us:()=>Lt,Nv:()=>_n,uE:()=>bn,Uk:()=>gn,Wm:()=>pn,RC:()=>Te,aZ:()=>Ce,Bz:()=>rr,WY:()=>or,MW:()=>nr,mW:()=>M,FN:()=>Nn,Q6:()=>Ee,F4:()=>mn,h:()=>fr,S3:()=>d,Mr:()=>mr,f3:()=>se,nQ:()=>gr,of:()=>Yn,lA:()=>an,u_:()=>cr,dG:()=>Sn,Y3:()=>C,dl:()=>Ae,wF:()=>We,Jd:()=>qe,Xn:()=>ze,se:()=>Ie,d1:()=>Ge,bv:()=>Be,bT:()=>Ye,Yq:()=>Ze,vl:()=>Ue,Ah:()=>$e,ic:()=>Ve,wg:()=>Xt,Cn:()=>$,JJ:()=>ie,dD:()=>q,qb:()=>L,Y1:()=>Zn,Ko:()=>Cn,WI:()=>Tn,up:()=>Wt,Q2:()=>Vt,LL:()=>zt,eq:()=>wr,U2:()=>we,qZ:()=>nn,ec:()=>H,nK:()=>Se,Uc:()=>hr,G:()=>yr,mx:()=>Ln,C3:()=>cn,l1:()=>ar,Zq:()=>pr,Rr:()=>sr,Y8:()=>ve,i8:()=>br,ZK:()=>s,YP:()=>de,m0:()=>ae,Rh:()=>le,yX:()=>ce,mv:()=>dr,w5:()=>Z,b9:()=>ir,wy:()=>bt,MX:()=>vr,HX:()=>U});var r=n(2262),o=n(3577);const i=[];function s(e,...t){(0,r.Jd)();const n=i.length?i[i.length-1].component:null,o=n&&n.appContext.config.warnHandler,s=function(){let e=i[i.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const r=e.component&&e.component.parent;e=r&&r.vnode}return t}();if(o)c(o,n,11,[e+t.join(""),n&&n.proxy,s.map((({vnode:e})=>`at <${er(n,e.type)}>`)).join("\n"),s]);else{const n=[`[Vue warn]: ${e}`,...t];s.length&&n.push("\n",...function(e){const t=[];return e.forEach(((e,n)=>{t.push(...0===n?[]:["\n"],...function({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",r=!!e.component&&null==e.component.parent,o=` at <${er(e.component,e.type,r)}`,i=">"+n;return e.props?[o,...a(e.props),i]:[o+i]}(e))})),t}(s)),console.warn(...n)}(0,r.lk)()}function a(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach((n=>{t.push(...l(n,e[n]))})),n.length>3&&t.push(" ..."),t}function l(e,t,n){return(0,o.HD)(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):"number"==typeof t||"boolean"==typeof t||null==t?n?t:[`${e}=${t}`]:(0,r.dq)(t)?(t=l(e,(0,r.IU)(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):(0,o.mf)(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=(0,r.IU)(t),n?t:[`${e}=`,t])}function c(e,t,n,r){let o;try{o=r?e(...r):e()}catch(e){d(e,t,n)}return o}function u(e,t,n,r){if((0,o.mf)(e)){const i=c(e,t,n,r);return i&&(0,o.tI)(i)&&i.catch((e=>{d(e,t,n)})),i}const i=[];for(let o=0;o<e.length;o++)i.push(u(e[o],t,n,r));return i}function d(e,t,n,r=!0){if(t&&t.vnode,t){let r=t.parent;const o=t.proxy,i=n;for(;r;){const t=r.ec;if(t)for(let n=0;n<t.length;n++)if(!1===t[n](e,o,i))return;r=r.parent}const s=t.appContext.config.errorHandler;if(s)return void c(s,null,10,[e,o,i])}!function(e,t,n,r=!0){console.error(e)}(e,0,0,r)}let f=!1,h=!1;const p=[];let m=0;const v=[];let g=null,b=0;const y=[];let w=null,x=0;const k=Promise.resolve();let S=null,E=null;function C(e){const t=S||k;return e?t.then(this?e.bind(this):e):t}function _(e){p.length&&p.includes(e,f&&e.allowRecurse?m+1:m)||e===E||(null==e.id?p.push(e):p.splice(function(e){let t=m+1,n=p.length;for(;t<n;){const r=t+n>>>1;A(p[r])<e?t=r+1:n=r}return t}(e.id),0,e),T())}function T(){f||h||(h=!0,S=k.then(I))}function O(e,t,n,r){(0,o.kJ)(e)?n.push(...e):t&&t.includes(e,e.allowRecurse?r+1:r)||n.push(e),T()}function L(e){O(e,w,y,x)}function R(e,t=null){if(v.length){for(E=t,g=[...new Set(v)],v.length=0,b=0;b<g.length;b++)g[b]();g=null,b=0,E=null,R(e,t)}}function D(e){if(y.length){const e=[...new Set(y)];if(y.length=0,w)return void w.push(...e);for(w=e,w.sort(((e,t)=>A(e)-A(t))),x=0;x<w.length;x++)w[x]();w=null,x=0}}const A=e=>null==e.id?1/0:e.id;function I(e){h=!1,f=!0,R(e),p.sort(((e,t)=>A(e)-A(t))),o.dG;try{for(m=0;m<p.length;m++){const e=p[m];e&&!1!==e.active&&c(e,null,14)}}finally{m=0,p.length=0,D(),f=!1,S=null,(p.length||v.length||y.length)&&I(e)}}new Set,new Map;let M,F=[],P=!1;function H(e,t){var n,r;M=e,M?(M.enabled=!0,F.forEach((({event:e,args:t})=>M.emit(e,...t))),F=[]):"undefined"!=typeof window&&window.HTMLElement&&!(null===(r=null===(n=window.navigator)||void 0===n?void 0:n.userAgent)||void 0===r?void 0:r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push((e=>{H(e,t)})),setTimeout((()=>{M||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,P=!0,F=[])}),3e3)):(P=!0,F=[])}function N(e,t,...n){const r=e.vnode.props||o.kT;let i=n;const s=t.startsWith("update:"),a=s&&t.slice(7);if(a&&a in r){const e=`${"modelValue"===a?"model":a}Modifiers`,{number:t,trim:s}=r[e]||o.kT;s?i=n.map((e=>e.trim())):t&&(i=n.map(o.He))}let l,c=r[l=(0,o.hR)(t)]||r[l=(0,o.hR)((0,o._A)(t))];!c&&s&&(c=r[l=(0,o.hR)((0,o.rs)(t))]),c&&u(c,e,6,i);const d=r[l+"Once"];if(d){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,u(d,e,6,i)}}function j(e,t,n=!1){const r=t.emitsCache,i=r.get(e);if(void 0!==i)return i;const s=e.emits;let a={},l=!1;if(!(0,o.mf)(e)){const r=e=>{const n=j(e,t,!0);n&&(l=!0,(0,o.l7)(a,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return s||l?((0,o.kJ)(s)?s.forEach((e=>a[e]=null)):(0,o.l7)(a,s),r.set(e,a),a):(r.set(e,null),null)}function W(e,t){return!(!e||!(0,o.F7)(t))&&(t=t.slice(2).replace(/Once$/,""),(0,o.RI)(e,t[0].toLowerCase()+t.slice(1))||(0,o.RI)(e,(0,o.rs)(t))||(0,o.RI)(e,t))}let B=null,z=null;function V(e){const t=B;return B=e,z=e&&e.type.__scopeId||null,t}function q(e){z=e}function $(){z=null}const U=e=>Z;function Z(e,t=B,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&nn(-1);const o=V(t),i=e(...n);return V(o),r._d&&nn(1),i};return r._n=!0,r._c=!0,r._d=!0,r}function Y(e){const{type:t,vnode:n,proxy:r,withProxy:i,props:s,propsOptions:[a],slots:l,attrs:c,emit:u,render:f,renderCache:h,data:p,setupState:m,ctx:v,inheritAttrs:g}=e;let b,y;const w=V(e);try{if(4&n.shapeFlag){const e=i||r;b=wn(f.call(e,e,h,s,m,p,v)),y=c}else{const e=t;b=wn(e.length>1?e(s,{attrs:c,slots:l,emit:u}):e(s,null)),y=t.props?c:G(c)}}catch(t){Jt.length=0,d(t,e,1),b=pn(Yt)}let x=b;if(y&&!1!==g){const e=Object.keys(y),{shapeFlag:t}=x;e.length&&7&t&&(a&&e.some(o.tR)&&(y=J(y,a)),x=vn(x,y))}return n.dirs&&(x.dirs=x.dirs?x.dirs.concat(n.dirs):n.dirs),n.transition&&(x.transition=n.transition),b=x,V(w),b}const G=e=>{let t;for(const n in e)("class"===n||"style"===n||(0,o.F7)(n))&&((t||(t={}))[n]=e[n]);return t},J=(e,t)=>{const n={};for(const r in e)(0,o.tR)(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function K(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;o<r.length;o++){const i=r[o];if(t[i]!==e[i]&&!W(n,i))return!0}return!1}function X({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const Q={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,s,a,l,c){null==e?function(e,t,n,r,o,i,s,a,l){const{p:c,o:{createElement:u}}=l,d=u("div"),f=e.suspense=te(e,o,r,t,d,n,i,s,a,l);c(null,f.pendingBranch=e.ssContent,d,null,r,f,i,s),f.deps>0?(ee(e,"onPending"),ee(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,i,s),oe(f,e.ssFallback)):f.resolve()}(t,n,r,o,i,s,a,l,c):function(e,t,n,r,o,i,s,a,{p:l,um:c,o:{createElement:u}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,h=t.ssFallback,{activeBranch:p,pendingBranch:m,isInFallback:v,isHydrating:g}=d;if(m)d.pendingBranch=f,ln(f,m)?(l(m,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():v&&(l(p,h,n,r,o,null,i,s,a),oe(d,h))):(d.pendingId++,g?(d.isHydrating=!1,d.activeBranch=m):c(m,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=u("div"),v?(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():(l(p,h,n,r,o,null,i,s,a),oe(d,h))):p&&ln(f,p)?(l(p,f,n,r,o,d,i,s,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0&&d.resolve()));else if(p&&ln(f,p))l(p,f,n,r,o,d,i,s,a),oe(d,f);else if(ee(t,"onPending"),d.pendingBranch=f,d.pendingId++,l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0)d.resolve();else{const{timeout:e,pendingId:t}=d;e>0?setTimeout((()=>{d.pendingId===t&&d.fallback(h)}),e):0===e&&d.fallback(h)}}(e,t,n,r,o,s,a,l,c)},hydrate:function(e,t,n,r,o,i,s,a,l){const c=t.suspense=te(t,r,n,e.parentNode,document.createElement("div"),null,o,i,s,a,!0),u=l(e,c.pendingBranch=t.ssContent,n,c,i,s);return 0===c.deps&&c.resolve(),u},create:te,normalize:function(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=ne(r?n.default:n),e.ssFallback=r?ne(n.fallback):pn(Yt)}};function ee(e,t){const n=e.props&&e.props[t];(0,o.mf)(n)&&n()}function te(e,t,n,r,i,s,a,l,c,u,f=!1){const{p:h,m:p,um:m,n:v,o:{parentNode:g,remove:b}}=u,y=(0,o.He)(e.props&&e.props.timeout),w={vnode:e,parent:t,parentComponent:n,isSVG:a,container:r,hiddenContainer:i,anchor:s,deps:0,pendingId:0,timeout:"number"==typeof y?y:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:f,isUnmounted:!1,effects:[],resolve(e=!1){const{vnode:t,activeBranch:n,pendingBranch:r,pendingId:o,effects:i,parentComponent:s,container:a}=w;if(w.isHydrating)w.isHydrating=!1;else if(!e){const e=n&&r.transition&&"out-in"===r.transition.mode;e&&(n.transition.afterLeave=()=>{o===w.pendingId&&p(r,a,t,0)});let{anchor:t}=w;n&&(t=v(n),m(n,s,w,!0)),e||p(r,a,t,0)}oe(w,r),w.pendingBranch=null,w.isInFallback=!1;let l=w.parent,c=!1;for(;l;){if(l.pendingBranch){l.effects.push(...i),c=!0;break}l=l.parent}c||L(i),w.effects=[],ee(t,"onResolve")},fallback(e){if(!w.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,isSVG:i}=w;ee(t,"onFallback");const s=v(n),a=()=>{w.isInFallback&&(h(null,e,o,s,r,null,i,l,c),oe(w,e))},u=e.transition&&"out-in"===e.transition.mode;u&&(n.transition.afterLeave=a),w.isInFallback=!0,m(n,r,null,!0),u||a()},move(e,t,n){w.activeBranch&&p(w.activeBranch,e,t,n),w.container=e},next:()=>w.activeBranch&&v(w.activeBranch),registerDep(e,t){const n=!!w.pendingBranch;n&&w.deps++;const r=e.vnode.el;e.asyncDep.catch((t=>{d(t,e,0)})).then((o=>{if(e.isUnmounted||w.isUnmounted||w.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:i}=e;Un(e,o,!1),r&&(i.el=r);const s=!r&&e.subTree.el;t(e,i,g(r||e.subTree.el),r?null:v(e.subTree),w,a,c),s&&b(s),X(e,i.el),n&&0==--w.deps&&w.resolve()}))},unmount(e,t){w.isUnmounted=!0,w.activeBranch&&m(w.activeBranch,n,e,t),w.pendingBranch&&m(w.pendingBranch,n,e,t)}};return w}function ne(e){let t;if((0,o.mf)(e)){const n=tn&&e._c;n&&(e._d=!1,Xt()),e=e(),n&&(e._d=!0,t=Kt,Qt())}if((0,o.kJ)(e)){const t=function(e){let t;for(let n=0;n<e.length;n++){const r=e[n];if(!an(r))return;if(r.type!==Yt||"v-if"===r.children){if(t)return;t=r}}return t}(e);e=t}return e=wn(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter((t=>t!==e))),e}function re(e,t){t&&t.pendingBranch?(0,o.kJ)(e)?t.effects.push(...e):t.effects.push(e):L(e)}function oe(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e,o=n.el=t.el;r&&r.subTree===n&&(r.vnode.el=o,X(r,o))}function ie(e,t){if(Hn){let n=Hn.provides;const r=Hn.parent&&Hn.parent.provides;r===n&&(n=Hn.provides=Object.create(r)),n[e]=t}}function se(e,t,n=!1){const r=Hn||B;if(r){const i=null==r.parent?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(i&&e in i)return i[e];if(arguments.length>1)return n&&(0,o.mf)(t)?t.call(r.proxy):t}}function ae(e,t){return fe(e,null,t)}function le(e,t){return fe(e,null,{flush:"post"})}function ce(e,t){return fe(e,null,{flush:"sync"})}const ue={};function de(e,t,n){return fe(e,t,n)}function fe(e,t,{immediate:n,deep:i,flush:s,onTrack:a,onTrigger:l}=o.kT){const d=Hn;let f,h,p=!1,m=!1;if((0,r.dq)(e)?(f=()=>e.value,p=(0,r.yT)(e)):(0,r.PG)(e)?(f=()=>e,i=!0):(0,o.kJ)(e)?(m=!0,p=e.some(r.PG),f=()=>e.map((e=>(0,r.dq)(e)?e.value:(0,r.PG)(e)?me(e):(0,o.mf)(e)?c(e,d,2):void 0))):f=(0,o.mf)(e)?t?()=>c(e,d,2):()=>{if(!d||!d.isUnmounted)return h&&h(),u(e,d,3,[y])}:o.dG,t&&i){const e=f;f=()=>me(e())}let y=e=>{h=S.onStop=()=>{c(e,d,4)}};if(qn)return y=o.dG,t?n&&u(t,d,3,[f(),m?[]:void 0,y]):f(),o.dG;let w=m?[]:ue;const x=()=>{if(S.active)if(t){const e=S.run();(i||p||(m?e.some(((e,t)=>(0,o.aU)(e,w[t]))):(0,o.aU)(e,w)))&&(h&&h(),u(t,d,3,[e,w===ue?void 0:w,y]),w=e)}else S.run()};let k;x.allowRecurse=!!t,k="sync"===s?x:"post"===s?()=>Ot(x,d&&d.suspense):()=>{!d||d.isMounted?function(e){O(e,g,v,b)}(x):x()};const S=new r.qq(f,k);return t?n?x():w=S.run():"post"===s?Ot(S.run.bind(S),d&&d.suspense):S.run(),()=>{S.stop(),d&&d.scope&&(0,o.Od)(d.scope.effects,S)}}function he(e,t,n){const r=this.proxy,i=(0,o.HD)(e)?e.includes(".")?pe(r,e):()=>r[e]:e.bind(r,r);let s;(0,o.mf)(t)?s=t:(s=t.handler,n=t);const a=Hn;jn(this);const l=fe(i,s.bind(r),n);return a?jn(a):Wn(),l}function pe(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}function me(e,t){if(!(0,o.Kn)(e)||e.__v_skip)return e;if((t=t||new Set).has(e))return e;if(t.add(e),(0,r.dq)(e))me(e.value,t);else if((0,o.kJ)(e))for(let n=0;n<e.length;n++)me(e[n],t);else if((0,o.DM)(e)||(0,o._N)(e))e.forEach((e=>{me(e,t)}));else if((0,o.PO)(e))for(const n in e)me(e[n],t);return e}function ve(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Be((()=>{e.isMounted=!0})),qe((()=>{e.isUnmounting=!0})),e}const ge=[Function,Array],be={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ge,onEnter:ge,onAfterEnter:ge,onEnterCancelled:ge,onBeforeLeave:ge,onLeave:ge,onAfterLeave:ge,onLeaveCancelled:ge,onBeforeAppear:ge,onAppear:ge,onAfterAppear:ge,onAppearCancelled:ge},setup(e,{slots:t}){const n=Nn(),o=ve();let i;return()=>{const s=t.default&&Ee(t.default(),!0);if(!s||!s.length)return;const a=(0,r.IU)(e),{mode:l}=a,c=s[0];if(o.isLeaving)return xe(c);const u=ke(c);if(!u)return xe(c);const d=we(u,a,o,n);Se(u,d);const f=n.subTree,h=f&&ke(f);let p=!1;const{getTransitionKey:m}=u.type;if(m){const e=m();void 0===i?i=e:e!==i&&(i=e,p=!0)}if(h&&h.type!==Yt&&(!ln(u,h)||p)){const e=we(h,a,o,n);if(Se(h,e),"out-in"===l)return o.isLeaving=!0,e.afterLeave=()=>{o.isLeaving=!1,n.update()},xe(c);"in-out"===l&&u.type!==Yt&&(e.delayLeave=(e,t,n)=>{ye(o,h)[String(h.key)]=h,e._leaveCb=()=>{t(),e._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=n})}return c}}};function ye(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function we(e,t,n,r){const{appear:o,mode:i,persisted:s=!1,onBeforeEnter:a,onEnter:l,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:f,onLeave:h,onAfterLeave:p,onLeaveCancelled:m,onBeforeAppear:v,onAppear:g,onAfterAppear:b,onAppearCancelled:y}=t,w=String(e.key),x=ye(n,e),k=(e,t)=>{e&&u(e,r,9,t)},S={mode:i,persisted:s,beforeEnter(t){let r=a;if(!n.isMounted){if(!o)return;r=v||a}t._leaveCb&&t._leaveCb(!0);const i=x[w];i&&ln(e,i)&&i.el._leaveCb&&i.el._leaveCb(),k(r,[t])},enter(e){let t=l,r=c,i=d;if(!n.isMounted){if(!o)return;t=g||l,r=b||c,i=y||d}let s=!1;const a=e._enterCb=t=>{s||(s=!0,k(t?i:r,[e]),S.delayedLeave&&S.delayedLeave(),e._enterCb=void 0)};t?(t(e,a),t.length<=1&&a()):a()},leave(t,r){const o=String(e.key);if(t._enterCb&&t._enterCb(!0),n.isUnmounting)return r();k(f,[t]);let i=!1;const s=t._leaveCb=n=>{i||(i=!0,r(),k(n?m:p,[t]),t._leaveCb=void 0,x[o]===e&&delete x[o])};x[o]=e,h?(h(t,s),h.length<=1&&s()):s()},clone:e=>we(e,t,n,r)};return S}function xe(e){if(Le(e))return(e=vn(e)).children=null,e}function ke(e){return Le(e)?e.children?e.children[0]:void 0:e}function Se(e,t){6&e.shapeFlag&&e.component?Se(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ee(e,t=!1){let n=[],r=0;for(let o=0;o<e.length;o++){const i=e[o];i.type===Ut?(128&i.patchFlag&&r++,n=n.concat(Ee(i.children,t))):(t||i.type!==Yt)&&n.push(i)}if(r>1)for(let e=0;e<n.length;e++)n[e].patchFlag=-2;return n}function Ce(e){return(0,o.mf)(e)?{setup:e,name:e.name}:e}const _e=e=>!!e.type.__asyncLoader;function Te(e){(0,o.mf)(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:i,delay:s=200,timeout:a,suspensible:l=!0,onError:c}=e;let u,f=null,h=0;const p=()=>{let e;return f||(e=f=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),c)return new Promise(((t,n)=>{c(e,(()=>t((h++,f=null,p()))),(()=>n(e)),h+1)}));throw e})).then((t=>e!==f&&f?f:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),u=t,t))))};return Ce({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return u},setup(){const e=Hn;if(u)return()=>Oe(u,e);const t=t=>{f=null,d(t,e,13,!i)};if(l&&e.suspense||qn)return p().then((t=>()=>Oe(t,e))).catch((e=>(t(e),()=>i?pn(i,{error:e}):null)));const o=(0,r.iH)(!1),c=(0,r.iH)(),h=(0,r.iH)(!!s);return s&&setTimeout((()=>{h.value=!1}),s),null!=a&&setTimeout((()=>{if(!o.value&&!c.value){const e=new Error(`Async component timed out after ${a}ms.`);t(e),c.value=e}}),a),p().then((()=>{o.value=!0,e.parent&&Le(e.parent.vnode)&&_(e.parent.update)})).catch((e=>{t(e),c.value=e})),()=>o.value&&u?Oe(u,e):c.value&&i?pn(i,{error:c.value}):n&&!h.value?pn(n):void 0}})}function Oe(e,{vnode:{ref:t,props:n,children:r}}){const o=pn(e,n,r);return o.ref=t,o}const Le=e=>e.type.__isKeepAlive,Re={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Nn(),r=n.ctx;if(!r.renderer)return t.default;const i=new Map,s=new Set;let a=null;const l=n.suspense,{renderer:{p:c,m:u,um:d,o:{createElement:f}}}=r,h=f("div");function p(e){Pe(e),d(e,n,l,!0)}function m(e){i.forEach(((t,n)=>{const r=Qn(t.type);!r||e&&e(r)||v(n)}))}function v(e){const t=i.get(e);a&&t.type===a.type?a&&Pe(a):p(t),i.delete(e),s.delete(e)}r.activate=(e,t,n,r,i)=>{const s=e.component;u(e,t,n,0,l),c(s.vnode,e,t,n,s,l,r,e.slotScopeIds,i),Ot((()=>{s.isDeactivated=!1,s.a&&(0,o.ir)(s.a);const t=e.props&&e.props.onVnodeMounted;t&&En(t,s.parent,e)}),l)},r.deactivate=e=>{const t=e.component;u(e,h,null,1,l),Ot((()=>{t.da&&(0,o.ir)(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&En(n,t.parent,e),t.isDeactivated=!0}),l)},de((()=>[e.include,e.exclude]),(([e,t])=>{e&&m((t=>De(e,t))),t&&m((e=>!De(t,e)))}),{flush:"post",deep:!0});let g=null;const b=()=>{null!=g&&i.set(g,He(n.subTree))};return Be(b),Ve(b),qe((()=>{i.forEach((e=>{const{subTree:t,suspense:r}=n,o=He(t);if(e.type!==o.type)p(e);else{Pe(o);const e=o.component.da;e&&Ot(e,r)}}))})),()=>{if(g=null,!t.default)return null;const n=t.default(),r=n[0];if(n.length>1)return a=null,n;if(!an(r)||!(4&r.shapeFlag||128&r.shapeFlag))return a=null,r;let o=He(r);const l=o.type,c=Qn(_e(o)?o.type.__asyncResolved||{}:l),{include:u,exclude:d,max:f}=e;if(u&&(!c||!De(u,c))||d&&c&&De(d,c))return a=o,r;const h=null==o.key?l:o.key,p=i.get(h);return o.el&&(o=vn(o),128&r.shapeFlag&&(r.ssContent=o)),g=h,p?(o.el=p.el,o.component=p.component,o.transition&&Se(o,o.transition),o.shapeFlag|=512,s.delete(h),s.add(h)):(s.add(h),f&&s.size>parseInt(f,10)&&v(s.values().next().value)),o.shapeFlag|=256,a=o,r}}};function De(e,t){return(0,o.kJ)(e)?e.some((e=>De(e,t))):(0,o.HD)(e)?e.split(",").includes(t):!!e.test&&e.test(t)}function Ae(e,t){Me(e,"a",t)}function Ie(e,t){Me(e,"da",t)}function Me(e,t,n=Hn){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(Ne(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Le(e.parent.vnode)&&Fe(r,t,n,e),e=e.parent}}function Fe(e,t,n,r){const i=Ne(t,e,r,!0);$e((()=>{(0,o.Od)(r[t],i)}),n)}function Pe(e){let t=e.shapeFlag;256&t&&(t-=256),512&t&&(t-=512),e.shapeFlag=t}function He(e){return 128&e.shapeFlag?e.ssContent:e}function Ne(e,t,n=Hn,o=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;(0,r.Jd)(),jn(n);const i=u(t,n,e,o);return Wn(),(0,r.lk)(),i});return o?i.unshift(s):i.push(s),s}}const je=e=>(t,n=Hn)=>(!qn||"sp"===e)&&Ne(e,t,n),We=je("bm"),Be=je("m"),ze=je("bu"),Ve=je("u"),qe=je("bum"),$e=je("um"),Ue=je("sp"),Ze=je("rtg"),Ye=je("rtc");function Ge(e,t=Hn){Ne("ec",e,t)}let Je=!0;function Ke(e,t,n){u((0,o.kJ)(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function Xe(e,t,n,r){const i=r.includes(".")?pe(n,r):()=>n[r];if((0,o.HD)(e)){const n=t[e];(0,o.mf)(n)&&de(i,n)}else if((0,o.mf)(e))de(i,e.bind(n));else if((0,o.Kn)(e))if((0,o.kJ)(e))e.forEach((e=>Xe(e,t,n,r)));else{const r=(0,o.mf)(e.handler)?e.handler.bind(n):t[e.handler];(0,o.mf)(r)&&de(i,r,e)}}function Qe(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:s}}=e.appContext,a=i.get(t);let l;return a?l=a:o.length||n||r?(l={},o.length&&o.forEach((e=>et(l,e,s,!0))),et(l,t,s)):l=t,i.set(t,l),l}function et(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&et(e,i,n,!0),o&&o.forEach((t=>et(e,t,n,!0)));for(const o in t)if(r&&"expose"===o);else{const r=tt[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const tt={data:nt,props:it,emits:it,methods:it,computed:it,beforeCreate:ot,created:ot,beforeMount:ot,mounted:ot,beforeUpdate:ot,updated:ot,beforeDestroy:ot,beforeUnmount:ot,destroyed:ot,unmounted:ot,activated:ot,deactivated:ot,errorCaptured:ot,serverPrefetch:ot,components:it,directives:it,watch:function(e,t){if(!e)return t;if(!t)return e;const n=(0,o.l7)(Object.create(null),e);for(const r in t)n[r]=ot(e[r],t[r]);return n},provide:nt,inject:function(e,t){return it(rt(e),rt(t))}};function nt(e,t){return t?e?function(){return(0,o.l7)((0,o.mf)(e)?e.call(this,this):e,(0,o.mf)(t)?t.call(this,this):t)}:t:e}function rt(e){if((0,o.kJ)(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function ot(e,t){return e?[...new Set([].concat(e,t))]:t}function it(e,t){return e?(0,o.l7)((0,o.l7)(Object.create(null),e),t):t}function st(e,t,n,i){const[s,a]=e.propsOptions;let l,c=!1;if(t)for(let r in t){if((0,o.Gg)(r))continue;const u=t[r];let d;s&&(0,o.RI)(s,d=(0,o._A)(r))?a&&a.includes(d)?(l||(l={}))[d]=u:n[d]=u:W(e.emitsOptions,r)||r in i&&u===i[r]||(i[r]=u,c=!0)}if(a){const t=(0,r.IU)(n),i=l||o.kT;for(let r=0;r<a.length;r++){const l=a[r];n[l]=at(s,t,l,i[l],e,!(0,o.RI)(i,l))}}return c}function at(e,t,n,r,i,s){const a=e[n];if(null!=a){const e=(0,o.RI)(a,"default");if(e&&void 0===r){const e=a.default;if(a.type!==Function&&(0,o.mf)(e)){const{propsDefaults:o}=i;n in o?r=o[n]:(jn(i),r=o[n]=e.call(null,t),Wn())}else r=e}a[0]&&(s&&!e?r=!1:!a[1]||""!==r&&r!==(0,o.rs)(n)||(r=!0))}return r}function lt(e,t,n=!1){const r=t.propsCache,i=r.get(e);if(i)return i;const s=e.props,a={},l=[];let c=!1;if(!(0,o.mf)(e)){const r=e=>{c=!0;const[n,r]=lt(e,t,!0);(0,o.l7)(a,n),r&&l.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!s&&!c)return r.set(e,o.Z6),o.Z6;if((0,o.kJ)(s))for(let e=0;e<s.length;e++){const t=(0,o._A)(s[e]);ct(t)&&(a[t]=o.kT)}else if(s)for(const e in s){const t=(0,o._A)(e);if(ct(t)){const n=s[e],r=a[t]=(0,o.kJ)(n)||(0,o.mf)(n)?{type:n}:n;if(r){const e=ft(Boolean,r.type),n=ft(String,r.type);r[0]=e>-1,r[1]=n<0||e<n,(e>-1||(0,o.RI)(r,"default"))&&l.push(t)}}}const u=[a,l];return r.set(e,u),u}function ct(e){return"$"!==e[0]}function ut(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:null===e?"null":""}function dt(e,t){return ut(e)===ut(t)}function ft(e,t){return(0,o.kJ)(t)?t.findIndex((t=>dt(t,e))):(0,o.mf)(t)&&dt(t,e)?0:-1}const ht=e=>"_"===e[0]||"$stable"===e,pt=e=>(0,o.kJ)(e)?e.map(wn):[wn(e)],mt=(e,t,n)=>{const r=Z(((...e)=>pt(t(...e))),n);return r._c=!1,r},vt=(e,t,n)=>{const r=e._ctx;for(const n in e){if(ht(n))continue;const i=e[n];if((0,o.mf)(i))t[n]=mt(0,i,r);else if(null!=i){const e=pt(i);t[n]=()=>e}}},gt=(e,t)=>{const n=pt(t);e.slots.default=()=>n};function bt(e,t){if(null===B)return e;const n=B.proxy,r=e.dirs||(e.dirs=[]);for(let e=0;e<t.length;e++){let[i,s,a,l=o.kT]=t[e];(0,o.mf)(i)&&(i={mounted:i,updated:i}),i.deep&&me(s),r.push({dir:i,instance:n,value:s,oldValue:void 0,arg:a,modifiers:l})}return e}function yt(e,t,n,o){const i=e.dirs,s=t&&t.dirs;for(let a=0;a<i.length;a++){const l=i[a];s&&(l.oldValue=s[a].value);let c=l.dir[o];c&&((0,r.Jd)(),u(c,n,8,[e.el,l,e,t]),(0,r.lk)())}}function wt(){return{app:null,config:{isNativeTag:o.NO,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let xt=0;function kt(e,t){return function(n,r=null){null==r||(0,o.Kn)(r)||(r=null);const i=wt(),s=new Set;let a=!1;const l=i.app={_uid:xt++,_component:n,_props:r,_container:null,_context:i,_instance:null,version:br,get config(){return i.config},set config(e){},use:(e,...t)=>(s.has(e)||(e&&(0,o.mf)(e.install)?(s.add(e),e.install(l,...t)):(0,o.mf)(e)&&(s.add(e),e(l,...t))),l),mixin:e=>(i.mixins.includes(e)||i.mixins.push(e),l),component:(e,t)=>t?(i.components[e]=t,l):i.components[e],directive:(e,t)=>t?(i.directives[e]=t,l):i.directives[e],mount(o,s,c){if(!a){const u=pn(n,r);return u.appContext=i,s&&t?t(u,o):e(u,o,c),a=!0,l._container=o,o.__vue_app__=l,Kn(u.component)||u.component.proxy}},unmount(){a&&(e(null,l._container),delete l._container.__vue_app__)},provide:(e,t)=>(i.provides[e]=t,l)};return l}}function St(e,t,n,i,s=!1){if((0,o.kJ)(e))return void e.forEach(((e,r)=>St(e,t&&((0,o.kJ)(t)?t[r]:t),n,i,s)));if(_e(i)&&!s)return;const a=4&i.shapeFlag?Kn(i.component)||i.component.proxy:i.el,l=s?null:a,{i:u,r:d}=e,f=t&&t.r,h=u.refs===o.kT?u.refs={}:u.refs,p=u.setupState;if(null!=f&&f!==d&&((0,o.HD)(f)?(h[f]=null,(0,o.RI)(p,f)&&(p[f]=null)):(0,r.dq)(f)&&(f.value=null)),(0,o.mf)(d))c(d,u,12,[l,h]);else{const t=(0,o.HD)(d),i=(0,r.dq)(d);if(t||i){const i=()=>{if(e.f){const n=t?h[d]:d.value;s?(0,o.kJ)(n)&&(0,o.Od)(n,a):(0,o.kJ)(n)?n.includes(a)||n.push(a):t?h[d]=[a]:(d.value=[a],e.k&&(h[e.k]=d.value))}else t?(h[d]=l,(0,o.RI)(p,d)&&(p[d]=l)):(0,r.dq)(d)&&(d.value=l,e.k&&(h[e.k]=l))};l?(i.id=-1,Ot(i,n)):i()}}}let Et=!1;const Ct=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,_t=e=>8===e.nodeType;function Tt(e){const{mt:t,p:n,o:{patchProp:r,nextSibling:i,parentNode:s,remove:a,insert:l,createComment:c}}=e,u=(n,r,o,a,l,c=!1)=>{const v=_t(n)&&"["===n.data,g=()=>p(n,r,o,a,l,v),{type:b,ref:y,shapeFlag:w}=r,x=n.nodeType;r.el=n;let k=null;switch(b){case Zt:3!==x?k=g():(n.data!==r.children&&(Et=!0,n.data=r.children),k=i(n));break;case Yt:k=8!==x||v?g():i(n);break;case Gt:if(1===x){k=n;const e=!r.children.length;for(let t=0;t<r.staticCount;t++)e&&(r.children+=k.outerHTML),t===r.staticCount-1&&(r.anchor=k),k=i(k);return k}k=g();break;case Ut:k=v?h(n,r,o,a,l,c):g();break;default:if(1&w)k=1!==x||r.type.toLowerCase()!==n.tagName.toLowerCase()?g():d(n,r,o,a,l,c);else if(6&w){r.slotScopeIds=l;const e=s(n);if(t(r,e,null,o,a,Ct(e),c),k=v?m(n):i(n),_e(r)){let t;v?(t=pn(Ut),t.anchor=k?k.previousSibling:e.lastChild):t=3===n.nodeType?gn(""):pn("div"),t.el=n,r.component.subTree=t}}else 64&w?k=8!==x?g():r.type.hydrate(n,r,o,a,l,c,e,f):128&w&&(k=r.type.hydrate(n,r,o,a,Ct(s(n)),l,c,e,u))}return null!=y&&St(y,null,a,r),k},d=(e,t,n,i,s,l)=>{l=l||!!t.dynamicChildren;const{type:c,props:u,patchFlag:d,shapeFlag:h,dirs:p}=t,m="input"===c&&p||"option"===c;if(m||-1!==d){if(p&&yt(t,null,n,"created"),u)if(m||!l||48&d)for(const t in u)(m&&t.endsWith("value")||(0,o.F7)(t)&&!(0,o.Gg)(t))&&r(e,t,null,u[t],!1,void 0,n);else u.onClick&&r(e,"onClick",null,u.onClick,!1,void 0,n);let c;if((c=u&&u.onVnodeBeforeMount)&&En(c,n,t),p&&yt(t,null,n,"beforeMount"),((c=u&&u.onVnodeMounted)||p)&&re((()=>{c&&En(c,n,t),p&&yt(t,null,n,"mounted")}),i),16&h&&(!u||!u.innerHTML&&!u.textContent)){let r=f(e.firstChild,t,e,n,i,s,l);for(;r;){Et=!0;const e=r;r=r.nextSibling,a(e)}}else 8&h&&e.textContent!==t.children&&(Et=!0,e.textContent=t.children)}return e.nextSibling},f=(e,t,r,o,i,s,a)=>{a=a||!!t.dynamicChildren;const l=t.children,c=l.length;for(let t=0;t<c;t++){const c=a?l[t]:l[t]=wn(l[t]);if(e)e=u(e,c,o,i,s,a);else{if(c.type===Zt&&!c.children)continue;Et=!0,n(null,c,r,null,o,i,Ct(r),s)}}return e},h=(e,t,n,r,o,a)=>{const{slotScopeIds:u}=t;u&&(o=o?o.concat(u):u);const d=s(e),h=f(i(e),t,d,n,r,o,a);return h&&_t(h)&&"]"===h.data?i(t.anchor=h):(Et=!0,l(t.anchor=c("]"),d,h),h)},p=(e,t,r,o,l,c)=>{if(Et=!0,t.el=null,c){const t=m(e);for(;;){const n=i(e);if(!n||n===t)break;a(n)}}const u=i(e),d=s(e);return a(e),n(null,t,d,u,r,o,Ct(d),l),u},m=e=>{let t=0;for(;e;)if((e=i(e))&&_t(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return i(e);t--}return e};return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),void D();Et=!1,u(t.firstChild,e,null,null,null),D(),Et&&console.error("Hydration completed but contains mismatches.")},u]}const Ot=re;function Lt(e){return Dt(e)}function Rt(e){return Dt(e,Tt)}function Dt(e,t){(0,o.E9)().__VUE__=!0;const{insert:n,remove:i,patchProp:s,createElement:a,createText:l,createComment:c,setText:u,setElementText:d,parentNode:f,nextSibling:h,setScopeId:v=o.dG,cloneNode:g,insertStaticContent:b}=e,y=(e,t,n,r=null,o=null,i=null,s=!1,a=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!ln(e,t)&&(r=J(e),q(e,o,i,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);const{type:c,ref:u,shapeFlag:d}=t;switch(c){case Zt:w(e,t,n,r);break;case Yt:x(e,t,n,r);break;case Gt:null==e&&k(t,n,r,s);break;case Ut:I(e,t,n,r,o,i,s,a,l);break;default:1&d?S(e,t,n,r,o,i,s,a,l):6&d?M(e,t,n,r,o,i,s,a,l):(64&d||128&d)&&c.process(e,t,n,r,o,i,s,a,l,ee)}null!=u&&o&&St(u,e&&e.ref,i,t||e,!t)},w=(e,t,r,o)=>{if(null==e)n(t.el=l(t.children),r,o);else{const n=t.el=e.el;t.children!==e.children&&u(n,t.children)}},x=(e,t,r,o)=>{null==e?n(t.el=c(t.children||""),r,o):t.el=e.el},k=(e,t,n,r)=>{[e.el,e.anchor]=b(e.children,t,n,r,e.el,e.anchor)},S=(e,t,n,r,o,i,s,a,l)=>{s=s||"svg"===t.type,null==e?E(t,n,r,o,i,s,a,l):O(e,t,o,i,s,a,l)},E=(e,t,r,i,l,c,u,f)=>{let h,p;const{type:m,props:v,shapeFlag:b,transition:y,patchFlag:w,dirs:x}=e;if(e.el&&void 0!==g&&-1===w)h=e.el=g(e.el);else{if(h=e.el=a(e.type,c,v&&v.is,v),8&b?d(h,e.children):16&b&&T(e.children,h,null,i,l,c&&"foreignObject"!==m,u,f),x&&yt(e,null,i,"created"),v){for(const t in v)"value"===t||(0,o.Gg)(t)||s(h,t,null,v[t],c,e.children,i,l,G);"value"in v&&s(h,"value",null,v.value),(p=v.onVnodeBeforeMount)&&En(p,i,e)}C(h,e,e.scopeId,u,i)}x&&yt(e,null,i,"beforeMount");const k=(!l||l&&!l.pendingBranch)&&y&&!y.persisted;k&&y.beforeEnter(h),n(h,t,r),((p=v&&v.onVnodeMounted)||k||x)&&Ot((()=>{p&&En(p,i,e),k&&y.enter(h),x&&yt(e,null,i,"mounted")}),l)},C=(e,t,n,r,o)=>{if(n&&v(e,n),r)for(let t=0;t<r.length;t++)v(e,r[t]);if(o&&t===o.subTree){const t=o.vnode;C(e,t,t.scopeId,t.slotScopeIds,o.parent)}},T=(e,t,n,r,o,i,s,a,l=0)=>{for(let c=l;c<e.length;c++){const l=e[c]=a?xn(e[c]):wn(e[c]);y(null,l,t,n,r,o,i,s,a)}},O=(e,t,n,r,i,a,l)=>{const c=t.el=e.el;let{patchFlag:u,dynamicChildren:f,dirs:h}=t;u|=16&e.patchFlag;const p=e.props||o.kT,m=t.props||o.kT;let v;n&&At(n,!1),(v=m.onVnodeBeforeUpdate)&&En(v,n,t,e),h&&yt(t,e,n,"beforeUpdate"),n&&At(n,!0);const g=i&&"foreignObject"!==t.type;if(f?L(e.dynamicChildren,f,c,n,r,g,a):l||j(e,t,c,null,n,r,g,a,!1),u>0){if(16&u)A(c,t,p,m,n,r,i);else if(2&u&&p.class!==m.class&&s(c,"class",null,m.class,i),4&u&&s(c,"style",p.style,m.style,i),8&u){const o=t.dynamicProps;for(let t=0;t<o.length;t++){const a=o[t],l=p[a],u=m[a];u===l&&"value"!==a||s(c,a,l,u,i,e.children,n,r,G)}}1&u&&e.children!==t.children&&d(c,t.children)}else l||null!=f||A(c,t,p,m,n,r,i);((v=m.onVnodeUpdated)||h)&&Ot((()=>{v&&En(v,n,t,e),h&&yt(t,e,n,"updated")}),r)},L=(e,t,n,r,o,i,s)=>{for(let a=0;a<t.length;a++){const l=e[a],c=t[a],u=l.el&&(l.type===Ut||!ln(l,c)||70&l.shapeFlag)?f(l.el):n;y(l,c,u,null,r,o,i,s,!0)}},A=(e,t,n,r,i,a,l)=>{if(n!==r){for(const c in r){if((0,o.Gg)(c))continue;const u=r[c],d=n[c];u!==d&&"value"!==c&&s(e,c,d,u,l,t.children,i,a,G)}if(n!==o.kT)for(const c in n)(0,o.Gg)(c)||c in r||s(e,c,n[c],null,l,t.children,i,a,G);"value"in r&&s(e,"value",n.value,r.value)}},I=(e,t,r,o,i,s,a,c,u)=>{const d=t.el=e?e.el:l(""),f=t.anchor=e?e.anchor:l("");let{patchFlag:h,dynamicChildren:p,slotScopeIds:m}=t;m&&(c=c?c.concat(m):m),null==e?(n(d,r,o),n(f,r,o),T(t.children,r,f,i,s,a,c,u)):h>0&&64&h&&p&&e.dynamicChildren?(L(e.dynamicChildren,p,r,i,s,a,c),(null!=t.key||i&&t===i.subTree)&&It(e,t,!0)):j(e,t,r,f,i,s,a,c,u)},M=(e,t,n,r,o,i,s,a,l)=>{t.slotScopeIds=a,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,s,l):F(t,n,r,o,i,s,l):P(e,t,l)},F=(e,t,n,r,o,i,s)=>{const a=e.component=Pn(e,r,o);if(Le(e)&&(a.ctx.renderer=ee),$n(a),a.asyncDep){if(o&&o.registerDep(a,H),!e.el){const e=a.subTree=pn(Yt);x(null,e,t,n)}}else H(a,e,t,n,o,i,s)},P=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:i}=e,{props:s,children:a,patchFlag:l}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return!(!o&&!a||a&&a.$stable)||r!==s&&(r?!s||K(r,s,c):!!s);if(1024&l)return!0;if(16&l)return r?K(r,s,c):!!s;if(8&l){const e=t.dynamicProps;for(let t=0;t<e.length;t++){const n=e[t];if(s[n]!==r[n]&&!W(c,n))return!0}}return!1}(e,t,n)){if(r.asyncDep&&!r.asyncResolved)return void N(r,t,n);r.next=t,function(e){const t=p.indexOf(e);t>m&&p.splice(t,1)}(r.update),r.update()}else t.component=e.component,t.el=e.el,r.vnode=t},H=(e,t,n,i,s,a,l)=>{const c=e.effect=new r.qq((()=>{if(e.isMounted){let t,{next:n,bu:r,u:i,parent:c,vnode:u}=e,d=n;At(e,!1),n?(n.el=u.el,N(e,n,l)):n=u,r&&(0,o.ir)(r),(t=n.props&&n.props.onVnodeBeforeUpdate)&&En(t,c,n,u),At(e,!0);const h=Y(e),p=e.subTree;e.subTree=h,y(p,h,f(p.el),J(p),e,s,a),n.el=h.el,null===d&&X(e,h.el),i&&Ot(i,s),(t=n.props&&n.props.onVnodeUpdated)&&Ot((()=>En(t,c,n,u)),s)}else{let r;const{el:l,props:c}=t,{bm:u,m:d,parent:f}=e,h=_e(t);if(At(e,!1),u&&(0,o.ir)(u),!h&&(r=c&&c.onVnodeBeforeMount)&&En(r,f,t),At(e,!0),l&&ne){const n=()=>{e.subTree=Y(e),ne(l,e.subTree,e,s,null)};h?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{const r=e.subTree=Y(e);y(null,r,n,i,e,s,a),t.el=r.el}if(d&&Ot(d,s),!h&&(r=c&&c.onVnodeMounted)){const e=t;Ot((()=>En(r,f,e)),s)}256&t.shapeFlag&&e.a&&Ot(e.a,s),e.isMounted=!0,t=n=i=null}}),(()=>_(e.update)),e.scope),u=e.update=c.run.bind(c);u.id=e.uid,At(e,!0),u()},N=(e,t,n)=>{t.component=e;const i=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,i){const{props:s,attrs:a,vnode:{patchFlag:l}}=e,c=(0,r.IU)(s),[u]=e.propsOptions;let d=!1;if(!(i||l>0)||16&l){let r;st(e,t,s,a)&&(d=!0);for(const i in c)t&&((0,o.RI)(t,i)||(r=(0,o.rs)(i))!==i&&(0,o.RI)(t,r))||(u?!n||void 0===n[i]&&void 0===n[r]||(s[i]=at(u,c,i,void 0,e,!0)):delete s[i]);if(a!==c)for(const e in a)t&&(0,o.RI)(t,e)||(delete a[e],d=!0)}else if(8&l){const n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let i=n[r];const l=t[i];if(u)if((0,o.RI)(a,i))l!==a[i]&&(a[i]=l,d=!0);else{const t=(0,o._A)(i);s[t]=at(u,c,t,l,e,!1)}else l!==a[i]&&(a[i]=l,d=!0)}}d&&(0,r.X$)(e,"set","$attrs")}(e,t.props,i,n),((e,t,n)=>{const{vnode:r,slots:i}=e;let s=!0,a=o.kT;if(32&r.shapeFlag){const e=t._;e?n&&1===e?s=!1:((0,o.l7)(i,t),n||1!==e||delete i._):(s=!t.$stable,vt(t,i)),a=t}else t&&(gt(e,t),a={default:1});if(s)for(const e in i)ht(e)||e in a||delete i[e]})(e,t.children,n),(0,r.Jd)(),R(void 0,e.update),(0,r.lk)()},j=(e,t,n,r,o,i,s,a,l=!1)=>{const c=e&&e.children,u=e?e.shapeFlag:0,f=t.children,{patchFlag:h,shapeFlag:p}=t;if(h>0){if(128&h)return void z(c,f,n,r,o,i,s,a,l);if(256&h)return void B(c,f,n,r,o,i,s,a,l)}8&p?(16&u&&G(c,o,i),f!==c&&d(n,f)):16&u?16&p?z(c,f,n,r,o,i,s,a,l):G(c,o,i,!0):(8&u&&d(n,""),16&p&&T(f,n,r,o,i,s,a,l))},B=(e,t,n,r,i,s,a,l,c)=>{e=e||o.Z6,t=t||o.Z6;const u=e.length,d=t.length,f=Math.min(u,d);let h;for(h=0;h<f;h++){const r=t[h]=c?xn(t[h]):wn(t[h]);y(e[h],r,n,null,i,s,a,l,c)}u>d?G(e,i,s,!0,!1,f):T(t,n,r,i,s,a,l,c,f)},z=(e,t,n,r,i,s,a,l,c)=>{let u=0;const d=t.length;let f=e.length-1,h=d-1;for(;u<=f&&u<=h;){const r=e[u],o=t[u]=c?xn(t[u]):wn(t[u]);if(!ln(r,o))break;y(r,o,n,null,i,s,a,l,c),u++}for(;u<=f&&u<=h;){const r=e[f],o=t[h]=c?xn(t[h]):wn(t[h]);if(!ln(r,o))break;y(r,o,n,null,i,s,a,l,c),f--,h--}if(u>f){if(u<=h){const e=h+1,o=e<d?t[e].el:r;for(;u<=h;)y(null,t[u]=c?xn(t[u]):wn(t[u]),n,o,i,s,a,l,c),u++}}else if(u>h)for(;u<=f;)q(e[u],i,s,!0),u++;else{const p=u,m=u,v=new Map;for(u=m;u<=h;u++){const e=t[u]=c?xn(t[u]):wn(t[u]);null!=e.key&&v.set(e.key,u)}let g,b=0;const w=h-m+1;let x=!1,k=0;const S=new Array(w);for(u=0;u<w;u++)S[u]=0;for(u=p;u<=f;u++){const r=e[u];if(b>=w){q(r,i,s,!0);continue}let o;if(null!=r.key)o=v.get(r.key);else for(g=m;g<=h;g++)if(0===S[g-m]&&ln(r,t[g])){o=g;break}void 0===o?q(r,i,s,!0):(S[o-m]=u+1,o>=k?k=o:x=!0,y(r,t[o],n,null,i,s,a,l,c),b++)}const E=x?function(e){const t=e.slice(),n=[0];let r,o,i,s,a;const l=e.length;for(r=0;r<l;r++){const l=e[r];if(0!==l){if(o=n[n.length-1],e[o]<l){t[r]=o,n.push(r);continue}for(i=0,s=n.length-1;i<s;)a=i+s>>1,e[n[a]]<l?i=a+1:s=a;l<e[n[i]]&&(i>0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,s=n[i-1];i-- >0;)n[i]=s,s=t[s];return n}(S):o.Z6;for(g=E.length-1,u=w-1;u>=0;u--){const e=m+u,o=t[e],f=e+1<d?t[e+1].el:r;0===S[u]?y(null,o,n,f,i,s,a,l,c):x&&(g<0||u!==E[g]?V(o,n,f,2):g--)}}},V=(e,t,r,o,i=null)=>{const{el:s,type:a,transition:l,children:c,shapeFlag:u}=e;if(6&u)V(e.component.subTree,t,r,o);else if(128&u)e.suspense.move(t,r,o);else if(64&u)a.move(e,t,r,ee);else if(a!==Ut)if(a!==Gt)if(2!==o&&1&u&&l)if(0===o)l.beforeEnter(s),n(s,t,r),Ot((()=>l.enter(s)),i);else{const{leave:e,delayLeave:o,afterLeave:i}=l,a=()=>n(s,t,r),c=()=>{e(s,(()=>{a(),i&&i()}))};o?o(s,a,c):c()}else n(s,t,r);else(({el:e,anchor:t},r,o)=>{let i;for(;e&&e!==t;)i=h(e),n(e,r,o),e=i;n(t,r,o)})(e,t,r);else{n(s,t,r);for(let e=0;e<c.length;e++)V(c[e],t,r,o);n(e.anchor,t,r)}},q=(e,t,n,r=!1,o=!1)=>{const{type:i,props:s,ref:a,children:l,dynamicChildren:c,shapeFlag:u,patchFlag:d,dirs:f}=e;if(null!=a&&St(a,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const h=1&u&&f,p=!_e(e);let m;if(p&&(m=s&&s.onVnodeBeforeUnmount)&&En(m,t,e),6&u)Z(e.component,n,r);else{if(128&u)return void e.suspense.unmount(n,r);h&&yt(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,o,ee,r):c&&(i!==Ut||d>0&&64&d)?G(c,t,n,!1,!0):(i===Ut&&384&d||!o&&16&u)&&G(l,t,n),r&&$(e)}(p&&(m=s&&s.onVnodeUnmounted)||h)&&Ot((()=>{m&&En(m,t,e),h&&yt(e,null,t,"unmounted")}),n)},$=e=>{const{type:t,el:n,anchor:r,transition:o}=e;if(t===Ut)return void U(n,r);if(t===Gt)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),i(e),e=n;i(t)})(e);const s=()=>{i(n),o&&!o.persisted&&o.afterLeave&&o.afterLeave()};if(1&e.shapeFlag&&o&&!o.persisted){const{leave:t,delayLeave:r}=o,i=()=>t(n,s);r?r(e.el,s,i):i()}else s()},U=(e,t)=>{let n;for(;e!==t;)n=h(e),i(e),e=n;i(t)},Z=(e,t,n)=>{const{bum:r,scope:i,update:s,subTree:a,um:l}=e;r&&(0,o.ir)(r),i.stop(),s&&(s.active=!1,q(a,e,t,n)),l&&Ot(l,t),Ot((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},G=(e,t,n,r=!1,o=!1,i=0)=>{for(let s=i;s<e.length;s++)q(e[s],t,n,r,o)},J=e=>6&e.shapeFlag?J(e.component.subTree):128&e.shapeFlag?e.suspense.next():h(e.anchor||e.el),Q=(e,t,n)=>{null==e?t._vnode&&q(t._vnode,null,null,!0):y(t._vnode||null,e,t,null,null,null,n),D(),t._vnode=e},ee={p:y,um:q,m:V,r:$,mt:F,mc:T,pc:j,pbc:L,n:J,o:e};let te,ne;return t&&([te,ne]=t(ee)),{render:Q,hydrate:te,createApp:kt(Q,te)}}function At({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function It(e,t,n=!1){const r=e.children,i=t.children;if((0,o.kJ)(r)&&(0,o.kJ)(i))for(let e=0;e<r.length;e++){const t=r[e];let o=i[e];1&o.shapeFlag&&!o.dynamicChildren&&((o.patchFlag<=0||32===o.patchFlag)&&(o=i[e]=xn(i[e]),o.el=t.el),n||It(t,o))}}const Mt=e=>e&&(e.disabled||""===e.disabled),Ft=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,Pt=(e,t)=>{const n=e&&e.to;if((0,o.HD)(n)){if(t){return t(n)}return null}return n};function Ht(e,t,n,{o:{insert:r},m:o},i=2){0===i&&r(e.targetAnchor,t,n);const{el:s,anchor:a,shapeFlag:l,children:c,props:u}=e,d=2===i;if(d&&r(s,t,n),(!d||Mt(u))&&16&l)for(let e=0;e<c.length;e++)o(c[e],t,n,2);d&&r(a,t,n)}const Nt={__isTeleport:!0,process(e,t,n,r,o,i,s,a,l,c){const{mc:u,pc:d,pbc:f,o:{insert:h,querySelector:p,createText:m,createComment:v}}=c,g=Mt(t.props);let{shapeFlag:b,children:y,dynamicChildren:w}=t;if(null==e){const e=t.el=m(""),c=t.anchor=m("");h(e,n,r),h(c,n,r);const d=t.target=Pt(t.props,p),f=t.targetAnchor=m("");d&&(h(f,d),s=s||Ft(d));const v=(e,t)=>{16&b&&u(y,e,t,o,i,s,a,l)};g?v(n,c):d&&v(d,f)}else{t.el=e.el;const r=t.anchor=e.anchor,u=t.target=e.target,h=t.targetAnchor=e.targetAnchor,m=Mt(e.props),v=m?n:u,b=m?r:h;if(s=s||Ft(u),w?(f(e.dynamicChildren,w,v,o,i,s,a),It(e,t,!0)):l||d(e,t,v,b,o,i,s,a,!1),g)m||Ht(t,n,r,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=Pt(t.props,p);e&&Ht(t,e,null,c,0)}else m&&Ht(t,u,h,c,1)}},remove(e,t,n,r,{um:o,o:{remove:i}},s){const{shapeFlag:a,children:l,anchor:c,targetAnchor:u,target:d,props:f}=e;if(d&&i(u),(s||!Mt(f))&&(i(c),16&a))for(let e=0;e<l.length;e++){const r=l[e];o(r,t,n,!0,!!r.dynamicChildren)}},move:Ht,hydrate:function(e,t,n,r,o,i,{o:{nextSibling:s,parentNode:a,querySelector:l}},c){const u=t.target=Pt(t.props,l);if(u){const l=u._lpa||u.firstChild;16&t.shapeFlag&&(Mt(t.props)?(t.anchor=c(s(e),t,a(e),n,r,o,i),t.targetAnchor=l):(t.anchor=s(e),t.targetAnchor=c(l,t,u,n,r,o,i)),u._lpa=t.targetAnchor&&s(t.targetAnchor))}return t.anchor&&s(t.anchor)}},jt="components";function Wt(e,t){return qt(jt,e,!0,t)||e}const Bt=Symbol();function zt(e){return(0,o.HD)(e)?qt(jt,e,!1)||e:e||Bt}function Vt(e){return qt("directives",e)}function qt(e,t,n=!0,r=!1){const i=B||Hn;if(i){const n=i.type;if(e===jt){const e=Qn(n);if(e&&(e===t||e===(0,o._A)(t)||e===(0,o.kC)((0,o._A)(t))))return n}const s=$t(i[e]||n[e],t)||$t(i.appContext[e],t);return!s&&r?n:s}}function $t(e,t){return e&&(e[t]||e[(0,o._A)(t)]||e[(0,o.kC)((0,o._A)(t))])}const Ut=Symbol(void 0),Zt=Symbol(void 0),Yt=Symbol(void 0),Gt=Symbol(void 0),Jt=[];let Kt=null;function Xt(e=!1){Jt.push(Kt=e?null:[])}function Qt(){Jt.pop(),Kt=Jt[Jt.length-1]||null}let en,tn=1;function nn(e){tn+=e}function rn(e){return e.dynamicChildren=tn>0?Kt||o.Z6:null,Qt(),tn>0&&Kt&&Kt.push(e),e}function on(e,t,n,r,o,i){return rn(hn(e,t,n,r,o,i,!0))}function sn(e,t,n,r,o){return rn(pn(e,t,n,r,o,!0))}function an(e){return!!e&&!0===e.__v_isVNode}function ln(e,t){return e.type===t.type&&e.key===t.key}function cn(e){en=e}const un="__vInternal",dn=({key:e})=>null!=e?e:null,fn=({ref:e,ref_key:t,ref_for:n})=>null!=e?(0,o.HD)(e)||(0,r.dq)(e)||(0,o.mf)(e)?{i:B,r:e,k:t,f:!!n}:e:null;function hn(e,t=null,n=null,r=0,i=null,s=(e===Ut?0:1),a=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&dn(t),ref:t&&fn(t),scopeId:z,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null};return l?(kn(c,n),128&s&&e.normalize(c)):n&&(c.shapeFlag|=(0,o.HD)(n)?8:16),tn>0&&!a&&Kt&&(c.patchFlag>0||6&s)&&32!==c.patchFlag&&Kt.push(c),c}const pn=function(e,t=null,n=null,i=0,s=null,a=!1){if(e&&e!==Bt||(e=Yt),an(e)){const r=vn(e,t,!0);return n&&kn(r,n),r}if(l=e,(0,o.mf)(l)&&"__vccOpts"in l&&(e=e.__vccOpts),t){t=mn(t);let{class:e,style:n}=t;e&&!(0,o.HD)(e)&&(t.class=(0,o.C_)(e)),(0,o.Kn)(n)&&((0,r.X3)(n)&&!(0,o.kJ)(n)&&(n=(0,o.l7)({},n)),t.style=(0,o.j5)(n))}var l;return hn(e,t,n,i,s,(0,o.HD)(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:(0,o.Kn)(e)?4:(0,o.mf)(e)?2:0,a,!0)};function mn(e){return e?(0,r.X3)(e)||un in e?(0,o.l7)({},e):e:null}function vn(e,t,n=!1){const{props:r,ref:i,patchFlag:s,children:a}=e,l=t?Sn(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&dn(l),ref:t&&t.ref?n&&i?(0,o.kJ)(i)?i.concat(fn(t)):[i,fn(t)]:fn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ut?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&vn(e.ssContent),ssFallback:e.ssFallback&&vn(e.ssFallback),el:e.el,anchor:e.anchor}}function gn(e=" ",t=0){return pn(Zt,null,e,t)}function bn(e,t){const n=pn(Gt,null,e);return n.staticCount=t,n}function yn(e="",t=!1){return t?(Xt(),sn(Yt,null,e)):pn(Yt,null,e)}function wn(e){return null==e||"boolean"==typeof e?pn(Yt):(0,o.kJ)(e)?pn(Ut,null,e.slice()):"object"==typeof e?xn(e):pn(Zt,null,String(e))}function xn(e){return null===e.el||e.memo?e:vn(e)}function kn(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if((0,o.kJ)(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),kn(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||un in t?3===r&&B&&(1===B.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=B}}else(0,o.mf)(t)?(t={default:t,_ctx:B},n=32):(t=String(t),64&r?(n=16,t=[gn(t)]):n=8);e.children=t,e.shapeFlag|=n}function Sn(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const e in r)if("class"===e)t.class!==r.class&&(t.class=(0,o.C_)([t.class,r.class]));else if("style"===e)t.style=(0,o.j5)([t.style,r.style]);else if((0,o.F7)(e)){const n=t[e],i=r[e];!i||n===i||(0,o.kJ)(n)&&n.includes(i)||(t[e]=n?[].concat(n,i):i)}else""!==e&&(t[e]=r[e])}return t}function En(e,t,n,r=null){u(e,t,7,[n,r])}function Cn(e,t,n,r){let i;const s=n&&n[r];if((0,o.kJ)(e)||(0,o.HD)(e)){i=new Array(e.length);for(let n=0,r=e.length;n<r;n++)i[n]=t(e[n],n,void 0,s&&s[n])}else if("number"==typeof e){i=new Array(e);for(let n=0;n<e;n++)i[n]=t(n+1,n,void 0,s&&s[n])}else if((0,o.Kn)(e))if(e[Symbol.iterator])i=Array.from(e,((e,n)=>t(e,n,void 0,s&&s[n])));else{const n=Object.keys(e);i=new Array(n.length);for(let r=0,o=n.length;r<o;r++){const o=n[r];i[r]=t(e[o],o,r,s&&s[r])}}else i=[];return n&&(n[r]=i),i}function _n(e,t){for(let n=0;n<t.length;n++){const r=t[n];if((0,o.kJ)(r))for(let t=0;t<r.length;t++)e[r[t].name]=r[t].fn;else r&&(e[r.name]=r.fn)}return e}function Tn(e,t,n={},r,o){if(B.isCE)return pn("slot","default"===t?null:{name:t},r&&r());let i=e[t];i&&i._c&&(i._d=!1),Xt();const s=i&&On(i(n)),a=sn(Ut,{key:n.key||`_${t}`},s||(r?r():[]),s&&1===e._?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),i&&i._c&&(i._d=!0),a}function On(e){return e.some((e=>!an(e)||e.type!==Yt&&!(e.type===Ut&&!On(e.children))))?e:null}function Ln(e){const t={};for(const n in e)t[(0,o.hR)(n)]=e[n];return t}const Rn=e=>e?Bn(e)?Kn(e)||e.proxy:Rn(e.parent):null,Dn=(0,o.l7)(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Rn(e.parent),$root:e=>Rn(e.root),$emit:e=>e.emit,$options:e=>Qe(e),$forceUpdate:e=>()=>_(e.update),$nextTick:e=>C.bind(e.proxy),$watch:e=>he.bind(e)}),An={get({_:e},t){const{ctx:n,setupState:i,data:s,props:a,accessCache:l,type:c,appContext:u}=e;let d;if("$"!==t[0]){const r=l[t];if(void 0!==r)switch(r){case 1:return i[t];case 2:return s[t];case 4:return n[t];case 3:return a[t]}else{if(i!==o.kT&&(0,o.RI)(i,t))return l[t]=1,i[t];if(s!==o.kT&&(0,o.RI)(s,t))return l[t]=2,s[t];if((d=e.propsOptions[0])&&(0,o.RI)(d,t))return l[t]=3,a[t];if(n!==o.kT&&(0,o.RI)(n,t))return l[t]=4,n[t];Je&&(l[t]=0)}}const f=Dn[t];let h,p;return f?("$attrs"===t&&(0,r.j)(e,"get",t),f(e)):(h=c.__cssModules)&&(h=h[t])?h:n!==o.kT&&(0,o.RI)(n,t)?(l[t]=4,n[t]):(p=u.config.globalProperties,(0,o.RI)(p,t)?p[t]:void 0)},set({_:e},t,n){const{data:r,setupState:i,ctx:s}=e;if(i!==o.kT&&(0,o.RI)(i,t))i[t]=n;else if(r!==o.kT&&(0,o.RI)(r,t))r[t]=n;else if((0,o.RI)(e.props,t))return!1;return!("$"===t[0]&&t.slice(1)in e||(s[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,propsOptions:s}},a){let l;return!!n[a]||e!==o.kT&&(0,o.RI)(e,a)||t!==o.kT&&(0,o.RI)(t,a)||(l=s[0])&&(0,o.RI)(l,a)||(0,o.RI)(r,a)||(0,o.RI)(Dn,a)||(0,o.RI)(i.config.globalProperties,a)}},In=(0,o.l7)({},An,{get(e,t){if(t!==Symbol.unscopables)return An.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!(0,o.e1)(t)}),Mn=wt();let Fn=0;function Pn(e,t,n){const i=e.type,s=(t?t.appContext:e.appContext)||Mn,a={uid:Fn++,vnode:e,type:i,parent:t,appContext:s,root:null,next:null,subTree:null,effect:null,update:null,scope:new r.Bj(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(s.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:lt(i,s),emitsOptions:j(i,s),emit:null,emitted:null,propsDefaults:o.kT,inheritAttrs:i.inheritAttrs,ctx:o.kT,data:o.kT,props:o.kT,attrs:o.kT,slots:o.kT,refs:o.kT,setupState:o.kT,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return a.ctx={_:a},a.root=t?t.root:a,a.emit=N.bind(null,a),e.ce&&e.ce(a),a}let Hn=null;const Nn=()=>Hn||B,jn=e=>{Hn=e,e.scope.on()},Wn=()=>{Hn&&Hn.scope.off(),Hn=null};function Bn(e){return 4&e.vnode.shapeFlag}let zn,Vn,qn=!1;function $n(e,t=!1){qn=t;const{props:n,children:i}=e.vnode,s=Bn(e);!function(e,t,n,i=!1){const s={},a={};(0,o.Nj)(a,un,1),e.propsDefaults=Object.create(null),st(e,t,s,a);for(const t in e.propsOptions[0])t in s||(s[t]=void 0);n?e.props=i?s:(0,r.Um)(s):e.type.props?e.props=s:e.props=a,e.attrs=a}(e,n,s,t),((e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=(0,r.IU)(t),(0,o.Nj)(t,"_",n)):vt(t,e.slots={})}else e.slots={},t&&gt(e,t);(0,o.Nj)(e.slots,un,1)})(e,i);const a=s?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=(0,r.Xl)(new Proxy(e.ctx,An));const{setup:i}=n;if(i){const n=e.setupContext=i.length>1?Jn(e):null;jn(e),(0,r.Jd)();const s=c(i,e,0,[e.props,n]);if((0,r.lk)(),Wn(),(0,o.tI)(s)){if(s.then(Wn,Wn),t)return s.then((n=>{Un(e,n,t)})).catch((t=>{d(t,e,0)}));e.asyncDep=s}else Un(e,s,t)}else Gn(e,t)}(e,t):void 0;return qn=!1,a}function Un(e,t,n){(0,o.mf)(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:(0,o.Kn)(t)&&(e.setupState=(0,r.WL)(t)),Gn(e,n)}function Zn(e){zn=e,Vn=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,In))}}const Yn=()=>!zn;function Gn(e,t,n){const i=e.type;if(!e.render){if(!t&&zn&&!i.render){const t=i.template;if(t){const{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:s,compilerOptions:a}=i,l=(0,o.l7)((0,o.l7)({isCustomElement:n,delimiters:s},r),a);i.render=zn(t,l)}}e.render=i.render||o.dG,Vn&&Vn(e)}jn(e),(0,r.Jd)(),function(e){const t=Qe(e),n=e.proxy,i=e.ctx;Je=!1,t.beforeCreate&&Ke(t.beforeCreate,e,"bc");const{data:s,computed:a,methods:l,watch:c,provide:u,inject:d,created:f,beforeMount:h,mounted:p,beforeUpdate:m,updated:v,activated:g,deactivated:b,beforeDestroy:y,beforeUnmount:w,destroyed:x,unmounted:k,render:S,renderTracked:E,renderTriggered:C,errorCaptured:_,serverPrefetch:T,expose:O,inheritAttrs:L,components:R,directives:D,filters:A}=t;if(d&&function(e,t,n=o.dG,i=!1){(0,o.kJ)(e)&&(e=rt(e));for(const n in e){const s=e[n];let a;a=(0,o.Kn)(s)?"default"in s?se(s.from||n,s.default,!0):se(s.from||n):se(s),(0,r.dq)(a)&&i?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e}):t[n]=a}}(d,i,null,e.appContext.config.unwrapInjectedRef),l)for(const e in l){const t=l[e];(0,o.mf)(t)&&(i[e]=t.bind(n))}if(s){const t=s.call(n,n);(0,o.Kn)(t)&&(e.data=(0,r.qj)(t))}if(Je=!0,a)for(const e in a){const t=a[e],r=(0,o.mf)(t)?t.bind(n,n):(0,o.mf)(t.get)?t.get.bind(n,n):o.dG,s=!(0,o.mf)(t)&&(0,o.mf)(t.set)?t.set.bind(n):o.dG,l=tr({get:r,set:s});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e})}if(c)for(const e in c)Xe(c[e],i,n,e);if(u){const e=(0,o.mf)(u)?u.call(n):u;Reflect.ownKeys(e).forEach((t=>{ie(t,e[t])}))}function I(e,t){(0,o.kJ)(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(f&&Ke(f,e,"c"),I(We,h),I(Be,p),I(ze,m),I(Ve,v),I(Ae,g),I(Ie,b),I(Ge,_),I(Ye,E),I(Ze,C),I(qe,w),I($e,k),I(Ue,T),(0,o.kJ)(O))if(O.length){const t=e.exposed||(e.exposed={});O.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});S&&e.render===o.dG&&(e.render=S),null!=L&&(e.inheritAttrs=L),R&&(e.components=R),D&&(e.directives=D)}(e),(0,r.lk)(),Wn()}function Jn(e){let t;return{get attrs(){return t||(t=function(e){return new Proxy(e.attrs,{get:(t,n)=>((0,r.j)(e,"get","$attrs"),t[n])})}(e))},slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function Kn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy((0,r.WL)((0,r.Xl)(e.exposed)),{get:(t,n)=>n in t?t[n]:n in Dn?Dn[n](e):void 0}))}const Xn=/(?:^|[-_])(\w)/g;function Qn(e){return(0,o.mf)(e)&&e.displayName||e.name}function er(e,t,n=!1){let r=Qn(t);if(!r&&t.__file){const e=t.__file.match(/([^/\\]+)\.\w+$/);e&&(r=e[1])}if(!r&&e&&e.parent){const n=e=>{for(const n in e)if(e[n]===t)return n};r=n(e.components||e.parent.type.components)||n(e.appContext.components)}return r?r.replace(Xn,(e=>e.toUpperCase())).replace(/[-_]/g,""):n?"App":"Anonymous"}const tr=(e,t)=>(0,r.Fl)(e,t,qn);function nr(){return null}function rr(){return null}function or(e){}function ir(e,t){return null}function sr(){return lr().slots}function ar(){return lr().attrs}function lr(){const e=Nn();return e.setupContext||(e.setupContext=Jn(e))}function cr(e,t){const n=(0,o.kJ)(e)?e.reduce(((e,t)=>(e[t]={},e)),{}):e;for(const e in t){const r=n[e];r?(0,o.kJ)(r)||(0,o.mf)(r)?n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(n[e]={default:t[e]})}return n}function ur(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function dr(e){const t=Nn();let n=e();return Wn(),(0,o.tI)(n)&&(n=n.catch((e=>{throw jn(t),e}))),[n,()=>jn(t)]}function fr(e,t,n){const r=arguments.length;return 2===r?(0,o.Kn)(t)&&!(0,o.kJ)(t)?an(t)?pn(e,null,[t]):pn(e,t):pn(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&an(n)&&(n=[n]),pn(e,t,n))}const hr=Symbol(""),pr=()=>{{const e=se(hr);return e||s("Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build."),e}};function mr(){}function vr(e,t,n,r){const o=n[r];if(o&&gr(o,e))return o;const i=t();return i.memo=e.slice(),n[r]=i}function gr(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(n[e]!==t[e])return!1;return tn>0&&Kt&&Kt.push(e),!0}const br="3.2.30",yr={createComponentInstance:Pn,setupComponent:$n,renderComponentRoot:Y,setCurrentRenderingInstance:V,isVNode:an,normalizeVNode:wn},wr=null,xr=null},3577:(e,t,n)=>{"use strict";function r(e,t){const n=Object.create(null),r=e.split(",");for(let e=0;e<r.length;e++)n[r[e]]=!0;return t?e=>!!n[e.toLowerCase()]:e=>!!n[e]}n.d(t,{Z6:()=>S,kT:()=>k,NO:()=>C,dG:()=>E,m:()=>o,_A:()=>K,kC:()=>ee,Nj:()=>oe,l7:()=>L,Kp:()=>s,E9:()=>ae,aU:()=>ne,RI:()=>A,rs:()=>Q,yA:()=>l,ir:()=>re,kJ:()=>I,wh:()=>Y,mf:()=>H,e1:()=>i,eS:()=>m,S0:()=>U,_N:()=>M,tR:()=>O,Kn:()=>W,F7:()=>T,PO:()=>$,tI:()=>B,Gg:()=>Z,aN:()=>v,DM:()=>F,Pq:()=>a,HD:()=>N,yk:()=>j,WB:()=>g,WV:()=>b,hq:()=>y,fY:()=>r,C_:()=>h,vs:()=>p,j5:()=>c,yL:()=>f,Od:()=>R,zw:()=>w,hR:()=>te,He:()=>ie,W7:()=>q});const o={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"HYDRATE_EVENTS",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},i=r("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt");function s(e,t=0,n=e.length){let r=e.split(/(\r?\n)/);const o=r.filter(((e,t)=>t%2==1));r=r.filter(((e,t)=>t%2==0));let i=0;const s=[];for(let e=0;e<r.length;e++)if(i+=r[e].length+(o[e]&&o[e].length||0),i>=t){for(let a=e-2;a<=e+2||n>i;a++){if(a<0||a>=r.length)continue;const l=a+1;s.push(`${l}${" ".repeat(Math.max(3-String(l).length,0))}|  ${r[a]}`);const c=r[a].length,u=o[a]&&o[a].length||0;if(a===e){const e=t-(i-(c+u)),r=Math.max(1,n>i?c-e:n-t);s.push("   |  "+" ".repeat(e)+"^".repeat(r))}else if(a>e){if(n>i){const e=Math.max(Math.min(n-i,c),1);s.push("   |  "+"^".repeat(e))}i+=c+u}}break}return s.join("\n")}const a=r("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function l(e){return!!e||""===e}function c(e){if(I(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],o=N(r)?f(r):c(r);if(o)for(const e in o)t[e]=o[e]}return t}return N(e)||W(e)?e:void 0}const u=/;(?![^(]*\))/g,d=/:(.+)/;function f(e){const t={};return e.split(u).forEach((e=>{if(e){const n=e.split(d);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function h(e){let t="";if(N(e))t=e;else if(I(e))for(let n=0;n<e.length;n++){const r=h(e[n]);r&&(t+=r+" ")}else if(W(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}function p(e){if(!e)return null;let{class:t,style:n}=e;return t&&!N(t)&&(e.class=h(t)),n&&(e.style=c(n)),e}const m=r("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),v=r("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),g=r("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr");function b(e,t){if(e===t)return!0;let n=P(e),r=P(t);if(n||r)return!(!n||!r)&&e.getTime()===t.getTime();if(n=I(e),r=I(t),n||r)return!(!n||!r)&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=b(e[r],t[r]);return n}(e,t);if(n=W(e),r=W(t),n||r){if(!n||!r)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e){const r=e.hasOwnProperty(n),o=t.hasOwnProperty(n);if(r&&!o||!r&&o||!b(e[n],t[n]))return!1}}return String(e)===String(t)}function y(e,t){return e.findIndex((e=>b(e,t)))}const w=e=>N(e)?e:null==e?"":I(e)||W(e)&&(e.toString===z||!H(e.toString))?JSON.stringify(e,x,2):String(e),x=(e,t)=>t&&t.__v_isRef?x(e,t.value):M(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:F(t)?{[`Set(${t.size})`]:[...t.values()]}:!W(t)||I(t)||$(t)?t:String(t),k={},S=[],E=()=>{},C=()=>!1,_=/^on[^a-z]/,T=e=>_.test(e),O=e=>e.startsWith("onUpdate:"),L=Object.assign,R=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},D=Object.prototype.hasOwnProperty,A=(e,t)=>D.call(e,t),I=Array.isArray,M=e=>"[object Map]"===V(e),F=e=>"[object Set]"===V(e),P=e=>e instanceof Date,H=e=>"function"==typeof e,N=e=>"string"==typeof e,j=e=>"symbol"==typeof e,W=e=>null!==e&&"object"==typeof e,B=e=>W(e)&&H(e.then)&&H(e.catch),z=Object.prototype.toString,V=e=>z.call(e),q=e=>V(e).slice(8,-1),$=e=>"[object Object]"===V(e),U=e=>N(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,Z=r(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Y=r("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),G=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},J=/-(\w)/g,K=G((e=>e.replace(J,((e,t)=>t?t.toUpperCase():"")))),X=/\B([A-Z])/g,Q=G((e=>e.replace(X,"-$1").toLowerCase())),ee=G((e=>e.charAt(0).toUpperCase()+e.slice(1))),te=G((e=>e?`on${ee(e)}`:"")),ne=(e,t)=>!Object.is(e,t),re=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},oe=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},ie=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let se;const ae=()=>se||(se="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{})},1807:e=>{var t=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=t},2152:function(e){var t;t=function(){return function(){var e={686:function(e,t,n){"use strict";n.d(t,{default:function(){return x}});var r=n(279),o=n.n(r),i=n(370),s=n.n(i),a=n(817),l=n.n(a);function c(e){try{return document.execCommand(e)}catch(e){return!1}}var u=function(e){var t=l()(e);return c("cut"),t};function d(e){var t="rtl"===document.documentElement.getAttribute("dir"),n=document.createElement("textarea");n.style.fontSize="12pt",n.style.border="0",n.style.padding="0",n.style.margin="0",n.style.position="absolute",n.style[t?"right":"left"]="-9999px";var r=window.pageYOffset||document.documentElement.scrollTop;return n.style.top="".concat(r,"px"),n.setAttribute("readonly",""),n.value=e,n}var f=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body},n="";if("string"==typeof e){var r=d(e);t.container.appendChild(r),n=l()(r),c("copy"),r.remove()}else n=l()(e),c("copy");return n};function h(e){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},h(e)}function p(e){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p(e)}function m(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function v(e,t){return v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},v(e,t)}function g(e,t){return!t||"object"!==p(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function b(e){return b=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},b(e)}function y(e,t){var n="data-clipboard-".concat(e);if(t.hasAttribute(n))return t.getAttribute(n)}var w=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(l,e);var t,n,r,o,i,a=(o=l,i=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(o);if(i){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return g(this,e)});function l(e,t){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),(n=a.call(this)).resolveOptions(t),n.listenClick(e),n}return t=l,n=[{key:"resolveOptions",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===p(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=s()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget,n=this.action(t)||"copy",r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.action,n=void 0===t?"copy":t,r=e.container,o=e.target,i=e.text;if("copy"!==n&&"cut"!==n)throw new Error('Invalid "action" value, use either "copy" or "cut"');if(void 0!==o){if(!o||"object"!==h(o)||1!==o.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===n&&o.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===n&&(o.hasAttribute("readonly")||o.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}return i?f(i,{container:r}):o?"cut"===n?u(o):f(o,{container:r}):void 0}({action:n,container:this.container,target:this.target(t),text:this.text(t)});this.emit(r?"success":"error",{action:n,text:r,trigger:t,clearSelection:function(){t&&t.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(e){return y("action",e)}},{key:"defaultTarget",value:function(e){var t=y("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return y("text",e)}},{key:"destroy",value:function(){this.listener.destroy()}}],r=[{key:"copy",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body};return f(e,t)}},{key:"cut",value:function(e){return u(e)}},{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}],n&&m(t.prototype,n),r&&m(t,r),l}(o()),x=w},828:function(e){if("undefined"!=typeof Element&&!Element.prototype.matches){var t=Element.prototype;t.matches=t.matchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector||t.webkitMatchesSelector}e.exports=function(e,t){for(;e&&9!==e.nodeType;){if("function"==typeof e.matches&&e.matches(t))return e;e=e.parentNode}}},438:function(e,t,n){var r=n(828);function o(e,t,n,r,o){var s=i.apply(this,arguments);return e.addEventListener(n,s,o),{destroy:function(){e.removeEventListener(n,s,o)}}}function i(e,t,n,o){return function(n){n.delegateTarget=r(n.target,t),n.delegateTarget&&o.call(e,n)}}e.exports=function(e,t,n,r,i){return"function"==typeof e.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof e&&(e=document.querySelectorAll(e)),Array.prototype.map.call(e,(function(e){return o(e,t,n,r,i)})))}},879:function(e,t){t.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},t.nodeList=function(e){var n=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in e&&(0===e.length||t.node(e[0]))},t.string=function(e){return"string"==typeof e||e instanceof String},t.fn=function(e){return"[object Function]"===Object.prototype.toString.call(e)}},370:function(e,t,n){var r=n(879),o=n(438);e.exports=function(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!r.string(t))throw new TypeError("Second argument must be a String");if(!r.fn(n))throw new TypeError("Third argument must be a Function");if(r.node(e))return function(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}(e,t,n);if(r.nodeList(e))return function(e,t,n){return Array.prototype.forEach.call(e,(function(e){e.addEventListener(t,n)})),{destroy:function(){Array.prototype.forEach.call(e,(function(e){e.removeEventListener(t,n)}))}}}(e,t,n);if(r.string(e))return function(e,t,n){return o(document.body,e,t,n)}(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}},817:function(e){e.exports=function(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var r=window.getSelection(),o=document.createRange();o.selectNodeContents(e),r.removeAllRanges(),r.addRange(o),t=r.toString()}return t}},279:function(e){function t(){}t.prototype={on:function(e,t,n){var r=this.e||(this.e={});return(r[e]||(r[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){var r=this;function o(){r.off(e,o),t.apply(n,arguments)}return o._=t,this.on(e,o,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),r=0,o=n.length;r<o;r++)n[r].fn.apply(n[r].ctx,t);return this},off:function(e,t){var n=this.e||(this.e={}),r=n[e],o=[];if(r&&t)for(var i=0,s=r.length;i<s;i++)r[i].fn!==t&&r[i].fn._!==t&&o.push(r[i]);return o.length?n[e]=o:delete n[e],this}},e.exports=t,e.exports.TinyEmitter=t}},t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}return n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n(686)}().default},e.exports=t()},9662:(e,t,n)=>{var r=n(7854),o=n(614),i=n(6330),s=r.TypeError;e.exports=function(e){if(o(e))return e;throw s(i(e)+" is not a function")}},6077:(e,t,n)=>{var r=n(7854),o=n(614),i=r.String,s=r.TypeError;e.exports=function(e){if("object"==typeof e||o(e))return e;throw s("Can't set "+i(e)+" as a prototype")}},1223:(e,t,n)=>{var r=n(5112),o=n(30),i=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&i.f(a,s,{configurable:!0,value:o(null)}),e.exports=function(e){a[s][e]=!0}},1530:(e,t,n)=>{"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:(e,t,n)=>{var r=n(7854),o=n(7976),i=r.TypeError;e.exports=function(e,t){if(o(t,e))return e;throw i("Incorrect invocation")}},9670:(e,t,n)=>{var r=n(7854),o=n(111),i=r.String,s=r.TypeError;e.exports=function(e){if(o(e))return e;throw s(i(e)+" is not an object")}},7556:(e,t,n)=>{var r=n(7293);e.exports=r((function(){if("function"==typeof ArrayBuffer){var e=new ArrayBuffer(8);Object.isExtensible(e)&&Object.defineProperty(e,"a",{value:8})}}))},8533:(e,t,n)=>{"use strict";var r=n(2092).forEach,o=n(9341)("forEach");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},1318:(e,t,n)=>{var r=n(5656),o=n(1400),i=n(6244),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:(e,t,n)=>{var r=n(9974),o=n(1702),i=n(8361),s=n(7908),a=n(6244),l=n(5417),c=o([].push),u=function(e){var t=1==e,n=2==e,o=3==e,u=4==e,d=6==e,f=7==e,h=5==e||d;return function(p,m,v,g){for(var b,y,w=s(p),x=i(w),k=r(m,v),S=a(x),E=0,C=g||l,_=t?C(p,S):n||f?C(p,0):void 0;S>E;E++)if((h||E in x)&&(y=k(b=x[E],E,w),e))if(t)_[E]=y;else if(y)switch(e){case 3:return!0;case 5:return b;case 6:return E;case 2:c(_,b)}else switch(e){case 4:return!1;case 7:c(_,b)}return d?-1:o||u?u:_}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},1194:(e,t,n)=>{var r=n(7293),o=n(5112),i=n(7392),s=o("species");e.exports=function(e){return i>=51||!r((function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},9341:(e,t,n)=>{"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},3671:(e,t,n)=>{var r=n(7854),o=n(9662),i=n(7908),s=n(8361),a=n(6244),l=r.TypeError,c=function(e){return function(t,n,r,c){o(n);var u=i(t),d=s(u),f=a(u),h=e?f-1:0,p=e?-1:1;if(r<2)for(;;){if(h in d){c=d[h],h+=p;break}if(h+=p,e?h<0:f<=h)throw l("Reduce of empty array with no initial value")}for(;e?h>=0:f>h;h+=p)h in d&&(c=n(c,d[h],h,u));return c}};e.exports={left:c(!1),right:c(!0)}},1589:(e,t,n)=>{var r=n(7854),o=n(1400),i=n(6244),s=n(6135),a=r.Array,l=Math.max;e.exports=function(e,t,n){for(var r=i(e),c=o(t,r),u=o(void 0===n?r:n,r),d=a(l(u-c,0)),f=0;c<u;c++,f++)s(d,f,e[c]);return d.length=f,d}},7475:(e,t,n)=>{var r=n(7854),o=n(3157),i=n(4411),s=n(111),a=n(5112)("species"),l=r.Array;e.exports=function(e){var t;return o(e)&&(t=e.constructor,(i(t)&&(t===l||o(t.prototype))||s(t)&&null===(t=t[a]))&&(t=void 0)),void 0===t?l:t}},5417:(e,t,n)=>{var r=n(7475);e.exports=function(e,t){return new(r(e))(0===t?0:t)}},7072:(e,t,n)=>{var r=n(5112)("iterator"),o=!1;try{var i=0,s={next:function(){return{done:!!i++}},return:function(){o=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(e){}return n}},4326:(e,t,n)=>{var r=n(1702),o=r({}.toString),i=r("".slice);e.exports=function(e){return i(o(e),8,-1)}},648:(e,t,n)=>{var r=n(7854),o=n(1694),i=n(614),s=n(4326),a=n(5112)("toStringTag"),l=r.Object,c="Arguments"==s(function(){return arguments}());e.exports=o?s:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=l(e),a))?n:c?s(t):"Object"==(r=s(t))&&i(t.callee)?"Arguments":r}},9320:(e,t,n)=>{"use strict";var r=n(1702),o=n(2248),i=n(2423).getWeakData,s=n(9670),a=n(111),l=n(5787),c=n(408),u=n(2092),d=n(2597),f=n(9909),h=f.set,p=f.getterFor,m=u.find,v=u.findIndex,g=r([].splice),b=0,y=function(e){return e.frozen||(e.frozen=new w)},w=function(){this.entries=[]},x=function(e,t){return m(e.entries,(function(e){return e[0]===t}))};w.prototype={get:function(e){var t=x(this,e);if(t)return t[1]},has:function(e){return!!x(this,e)},set:function(e,t){var n=x(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=v(this.entries,(function(t){return t[0]===e}));return~t&&g(this.entries,t,1),!!~t}},e.exports={getConstructor:function(e,t,n,r){var u=e((function(e,o){l(e,f),h(e,{type:t,id:b++,frozen:void 0}),null!=o&&c(o,e[r],{that:e,AS_ENTRIES:n})})),f=u.prototype,m=p(t),v=function(e,t,n){var r=m(e),o=i(s(t),!0);return!0===o?y(r).set(t,n):o[r.id]=n,e};return o(f,{delete:function(e){var t=m(this);if(!a(e))return!1;var n=i(e);return!0===n?y(t).delete(e):n&&d(n,t.id)&&delete n[t.id]},has:function(e){var t=m(this);if(!a(e))return!1;var n=i(e);return!0===n?y(t).has(e):n&&d(n,t.id)}}),o(f,n?{get:function(e){var t=m(this);if(a(e)){var n=i(e);return!0===n?y(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return v(this,e,t)}}:{add:function(e){return v(this,e,!0)}}),u}}},7710:(e,t,n)=>{"use strict";var r=n(2109),o=n(7854),i=n(1702),s=n(4705),a=n(1320),l=n(2423),c=n(408),u=n(5787),d=n(614),f=n(111),h=n(7293),p=n(7072),m=n(8003),v=n(9587);e.exports=function(e,t,n){var g=-1!==e.indexOf("Map"),b=-1!==e.indexOf("Weak"),y=g?"set":"add",w=o[e],x=w&&w.prototype,k=w,S={},E=function(e){var t=i(x[e]);a(x,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(b&&!f(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return b&&!f(e)?void 0:t(this,0===e?0:e)}:"has"==e?function(e){return!(b&&!f(e))&&t(this,0===e?0:e)}:function(e,n){return t(this,0===e?0:e,n),this})};if(s(e,!d(w)||!(b||x.forEach&&!h((function(){(new w).entries().next()})))))k=n.getConstructor(t,e,g,y),l.enable();else if(s(e,!0)){var C=new k,_=C[y](b?{}:-0,1)!=C,T=h((function(){C.has(1)})),O=p((function(e){new w(e)})),L=!b&&h((function(){for(var e=new w,t=5;t--;)e[y](t,t);return!e.has(-0)}));O||((k=t((function(e,t){u(e,x);var n=v(new w,e,k);return null!=t&&c(t,n[y],{that:n,AS_ENTRIES:g}),n}))).prototype=x,x.constructor=k),(T||L)&&(E("delete"),E("has"),g&&E("get")),(L||_)&&E(y),b&&x.clear&&delete x.clear}return S[e]=k,r({global:!0,forced:k!=w},S),m(k,e),b||n.setStrong(k,e,g),k}},9920:(e,t,n)=>{var r=n(2597),o=n(3887),i=n(1236),s=n(3070);e.exports=function(e,t,n){for(var a=o(t),l=s.f,c=i.f,u=0;u<a.length;u++){var d=a[u];r(e,d)||n&&r(n,d)||l(e,d,c(t,d))}}},8544:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},4994:(e,t,n)=>{"use strict";var r=n(3383).IteratorPrototype,o=n(30),i=n(9114),s=n(8003),a=n(7497),l=function(){return this};e.exports=function(e,t,n,c){var u=t+" Iterator";return e.prototype=o(r,{next:i(+!c,n)}),s(e,u,!1,!0),a[u]=l,e}},8880:(e,t,n)=>{var r=n(9781),o=n(3070),i=n(9114);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},9114:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},6135:(e,t,n)=>{"use strict";var r=n(4948),o=n(3070),i=n(9114);e.exports=function(e,t,n){var s=r(t);s in e?o.f(e,s,i(0,n)):e[s]=n}},654:(e,t,n)=>{"use strict";var r=n(2109),o=n(6916),i=n(1913),s=n(6530),a=n(614),l=n(4994),c=n(9518),u=n(7674),d=n(8003),f=n(8880),h=n(1320),p=n(5112),m=n(7497),v=n(3383),g=s.PROPER,b=s.CONFIGURABLE,y=v.IteratorPrototype,w=v.BUGGY_SAFARI_ITERATORS,x=p("iterator"),k="keys",S="values",E="entries",C=function(){return this};e.exports=function(e,t,n,s,p,v,_){l(n,t,s);var T,O,L,R=function(e){if(e===p&&F)return F;if(!w&&e in I)return I[e];switch(e){case k:case S:case E:return function(){return new n(this,e)}}return function(){return new n(this)}},D=t+" Iterator",A=!1,I=e.prototype,M=I[x]||I["@@iterator"]||p&&I[p],F=!w&&M||R(p),P="Array"==t&&I.entries||M;if(P&&(T=c(P.call(new e)))!==Object.prototype&&T.next&&(i||c(T)===y||(u?u(T,y):a(T[x])||h(T,x,C)),d(T,D,!0,!0),i&&(m[D]=C)),g&&p==S&&M&&M.name!==S&&(!i&&b?f(I,"name",S):(A=!0,F=function(){return o(M,this)})),p)if(O={values:R(S),keys:v?F:R(k),entries:R(E)},_)for(L in O)(w||A||!(L in I))&&h(I,L,O[L]);else r({target:t,proto:!0,forced:w||A},O);return i&&!_||I[x]===F||h(I,x,F,{name:p}),m[t]=F,O}},9781:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},317:(e,t,n)=>{var r=n(7854),o=n(111),i=r.document,s=o(i)&&o(i.createElement);e.exports=function(e){return s?i.createElement(e):{}}},8324:e=>{e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},8509:(e,t,n)=>{var r=n(317)("span").classList,o=r&&r.constructor&&r.constructor.prototype;e.exports=o===Object.prototype?void 0:o},5268:(e,t,n)=>{var r=n(4326),o=n(7854);e.exports="process"==r(o.process)},8113:(e,t,n)=>{var r=n(5005);e.exports=r("navigator","userAgent")||""},7392:(e,t,n)=>{var r,o,i=n(7854),s=n(8113),a=i.process,l=i.Deno,c=a&&a.versions||l&&l.version,u=c&&c.v8;u&&(o=(r=u.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&s&&(!(r=s.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=s.match(/Chrome\/(\d+)/))&&(o=+r[1]),e.exports=o},748:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:(e,t,n)=>{var r=n(7854),o=n(1236).f,i=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,h,p=e.target,m=e.global,v=e.stat;if(n=m?r:v?r[p]||a(p,{}):(r[p]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(h=o(n,u))&&h.value:n[u],!c(m?u:p+(v?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&i(f,"sham",!0),s(n,u,f,e)}}},7293:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:(e,t,n)=>{"use strict";n(4916);var r=n(1702),o=n(1320),i=n(2261),s=n(7293),a=n(5112),l=n(8880),c=a("species"),u=RegExp.prototype;e.exports=function(e,t,n,d){var f=a(e),h=!s((function(){var t={};return t[f]=function(){return 7},7!=""[e](t)})),p=h&&!s((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[c]=function(){return n},n.flags="",n[f]=/./[f]),n.exec=function(){return t=!0,null},n[f](""),!t}));if(!h||!p||n){var m=r(/./[f]),v=t(f,""[e],(function(e,t,n,o,s){var a=r(e),l=t.exec;return l===i||l===u.exec?h&&!s?{done:!0,value:m(t,n,o)}:{done:!0,value:a(n,t,o)}:{done:!1}}));o(String.prototype,e,v[0]),o(u,f,v[1])}d&&l(u[f],"sham",!0)}},6677:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},2104:(e,t,n)=>{var r=n(4374),o=Function.prototype,i=o.apply,s=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?s.bind(i):function(){return s.apply(i,arguments)})},9974:(e,t,n)=>{var r=n(1702),o=n(9662),i=n(4374),s=r(r.bind);e.exports=function(e,t){return o(e),void 0===t?e:i?s(e,t):function(){return e.apply(t,arguments)}}},4374:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},6916:(e,t,n)=>{var r=n(4374),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},6530:(e,t,n)=>{var r=n(9781),o=n(2597),i=Function.prototype,s=r&&Object.getOwnPropertyDescriptor,a=o(i,"name"),l=a&&"something"===function(){}.name,c=a&&(!r||r&&s(i,"name").configurable);e.exports={EXISTS:a,PROPER:l,CONFIGURABLE:c}},1702:(e,t,n)=>{var r=n(4374),o=Function.prototype,i=o.bind,s=o.call,a=r&&i.bind(s,s);e.exports=r?function(e){return e&&a(e)}:function(e){return e&&function(){return s.apply(e,arguments)}}},5005:(e,t,n)=>{var r=n(7854),o=n(614),i=function(e){return o(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e]):r[e]&&r[e][t]}},1246:(e,t,n)=>{var r=n(648),o=n(8173),i=n(7497),s=n(5112)("iterator");e.exports=function(e){if(null!=e)return o(e,s)||o(e,"@@iterator")||i[r(e)]}},8554:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(9662),s=n(9670),a=n(6330),l=n(1246),c=r.TypeError;e.exports=function(e,t){var n=arguments.length<2?l(e):t;if(i(n))return s(o(n,e));throw c(a(e)+" is not iterable")}},8173:(e,t,n)=>{var r=n(9662);e.exports=function(e,t){var n=e[t];return null==n?void 0:r(n)}},647:(e,t,n)=>{var r=n(1702),o=n(7908),i=Math.floor,s=r("".charAt),a=r("".replace),l=r("".slice),c=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,u=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,r,d,f){var h=n+e.length,p=r.length,m=u;return void 0!==d&&(d=o(d),m=c),a(f,m,(function(o,a){var c;switch(s(a,0)){case"$":return"$";case"&":return e;case"`":return l(t,0,n);case"'":return l(t,h);case"<":c=d[l(a,1,-1)];break;default:var u=+a;if(0===u)return o;if(u>p){var f=i(u/10);return 0===f?o:f<=p?void 0===r[f-1]?s(a,1):r[f-1]+s(a,1):o}c=r[u-1]}return void 0===c?"":c}))}},7854:(e,t,n)=>{var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},2597:(e,t,n)=>{var r=n(1702),o=n(7908),i=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return i(o(e),t)}},3501:e=>{e.exports={}},490:(e,t,n)=>{var r=n(5005);e.exports=r("document","documentElement")},4664:(e,t,n)=>{var r=n(9781),o=n(7293),i=n(317);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},8361:(e,t,n)=>{var r=n(7854),o=n(1702),i=n(7293),s=n(4326),a=r.Object,l=o("".split);e.exports=i((function(){return!a("z").propertyIsEnumerable(0)}))?function(e){return"String"==s(e)?l(e,""):a(e)}:a},9587:(e,t,n)=>{var r=n(614),o=n(111),i=n(7674);e.exports=function(e,t,n){var s,a;return i&&r(s=t.constructor)&&s!==n&&o(a=s.prototype)&&a!==n.prototype&&i(e,a),e}},2788:(e,t,n)=>{var r=n(1702),o=n(614),i=n(5465),s=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(e){return s(e)}),e.exports=i.inspectSource},2423:(e,t,n)=>{var r=n(2109),o=n(1702),i=n(3501),s=n(111),a=n(2597),l=n(3070).f,c=n(8006),u=n(1156),d=n(2050),f=n(9711),h=n(6677),p=!1,m=f("meta"),v=0,g=function(e){l(e,m,{value:{objectID:"O"+v++,weakData:{}}})},b=e.exports={enable:function(){b.enable=function(){},p=!0;var e=c.f,t=o([].splice),n={};n[m]=1,e(n).length&&(c.f=function(n){for(var r=e(n),o=0,i=r.length;o<i;o++)if(r[o]===m){t(r,o,1);break}return r},r({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:u.f}))},fastKey:function(e,t){if(!s(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,m)){if(!d(e))return"F";if(!t)return"E";g(e)}return e[m].objectID},getWeakData:function(e,t){if(!a(e,m)){if(!d(e))return!0;if(!t)return!1;g(e)}return e[m].weakData},onFreeze:function(e){return h&&p&&d(e)&&!a(e,m)&&g(e),e}};i[m]=!0},9909:(e,t,n)=>{var r,o,i,s=n(8536),a=n(7854),l=n(1702),c=n(111),u=n(8880),d=n(2597),f=n(5465),h=n(6200),p=n(3501),m="Object already initialized",v=a.TypeError,g=a.WeakMap;if(s||f.state){var b=f.state||(f.state=new g),y=l(b.get),w=l(b.has),x=l(b.set);r=function(e,t){if(w(b,e))throw new v(m);return t.facade=e,x(b,e,t),t},o=function(e){return y(b,e)||{}},i=function(e){return w(b,e)}}else{var k=h("state");p[k]=!0,r=function(e,t){if(d(e,k))throw new v(m);return t.facade=e,u(e,k,t),t},o=function(e){return d(e,k)?e[k]:{}},i=function(e){return d(e,k)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!c(t)||(n=o(t)).type!==e)throw v("Incompatible receiver, "+e+" required");return n}}}},7659:(e,t,n)=>{var r=n(5112),o=n(7497),i=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||s[i]===e)}},3157:(e,t,n)=>{var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},614:e=>{e.exports=function(e){return"function"==typeof e}},4411:(e,t,n)=>{var r=n(1702),o=n(7293),i=n(614),s=n(648),a=n(5005),l=n(2788),c=function(){},u=[],d=a("Reflect","construct"),f=/^\s*(?:class|function)\b/,h=r(f.exec),p=!f.exec(c),m=function(e){if(!i(e))return!1;try{return d(c,u,e),!0}catch(e){return!1}},v=function(e){if(!i(e))return!1;switch(s(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return p||!!h(f,l(e))}catch(e){return!0}};v.sham=!0,e.exports=!d||o((function(){var e;return m(m.call)||!m(Object)||!m((function(){e=!0}))||e}))?v:m},4705:(e,t,n)=>{var r=n(7293),o=n(614),i=/#|\.prototype\./,s=function(e,t){var n=l[a(e)];return n==u||n!=c&&(o(t)?r(t):!!t)},a=s.normalize=function(e){return String(e).replace(i,".").toLowerCase()},l=s.data={},c=s.NATIVE="N",u=s.POLYFILL="P";e.exports=s},111:(e,t,n)=>{var r=n(614);e.exports=function(e){return"object"==typeof e?null!==e:r(e)}},1913:e=>{e.exports=!1},2190:(e,t,n)=>{var r=n(7854),o=n(5005),i=n(614),s=n(7976),a=n(3307),l=r.Object;e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=o("Symbol");return i(t)&&s(t.prototype,l(e))}},408:(e,t,n)=>{var r=n(7854),o=n(9974),i=n(6916),s=n(9670),a=n(6330),l=n(7659),c=n(6244),u=n(7976),d=n(8554),f=n(1246),h=n(9212),p=r.TypeError,m=function(e,t){this.stopped=e,this.result=t},v=m.prototype;e.exports=function(e,t,n){var r,g,b,y,w,x,k,S=n&&n.that,E=!(!n||!n.AS_ENTRIES),C=!(!n||!n.IS_ITERATOR),_=!(!n||!n.INTERRUPTED),T=o(t,S),O=function(e){return r&&h(r,"normal",e),new m(!0,e)},L=function(e){return E?(s(e),_?T(e[0],e[1],O):T(e[0],e[1])):_?T(e,O):T(e)};if(C)r=e;else{if(!(g=f(e)))throw p(a(e)+" is not iterable");if(l(g)){for(b=0,y=c(e);y>b;b++)if((w=L(e[b]))&&u(v,w))return w;return new m(!1)}r=d(e,g)}for(x=r.next;!(k=i(x,r)).done;){try{w=L(k.value)}catch(e){h(r,"throw",e)}if("object"==typeof w&&w&&u(v,w))return w}return new m(!1)}},9212:(e,t,n)=>{var r=n(6916),o=n(9670),i=n(8173);e.exports=function(e,t,n){var s,a;o(e);try{if(!(s=i(e,"return"))){if("throw"===t)throw n;return n}s=r(s,e)}catch(e){a=!0,s=e}if("throw"===t)throw n;if(a)throw s;return o(s),n}},3383:(e,t,n)=>{"use strict";var r,o,i,s=n(7293),a=n(614),l=n(30),c=n(9518),u=n(1320),d=n(5112),f=n(1913),h=d("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=c(c(i)))!==Object.prototype&&(r=o):p=!0),null==r||s((function(){var e={};return r[h].call(e)!==e}))?r={}:f&&(r=l(r)),a(r[h])||u(r,h,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:e=>{e.exports={}},6244:(e,t,n)=>{var r=n(7466);e.exports=function(e){return r(e.length)}},133:(e,t,n)=>{var r=n(7392),o=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},8536:(e,t,n)=>{var r=n(7854),o=n(614),i=n(2788),s=r.WeakMap;e.exports=o(s)&&/native code/.test(i(s))},3009:(e,t,n)=>{var r=n(7854),o=n(7293),i=n(1702),s=n(1340),a=n(3111).trim,l=n(1361),c=r.parseInt,u=r.Symbol,d=u&&u.iterator,f=/^[+-]?0x/i,h=i(f.exec),p=8!==c(l+"08")||22!==c(l+"0x16")||d&&!o((function(){c(Object(d))}));e.exports=p?function(e,t){var n=a(s(e));return c(n,t>>>0||(h(f,n)?16:10))}:c},1574:(e,t,n)=>{"use strict";var r=n(9781),o=n(1702),i=n(6916),s=n(7293),a=n(1956),l=n(5181),c=n(5296),u=n(7908),d=n(8361),f=Object.assign,h=Object.defineProperty,p=o([].concat);e.exports=!f||s((function(){if(r&&1!==f({b:1},f(h({},"a",{enumerable:!0,get:function(){h(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!=f({},e)[n]||a(f({},t)).join("")!=o}))?function(e,t){for(var n=u(e),o=arguments.length,s=1,f=l.f,h=c.f;o>s;)for(var m,v=d(arguments[s++]),g=f?p(a(v),f(v)):a(v),b=g.length,y=0;b>y;)m=g[y++],r&&!i(h,v,m)||(n[m]=v[m]);return n}:f},30:(e,t,n)=>{var r,o=n(9670),i=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200)("IE_PROTO"),d=function(){},f=function(e){return"<script>"+e+"<\/script>"},h=function(e){e.write(f("")),e.close();var t=e.parentWindow.Object;return e=null,t},p=function(){try{r=new ActiveXObject("htmlfile")}catch(e){}var e,t;p="undefined"!=typeof document?document.domain&&r?h(r):((t=c("iframe")).style.display="none",l.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(f("document.F=Object")),e.close(),e.F):h(r);for(var n=s.length;n--;)delete p.prototype[s[n]];return p()};a[u]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(d.prototype=o(e),n=new d,d.prototype=null,n[u]=e):n=p(),void 0===t?n:i.f(n,t)}},6048:(e,t,n)=>{var r=n(9781),o=n(3353),i=n(3070),s=n(9670),a=n(5656),l=n(1956);t.f=r&&!o?Object.defineProperties:function(e,t){s(e);for(var n,r=a(t),o=l(t),c=o.length,u=0;c>u;)i.f(e,n=o[u++],r[n]);return e}},3070:(e,t,n)=>{var r=n(7854),o=n(9781),i=n(4664),s=n(3353),a=n(9670),l=n(4948),c=r.TypeError,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor;t.f=o?s?function(e,t,n){if(a(e),t=l(t),a(n),"function"==typeof e&&"prototype"===t&&"value"in n&&"writable"in n&&!n.writable){var r=d(e,t);r&&r.writable&&(e[t]=n.value,n={configurable:"configurable"in n?n.configurable:r.configurable,enumerable:"enumerable"in n?n.enumerable:r.enumerable,writable:!1})}return u(e,t,n)}:u:function(e,t,n){if(a(e),t=l(t),a(n),i)try{return u(e,t,n)}catch(e){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:(e,t,n)=>{var r=n(9781),o=n(6916),i=n(5296),s=n(9114),a=n(5656),l=n(4948),c=n(2597),u=n(4664),d=Object.getOwnPropertyDescriptor;t.f=r?d:function(e,t){if(e=a(e),t=l(t),u)try{return d(e,t)}catch(e){}if(c(e,t))return s(!o(i.f,e,t),e[t])}},1156:(e,t,n)=>{var r=n(4326),o=n(5656),i=n(8006).f,s=n(1589),a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"Window"==r(e)?function(e){try{return i(e)}catch(e){return s(a)}}(e):i(o(e))}},8006:(e,t,n)=>{var r=n(6324),o=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},5181:(e,t)=>{t.f=Object.getOwnPropertySymbols},9518:(e,t,n)=>{var r=n(7854),o=n(2597),i=n(614),s=n(7908),a=n(6200),l=n(8544),c=a("IE_PROTO"),u=r.Object,d=u.prototype;e.exports=l?u.getPrototypeOf:function(e){var t=s(e);if(o(t,c))return t[c];var n=t.constructor;return i(n)&&t instanceof n?n.prototype:t instanceof u?d:null}},2050:(e,t,n)=>{var r=n(7293),o=n(111),i=n(4326),s=n(7556),a=Object.isExtensible,l=r((function(){a(1)}));e.exports=l||s?function(e){return!!o(e)&&(!s||"ArrayBuffer"!=i(e))&&(!a||a(e))}:a},7976:(e,t,n)=>{var r=n(1702);e.exports=r({}.isPrototypeOf)},6324:(e,t,n)=>{var r=n(1702),o=n(2597),i=n(5656),s=n(1318).indexOf,a=n(3501),l=r([].push);e.exports=function(e,t){var n,r=i(e),c=0,u=[];for(n in r)!o(a,n)&&o(r,n)&&l(u,n);for(;t.length>c;)o(r,n=t[c++])&&(~s(u,n)||l(u,n));return u}},1956:(e,t,n)=>{var r=n(6324),o=n(748);e.exports=Object.keys||function(e){return r(e,o)}},5296:(e,t)=>{"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,o=r&&!n.call({1:2},1);t.f=o?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:(e,t,n)=>{var r=n(1702),o=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=r(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return o(n),i(r),t?e(n,r):n.__proto__=r,n}}():void 0)},288:(e,t,n)=>{"use strict";var r=n(1694),o=n(648);e.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},2140:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(614),s=n(111),a=r.TypeError;e.exports=function(e,t){var n,r;if("string"===t&&i(n=e.toString)&&!s(r=o(n,e)))return r;if(i(n=e.valueOf)&&!s(r=o(n,e)))return r;if("string"!==t&&i(n=e.toString)&&!s(r=o(n,e)))return r;throw a("Can't convert object to primitive value")}},3887:(e,t,n)=>{var r=n(5005),o=n(1702),i=n(8006),s=n(5181),a=n(9670),l=o([].concat);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(a(e)),n=s.f;return n?l(t,n(e)):t}},2248:(e,t,n)=>{var r=n(1320);e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},1320:(e,t,n)=>{var r=n(7854),o=n(614),i=n(2597),s=n(8880),a=n(3505),l=n(2788),c=n(9909),u=n(6530).CONFIGURABLE,d=c.get,f=c.enforce,h=String(String).split("String");(e.exports=function(e,t,n,l){var c,d=!!l&&!!l.unsafe,p=!!l&&!!l.enumerable,m=!!l&&!!l.noTargetGet,v=l&&void 0!==l.name?l.name:t;o(n)&&("Symbol("===String(v).slice(0,7)&&(v="["+String(v).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!i(n,"name")||u&&n.name!==v)&&s(n,"name",v),(c=f(n)).source||(c.source=h.join("string"==typeof v?v:""))),e!==r?(d?!m&&e[t]&&(p=!0):delete e[t],p?e[t]=n:s(e,t,n)):p?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return o(this)&&d(this).source||l(this)}))},7651:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(9670),s=n(614),a=n(4326),l=n(2261),c=r.TypeError;e.exports=function(e,t){var n=e.exec;if(s(n)){var r=o(n,e,t);return null!==r&&i(r),r}if("RegExp"===a(e))return o(l,e,t);throw c("RegExp#exec called on incompatible receiver")}},2261:(e,t,n)=>{"use strict";var r,o,i=n(6916),s=n(1702),a=n(1340),l=n(7066),c=n(2999),u=n(2309),d=n(30),f=n(9909).get,h=n(9441),p=n(7168),m=u("native-string-replace",String.prototype.replace),v=RegExp.prototype.exec,g=v,b=s("".charAt),y=s("".indexOf),w=s("".replace),x=s("".slice),k=(o=/b*/g,i(v,r=/a/,"a"),i(v,o,"a"),0!==r.lastIndex||0!==o.lastIndex),S=c.BROKEN_CARET,E=void 0!==/()??/.exec("")[1];(k||E||S||h||p)&&(g=function(e){var t,n,r,o,s,c,u,h=this,p=f(h),C=a(e),_=p.raw;if(_)return _.lastIndex=h.lastIndex,t=i(g,_,C),h.lastIndex=_.lastIndex,t;var T=p.groups,O=S&&h.sticky,L=i(l,h),R=h.source,D=0,A=C;if(O&&(L=w(L,"y",""),-1===y(L,"g")&&(L+="g"),A=x(C,h.lastIndex),h.lastIndex>0&&(!h.multiline||h.multiline&&"\n"!==b(C,h.lastIndex-1))&&(R="(?: "+R+")",A=" "+A,D++),n=new RegExp("^(?:"+R+")",L)),E&&(n=new RegExp("^"+R+"$(?!\\s)",L)),k&&(r=h.lastIndex),o=i(v,O?n:h,A),O?o?(o.input=x(o.input,D),o[0]=x(o[0],D),o.index=h.lastIndex,h.lastIndex+=o[0].length):h.lastIndex=0:k&&o&&(h.lastIndex=h.global?o.index+o[0].length:r),E&&o&&o.length>1&&i(m,o[0],n,(function(){for(s=1;s<arguments.length-2;s++)void 0===arguments[s]&&(o[s]=void 0)})),o&&T)for(o.groups=c=d(null),s=0;s<T.length;s++)c[(u=T[s])[0]]=o[u[1]];return o}),e.exports=g},7066:(e,t,n)=>{"use strict";var r=n(9670);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},2999:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp,i=r((function(){var e=o("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),s=i||r((function(){return!o("a","y").sticky})),a=i||r((function(){var e=o("^r","gy");return e.lastIndex=2,null!=e.exec("str")}));e.exports={BROKEN_CARET:a,MISSED_STICKY:s,UNSUPPORTED_Y:i}},9441:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp;e.exports=r((function(){var e=o(".","s");return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)}))},7168:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp;e.exports=r((function(){var e=o("(?<a>b)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$<a>c")}))},4488:(e,t,n)=>{var r=n(7854).TypeError;e.exports=function(e){if(null==e)throw r("Can't call method on "+e);return e}},3505:(e,t,n)=>{var r=n(7854),o=Object.defineProperty;e.exports=function(e,t){try{o(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}},8003:(e,t,n)=>{var r=n(3070).f,o=n(2597),i=n(5112)("toStringTag");e.exports=function(e,t,n){e&&!n&&(e=e.prototype),e&&!o(e,i)&&r(e,i,{configurable:!0,value:t})}},6200:(e,t,n)=>{var r=n(2309),o=n(9711),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},5465:(e,t,n)=>{var r=n(7854),o=n(3505),i="__core-js_shared__",s=r[i]||o(i,{});e.exports=s},2309:(e,t,n)=>{var r=n(1913),o=n(5465);(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.21.0",mode:r?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.21.0/LICENSE",source:"https://github.com/zloirock/core-js"})},8710:(e,t,n)=>{var r=n(1702),o=n(9303),i=n(1340),s=n(4488),a=r("".charAt),l=r("".charCodeAt),c=r("".slice),u=function(e){return function(t,n){var r,u,d=i(s(t)),f=o(n),h=d.length;return f<0||f>=h?e?"":void 0:(r=l(d,f))<55296||r>56319||f+1===h||(u=l(d,f+1))<56320||u>57343?e?a(d,f):r:e?c(d,f,f+2):u-56320+(r-55296<<10)+65536}};e.exports={codeAt:u(!1),charAt:u(!0)}},3111:(e,t,n)=>{var r=n(1702),o=n(4488),i=n(1340),s=n(1361),a=r("".replace),l="["+s+"]",c=RegExp("^"+l+l+"*"),u=RegExp(l+l+"*$"),d=function(e){return function(t){var n=i(o(t));return 1&e&&(n=a(n,c,"")),2&e&&(n=a(n,u,"")),n}};e.exports={start:d(1),end:d(2),trim:d(3)}},1400:(e,t,n)=>{var r=n(9303),o=Math.max,i=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):i(n,t)}},5656:(e,t,n)=>{var r=n(8361),o=n(4488);e.exports=function(e){return r(o(e))}},9303:e=>{var t=Math.ceil,n=Math.floor;e.exports=function(e){var r=+e;return r!=r||0===r?0:(r>0?n:t)(r)}},7466:(e,t,n)=>{var r=n(9303),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},7908:(e,t,n)=>{var r=n(7854),o=n(4488),i=r.Object;e.exports=function(e){return i(o(e))}},7593:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(111),s=n(2190),a=n(8173),l=n(2140),c=n(5112),u=r.TypeError,d=c("toPrimitive");e.exports=function(e,t){if(!i(e)||s(e))return e;var n,r=a(e,d);if(r){if(void 0===t&&(t="default"),n=o(r,e,t),!i(n)||s(n))return n;throw u("Can't convert object to primitive value")}return void 0===t&&(t="number"),l(e,t)}},4948:(e,t,n)=>{var r=n(7593),o=n(2190);e.exports=function(e){var t=r(e,"string");return o(t)?t:t+""}},1694:(e,t,n)=>{var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},1340:(e,t,n)=>{var r=n(7854),o=n(648),i=r.String;e.exports=function(e){if("Symbol"===o(e))throw TypeError("Cannot convert a Symbol value to a string");return i(e)}},6330:(e,t,n)=>{var r=n(7854).String;e.exports=function(e){try{return r(e)}catch(e){return"Object"}}},9711:(e,t,n)=>{var r=n(1702),o=0,i=Math.random(),s=r(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+s(++o+i,36)}},3307:(e,t,n)=>{var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3353:(e,t,n)=>{var r=n(9781),o=n(7293);e.exports=r&&o((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},5112:(e,t,n)=>{var r=n(7854),o=n(2309),i=n(2597),s=n(9711),a=n(133),l=n(3307),c=o("wks"),u=r.Symbol,d=u&&u.for,f=l?u:u&&u.withoutSetter||s;e.exports=function(e){if(!i(c,e)||!a&&"string"!=typeof c[e]){var t="Symbol."+e;a&&i(u,e)?c[e]=u[e]:c[e]=l&&d?d(t):f(t)}return c[e]}},1361:e=>{e.exports="\t\n\v\f\r                　\u2028\u2029\ufeff"},7327:(e,t,n)=>{"use strict";var r=n(2109),o=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},9554:(e,t,n)=>{"use strict";var r=n(2109),o=n(8533);r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},6992:(e,t,n)=>{"use strict";var r=n(5656),o=n(1223),i=n(7497),s=n(9909),a=n(3070).f,l=n(654),c=n(1913),u=n(9781),d="Array Iterator",f=s.set,h=s.getterFor(d);e.exports=l(Array,"Array",(function(e,t){f(this,{type:d,target:r(e),index:0,kind:t})}),(function(){var e=h(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");var p=i.Arguments=i.Array;if(o("keys"),o("values"),o("entries"),!c&&u&&"values"!==p.name)try{a(p,"name",{value:"values"})}catch(e){}},5827:(e,t,n)=>{"use strict";var r=n(2109),o=n(3671).left,i=n(9341),s=n(7392),a=n(5268);r({target:"Array",proto:!0,forced:!i("reduce")||!a&&s>79&&s<83},{reduce:function(e){var t=arguments.length;return o(this,e,t,t>1?arguments[1]:void 0)}})},8309:(e,t,n)=>{var r=n(9781),o=n(6530).EXISTS,i=n(1702),s=n(3070).f,a=Function.prototype,l=i(a.toString),c=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,u=i(c.exec);r&&!o&&s(a,"name",{configurable:!0,get:function(){try{return u(c,l(this))[1]}catch(e){return""}}})},9601:(e,t,n)=>{var r=n(2109),o=n(1574);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},1539:(e,t,n)=>{var r=n(1694),o=n(1320),i=n(288);r||o(Object.prototype,"toString",i,{unsafe:!0})},1058:(e,t,n)=>{var r=n(2109),o=n(3009);r({global:!0,forced:parseInt!=o},{parseInt:o})},4916:(e,t,n)=>{"use strict";var r=n(2109),o=n(2261);r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},8783:(e,t,n)=>{"use strict";var r=n(8710).charAt,o=n(1340),i=n(9909),s=n(654),a="String Iterator",l=i.set,c=i.getterFor(a);s(String,"String",(function(e){l(this,{type:a,string:o(e),index:0})}),(function(){var e,t=c(this),n=t.string,o=t.index;return o>=n.length?{value:void 0,done:!0}:(e=r(n,o),t.index+=e.length,{value:e,done:!1})}))},4723:(e,t,n)=>{"use strict";var r=n(6916),o=n(7007),i=n(9670),s=n(7466),a=n(1340),l=n(4488),c=n(8173),u=n(1530),d=n(7651);o("match",(function(e,t,n){return[function(t){var n=l(this),o=null==t?void 0:c(t,e);return o?r(o,t,n):new RegExp(t)[e](a(n))},function(e){var r=i(this),o=a(e),l=n(t,r,o);if(l.done)return l.value;if(!r.global)return d(r,o);var c=r.unicode;r.lastIndex=0;for(var f,h=[],p=0;null!==(f=d(r,o));){var m=a(f[0]);h[p]=m,""===m&&(r.lastIndex=u(o,s(r.lastIndex),c)),p++}return 0===p?null:h}]}))},5306:(e,t,n)=>{"use strict";var r=n(2104),o=n(6916),i=n(1702),s=n(7007),a=n(7293),l=n(9670),c=n(614),u=n(9303),d=n(7466),f=n(1340),h=n(4488),p=n(1530),m=n(8173),v=n(647),g=n(7651),b=n(5112)("replace"),y=Math.max,w=Math.min,x=i([].concat),k=i([].push),S=i("".indexOf),E=i("".slice),C="$0"==="a".replace(/./,"$0"),_=!!/./[b]&&""===/./[b]("a","$0");s("replace",(function(e,t,n){var i=_?"$":"$0";return[function(e,n){var r=h(this),i=null==e?void 0:m(e,b);return i?o(i,e,r,n):o(t,f(r),e,n)},function(e,o){var s=l(this),a=f(e);if("string"==typeof o&&-1===S(o,i)&&-1===S(o,"$<")){var h=n(t,s,a,o);if(h.done)return h.value}var m=c(o);m||(o=f(o));var b=s.global;if(b){var C=s.unicode;s.lastIndex=0}for(var _=[];;){var T=g(s,a);if(null===T)break;if(k(_,T),!b)break;""===f(T[0])&&(s.lastIndex=p(a,d(s.lastIndex),C))}for(var O,L="",R=0,D=0;D<_.length;D++){for(var A=f((T=_[D])[0]),I=y(w(u(T.index),a.length),0),M=[],F=1;F<T.length;F++)k(M,void 0===(O=T[F])?O:String(O));var P=T.groups;if(m){var H=x([A],M,I,a);void 0!==P&&k(H,P);var N=f(r(o,void 0,H))}else N=v(A,a,I,M,P,o);I>=R&&(L+=E(a,R,I)+N,R=I+A.length)}return L+E(a,R)}]}),!!a((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}))||!C||_)},4129:(e,t,n)=>{"use strict";var r,o=n(7854),i=n(1702),s=n(2248),a=n(2423),l=n(7710),c=n(9320),u=n(111),d=n(2050),f=n(9909).enforce,h=n(8536),p=!o.ActiveXObject&&"ActiveXObject"in o,m=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},v=l("WeakMap",m,c);if(h&&p){r=c.getConstructor(m,"WeakMap",!0),a.enable();var g=v.prototype,b=i(g.delete),y=i(g.has),w=i(g.get),x=i(g.set);s(g,{delete:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),b(this,e)||t.frozen.delete(e)}return b(this,e)},has:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),y(this,e)||t.frozen.has(e)}return y(this,e)},get:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),y(this,e)?w(this,e):t.frozen.get(e)}return w(this,e)},set:function(e,t){if(u(e)&&!d(e)){var n=f(this);n.frozen||(n.frozen=new r),y(this,e)?x(this,e,t):n.frozen.set(e,t)}else x(this,e,t);return this}})}},4747:(e,t,n)=>{var r=n(7854),o=n(8324),i=n(8509),s=n(8533),a=n(8880),l=function(e){if(e&&e.forEach!==s)try{a(e,"forEach",s)}catch(t){e.forEach=s}};for(var c in o)o[c]&&l(r[c]&&r[c].prototype);l(i)},3948:(e,t,n)=>{var r=n(7854),o=n(8324),i=n(8509),s=n(6992),a=n(8880),l=n(5112),c=l("iterator"),u=l("toStringTag"),d=s.values,f=function(e,t){if(e){if(e[c]!==d)try{a(e,c,d)}catch(t){e[c]=d}if(e[u]||a(e,u,t),o[t])for(var n in s)if(e[n]!==s[n])try{a(e,n,s[n])}catch(t){e[n]=s[n]}}};for(var h in o)f(r[h]&&r[h].prototype,h);f(i,"DOMTokenList")},9843:(e,t,n)=>{e.exports={ResizeSensor:n(6087),ElementQueries:n(6456)}},6456:function(e,t,n){"use strict";var r,o,i;"undefined"!=typeof window&&window,o=[n(6087)],void 0===(i="function"==typeof(r=function(e){var t=function(){var t,n={},r=[];function o(e){e||(e=document.documentElement);var t=window.getComputedStyle(e,null).fontSize;return parseFloat(t)||16}function i(e,t){var n=t.split(/\d/),r=n[n.length-1];switch(t=parseFloat(t),r){case"px":default:return t;case"em":return t*o(e);case"rem":return t*o();case"vw":return t*document.documentElement.clientWidth/100;case"vh":return t*document.documentElement.clientHeight/100;case"vmin":case"vmax":var i=document.documentElement.clientWidth/100,s=document.documentElement.clientHeight/100;return t*(0,Math["vmin"===r?"min":"max"])(i,s)}}function s(e,t){var r,o,s,a,l,c,u,d;this.element=e;var f=["min-width","min-height","max-width","max-height"];this.call=function(){for(r in s=function(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}(this.element),c={},n[t])n[t].hasOwnProperty(r)&&(o=n[t][r],a=i(this.element,o.value),l="width"===o.property?s.width:s.height,d=o.mode+"-"+o.property,u="","min"===o.mode&&l>=a&&(u+=o.value),"max"===o.mode&&l<=a&&(u+=o.value),c[d]||(c[d]=""),u&&-1===(" "+c[d]+" ").indexOf(" "+u+" ")&&(c[d]+=" "+u));for(var e in f)f.hasOwnProperty(e)&&(c[f[e]]?this.element.setAttribute(f[e],c[f[e]].substr(1)):this.element.removeAttribute(f[e]))}}function a(t,n){t.elementQueriesSetupInformation||(t.elementQueriesSetupInformation=new s(t,n)),t.elementQueriesSensor||(t.elementQueriesSensor=new e(t,(function(){t.elementQueriesSetupInformation.call()})))}function l(e,o,i,s){if(void 0===n[e]){n[e]=[];var a=r.length;t.innerHTML+="\n"+e+" {animation: 0.1s element-queries;}",t.innerHTML+="\n"+e+" > .resize-sensor {min-width: "+a+"px;}",r.push(e)}n[e].push({mode:o,property:i,value:s})}function c(e){var t;if(document.querySelectorAll&&(t=e?e.querySelectorAll.bind(e):document.querySelectorAll.bind(document)),t||"undefined"==typeof $$||(t=$$),t||"undefined"==typeof jQuery||(t=jQuery),!t)throw"No document.querySelectorAll, jQuery or Mootools's $$ found.";return t}function u(t){var n=[],r=[],o=[],i=0,s=-1,a=[];for(var l in t.children)if(t.children.hasOwnProperty(l)&&t.children[l].tagName&&"img"===t.children[l].tagName.toLowerCase()){n.push(t.children[l]);var c=t.children[l].getAttribute("min-width")||t.children[l].getAttribute("data-min-width"),u=t.children[l].getAttribute("data-src")||t.children[l].getAttribute("url");o.push(u);var d={minWidth:c};r.push(d),c?t.children[l].style.display="none":(i=n.length-1,t.children[l].style.display="block")}function f(){var e,l=!1;for(e in n)n.hasOwnProperty(e)&&r[e].minWidth&&t.offsetWidth>r[e].minWidth&&(l=e);if(l||(l=i),s!==l)if(a[l])n[s].style.display="none",n[l].style.display="block",s=l;else{var c=new Image;c.onload=function(){n[l].src=o[l],n[s].style.display="none",n[l].style.display="block",a[l]=!0,s=l},c.src=o[l]}else n[l].src=o[l]}s=i,t.resizeSensorInstance=new e(t,f),f()}var d=/,?[\s\t]*([^,\n]*?)((?:\[[\s\t]*?(?:min|max)-(?:width|height)[\s\t]*?[~$\^]?=[\s\t]*?"[^"]*?"[\s\t]*?])+)([^,\n\s\{]*)/gim,f=/\[[\s\t]*?(min|max)-(width|height)[\s\t]*?[~$\^]?=[\s\t]*?"([^"]*?)"[\s\t]*?]/gim;function h(e){var t,n,r,o;for(e=e.replace(/'/g,'"');null!==(t=d.exec(e));)for(n=t[1]+t[3],r=t[2];null!==(o=f.exec(r));)l(n,o[1],o[2],o[3])}function p(e){var t="";if(e)if("string"==typeof e)-1===(e=e.toLowerCase()).indexOf("min-width")&&-1===e.indexOf("max-width")||h(e);else for(var n=0,r=e.length;n<r;n++)1===e[n].type?-1!==(t=e[n].selectorText||e[n].cssText).indexOf("min-height")||-1!==t.indexOf("max-height")?h(t):-1===t.indexOf("min-width")&&-1===t.indexOf("max-width")||h(t):4===e[n].type?p(e[n].cssRules||e[n].rules):3===e[n].type&&e[n].styleSheet.hasOwnProperty("cssRules")&&p(e[n].styleSheet.cssRules)}var m=!1;this.init=function(){var n="animationstart";void 0!==document.documentElement.style.webkitAnimationName?n="webkitAnimationStart":void 0!==document.documentElement.style.MozAnimationName?n="mozanimationstart":void 0!==document.documentElement.style.OAnimationName&&(n="oanimationstart"),document.body.addEventListener(n,(function(t){var n=t.target,o=n&&window.getComputedStyle(n,null),i=o&&o.getPropertyValue("animation-name");if(i&&-1!==i.indexOf("element-queries")){n.elementQueriesSensor=new e(n,(function(){n.elementQueriesSetupInformation&&n.elementQueriesSetupInformation.call()}));var s=window.getComputedStyle(n.resizeSensor,null).getPropertyValue("min-width");s=parseInt(s.replace("px","")),a(t.target,r[s])}})),m||((t=document.createElement("style")).type="text/css",t.innerHTML="[responsive-image] > img, [data-responsive-image] {overflow: hidden; padding: 0; } [responsive-image] > img, [data-responsive-image] > img {width: 100%;}",t.innerHTML+="\n@keyframes element-queries { 0% { visibility: inherit; } }",document.getElementsByTagName("head")[0].appendChild(t),m=!0);for(var o=0,i=document.styleSheets.length;o<i;o++)try{document.styleSheets[o].href&&0===document.styleSheets[o].href.indexOf("file://")&&console.warn("CssElementQueries: unable to parse local css files, "+document.styleSheets[o].href),p(document.styleSheets[o].cssRules||document.styleSheets[o].rules||document.styleSheets[o].cssText)}catch(e){}!function(){for(var e=c()("[data-responsive-image],[responsive-image]"),t=0,n=e.length;t<n;t++)u(e[t])}()},this.findElementQueriesElements=function(e){!function(e){var t=c(e);for(var r in n)if(n.hasOwnProperty(r))for(var o=t(r,e),i=0,s=o.length;i<s;i++)a(o[i],r)}(e)},this.update=function(){this.init()}};t.update=function(){t.instance.update()},t.detach=function(e){e.elementQueriesSetupInformation?(e.elementQueriesSensor.detach(),delete e.elementQueriesSetupInformation,delete e.elementQueriesSensor):e.resizeSensorInstance&&(e.resizeSensorInstance.detach(),delete e.resizeSensorInstance)},t.init=function(){t.instance||(t.instance=new t),t.instance.init()};return t.findElementQueriesElements=function(e){t.instance.findElementQueriesElements(e)},t.listen=function(){!function(e){if(document.addEventListener)document.addEventListener("DOMContentLoaded",e,!1);else if(/KHTML|WebKit|iCab/i.test(navigator.userAgent))var t=setInterval((function(){/loaded|complete/i.test(document.readyState)&&(e(),clearInterval(t))}),10);else window.onload=e}(t.init)},t})?r.apply(t,o):r)||(e.exports=i)},6087:function(e,t,n){"use strict";var r,o;"undefined"!=typeof window&&window,void 0===(o="function"==typeof(r=function(){if("undefined"==typeof window)return null;var e="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),t=e.requestAnimationFrame||e.mozRequestAnimationFrame||e.webkitRequestAnimationFrame||function(t){return e.setTimeout(t,20)},n=e.cancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelAnimationFrame||function(t){e.clearTimeout(t)};function r(e,t){var n=Object.prototype.toString.call(e),r="[object Array]"===n||"[object NodeList]"===n||"[object HTMLCollection]"===n||"[object Object]"===n||"undefined"!=typeof jQuery&&e instanceof jQuery||"undefined"!=typeof Elements&&e instanceof Elements,o=0,i=e.length;if(r)for(;o<i;o++)t(e[o]);else t(e)}function o(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}function i(e,t){Object.keys(t).forEach((function(n){e.style[n]=t[n]}))}var s=function(e,a){var l=0;function c(){var e,t,n=[];this.add=function(e){n.push(e)},this.call=function(r){for(e=0,t=n.length;e<t;e++)n[e].call(this,r)},this.remove=function(r){var o=[];for(e=0,t=n.length;e<t;e++)n[e]!==r&&o.push(n[e]);n=o},this.length=function(){return n.length}}function u(e,n){if(e)if(e.resizedAttached)e.resizedAttached.add(n);else{e.resizedAttached=new c,e.resizedAttached.add(n),e.resizeSensor=document.createElement("div"),e.resizeSensor.dir="ltr",e.resizeSensor.className="resize-sensor";var r={pointerEvents:"none",position:"absolute",left:"0px",top:"0px",right:"0px",bottom:"0px",overflow:"hidden",zIndex:"-1",visibility:"hidden",maxWidth:"100%"},s={position:"absolute",left:"0px",top:"0px",transition:"0s"};i(e.resizeSensor,r);var a=document.createElement("div");a.className="resize-sensor-expand",i(a,r);var u=document.createElement("div");i(u,s),a.appendChild(u);var d=document.createElement("div");d.className="resize-sensor-shrink",i(d,r);var f=document.createElement("div");i(f,s),i(f,{width:"200%",height:"200%"}),d.appendChild(f),e.resizeSensor.appendChild(a),e.resizeSensor.appendChild(d),e.appendChild(e.resizeSensor);var h=window.getComputedStyle(e),p=h?h.getPropertyValue("position"):null;"absolute"!==p&&"relative"!==p&&"fixed"!==p&&"sticky"!==p&&(e.style.position="relative");var m=!1,v=0,g=o(e),b=0,y=0,w=!0;l=0;var x=function(){if(w){if(0===e.offsetWidth&&0===e.offsetHeight)return void(l||(l=t((function(){l=0,x()}))));w=!1}var n,r;n=e.offsetWidth,r=e.offsetHeight,u.style.width=n+10+"px",u.style.height=r+10+"px",a.scrollLeft=n+10,a.scrollTop=r+10,d.scrollLeft=n+10,d.scrollTop=r+10};e.resizeSensor.resetSensor=x;var k=function(){v=0,m&&(b=g.width,y=g.height,e.resizedAttached&&e.resizedAttached.call(g))},S=function(){g=o(e),(m=g.width!==b||g.height!==y)&&!v&&(v=t(k)),x()},E=function(e,t,n){e.attachEvent?e.attachEvent("on"+t,n):e.addEventListener(t,n)};E(a,"scroll",S),E(d,"scroll",S),l=t((function(){l=0,x()}))}}r(e,(function(e){u(e,a)})),this.detach=function(t){l||(n(l),l=0),s.detach(e,t)},this.reset=function(){e.resizeSensor.resetSensor()}};if(s.reset=function(e){r(e,(function(e){e.resizeSensor.resetSensor()}))},s.detach=function(e,t){r(e,(function(e){e&&(e.resizedAttached&&"function"==typeof t&&(e.resizedAttached.remove(t),e.resizedAttached.length())||e.resizeSensor&&(e.contains(e.resizeSensor)&&e.removeChild(e.resizeSensor),delete e.resizeSensor,delete e.resizedAttached))}))},"undefined"!=typeof MutationObserver){var a=new MutationObserver((function(e){for(var t in e)if(e.hasOwnProperty(t))for(var n=e[t].addedNodes,r=0;r<n.length;r++)n[r].resizeSensor&&s.reset(n[r])}));document.addEventListener("DOMContentLoaded",(function(e){a.observe(document.body,{childList:!0,subtree:!0})}))}return s})?r.call(t,n,t,e):r)||(e.exports=o)},1296:(e,t,n)=>{var r=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,s=/^0o[0-7]+$/i,a=parseInt,l="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,c="object"==typeof self&&self&&self.Object===Object&&self,u=l||c||Function("return this")(),d=Object.prototype.toString,f=Math.max,h=Math.min,p=function(){return u.Date.now()};function m(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function v(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==d.call(e)}(e))return NaN;if(m(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=m(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=i.test(e);return n||s.test(e)?a(e.slice(2),n?2:8):o.test(e)?NaN:+e}e.exports=function(e,t,n){var r,o,i,s,a,l,c=0,u=!1,d=!1,g=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var n=r,i=o;return r=o=void 0,c=t,s=e.apply(i,n)}function y(e){return c=e,a=setTimeout(x,t),u?b(e):s}function w(e){var n=e-l;return void 0===l||n>=t||n<0||d&&e-c>=i}function x(){var e=p();if(w(e))return k(e);a=setTimeout(x,function(e){var n=t-(e-l);return d?h(n,i-(e-c)):n}(e))}function k(e){return a=void 0,g&&r?b(e):(r=o=void 0,s)}function S(){var e=p(),n=w(e);if(r=arguments,o=this,l=e,n){if(void 0===a)return y(l);if(d)return a=setTimeout(x,t),b(l)}return void 0===a&&(a=setTimeout(x,t)),s}return t=v(t)||0,m(n)&&(u=!!n.leading,i=(d="maxWait"in n)?f(v(n.maxWait)||0,t):i,g="trailing"in n?!!n.trailing:g),S.cancel=function(){void 0!==a&&clearTimeout(a),c=0,r=l=o=a=void 0},S.flush=function(){return void 0===a?s:k(p())},S}},773:(e,t,n)=>{var r,o="__lodash_hash_undefined__",i=/^\[object .+?Constructor\]$/,s="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,a="object"==typeof self&&self&&self.Object===Object&&self,l=s||a||Function("return this")(),c=Array.prototype,u=Function.prototype,d=Object.prototype,f=l["__core-js_shared__"],h=(r=/[^.]+$/.exec(f&&f.keys&&f.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",p=u.toString,m=d.hasOwnProperty,v=d.toString,g=RegExp("^"+p.call(m).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),b=c.splice,y=_(l,"Map"),w=_(Object,"create");function x(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function k(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function S(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function E(e,t){for(var n,r,o=e.length;o--;)if((n=e[o][0])===(r=t)||n!=n&&r!=r)return o;return-1}function C(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function _(e,t){var n=function(e,t){return null==e?void 0:e[t]}(e,t);return function(e){if(!O(e)||h&&h in e)return!1;var t=function(e){var t=O(e)?v.call(e):"";return"[object Function]"==t||"[object GeneratorFunction]"==t}(e)||function(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}(e)?g:i;return t.test(function(e){if(null!=e){try{return p.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}(n)?n:void 0}function T(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var s=e.apply(this,r);return n.cache=i.set(o,s),s};return n.cache=new(T.Cache||S),n}function O(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}x.prototype.clear=function(){this.__data__=w?w(null):{}},x.prototype.delete=function(e){return this.has(e)&&delete this.__data__[e]},x.prototype.get=function(e){var t=this.__data__;if(w){var n=t[e];return n===o?void 0:n}return m.call(t,e)?t[e]:void 0},x.prototype.has=function(e){var t=this.__data__;return w?void 0!==t[e]:m.call(t,e)},x.prototype.set=function(e,t){return this.__data__[e]=w&&void 0===t?o:t,this},k.prototype.clear=function(){this.__data__=[]},k.prototype.delete=function(e){var t=this.__data__,n=E(t,e);return!(n<0||(n==t.length-1?t.pop():b.call(t,n,1),0))},k.prototype.get=function(e){var t=this.__data__,n=E(t,e);return n<0?void 0:t[n][1]},k.prototype.has=function(e){return E(this.__data__,e)>-1},k.prototype.set=function(e,t){var n=this.__data__,r=E(n,e);return r<0?n.push([e,t]):n[r][1]=t,this},S.prototype.clear=function(){this.__data__={hash:new x,map:new(y||k),string:new x}},S.prototype.delete=function(e){return C(this,e).delete(e)},S.prototype.get=function(e){return C(this,e).get(e)},S.prototype.has=function(e){return C(this,e).has(e)},S.prototype.set=function(e,t){return C(this,e).set(e,t),this},T.Cache=S,e.exports=T},3096:(e,t,n)=>{var r="Expected a function",o=/^\s+|\s+$/g,i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,a=/^0o[0-7]+$/i,l=parseInt,c="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,u="object"==typeof self&&self&&self.Object===Object&&self,d=c||u||Function("return this")(),f=Object.prototype.toString,h=Math.max,p=Math.min,m=function(){return d.Date.now()};function v(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function g(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==f.call(e)}(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(o,"");var n=s.test(e);return n||a.test(e)?l(e.slice(2),n?2:8):i.test(e)?NaN:+e}e.exports=function(e,t,n){var o=!0,i=!0;if("function"!=typeof e)throw new TypeError(r);return v(n)&&(o="leading"in n?!!n.leading:o,i="trailing"in n?!!n.trailing:i),function(e,t,n){var o,i,s,a,l,c,u=0,d=!1,f=!1,b=!0;if("function"!=typeof e)throw new TypeError(r);function y(t){var n=o,r=i;return o=i=void 0,u=t,a=e.apply(r,n)}function w(e){return u=e,l=setTimeout(k,t),d?y(e):a}function x(e){var n=e-c;return void 0===c||n>=t||n<0||f&&e-u>=s}function k(){var e=m();if(x(e))return S(e);l=setTimeout(k,function(e){var n=t-(e-c);return f?p(n,s-(e-u)):n}(e))}function S(e){return l=void 0,b&&o?y(e):(o=i=void 0,a)}function E(){var e=m(),n=x(e);if(o=arguments,i=this,c=e,n){if(void 0===l)return w(c);if(f)return l=setTimeout(k,t),y(c)}return void 0===l&&(l=setTimeout(k,t)),a}return t=g(t)||0,v(n)&&(d=!!n.leading,s=(f="maxWait"in n)?h(g(n.maxWait)||0,t):s,b="trailing"in n?!!n.trailing:b),E.cancel=function(){void 0!==l&&clearTimeout(l),u=0,o=c=i=l=void 0},E.flush=function(){return void 0===l?a:S(m())},E}(e,t,{leading:o,maxWait:t,trailing:i})}},7924:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ne}),n(9554),n(4747);var r,o=n(1807),i=n.n(o),s=(n(7327),n(6992),n(9601),n(1539),n(1058),n(8783),n(4129),n(3948),n(3096)),a=n.n(s),l=n(1296),c=n.n(l),u=n(773),d=n.n(u),f=[],h="ResizeObserver loop completed with undelivered notifications.";!function(e){e.BORDER_BOX="border-box",e.CONTENT_BOX="content-box",e.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box"}(r||(r={}));var p,m=function(e){return Object.freeze(e)},v=function(e,t){this.inlineSize=e,this.blockSize=t,m(this)},g=function(){function e(e,t,n,r){return this.x=e,this.y=t,this.width=n,this.height=r,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,m(this)}return e.prototype.toJSON=function(){var e=this;return{x:e.x,y:e.y,top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.width,height:e.height}},e.fromRect=function(t){return new e(t.x,t.y,t.width,t.height)},e}(),b=function(e){return e instanceof SVGElement&&"getBBox"in e},y=function(e){if(b(e)){var t=e.getBBox(),n=t.width,r=t.height;return!n&&!r}var o=e,i=o.offsetWidth,s=o.offsetHeight;return!(i||s||e.getClientRects().length)},w=function(e){var t,n;if(e instanceof Element)return!0;var r=null===(n=null===(t=e)||void 0===t?void 0:t.ownerDocument)||void 0===n?void 0:n.defaultView;return!!(r&&e instanceof r.Element)},x="undefined"!=typeof window?window:{},k=new WeakMap,S=/auto|scroll/,E=/^tb|vertical/,C=/msie|trident/i.test(x.navigator&&x.navigator.userAgent),_=function(e){return parseFloat(e||"0")},T=function(e,t,n){return void 0===e&&(e=0),void 0===t&&(t=0),void 0===n&&(n=!1),new v((n?t:e)||0,(n?e:t)||0)},O=m({devicePixelContentBoxSize:T(),borderBoxSize:T(),contentBoxSize:T(),contentRect:new g(0,0,0,0)}),L=function(e,t){if(void 0===t&&(t=!1),k.has(e)&&!t)return k.get(e);if(y(e))return k.set(e,O),O;var n=getComputedStyle(e),r=b(e)&&e.ownerSVGElement&&e.getBBox(),o=!C&&"border-box"===n.boxSizing,i=E.test(n.writingMode||""),s=!r&&S.test(n.overflowY||""),a=!r&&S.test(n.overflowX||""),l=r?0:_(n.paddingTop),c=r?0:_(n.paddingRight),u=r?0:_(n.paddingBottom),d=r?0:_(n.paddingLeft),f=r?0:_(n.borderTopWidth),h=r?0:_(n.borderRightWidth),p=r?0:_(n.borderBottomWidth),v=d+c,w=l+u,x=(r?0:_(n.borderLeftWidth))+h,L=f+p,R=a?e.offsetHeight-L-e.clientHeight:0,D=s?e.offsetWidth-x-e.clientWidth:0,A=o?v+x:0,I=o?w+L:0,M=r?r.width:_(n.width)-A-D,F=r?r.height:_(n.height)-I-R,P=M+v+D+x,H=F+w+R+L,N=m({devicePixelContentBoxSize:T(Math.round(M*devicePixelRatio),Math.round(F*devicePixelRatio),i),borderBoxSize:T(P,H,i),contentBoxSize:T(M,F,i),contentRect:new g(d,l,M,F)});return k.set(e,N),N},R=function(e,t,n){var o=L(e,n),i=o.borderBoxSize,s=o.contentBoxSize,a=o.devicePixelContentBoxSize;switch(t){case r.DEVICE_PIXEL_CONTENT_BOX:return a;case r.BORDER_BOX:return i;default:return s}},D=function(e){var t=L(e);this.target=e,this.contentRect=t.contentRect,this.borderBoxSize=m([t.borderBoxSize]),this.contentBoxSize=m([t.contentBoxSize]),this.devicePixelContentBoxSize=m([t.devicePixelContentBoxSize])},A=function(e){if(y(e))return 1/0;for(var t=0,n=e.parentNode;n;)t+=1,n=n.parentNode;return t},I=function(){var e=1/0,t=[];f.forEach((function(n){if(0!==n.activeTargets.length){var r=[];n.activeTargets.forEach((function(t){var n=new D(t.target),o=A(t.target);r.push(n),t.lastReportedSize=R(t.target,t.observedBox),o<e&&(e=o)})),t.push((function(){n.callback.call(n.observer,r,n.observer)})),n.activeTargets.splice(0,n.activeTargets.length)}}));for(var n=0,r=t;n<r.length;n++)(0,r[n])();return e},M=function(e){f.forEach((function(t){t.activeTargets.splice(0,t.activeTargets.length),t.skippedTargets.splice(0,t.skippedTargets.length),t.observationTargets.forEach((function(n){n.isActive()&&(A(n.target)>e?t.activeTargets.push(n):t.skippedTargets.push(n))}))}))},F=[],P=0,H={attributes:!0,characterData:!0,childList:!0,subtree:!0},N=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],j=function(e){return void 0===e&&(e=0),Date.now()+e},W=!1,B=new(function(){function e(){var e=this;this.stopped=!0,this.listener=function(){return e.schedule()}}return e.prototype.run=function(e){var t=this;if(void 0===e&&(e=250),!W){W=!0;var n,r=j(e);n=function(){var n=!1;try{n=function(){var e,t=0;for(M(t);f.some((function(e){return e.activeTargets.length>0}));)t=I(),M(t);return f.some((function(e){return e.skippedTargets.length>0}))&&("function"==typeof ErrorEvent?e=new ErrorEvent("error",{message:h}):((e=document.createEvent("Event")).initEvent("error",!1,!1),e.message=h),window.dispatchEvent(e)),t>0}()}finally{if(W=!1,e=r-j(),!P)return;n?t.run(1e3):e>0?t.run(e):t.start()}},function(e){if(!p){var t=0,n=document.createTextNode("");new MutationObserver((function(){return F.splice(0).forEach((function(e){return e()}))})).observe(n,{characterData:!0}),p=function(){n.textContent=""+(t?t--:t++)}}F.push(e),p()}((function(){requestAnimationFrame(n)}))}},e.prototype.schedule=function(){this.stop(),this.run()},e.prototype.observe=function(){var e=this,t=function(){return e.observer&&e.observer.observe(document.body,H)};document.body?t():x.addEventListener("DOMContentLoaded",t)},e.prototype.start=function(){var e=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),N.forEach((function(t){return x.addEventListener(t,e.listener,!0)})))},e.prototype.stop=function(){var e=this;this.stopped||(this.observer&&this.observer.disconnect(),N.forEach((function(t){return x.removeEventListener(t,e.listener,!0)})),this.stopped=!0)},e}()),z=function(e){!P&&e>0&&B.start(),!(P+=e)&&B.stop()},V=function(){function e(e,t){this.target=e,this.observedBox=t||r.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return e.prototype.isActive=function(){var e,t=R(this.target,this.observedBox,!0);return e=this.target,b(e)||function(e){switch(e.tagName){case"INPUT":if("image"!==e.type)break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1}(e)||"inline"!==getComputedStyle(e).display||(this.lastReportedSize=t),this.lastReportedSize.inlineSize!==t.inlineSize||this.lastReportedSize.blockSize!==t.blockSize},e}(),q=function(e,t){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=e,this.callback=t},$=new WeakMap,U=function(e,t){for(var n=0;n<e.length;n+=1)if(e[n].target===t)return n;return-1},Z=function(){function e(){}return e.connect=function(e,t){var n=new q(e,t);$.set(e,n)},e.observe=function(e,t,n){var r=$.get(e),o=0===r.observationTargets.length;U(r.observationTargets,t)<0&&(o&&f.push(r),r.observationTargets.push(new V(t,n&&n.box)),z(1),B.schedule())},e.unobserve=function(e,t){var n=$.get(e),r=U(n.observationTargets,t),o=1===n.observationTargets.length;r>=0&&(o&&f.splice(f.indexOf(n),1),n.observationTargets.splice(r,1),z(-1))},e.disconnect=function(e){var t=this,n=$.get(e);n.observationTargets.slice().forEach((function(n){return t.unobserve(e,n.target)})),n.activeTargets.splice(0,n.activeTargets.length)},e}(),Y=function(){function e(e){if(0===arguments.length)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if("function"!=typeof e)throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");Z.connect(this,e)}return e.prototype.observe=function(e,t){if(0===arguments.length)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!w(e))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");Z.observe(this,e,t)},e.prototype.unobserve=function(e){if(0===arguments.length)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!w(e))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");Z.unobserve(this,e)},e.prototype.disconnect=function(){Z.disconnect(this)},e.toString=function(){return"function ResizeObserver () { [polyfill code] }"},e}(),G=(n(5827),n(8309),n(4916),n(4723),n(5306),function(e){return Array.prototype.reduce.call(e,(function(e,t){var n=t.name.match(/data-simplebar-(.+)/);if(n){var r=n[1].replace(/\W+(.)/g,(function(e,t){return t.toUpperCase()}));switch(t.value){case"true":e[r]=!0;break;case"false":e[r]=!1;break;case void 0:e[r]=!0;break;default:e[r]=t.value}}return e}),{})});function J(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView?e.ownerDocument.defaultView:window}function K(e){return e&&e.ownerDocument?e.ownerDocument:document}var X=null,Q=null;function ee(e){if(null===X){var t=K(e);if(void 0===t)return X=0;var n=t.body,r=t.createElement("div");r.classList.add("simplebar-hide-scrollbar"),n.appendChild(r);var o=r.getBoundingClientRect().right;n.removeChild(r),X=o}return X}i()&&window.addEventListener("resize",(function(){Q!==window.devicePixelRatio&&(Q=window.devicePixelRatio,X=null)}));var te=function(){function e(t,n){var r=this;this.onScroll=function(){var e=J(r.el);r.scrollXTicking||(e.requestAnimationFrame(r.scrollX),r.scrollXTicking=!0),r.scrollYTicking||(e.requestAnimationFrame(r.scrollY),r.scrollYTicking=!0)},this.scrollX=function(){r.axis.x.isOverflowing&&(r.showScrollbar("x"),r.positionScrollbar("x")),r.scrollXTicking=!1},this.scrollY=function(){r.axis.y.isOverflowing&&(r.showScrollbar("y"),r.positionScrollbar("y")),r.scrollYTicking=!1},this.onMouseEnter=function(){r.showScrollbar("x"),r.showScrollbar("y")},this.onMouseMove=function(e){r.mouseX=e.clientX,r.mouseY=e.clientY,(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseMoveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseMoveForAxis("y")},this.onMouseLeave=function(){r.onMouseMove.cancel(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseLeaveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseLeaveForAxis("y"),r.mouseX=-1,r.mouseY=-1},this.onWindowResize=function(){r.scrollbarWidth=r.getScrollbarWidth(),r.hideNativeScrollbar()},this.hideScrollbars=function(){r.axis.x.track.rect=r.axis.x.track.el.getBoundingClientRect(),r.axis.y.track.rect=r.axis.y.track.el.getBoundingClientRect(),r.isWithinBounds(r.axis.y.track.rect)||(r.axis.y.scrollbar.el.classList.remove(r.classNames.visible),r.axis.y.isVisible=!1),r.isWithinBounds(r.axis.x.track.rect)||(r.axis.x.scrollbar.el.classList.remove(r.classNames.visible),r.axis.x.isVisible=!1)},this.onPointerEvent=function(e){var t,n;r.axis.x.track.rect=r.axis.x.track.el.getBoundingClientRect(),r.axis.y.track.rect=r.axis.y.track.el.getBoundingClientRect(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&(t=r.isWithinBounds(r.axis.x.track.rect)),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&(n=r.isWithinBounds(r.axis.y.track.rect)),(t||n)&&(e.preventDefault(),e.stopPropagation(),"mousedown"===e.type&&(t&&(r.axis.x.scrollbar.rect=r.axis.x.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.x.scrollbar.rect)?r.onDragStart(e,"x"):r.onTrackClick(e,"x")),n&&(r.axis.y.scrollbar.rect=r.axis.y.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.y.scrollbar.rect)?r.onDragStart(e,"y"):r.onTrackClick(e,"y"))))},this.drag=function(t){var n=r.axis[r.draggedAxis].track,o=n.rect[r.axis[r.draggedAxis].sizeAttr],i=r.axis[r.draggedAxis].scrollbar,s=r.contentWrapperEl[r.axis[r.draggedAxis].scrollSizeAttr],a=parseInt(r.elStyles[r.axis[r.draggedAxis].sizeAttr],10);t.preventDefault(),t.stopPropagation();var l=(("y"===r.draggedAxis?t.pageY:t.pageX)-n.rect[r.axis[r.draggedAxis].offsetAttr]-r.axis[r.draggedAxis].dragOffset)/(o-i.size)*(s-a);"x"===r.draggedAxis&&(l=r.isRtl&&e.getRtlHelpers().isRtlScrollbarInverted?l-(o+i.size):l,l=r.isRtl&&e.getRtlHelpers().isRtlScrollingInverted?-l:l),r.contentWrapperEl[r.axis[r.draggedAxis].scrollOffsetAttr]=l},this.onEndDrag=function(e){var t=K(r.el),n=J(r.el);e.preventDefault(),e.stopPropagation(),r.el.classList.remove(r.classNames.dragging),t.removeEventListener("mousemove",r.drag,!0),t.removeEventListener("mouseup",r.onEndDrag,!0),r.removePreventClickId=n.setTimeout((function(){t.removeEventListener("click",r.preventClick,!0),t.removeEventListener("dblclick",r.preventClick,!0),r.removePreventClickId=null}))},this.preventClick=function(e){e.preventDefault(),e.stopPropagation()},this.el=t,this.minScrollbarWidth=20,this.options=Object.assign({},e.defaultOptions,{},n),this.classNames=Object.assign({},e.defaultOptions.classNames,{},this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,e.instances.has(this.el)||(this.recalculate=a()(this.recalculate.bind(this),64),this.onMouseMove=a()(this.onMouseMove.bind(this),64),this.hideScrollbars=c()(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=c()(this.onWindowResize.bind(this),64,{leading:!0}),e.getRtlHelpers=d()(e.getRtlHelpers),this.init())}e.getRtlHelpers=function(){var t=document.createElement("div");t.innerHTML='<div class="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>';var n=t.firstElementChild;document.body.appendChild(n);var r=n.firstElementChild;n.scrollLeft=0;var o=e.getOffset(n),i=e.getOffset(r);n.scrollLeft=999;var s=e.getOffset(r);return{isRtlScrollingInverted:o.left!==i.left&&i.left-s.left!=0,isRtlScrollbarInverted:o.left!==i.left}},e.getOffset=function(e){var t=e.getBoundingClientRect(),n=K(e),r=J(e);return{top:t.top+(r.pageYOffset||n.documentElement.scrollTop),left:t.left+(r.pageXOffset||n.documentElement.scrollLeft)}};var t=e.prototype;return t.init=function(){e.instances.set(this.el,this),i()&&(this.initDOM(),this.setAccessibilityAttributes(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},t.initDOM=function(){var e=this;if(Array.prototype.filter.call(this.el.children,(function(t){return t.classList.contains(e.classNames.wrapper)})).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var t=document.createElement("div"),n=document.createElement("div");t.classList.add(this.classNames.track),n.classList.add(this.classNames.scrollbar),t.appendChild(n),this.axis.x.track.el=t.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=t.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},t.setAccessibilityAttributes=function(){var e=this.options.ariaLabel||"scrollable content";this.contentWrapperEl.setAttribute("tabindex","0"),this.contentWrapperEl.setAttribute("role","region"),this.contentWrapperEl.setAttribute("aria-label",e)},t.initListeners=function(){var e=this,t=J(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach((function(t){e.el.addEventListener(t,e.onPointerEvent,!0)})),["touchstart","touchend","touchmove"].forEach((function(t){e.el.addEventListener(t,e.onPointerEvent,{capture:!0,passive:!0})})),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),t.addEventListener("resize",this.onWindowResize);var n=!1,r=t.ResizeObserver||Y;this.resizeObserver=new r((function(){n&&e.recalculate()})),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),t.requestAnimationFrame((function(){n=!0})),this.mutationObserver=new t.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},t.recalculate=function(){var e=J(this.el);this.elStyles=e.getComputedStyle(this.el),this.isRtl="rtl"===this.elStyles.direction;var t=this.heightAutoObserverEl.offsetHeight<=1,n=this.heightAutoObserverEl.offsetWidth<=1,r=this.contentEl.offsetWidth,o=this.contentWrapperEl.offsetWidth,i=this.elStyles.overflowX,s=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var a=this.contentEl.scrollHeight,l=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=t?"auto":"100%",this.placeholderEl.style.width=n?r+"px":"auto",this.placeholderEl.style.height=a+"px";var c=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=l>r,this.axis.y.isOverflowing=a>c,this.axis.x.isOverflowing="hidden"!==i&&this.axis.x.isOverflowing,this.axis.y.isOverflowing="hidden"!==s&&this.axis.y.isOverflowing,this.axis.x.forceVisible="x"===this.options.forceVisible||!0===this.options.forceVisible,this.axis.y.forceVisible="y"===this.options.forceVisible||!0===this.options.forceVisible,this.hideNativeScrollbar();var u=this.axis.x.isOverflowing?this.scrollbarWidth:0,d=this.axis.y.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&l>o-d,this.axis.y.isOverflowing=this.axis.y.isOverflowing&&a>c-u,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},t.getScrollbarSize=function(e){if(void 0===e&&(e="y"),!this.axis[e].isOverflowing)return 0;var t,n=this.contentEl[this.axis[e].scrollSizeAttr],r=this.axis[e].track.el[this.axis[e].offsetSizeAttr],o=r/n;return t=Math.max(~~(o*r),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(t=Math.min(t,this.options.scrollbarMaxSize)),t},t.positionScrollbar=function(t){if(void 0===t&&(t="y"),this.axis[t].isOverflowing){var n=this.contentWrapperEl[this.axis[t].scrollSizeAttr],r=this.axis[t].track.el[this.axis[t].offsetSizeAttr],o=parseInt(this.elStyles[this.axis[t].sizeAttr],10),i=this.axis[t].scrollbar,s=this.contentWrapperEl[this.axis[t].scrollOffsetAttr],a=(s="x"===t&&this.isRtl&&e.getRtlHelpers().isRtlScrollingInverted?-s:s)/(n-o),l=~~((r-i.size)*a);l="x"===t&&this.isRtl&&e.getRtlHelpers().isRtlScrollbarInverted?l+(r-i.size):l,i.el.style.transform="x"===t?"translate3d("+l+"px, 0, 0)":"translate3d(0, "+l+"px, 0)"}},t.toggleTrackVisibility=function(e){void 0===e&&(e="y");var t=this.axis[e].track.el,n=this.axis[e].scrollbar.el;this.axis[e].isOverflowing||this.axis[e].forceVisible?(t.style.visibility="visible",this.contentWrapperEl.style[this.axis[e].overflowAttr]="scroll"):(t.style.visibility="hidden",this.contentWrapperEl.style[this.axis[e].overflowAttr]="hidden"),this.axis[e].isOverflowing?n.style.display="block":n.style.display="none"},t.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},t.onMouseMoveForAxis=function(e){void 0===e&&(e="y"),this.axis[e].track.rect=this.axis[e].track.el.getBoundingClientRect(),this.axis[e].scrollbar.rect=this.axis[e].scrollbar.el.getBoundingClientRect(),this.isWithinBounds(this.axis[e].scrollbar.rect)?this.axis[e].scrollbar.el.classList.add(this.classNames.hover):this.axis[e].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[e].track.rect)?(this.showScrollbar(e),this.axis[e].track.el.classList.add(this.classNames.hover)):this.axis[e].track.el.classList.remove(this.classNames.hover)},t.onMouseLeaveForAxis=function(e){void 0===e&&(e="y"),this.axis[e].track.el.classList.remove(this.classNames.hover),this.axis[e].scrollbar.el.classList.remove(this.classNames.hover)},t.showScrollbar=function(e){void 0===e&&(e="y");var t=this.axis[e].scrollbar.el;this.axis[e].isVisible||(t.classList.add(this.classNames.visible),this.axis[e].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},t.onDragStart=function(e,t){void 0===t&&(t="y");var n=K(this.el),r=J(this.el),o=this.axis[t].scrollbar,i="y"===t?e.pageY:e.pageX;this.axis[t].dragOffset=i-o.rect[this.axis[t].offsetAttr],this.draggedAxis=t,this.el.classList.add(this.classNames.dragging),n.addEventListener("mousemove",this.drag,!0),n.addEventListener("mouseup",this.onEndDrag,!0),null===this.removePreventClickId?(n.addEventListener("click",this.preventClick,!0),n.addEventListener("dblclick",this.preventClick,!0)):(r.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},t.onTrackClick=function(e,t){var n=this;if(void 0===t&&(t="y"),this.options.clickOnTrack){var r=J(this.el);this.axis[t].scrollbar.rect=this.axis[t].scrollbar.el.getBoundingClientRect();var o=this.axis[t].scrollbar.rect[this.axis[t].offsetAttr],i=parseInt(this.elStyles[this.axis[t].sizeAttr],10),s=this.contentWrapperEl[this.axis[t].scrollOffsetAttr],a=("y"===t?this.mouseY-o:this.mouseX-o)<0?-1:1,l=-1===a?s-i:s+i;!function e(){var o,i;-1===a?s>l&&(s-=n.options.clickOnTrackSpeed,n.contentWrapperEl.scrollTo(((o={})[n.axis[t].offsetAttr]=s,o)),r.requestAnimationFrame(e)):s<l&&(s+=n.options.clickOnTrackSpeed,n.contentWrapperEl.scrollTo(((i={})[n.axis[t].offsetAttr]=s,i)),r.requestAnimationFrame(e))}()}},t.getContentElement=function(){return this.contentEl},t.getScrollElement=function(){return this.contentWrapperEl},t.getScrollbarWidth=function(){try{return"none"===getComputedStyle(this.contentWrapperEl,"::-webkit-scrollbar").display||"scrollbarWidth"in document.documentElement.style||"-ms-overflow-style"in document.documentElement.style?0:ee(this.el)}catch(e){return ee(this.el)}},t.removeListeners=function(){var e=this,t=J(this.el);this.options.autoHide&&this.el.removeEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach((function(t){e.el.removeEventListener(t,e.onPointerEvent,!0)})),["touchstart","touchend","touchmove"].forEach((function(t){e.el.removeEventListener(t,e.onPointerEvent,{capture:!0,passive:!0})})),this.el.removeEventListener("mousemove",this.onMouseMove),this.el.removeEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl&&this.contentWrapperEl.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onWindowResize),this.mutationObserver&&this.mutationObserver.disconnect(),this.resizeObserver&&this.resizeObserver.disconnect(),this.recalculate.cancel(),this.onMouseMove.cancel(),this.hideScrollbars.cancel(),this.onWindowResize.cancel()},t.unMount=function(){this.removeListeners(),e.instances.delete(this.el)},t.isWithinBounds=function(e){return this.mouseX>=e.left&&this.mouseX<=e.left+e.width&&this.mouseY>=e.top&&this.mouseY<=e.top+e.height},t.findChild=function(e,t){var n=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector;return Array.prototype.filter.call(e.children,(function(e){return n.call(e,t)}))[0]},e}();te.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3},te.instances=new WeakMap,te.initDOMLoadedElements=function(){document.removeEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.removeEventListener("load",this.initDOMLoadedElements),Array.prototype.forEach.call(document.querySelectorAll("[data-simplebar]"),(function(e){"init"===e.getAttribute("data-simplebar")||te.instances.has(e)||new te(e,G(e.attributes))}))},te.removeObserver=function(){this.globalObserver.disconnect()},te.initHtmlApi=function(){this.initDOMLoadedElements=this.initDOMLoadedElements.bind(this),"undefined"!=typeof MutationObserver&&(this.globalObserver=new MutationObserver(te.handleMutations),this.globalObserver.observe(document,{childList:!0,subtree:!0})),"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?window.setTimeout(this.initDOMLoadedElements):(document.addEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.addEventListener("load",this.initDOMLoadedElements))},te.handleMutations=function(e){e.forEach((function(e){Array.prototype.forEach.call(e.addedNodes,(function(e){1===e.nodeType&&(e.hasAttribute("data-simplebar")?!te.instances.has(e)&&document.documentElement.contains(e)&&new te(e,G(e.attributes)):Array.prototype.forEach.call(e.querySelectorAll("[data-simplebar]"),(function(e){"init"!==e.getAttribute("data-simplebar")&&!te.instances.has(e)&&document.documentElement.contains(e)&&new te(e,G(e.attributes))})))})),Array.prototype.forEach.call(e.removedNodes,(function(e){1===e.nodeType&&("init"===e.getAttribute("data-simplebar")?te.instances.has(e)&&!document.documentElement.contains(e)&&te.instances.get(e).unMount():Array.prototype.forEach.call(e.querySelectorAll('[data-simplebar="init"]'),(function(e){te.instances.has(e)&&!document.documentElement.contains(e)&&te.instances.get(e).unMount()})))}))}))},te.getOptions=G,i()&&te.initHtmlApi();const ne=te},1528:(e,t,n)=>{"use strict";n.r(t),n.d(t,{DocAnchorTarget:()=>u,DocAnchorTrigger:()=>p,DocBackToTop:()=>g,DocBadge:()=>y,DocCheckbox:()=>E,DocCodeblock:()=>Ge,DocCollapse:()=>Ke,DocDrawer:()=>ot,DocDropdown:()=>lt,DocEmoji:()=>dt,DocHistory:()=>It,DocIcon:()=>Ht,DocIconAlignRight:()=>Fi,DocIconArrowLeft:()=>Ni,DocIconArrowRight:()=>Bi,DocIconArrowTop:()=>qi,DocIconBox:()=>Zi,DocIconButton:()=>jt,DocIconCheck:()=>Ji,DocIconCheckCircle:()=>Qi,DocIconChevronDown:()=>ns,DocIconChevronRight:()=>is,DocIconCopy:()=>Ze,DocIconFile:()=>ls,DocIconFilter:()=>ds,DocIconFolder:()=>ms,DocIconHistory:()=>bs,DocIconHome:()=>xs,DocIconInfo:()=>Es,DocIconLayers:()=>Ts,DocIconLink:()=>Rs,DocIconMenu:()=>Is,DocIconMinus:()=>Ps,DocIconMoon:()=>js,DocIconMoreHorizontal:()=>zs,DocIconPlus:()=>$s,DocIconSearch:()=>Ys,DocIconShield:()=>Ks,DocIconSun:()=>ea,DocIconX:()=>ra,DocLoadingSpinner:()=>Bt,DocMember:()=>Dn,DocMemberGroup:()=>Hn,DocOverloadGroup:()=>jn,DocPanel:()=>Vn,DocPanels:()=>qn,DocParameter:()=>nr,DocParameters:()=>sr,DocSearchDesktop:()=>kr,DocSearchMobile:()=>Tr,DocSidebar:()=>ao,DocSidebarRight:()=>Lo,DocSwitch:()=>Mo,DocTab:()=>Fo,DocTabs:()=>No,DocThemeSwitch:()=>Wo,DocToolbar:()=>Li,DocToolbarMemberFilterNoResults:()=>Ai});var r=n(4359),o=["id"],i=n(5184),s=n(5543),a=n(2626);const l=(0,r.aZ)({name:"DocAnchorTarget",props:{id:{type:String,required:!0}},setup:function(e){var t=(0,a.oR)().store,n=(0,i.B)().scrollTo,o=(0,r.iH)("#".concat(e.id));function l(){n(o.value,{offset:s.vE,onStart:function(){t.actions.updateScrolledElementId(e.id)}})}(0,r.bv)((function(){window.location.hash&&decodeURIComponent(window.location.hash)===o.value&&setTimeout((function(){t.state.isScrollPositionRestored||(window.scrollTo(0,0),setTimeout(l,200))}),1)}))}});var c=n(3744);const u=(0,c.Z)(l,[["render",function(e,t,n,i,s,a){return(0,r.wg)(),(0,r.iD)("div",{id:e.id},[(0,r.WI)(e.$slots,"default")],8,o)}]]);var d=["href","tabindex","aria-disabled"],f=n(6184);const h=(0,r.aZ)({name:"DocAnchorTrigger",props:{disabled:Boolean,to:{type:String,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,a.oR)().store,l=(0,i.B)().scrollTo;return{onClick:function(t){(0,s.pI)(t)||(t.preventDefault(),(0,f.Vn)(e.to),n("click"),l(e.to,{offset:(0,s.vE)(),onStart:function(){var t="#"===e.to.charAt(0)?e.to.substr(1):e.to;o.actions.updateScrolledElementId(t)}}))},tabindex:(0,r.Fl)((function(){return e.disabled?"-1":null}))}}}),p=(0,c.Z)(h,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("a",{href:e.to,tabindex:e.tabindex,"aria-disabled":e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.WI)(e.$slots,"default")],8,d)}]]);var m=n(7023);const v=(0,r.aZ)({name:"DocBackToTop",setup:function(){var e=(0,r.iH)(!1),t=(0,i.B)().scrollTo;return(0,m.zX)(window,"scroll",(function(){document.documentElement.scrollTop>350?e.value=!0:e.value=!1})),{onClick:function(){t("body")},show:e}}}),g=(0,c.Z)(v,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-top"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-from-class":"translate-y-4 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"translate-y-4 opacity-0"},{default:(0,r.w5)((function(){return[e.show?((0,r.wg)(),(0,r.iD)("button",{key:0,class:"fixed bottom-6 right-6 w-12 h-12 flex items-center justify-center rounded-full bg-white bg-opacity-70 hover:bg-gray-200 dark:bg-dark-850 dark:hover:bg-dark-450 z-40 focus:outline-none transition duration-300 linear border border-gray-400 border-opacity-50 hover:border-opacity-10 dark:border-dark-450 dark:bg-opacity-70",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(l,{class:"w-7 h-7 text-blue-500 dark:text-blue-400"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})])):(0,r.kq)("",!0)]})),_:1})}]]),b=(0,r.aZ)({name:"DocBadge",props:{type:{type:String,default:""}},setup:function(e){var t=(0,r.Fl)((function(){return e.type.trim()}));return{badgeClasses:(0,r.Fl)((function(){switch(t.value){case"bindable":return"bg-yellow-100 text-yellow-700 dark:bg-yellow-500 dark:text-white";case"required":return"bg-indigo-100 text-indigo-700 dark:bg-indigo-500 dark:text-white";case"internal":return"bg-gray-700 text-white";case"private":case"primary":case"static":return"bg-blue-100 text-blue-700 dark:bg-blue-400 dark:text-white";case"warning":case"readonly":return"bg-orange-100 text-orange-700 dark:bg-orange-500 dark:text-white";case"chainable":case"public":case"success":return"bg-green-100 text-green-700 dark:bg-green-500 dark:text-white";case"template":case"info":return"bg-teal-100 text-teal-700 dark:bg-teal-500 dark:text-white";case"deprecated":case"removed":case"danger":return"bg-red-100 text-red-700 dark:bg-red-500 dark:text-white";default:return"bg-gray-200 text-gray-900 dark:bg-dark-550 dark:text-dark-250"}}))}}}),y=(0,c.Z)(b,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:(0,r.C_)(["inline-flex items-center justify-center h-6 px-2 text-xs font-medium leading-none whitespace-nowrap rounded",e.badgeClasses])},[(0,r.WI)(e.$slots,"default")],2)}]]);var w={class:"inline-flex py-1.5 cursor-pointer select-none"},x=["value"],k={class:"inline-block ml-2"};const S=(0,r.aZ)({name:"DocCheckbox",props:{value:[Boolean,String],modelValue:[Boolean,Array]},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(e.modelValue),i=(0,r.iH)(!1),s=(0,r.Fl)({get:function(){return o.value},set:function(e){o.value=e,n("update:modelValue",o.value)}}),a=(0,r.Fl)((function(){return Array.isArray(e.modelValue)?e.modelValue.includes(e.value):e.modelValue})),l=(0,r.Fl)((function(){return[{"border-blue-500 bg-blue-500":a.value},{"border-gray-400 bg-gray-100":!a.value},{"shadow-outline":i.value}]}));return(0,r.YP)((function(){return e.modelValue}),(function(e){return o.value=e})),{localValue:o,computedValue:s,isChecked:a,isFocused:i,checkboxClasses:l}}}),E=(0,c.Z)(S,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-check"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("label",w,[(0,r._)("div",{class:(0,r.C_)(["w-4 h-4 mt-px border rounded-sm",e.checkboxClasses])},[(0,r.wy)((0,r.Wm)(l,{width:"14",height:"14",class:"text-white"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},512),[[r.F8,e.isChecked]])],2),(0,r.wy)((0,r._)("input",{"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.computedValue=t}),class:"absolute opacity-0 hidden",style:{"z-index":"-1"},type:"checkbox",value:e.value,onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,x),[[r.e8,e.computedValue]]),(0,r._)("span",k,[(0,r.WI)(e.$slots,"default")])])}]]);var C={class:"absolute top-0 right-0 z-5"},_=["innerHTML"],T=n(7924),O={class:"whitespace-nowrap"},L=n(2152),R=n.n(L),D=function(e){return(0,r.dD)("data-v-cf3656fa"),e=e(),(0,r.Cn)(),e},A={key:0,ref:"tooltip",class:"z-50 px-2 py-1 text-xs text-white bg-gray-900 dark:bg-dark-500 rounded tooltip"},I=D((function(){return(0,r._)("div",{class:"arrow","data-popper-arrow":""},null,-1)}));function M(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function F(e){return e instanceof M(e).Element||e instanceof Element}function P(e){return e instanceof M(e).HTMLElement||e instanceof HTMLElement}function H(e){return"undefined"!=typeof ShadowRoot&&(e instanceof M(e).ShadowRoot||e instanceof ShadowRoot)}var N=Math.max,j=Math.min,W=Math.round;function B(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect(),r=1,o=1;if(P(e)&&t){var i=e.offsetHeight,s=e.offsetWidth;s>0&&(r=W(n.width)/s||1),i>0&&(o=W(n.height)/i||1)}return{width:n.width/r,height:n.height/o,top:n.top/o,right:n.right/r,bottom:n.bottom/o,left:n.left/r,x:n.left/r,y:n.top/o}}function z(e){var t=M(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function V(e){return e?(e.nodeName||"").toLowerCase():null}function q(e){return((F(e)?e.ownerDocument:e.document)||window.document).documentElement}function $(e){return B(q(e)).left+z(e).scrollLeft}function U(e){return M(e).getComputedStyle(e)}function Z(e){var t=U(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function Y(e,t,n){void 0===n&&(n=!1);var r,o,i=P(t),s=P(t)&&function(e){var t=e.getBoundingClientRect(),n=W(t.width)/e.offsetWidth||1,r=W(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(t),a=q(t),l=B(e,s),c={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(i||!i&&!n)&&(("body"!==V(t)||Z(a))&&(c=(r=t)!==M(r)&&P(r)?{scrollLeft:(o=r).scrollLeft,scrollTop:o.scrollTop}:z(r)),P(t)?((u=B(t,!0)).x+=t.clientLeft,u.y+=t.clientTop):a&&(u.x=$(a))),{x:l.left+c.scrollLeft-u.x,y:l.top+c.scrollTop-u.y,width:l.width,height:l.height}}function G(e){var t=B(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function J(e){return"html"===V(e)?e:e.assignedSlot||e.parentNode||(H(e)?e.host:null)||q(e)}function K(e){return["html","body","#document"].indexOf(V(e))>=0?e.ownerDocument.body:P(e)&&Z(e)?e:K(J(e))}function X(e,t){var n;void 0===t&&(t=[]);var r=K(e),o=r===(null==(n=e.ownerDocument)?void 0:n.body),i=M(r),s=o?[i].concat(i.visualViewport||[],Z(r)?r:[]):r,a=t.concat(s);return o?a:a.concat(X(J(s)))}function Q(e){return["table","td","th"].indexOf(V(e))>=0}function ee(e){return P(e)&&"fixed"!==U(e).position?e.offsetParent:null}function te(e){for(var t=M(e),n=ee(e);n&&Q(n)&&"static"===U(n).position;)n=ee(n);return n&&("html"===V(n)||"body"===V(n)&&"static"===U(n).position)?t:n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&P(e)&&"fixed"===U(e).position)return null;for(var n=J(e);P(n)&&["html","body"].indexOf(V(n))<0;){var r=U(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t}var ne="top",re="bottom",oe="right",ie="left",se="auto",ae=[ne,re,oe,ie],le="start",ce="end",ue="viewport",de="popper",fe=ae.reduce((function(e,t){return e.concat([t+"-"+le,t+"-"+ce])}),[]),he=[].concat(ae,[se]).reduce((function(e,t){return e.concat([t,t+"-"+le,t+"-"+ce])}),[]),pe=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function me(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}var ve={placement:"bottom",modifiers:[],strategy:"absolute"};function ge(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function be(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,r=void 0===n?[]:n,o=t.defaultOptions,i=void 0===o?ve:o;return function(e,t,n){void 0===n&&(n=i);var o,s,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},ve,i),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},l=[],c=!1,u={state:a,setOptions:function(n){var o="function"==typeof n?n(a.options):n;d(),a.options=Object.assign({},i,a.options,o),a.scrollParents={reference:F(e)?X(e):e.contextElement?X(e.contextElement):[],popper:X(t)};var s,c,f=function(e){var t=me(e);return pe.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}((s=[].concat(r,a.options.modifiers),c=s.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{}),Object.keys(c).map((function(e){return c[e]}))));return a.orderedModifiers=f.filter((function(e){return e.enabled})),a.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,r=void 0===n?{}:n,o=e.effect;if("function"==typeof o){var i=o({state:a,name:t,instance:u,options:r});l.push(i||function(){})}})),u.update()},forceUpdate:function(){if(!c){var e=a.elements,t=e.reference,n=e.popper;if(ge(t,n)){a.rects={reference:Y(t,te(n),"fixed"===a.options.strategy),popper:G(n)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(e){return a.modifiersData[e.name]=Object.assign({},e.data)}));for(var r=0;r<a.orderedModifiers.length;r++)if(!0!==a.reset){var o=a.orderedModifiers[r],i=o.fn,s=o.options,l=void 0===s?{}:s,d=o.name;"function"==typeof i&&(a=i({state:a,options:l,name:d,instance:u})||a)}else a.reset=!1,r=-1}}},update:(o=function(){return new Promise((function(e){u.forceUpdate(),e(a)}))},function(){return s||(s=new Promise((function(e){Promise.resolve().then((function(){s=void 0,e(o())}))}))),s}),destroy:function(){d(),c=!0}};if(!ge(e,t))return u;function d(){l.forEach((function(e){return e()})),l=[]}return u.setOptions(n).then((function(e){!c&&n.onFirstUpdate&&n.onFirstUpdate(e)})),u}}var ye={passive:!0};function we(e){return e.split("-")[0]}function xe(e){return e.split("-")[1]}function ke(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Se(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?we(o):null,s=o?xe(o):null,a=n.x+n.width/2-r.width/2,l=n.y+n.height/2-r.height/2;switch(i){case ne:t={x:a,y:n.y-r.height};break;case re:t={x:a,y:n.y+n.height};break;case oe:t={x:n.x+n.width,y:l};break;case ie:t={x:n.x-r.width,y:l};break;default:t={x:n.x,y:n.y}}var c=i?ke(i):null;if(null!=c){var u="y"===c?"height":"width";switch(s){case le:t[c]=t[c]-(n[u]/2-r[u]/2);break;case ce:t[c]=t[c]+(n[u]/2-r[u]/2)}}return t}var Ee={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Ce(e){var t,n=e.popper,r=e.popperRect,o=e.placement,i=e.variation,s=e.offsets,a=e.position,l=e.gpuAcceleration,c=e.adaptive,u=e.roundOffsets,d=e.isFixed,f=s.x,h=void 0===f?0:f,p=s.y,m=void 0===p?0:p,v="function"==typeof u?u({x:h,y:m}):{x:h,y:m};h=v.x,m=v.y;var g=s.hasOwnProperty("x"),b=s.hasOwnProperty("y"),y=ie,w=ne,x=window;if(c){var k=te(n),S="clientHeight",E="clientWidth";k===M(n)&&"static"!==U(k=q(n)).position&&"absolute"===a&&(S="scrollHeight",E="scrollWidth"),k=k,(o===ne||(o===ie||o===oe)&&i===ce)&&(w=re,m-=(d&&x.visualViewport?x.visualViewport.height:k[S])-r.height,m*=l?1:-1),o!==ie&&(o!==ne&&o!==re||i!==ce)||(y=oe,h-=(d&&x.visualViewport?x.visualViewport.width:k[E])-r.width,h*=l?1:-1)}var C,_=Object.assign({position:a},c&&Ee),T=!0===u?function(e){var t=e.x,n=e.y,r=window.devicePixelRatio||1;return{x:W(t*r)/r||0,y:W(n*r)/r||0}}({x:h,y:m}):{x:h,y:m};return h=T.x,m=T.y,l?Object.assign({},_,((C={})[w]=b?"0":"",C[y]=g?"0":"",C.transform=(x.devicePixelRatio||1)<=1?"translate("+h+"px, "+m+"px)":"translate3d("+h+"px, "+m+"px, 0)",C)):Object.assign({},_,((t={})[w]=b?m+"px":"",t[y]=g?h+"px":"",t.transform="",t))}var _e={left:"right",right:"left",bottom:"top",top:"bottom"};function Te(e){return e.replace(/left|right|bottom|top/g,(function(e){return _e[e]}))}var Oe={start:"end",end:"start"};function Le(e){return e.replace(/start|end/g,(function(e){return Oe[e]}))}function Re(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&H(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function De(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Ae(e,t){return t===ue?De(function(e){var t=M(e),n=q(e),r=t.visualViewport,o=n.clientWidth,i=n.clientHeight,s=0,a=0;return r&&(o=r.width,i=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=r.offsetLeft,a=r.offsetTop)),{width:o,height:i,x:s+$(e),y:a}}(e)):F(t)?function(e){var t=B(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):De(function(e){var t,n=q(e),r=z(e),o=null==(t=e.ownerDocument)?void 0:t.body,i=N(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=N(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-r.scrollLeft+$(e),l=-r.scrollTop;return"rtl"===U(o||n).direction&&(a+=N(n.clientWidth,o?o.clientWidth:0)-i),{width:i,height:s,x:a,y:l}}(q(e)))}function Ie(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function Me(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Fe(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=void 0===r?e.placement:r,i=n.boundary,s=void 0===i?"clippingParents":i,a=n.rootBoundary,l=void 0===a?ue:a,c=n.elementContext,u=void 0===c?de:c,d=n.altBoundary,f=void 0!==d&&d,h=n.padding,p=void 0===h?0:h,m=Ie("number"!=typeof p?p:Me(p,ae)),v=u===de?"reference":de,g=e.rects.popper,b=e.elements[f?v:u],y=function(e,t,n){var r="clippingParents"===t?function(e){var t=X(J(e)),n=["absolute","fixed"].indexOf(U(e).position)>=0&&P(e)?te(e):e;return F(n)?t.filter((function(e){return F(e)&&Re(e,n)&&"body"!==V(e)})):[]}(e):[].concat(t),o=[].concat(r,[n]),i=o[0],s=o.reduce((function(t,n){var r=Ae(e,n);return t.top=N(r.top,t.top),t.right=j(r.right,t.right),t.bottom=j(r.bottom,t.bottom),t.left=N(r.left,t.left),t}),Ae(e,i));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}(F(b)?b:b.contextElement||q(e.elements.popper),s,l),w=B(e.elements.reference),x=Se({reference:w,element:g,strategy:"absolute",placement:o}),k=De(Object.assign({},g,x)),S=u===de?k:w,E={top:y.top-S.top+m.top,bottom:S.bottom-y.bottom+m.bottom,left:y.left-S.left+m.left,right:S.right-y.right+m.right},C=e.modifiersData.offset;if(u===de&&C){var _=C[o];Object.keys(E).forEach((function(e){var t=[oe,re].indexOf(e)>=0?1:-1,n=[ne,re].indexOf(e)>=0?"y":"x";E[e]+=_[n]*t}))}return E}function Pe(e,t,n){return N(e,j(t,n))}function He(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Ne(e){return[ne,oe,re,ie].some((function(t){return e[t]>=0}))}var je=be({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,i=void 0===o||o,s=r.resize,a=void 0===s||s,l=M(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&c.forEach((function(e){e.addEventListener("scroll",n.update,ye)})),a&&l.addEventListener("resize",n.update,ye),function(){i&&c.forEach((function(e){e.removeEventListener("scroll",n.update,ye)})),a&&l.removeEventListener("resize",n.update,ye)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=Se({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,s=void 0===i||i,a=n.roundOffsets,l=void 0===a||a,c={placement:we(t.placement),variation:xe(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,Ce(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,Ce(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];P(o)&&V(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});P(r)&&V(r)&&(Object.assign(r.style,i),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,i=void 0===o?[0,0]:o,s=he.reduce((function(e,n){return e[n]=function(e,t,n){var r=we(e),o=[ie,ne].indexOf(r)>=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,s=i[0],a=i[1];return s=s||0,a=(a||0)*o,[ie,oe].indexOf(r)>=0?{x:a,y:s}:{x:s,y:a}}(n,t.rects,i),e}),{}),a=s[t.placement],l=a.x,c=a.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=s}},{name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0===s||s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,d=n.rootBoundary,f=n.altBoundary,h=n.flipVariations,p=void 0===h||h,m=n.allowedAutoPlacements,v=t.options.placement,g=we(v),b=l||(g!==v&&p?function(e){if(we(e)===se)return[];var t=Te(e);return[Le(e),t,Le(t)]}(v):[Te(v)]),y=[v].concat(b).reduce((function(e,n){return e.concat(we(n)===se?function(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?he:l,u=xe(r),d=u?a?fe:fe.filter((function(e){return xe(e)===u})):ae,f=d.filter((function(e){return c.indexOf(e)>=0}));0===f.length&&(f=d);var h=f.reduce((function(t,n){return t[n]=Fe(e,{placement:n,boundary:o,rootBoundary:i,padding:s})[we(n)],t}),{});return Object.keys(h).sort((function(e,t){return h[e]-h[t]}))}(t,{placement:n,boundary:u,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):n)}),[]),w=t.rects.reference,x=t.rects.popper,k=new Map,S=!0,E=y[0],C=0;C<y.length;C++){var _=y[C],T=we(_),O=xe(_)===le,L=[ne,re].indexOf(T)>=0,R=L?"width":"height",D=Fe(t,{placement:_,boundary:u,rootBoundary:d,altBoundary:f,padding:c}),A=L?O?oe:ie:O?re:ne;w[R]>x[R]&&(A=Te(A));var I=Te(A),M=[];if(i&&M.push(D[T]<=0),a&&M.push(D[A]<=0,D[I]<=0),M.every((function(e){return e}))){E=_,S=!1;break}k.set(_,M)}if(S)for(var F=function(e){var t=y.find((function(t){var n=k.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},P=p?3:1;P>0&&"break"!==F(P);P--);t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},{name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,d=n.padding,f=n.tether,h=void 0===f||f,p=n.tetherOffset,m=void 0===p?0:p,v=Fe(t,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),g=we(t.placement),b=xe(t.placement),y=!b,w=ke(g),x="x"===w?"y":"x",k=t.modifiersData.popperOffsets,S=t.rects.reference,E=t.rects.popper,C="function"==typeof m?m(Object.assign({},t.rects,{placement:t.placement})):m,_="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),T=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,O={x:0,y:0};if(k){if(i){var L,R="y"===w?ne:ie,D="y"===w?re:oe,A="y"===w?"height":"width",I=k[w],M=I+v[R],F=I-v[D],P=h?-E[A]/2:0,H=b===le?S[A]:E[A],W=b===le?-E[A]:-S[A],B=t.elements.arrow,z=h&&B?G(B):{width:0,height:0},V=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},q=V[R],$=V[D],U=Pe(0,S[A],z[A]),Z=y?S[A]/2-P-U-q-_.mainAxis:H-U-q-_.mainAxis,Y=y?-S[A]/2+P+U+$+_.mainAxis:W+U+$+_.mainAxis,J=t.elements.arrow&&te(t.elements.arrow),K=J?"y"===w?J.clientTop||0:J.clientLeft||0:0,X=null!=(L=null==T?void 0:T[w])?L:0,Q=I+Y-X,ee=Pe(h?j(M,I+Z-X-K):M,I,h?N(F,Q):F);k[w]=ee,O[w]=ee-I}if(a){var se,ae="x"===w?ne:ie,ce="x"===w?re:oe,ue=k[x],de="y"===x?"height":"width",fe=ue+v[ae],he=ue-v[ce],pe=-1!==[ne,ie].indexOf(g),me=null!=(se=null==T?void 0:T[x])?se:0,ve=pe?fe:ue-S[de]-E[de]-me+_.altAxis,ge=pe?ue+S[de]+E[de]-me-_.altAxis:he,be=h&&pe?function(e,t,n){var r=Pe(e,t,n);return r>n?n:r}(ve,ue,ge):Pe(h?ve:fe,ue,h?ge:he);k[x]=be,O[x]=be-ue}t.modifiersData[r]=O}},requiresIfExists:["offset"]},{name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,s=n.modifiersData.popperOffsets,a=we(n.placement),l=ke(a),c=[ie,oe].indexOf(a)>=0?"height":"width";if(i&&s){var u=function(e,t){return Ie("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:Me(e,ae))}(o.padding,n),d=G(i),f="y"===l?ne:ie,h="y"===l?re:oe,p=n.rects.reference[c]+n.rects.reference[l]-s[l]-n.rects.popper[c],m=s[l]-n.rects.reference[l],v=te(i),g=v?"y"===l?v.clientHeight||0:v.clientWidth||0:0,b=p/2-m/2,y=u[f],w=g-d[c]-u[h],x=g/2-d[c]/2+b,k=Pe(y,x,w),S=l;n.modifiersData[r]=((t={})[S]=k,t.centerOffset=k-x,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&Re(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,s=Fe(t,{elementContext:"reference"}),a=Fe(t,{altBoundary:!0}),l=He(s,r),c=He(a,o,i),u=Ne(l),d=Ne(c);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}}]});const We=(0,r.aZ)({name:"DocTooltip",props:{placement:{type:String,default:"top"},offset:{type:Array,default:function(){return[0,8]}},delay:{type:Number,default:250}},emits:["show","hide"],setup:function(e,t){var n,o=t.emit,i=(0,r.iH)(),s=(0,r.iH)(),a=(0,r.iH)(!1),l=null;return{trigger:i,tooltip:s,isOpen:a,show:function(){clearTimeout(n),n=setTimeout((function(){a.value=!0,(0,r.Y3)((function(){!function(){var t=document.querySelector("body"),n={placement:e.placement,modifiers:[{name:"offset",options:{offset:e.offset}},{name:"preventOverflow",options:{boundary:t}},{name:"flip",options:{boundary:t}}]};if(!i.value||!s.value)throw new Error("Tooltip trigger or tooltip element not found in DOM");l=je(i.value,s.value,n)}(),o("show")}))}),e.delay)},hide:function(){clearTimeout(n),o("hide"),a.value=!1,l&&(l.destroy(),l=null)},update:function(){l&&l.update()}}}}),Be=(0,c.Z)(We,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"trigger","aria-describedby":"tooltip",onMouseenter:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.show&&e.show.apply(e,t)}),onMouseleave:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger",{},void 0,!0)],544),e.isOpen?((0,r.wg)(),(0,r.iD)("div",A,[(0,r.WI)(e.$slots,"default",{},void 0,!0),I],512)):(0,r.kq)("",!0)])}],["__scopeId","data-v-cf3656fa"]]),ze=(0,r.aZ)({name:"DocCopyButton",components:{DocTooltip:Be},props:{copyText:String,tooltipText:{type:String,default:"Copy"},tooltipPlacement:{type:String,default:"top"},tooltipOffset:{type:Array,default:function(){return[0,8]}},buttonClass:{type:String,default:""}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(),o=(0,r.iH)(e.tooltipText),i=null;return(0,r.bv)((function(){(i=new(R())(n.value,{text:function(){return e.copyText}})).on("success",(function(){o.value="Copied!",t.value.update()}))})),(0,r.Jd)((function(){null!==i&&i.destroy()})),{tooltip:t,button:n,btnLabel:o}}}),Ve=(0,c.Z)(ze,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-tooltip");return(0,r.wg)(),(0,r.j4)(a,{ref:"tooltip",placement:e.tooltipPlacement,offset:e.tooltipOffset},{trigger:(0,r.w5)((function(){return[(0,r._)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 transition-colors duration-200 ease-in focus:outline-none",e.buttonClass]),onMouseleave:t[0]||(t[0]=function(t){return e.btnLabel=e.tooltipText})},[(0,r.WI)(e.$slots,"default")],34)]})),default:(0,r.w5)((function(){return[(0,r._)("span",O,(0,r.zw)(e.btnLabel),1)]})),_:3},8,["placement","offset"])}]]);var qe=[(0,r._)("path",{d:"M20 8h-9c-1.65 0-3 1.35-3 3v9c0 1.65 1.35 3 3 3h9c1.65 0 3-1.35 3-3v-9c0-1.65-1.35-3-3-3zm1 12c0 .55-.45 1-1 1h-9c-.55 0-1-.45-1-1v-9c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v9z"},null,-1),(0,r._)("path",{d:"M5 14H4c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v1c0 .55.45 1 1 1s1-.45 1-1V4c0-1.65-1.35-3-3-3H4C2.35 1 1 2.35 1 4v9c0 1.65 1.35 3 3 3h1c.55 0 1-.45 1-1s-.45-1-1-1z"},null,-1)],$e=n(6252);const Ue=(0,$e.aZ)({name:"DocIconCopy"}),Ze=(0,c.Z)(Ue,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,qe)}]]),Ye=(0,r.aZ)({name:"DocCodeblock",components:{DocCopyButton:Ve,DocIconCopy:Ze},props:{lineNumbers:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(""),o=(0,r.iH)(""),i=(0,r.iH)(!1);return(0,r.bv)((function(){var r,s,a,l;i.value="string"==typeof(null===(s=null===(r=t.value)||void 0===r?void 0:r.querySelector(".codeblock-title"))||void 0===s?void 0:s.textContent);var c=null===(a=t.value)||void 0===a?void 0:a.querySelector("code[class*='language-']");n.value=(null==c?void 0:c.innerText.trim())||"",e.lineNumbers&&(o.value=function(e){return e.split("\n").map((function(e,t){return"<div>".concat(t+1,"</div>")})).join("")}(n.value)),"PRE"===(null===(l=null==c?void 0:c.parentElement)||void 0===l?void 0:l.nodeName)&&new T.Z(c.parentElement)})),{codeblockRef:t,hasTitle:i,code:n,lineNumbersHtml:o}}}),Ge=(0,c.Z)(Ye,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-copy"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",{ref:"codeblockRef",class:(0,r.C_)(["codeblock relative",{"line-numbers":e.lineNumbers}])},[(0,r._)("div",C,[(0,r.Wm)(c,{"copy-text":e.code,"tooltip-text":"Copy","tooltip-placement":"left","tooltip-offset":[-1,0],class:(0,r.C_)(["mr-1.5",e.hasTitle?"mt-14":"mt-1.5"]),"button-class":"w-10 h-10 text-dark-350 hover:text-white bg-dark-850 dark:bg-dark-800 bg-opacity-50 dark:bg-opacity-50 rounded-full"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]})),_:1},8,["copy-text","class"])]),(0,r.WI)(e.$slots,"default"),e.lineNumbers?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["absolute top-0 w-14 py-4 pr-3 bg-dark-850 dark:bg-dark-800 font-mono leading-normal text-dark-350 text-xs text-right",{"mt-12":e.hasTitle}]),innerHTML:e.lineNumbersHtml},null,10,_)):(0,r.kq)("",!0)],2)}]]),Je=(0,r.aZ)({name:"DocCollapse",props:{modelValue:Boolean,animations:{type:Boolean,default:!0},triggerClass:{type:String,default:null}},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(!1),i=(0,r.iH)();function s(){n("update:modelValue",!e.modelValue)}return(0,r.YP)((function(){return e.modelValue}),(function(e){e?(0,r.Y3)((function(){if(i.value){var e=i.value.scrollHeight;i.value.style.height="".concat(e,"px")}})):i.value&&(i.value.style.height="0px")}),{immediate:!0}),{toggleCollapse:s,onKeydown:function(e){"Enter"===e.key&&s()},toggleMousedown:function(){o.value=!o.value},onFocus:function(e){o.value&&e.target.blur()},content:i}}}),Ke=(0,c.Z)(Je,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{class:(0,r.C_)(["cursor-pointer focus:outline-none focus:bg-gray-200 dark:focus:bg-dark-750",e.triggerClass]),tabindex:"0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleCollapse&&e.toggleCollapse.apply(e,t)}),onMousedown:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onMouseup:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onFocus:t[3]||(t[3]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[4]||(t[4]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger")],34),(0,r._)("div",{ref:"content",class:(0,r.C_)(["collapse-content overflow-hidden",e.animations?"transition-all duration-200 ease-out":null]),style:{height:"0"}},[(0,r.WI)(e.$slots,"default")],2),(0,r.WI)(e.$slots,"footer")])}]]),Xe=(0,r.aZ)({name:"DocOverlay",props:{isOpen:Boolean},emits:["swipe-left","swipe-right","click"],setup:function(e,t){var n=t.emit,o=(0,r.qj)({x:0,y:0});return{onTouchStart:function(e){o.x=e.changedTouches[0].clientX,o.y=e.changedTouches[0].clientY},onTouchEnd:function(e){var t=e.changedTouches[0].clientX-o.x,r=e.changedTouches[0].clientY-o.y;Math.abs(t)>Math.abs(r)&&Math.abs(t)>40&&(t<0&&n("swipe-left",[e,"swipe-left"]),t>0&&n("swipe-right",[e,"swipe-right"]))},onClick:function(e){n("click",[e,"click"])}}}}),Qe=(0,c.Z)(Xe,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed z-30 transition-opacity duration-300 ease-in-out bg-gray-600 dark:bg-dark-900",e.isOpen?"inset-0 opacity-50 dark:bg-opacity-70":"opacity-0"]),onTouchstart:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchStart&&e.onTouchStart.apply(e,t)}),onTouchend:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchEnd&&e.onTouchEnd.apply(e,t)}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,34)}]]);function et(e){(0,m.zX)(window,"resize",(function(t){e(t)}))}function tt(){var e=document.body,t=(0,r.iH)(0),n=e.offsetWidth;(0,r.bv)((function(){return n=e.offsetWidth})),et((function(){return n=e.offsetWidth}));var o=(0,r.iH)(!1);return{enableBodyScroll:function(){o.value&&(e.classList.remove("overflow-hidden","fixed"),e.style.width="",e.style.top="",window.scrollTo(0,t.value),o.value=!1)},disableBodyScroll:function(){o.value||(t.value=window.scrollY,e.style.width="".concat(n,"px"),e.style.top="".concat(-t.value,"px"),e.classList.add("overflow-hidden","fixed"),o.value=!0)},isBodyScrollDisabled:o}}var nt=r.lR;const rt=(0,r.aZ)({name:"DocDrawer",components:{DocOverlay:Qe,Teleport:nt},props:{hideEvent:{type:Array,required:!0}},emits:["show","shown","hide","hidden"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=tt(),a=s.enableBodyScroll,l=s.disableBodyScroll;return{Teleport:nt,isOpen:i,show:function(){n("show"),i.value=!0,l(),(0,r.Y3)((function(){n("shown")}))},hide:function(t){var s;if(n("hide"),!t||!t[0])return i.value=!1,a(),void(0,r.Y3)((function(){n("hidden")}));var l=t[0].target;o.value!==l&&!(null===(s=o.value)||void 0===s?void 0:s.contains(l))&&e.hideEvent.includes(t[1])&&(i.value=!1,a(),(0,r.Y3)((function(){n("hidden")})))}}}}),ot=(0,c.Z)(rt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{ref:"el",class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 h-full transition-transform duration-300 ease-in-out bg-white focus:outline-none dark:bg-dark-850",e.isOpen?"translate-x-0 shadow-2xl":"translate-x-full"]),tabindex:"-1",onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r.WI)(e.$slots,"default"),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,{"is-open":e.isOpen,onSwipeLeft:e.hide,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onSwipeRight","onClick"])]})),_:1}))],34)}]]);var it=["aria-expanded"],st=n(6850);const at=(0,r.aZ)({name:"DocDropdown",props:{buttonClass:{type:String,default:""},align:{type:String,default:"left"},menuWidth:{type:String,default:"12rem"}},setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=(0,r.iH)(!1);return(0,r.YP)(i,(function(){var e=i.value?"open":"close";n(e)})),(0,st.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),{isOpen:i,isFocused:s,onButtonClick:function(){i.value=!i.value},dropdown:o,hide:function(){i.value=!1}}}}),lt=(0,c.Z)(at,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:"relative",onKeydown:t[4]||(t[4]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",{class:(0,r.C_)(e.buttonClass),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,onFocus:t[0]||(t[0]=function(t){return e.isFocused=!0}),onBlur:t[1]||(t[1]=function(t){return e.isFocused=!1}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onButtonClick&&e.onButtonClick.apply(e,t)})},[(0,r.WI)(e.$slots,"button-content",{isOpen:e.isOpen,isFocused:e.isFocused})],42,it),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",{class:(0,r.C_)(["absolute z-30 py-2 mt-2 bg-white border border-gray-300 rounded shadow-lg dark:bg-dark-650 dark:border-dark-500","right"===e.align?"right-0":"left-0"]),style:(0,r.j5)({"min-width":e.menuWidth}),onClick:t[3]||(t[3]=(0,r.iM)((function(){}),["stop"]))},[(0,r.WI)(e.$slots,"default")],6),[[r.F8,e.isOpen]])]})),_:3})],544)}]]);var ct=["innerHTML"];const ut=(0,r.aZ)({name:"DocEmoji",props:{emoji:{type:String,required:!0}},setup:function(e){return{emojiHtml:(0,r.Fl)((function(){return"&#x".concat(e.emoji.replace(/-/g,"&#x"))}))}}}),dt=(0,c.Z)(ut,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:"docs-emoji",innerHTML:e.emojiHtml},null,8,ct)}]]);var ft={class:"flex justify-between px-5 py-3 -mt-1 border-b border-gray-200 dark:border-dark-650"},ht={class:"flex text-sm text-gray-500 dark:text-dark-350"},pt=(0,r._)("span",null,"History",-1),mt={key:0,class:"flex flex-col items-center py-6"},vt=[(0,r._)("svg",{class:"mb-2",xmlns:"http://www.w3.org/2000/svg",width:"60",height:"60"},[(0,r._)("circle",{cx:"30",cy:"30",r:"30",fill:"#e1edff"}),(0,r._)("path",{d:"M36.5 20.5h-2v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-6v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-2c-1.65 0-3 1.35-3 3v14c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3v-14c0-1.65-1.35-3-3-3zm-14 2h2v1c0 .55.45 1 1 1s1-.45 1-1v-1h6v1c0 .55.45 1 1 1s1-.45 1-1v-1h2c.55 0 1 .45 1 1v3h-16v-3c0-.55.45-1 1-1zm14 16h-14c-.55 0-1-.45-1-1v-9h16v9c0 .55-.45 1-1 1z",fill:"#8dbbff"})],-1),(0,r._)("div",{class:"text-sm text-gray-500"},"No history items",-1)],gt={key:1,class:"mt-2"},bt=["href","onClick"],yt={class:"flex"},wt=["textContent"],xt={class:"invisible ml-5 text-xs text-gray-600 group-hover:visible dark:text-dark-350"},kt=n(9984),St=n.n(kt);function Et(){var e=(0,r.iH)(null);return(0,r.bv)((function(){e.value=window.__DOCS__})),{pageData:e}}function Ct(e){var t={};return""===e||"?"===e||(e=e.trim().replace(/^(\?|#|&)/,"")).split("&").forEach((function(e){var n=e.split("="),r=n[0],o=n[1];r=decodeURIComponent(r);var i=null==o?null:decodeURIComponent(o);t[r]=i})),t}var _t=(0,r.iH)({path:"/"});function Tt(e,t){if("string"==typeof t)"push"===e?window.history.pushState(null,"",t):"replace"===e&&window.history.replaceState(null,"",t);else{if("object"!=typeof t)throw new Error("Invalid type. Expected a string or a Route object for new route location.");var n=t.path?t.path:window.location.href,r="";t.query&&(r=function(e){if(!Object.keys(e).length)return"";var t=[];return Object.keys(e).forEach((function(n){t.push("".concat(n,"=").concat(e[n]))})),"?"+t.join("&")}(t.query));var o="".concat(n).concat(r).concat(t.hash);"push"===e?window.history.pushState(null,"",o):"replace"===e&&window.history.replaceState(null,"",o)}_t.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Ct(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}}var Ot={replace:function(e){return Tt("replace",e)},push:function(e){return Tt("push",e)}};function Lt(){return _t.value.path=window.location.pathname?decodeURIComponent(window.location.pathname):"",_t.value.query=Ct(window.location.search),_t.value.hash=window.location.hash?decodeURIComponent(window.location.hash):"",(0,m.zX)(window,"turbo:visit",(function(){_t.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Ct(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}})),{route:_t,Router:Ot}}var Rt=n(830),Dt=function(){return Dt=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},Dt.apply(this,arguments)};const At=(0,r.aZ)({name:"DocHistory",components:{DocDropdown:lt},setup:function(){var e=(0,r.iH)(),t=St().maxHistoryItems,n=(0,r.iH)([]),o=Et().pageData,i=Lt().route,a=(0,Rt.Rs)();function l(e){return e&&"/"!==e?a+e:(0,Rt.wE)(a)}return(0,r.bv)((function(){var e;null==(e=(0,s.qn)(St().base,localStorage,"doc_history"))||("version"in e?n.value=e.items:(function(e){if(e.length){var t=o.value;if(t)for(var n=0,r=e;n<r.length;n++){var i=r[n];i.path=(0,Rt.cD)(i.path,t)}}}(e),n.value=e)),function(){var e=o.value;if(e){var r=(0,Rt.cD)(i.value.path,e),a={title:e.title,path:r,timestamp:Date.now(),icon:"doc-icon-".concat(e.icon)};!function(e){var t=n.value.findIndex((function(t){return t.path===e.path}));t>-1&&n.value.splice(t,1)}(a),n.value.unshift(a),n.value.length>t&&n.value.pop();var l={version:1,items:n.value};(0,s.Nh)(St().base,localStorage,"doc_history",l)}}()})),{dropdown:e,history:n,clearHistory:function(){n.value=[],(0,s.Nh)(St().base,localStorage,"doc_history",[])},setTimeVisited:function(){n.value=n.value.map((function(e){return Dt(Dt({},e),{timeAgo:(0,s.Sy)(e.timestamp)})}))},onHistoryItemClick:function(t,n){(0,s.pI)(n)||(n.preventDefault(),(0,f.Vn)(l(t)),e.value.hide())},getFullPath:l}}}),It=(0,c.Z)(At,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-history"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-icon"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.j4)(u,{ref:"dropdown",style:{"margin-right":"-0.625rem"},align:"right","menu-width":"18rem",onOpen:e.setTimeVisited},{"button-content":(0,r.w5)((function(){var t;return[(0,r.Wm)(l,{class:(0,r.C_)([{"bg-gray-300 dark:bg-dark-450":null===(t=e.dropdown)||void 0===t?void 0:t.isOpen},"w-10 h-10 -mb-0.5"]),"icon-size":"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["class"])]})),default:(0,r.w5)((function(){return[(0,r._)("div",ft,[(0,r._)("div",ht,[(0,r.Wm)(c,{width:"15",height:"15",class:"mr-3 mt-0.75"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),pt]),(0,r._)("button",{class:"text-xs text-blue-500 dark:text-blue-400 focus:outline-none hover:text-blue-900 dark:hover:text-blue-200",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.clearHistory&&e.clearHistory.apply(e,t)})}," Clear ")]),e.history.length?((0,r.wg)(),(0,r.iD)("ul",gt,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.history,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.timestamp},[(0,r._)("a",{class:"flex justify-between px-5 py-1.5 text-sm whitespace-nowrap group hover:bg-gray-200 dark:hover:bg-dark-500",href:e.getFullPath(t.path),onClick:function(n){return e.onHistoryItemClick(t.path,n)}},[(0,r._)("span",yt,[(0,r.Wm)(c,{class:"mr-3 mt-0.75",width:"15",height:"15"},{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(t.icon)))]})),_:2},1024),(0,r._)("span",{textContent:(0,r.zw)(t.title)},null,8,wt)]),(0,r._)("span",xt,(0,r.zw)(t.timeAgo),1)],8,bt)])})),128))])):((0,r.wg)(),(0,r.iD)("div",mt,vt))]})),_:1},8,["onOpen"])}]]);var Mt=["width","height"],Ft=["fill"];const Pt=(0,r.aZ)({name:"DocIcon",props:{width:{type:[Number,String],default:16},height:{type:[Number,String],default:16},iconColor:{type:String,default:"currentColor"}}}),Ht=(0,c.Z)(Pt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("svg",{xmlns:"http://www.w3.org/2000/svg",class:"mb-px",width:e.width,height:e.height,viewBox:"0 0 24 24",role:"presentation"},[(0,r._)("g",{fill:e.iconColor},[(0,r.WI)(e.$slots,"default")],8,Ft)],8,Mt)}]]),Nt=(0,r.aZ)({name:"DocIconButton",props:{iconSize:{type:[Number,String],default:16},rounded:{type:Boolean,default:!0}},setup:function(){var e=(0,r.iH)();return{button:e,onClick:function(){var t;null===(t=e.value)||void 0===t||t.blur()}}}}),jt=(0,c.Z)(Nt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 overflow-hidden transition-colors duration-200 ease-in hover:bg-gray-200 focus:outline-none focus:bg-gray-300 dark:text-white dark:hover:bg-dark-500 dark:focus:bg-dark-450",e.rounded?"rounded-full":"rounded"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(a,{class:"shrink-0",style:{"margin-bottom":"0"},width:e.iconSize,height:e.iconSize},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default")]})),_:3},8,["width","height"])],2)}]]),Wt=(0,r.aZ)({name:"LoadingSpinner",props:{size:{type:Number,default:20}},setup:function(e){return{styles:(0,r.Fl)((function(){return{width:"".concat(e.size,"px"),height:"".concat(e.size,"px"),borderWidth:"".concat(Math.round(e.size/8),"px")}}))}}}),Bt=(0,c.Z)(Wt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:"spinner inline-block rounded-full border-gray-400 dark:border-dark-450 border-solid animate-spin",style:(0,r.j5)(e.styles)},null,4)}],["__scopeId","data-v-79806448"]]);var zt={ref:"memberRef",class:"relative pluggable"},Vt={class:"relative z-10 px-5 pb-5"},qt={class:"absolute inset-0 transition-all duration-200 ease-linear z-5",style:{margin:"-1px"}},$t=[(0,r._)("div",{class:"absolute inset-0 bg-blue-200 bg-opacity-25 border border-blue-300 dark:bg-dark-550 dark:border-dark-600"},null,-1)],Ut=Symbol("DocsGroupId"),Zt=Symbol("DocsOverloadId");function Yt(e){var t=(0,a.oR)().store,n=(0,r.f3)(Ut),o=(0,r.Fl)((function(){return Object.values(t.state.memberGroups[n]).filter((function(n){return function(e,t,n){var r=e.overloadId===n,o=e.access.split(",").map((function(e){return e.trim()})).every((function(e){var n;return null===(n=t.state.access)||void 0===n?void 0:n.includes(e)})),i=!e.isInherited||e.isInherited===t.state.inherited;return r&&o&&i}(n,t,e)}))}));return{members:o}}var Gt={class:"flex justify-between h-16 px-5"},Jt={class:"flex items-center truncate"},Kt={ref:"memberName",class:"flex items-center group"},Xt={class:"font-mono text-sm truncate whitespace-nowrap dark:text-dark-350"},Qt={key:0,class:"ml-2"},en={key:1,class:"ml-2 text-gray-600 dark:text-dark-350"},tn={key:2},nn={key:3,class:"ml-1"},rn={key:0,class:"flex items-center h-6 px-2 ml-3 text-xs leading-none whitespace-nowrap border border-gray-400 rounded dark:border-dark-650"},on={class:"flex"},sn={class:"z-10 inline-flex bg-white border border-gray-300 rounded shadow-sm dark:bg-dark-650 dark:border-dark-650",style:{padding:"2px"}};const an=(0,r.aZ)({name:"DocMemberToolbar",components:{DocCopyButton:Ve},props:{id:String,name:String},setup:function(e){return{buttons:(0,r.Fl)((function(){var t=window.location,n=t.origin,r=t.pathname,o="".concat(n).concat(r,"#").concat(e.id);return[{id:1,copyText:e.name,tooltipText:"Copy name",icon:"DocIconCopy"},{id:2,copyText:o,tooltipText:"Copy link",icon:"DocIconLink"}]}))}}}),ln=(0,c.Z)(an,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",sn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.buttons,(function(e){return(0,r.wg)(),(0,r.j4)(l,{key:e.id,"copy-text":e.copyText,"tooltip-text":e.tooltipText,"button-class":"w-7 h-7 hover:bg-gray-200 focus:bg-gray-300 dark:hover:bg-dark-500",onClick:t[0]||(t[0]=(0,r.iM)((function(){}),["stop"]))},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(e.icon)))]})),_:2},1024)]})),_:2},1032,["copy-text","tooltip-text"])})),128))])}]]);var cn={class:"flex items-center"};const un=(0,r.aZ)({name:"DocMemberAccessBadges",props:{access:{type:Array}},setup:function(e){return{badges:(0,r.Fl)((function(){var t;return null===(t=e.access)||void 0===t?void 0:t.filter((function(e){return"public"!==e}))}))}}}),dn=(0,c.Z)(un,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",cn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.badges,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,class:"ml-3",type:e},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e),1)]})),_:2},1032,["type"])})),128))])}]]),fn=(0,r.aZ)({name:"DocMemberTitle",components:{DocMemberToolbar:ln,DocMemberAccessBadges:dn},props:{isVisible:{type:Boolean,required:!0,default:!1},isIntersecting:Boolean,isWindowScrolling:Boolean,id:String,name:String,overloadId:String,type:String,params:String,returns:String,memberAccess:Array},setup:function(e){var t,n,o=(0,r.Fl)((function(){return e.overloadId?Yt(e.overloadId).members.value.length-1:0})),i=(0,r.Fl)((function(){return e.type&&e.type.split(",").join(" | ")})),s=(0,r.Fl)((function(){return e.params?"(".concat(e.params.trim(),")"):""})),a=(0,r.Fl)((function(){return e.returns&&e.returns.split(",").join(" | ")})),l=(t=(0,r.iH)(),n=(0,r.iH)({}),(0,r.bv)((function(){var e,r=null===(e=t.value)||void 0===e?void 0:e.querySelector("h3");setTimeout((function(){var e=r?"".concat(r.clientWidth,"px"):"0";n.value={width:e,minWidth:"3.75rem",height:"2.625rem"}}),1e3)})),{memberName:t,hoverTriggerStyles:n});return{overloadCount:o,memberType:i,memberParams:s,memberReturnType:a,memberName:l.memberName,hoverTriggerStyles:l.hoverTriggerStyles}}}),hn=(0,c.Z)(fn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-toolbar"),l=(0,r.up)("doc-member-access-badges");return(0,r.wg)(),(0,r.iD)("div",Gt,[(0,r._)("div",Jt,[(0,r._)("div",Kt,[(0,r.WI)(e.$slots,"default"),e.isIntersecting&&!e.isWindowScrolling?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"absolute top-0 rounded-br-full",style:(0,r.j5)(e.hoverTriggerStyles)},[(0,r.Wm)(a,{id:e.id,class:"absolute top-0 left-0 hidden -mt-5 group-hover:inline-flex",name:e.name},null,8,["id","name"])],4)):(0,r.kq)("",!0)],512),(0,r._)("div",Xt,[e.memberType?((0,r.wg)(),(0,r.iD)("span",Qt,": "+(0,r.zw)(e.memberType),1)):(0,r.kq)("",!0),e.memberParams?((0,r.wg)(),(0,r.iD)("span",en,(0,r.zw)(e.memberParams),1)):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",tn,":")):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",nn,(0,r.zw)(e.memberReturnType),1)):(0,r.kq)("",!0)]),e.overloadCount?((0,r.wg)(),(0,r.iD)("div",rn," +"+(0,r.zw)(e.overloadCount)+" more ",1)):(0,r.kq)("",!0)]),(0,r._)("div",on,[(0,r.Wm)(l,{access:e.memberAccess},null,8,["access"])])])}]]);var pn={class:"mb-5"},mn=(0,r._)("span",{class:"relative z-10 px-2 mb-2 ml-2 text-sm text-gray-600 uppercase bg-white rounded dark:bg-dark-850 dark:text-dark-350"}," Overloads ",-1),vn={class:"max-h-60 pt-4 pb-2 -mt-3.5 mb-6 overflow-x-hidden overflow-y-auto border border-gray-200 rounded dark:border-dark-650"},gn={class:"pl-0"},bn=["onClick"],yn={class:"font-mono text-sm truncate whitespace-nowrap"};const wn=(0,r.aZ)({name:"DocOverloadSelect",components:{DocMemberAccessBadges:dn},setup:function(){var e=Yt((0,r.f3)(Zt)).members;return{members:e,memberLabel:function(e){var t=e.name;return(t+=e.params?" (".concat(e.params,")"):" ()")+(e.returns?": ".concat(e.returns):"")},memberAccess:function(e){return e.access?e.access.split(",").map((function(e){return e.trim()})):[]},memberClasses:function(e){var t="boolean"==typeof e.overloadVisibility&&e.overloadVisibility;return{"bg-blue-100 text-blue-600 font-semibold dark:bg-dark-550 dark:bg-opacity-50":t,"hover:bg-gray-200 dark:hover:bg-dark-500 dark:hover:bg-opacity-50":!t}},onMemberClick:function(t){e.value.forEach((function(e){e.overloadVisibility=e.isOpen=e.id===t.id,function(e){e.animations=!1,setTimeout((function(){e.animations=!0}),100)}(e)}))}}}}),xn=(0,c.Z)(wn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-access-badges");return(0,r.wy)(((0,r.wg)(),(0,r.iD)("div",pn,[mn,(0,r._)("div",vn,[(0,r._)("ul",gn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.id,class:(0,r.C_)(["flex px-4 py-1 list-none transition-colors duration-150 ease-linear cursor-pointer",e.memberClasses(t)]),onClick:function(n){return e.onMemberClick(t)}},[(0,r._)("div",yn,(0,r.zw)(e.memberLabel(t)),1),(0,r.Wm)(a,{class:"ml-auto",access:e.memberAccess(t)},null,8,["access"])],10,bn)})),128))])])],512)),[[r.F8,e.members.length>1]])}]]);var kn=(0,r._)("div",{class:"mb-2 text-sm text-gray-600 dark:text-dark-350 uppercase"}," Signature ",-1),Sn={class:"codeblock-wrapper"},En={class:"member-signature language-csharp m-0 px-5 py-4 text-dark-300 text-xs"},Cn={class:"member-signature language-csharp"};const _n=(0,r.aZ)({name:"DocMemberSignature",props:{signature:String}}),Tn=(0,c.Z)(_n,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-codeblock");return(0,r.wg)(),(0,r.iD)("div",null,[kn,(0,r._)("div",Sn,[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[(0,r._)("pre",En,[(0,r._)("code",Cn,(0,r.zw)(e.signature),1)])]})),_:1})])])}]]);function On(e,t){var n=Object.assign({},{root:null,rootMargin:"0px",threshold:0},t),o=(0,r.iH)(),i=(0,r.iH)([]),s=(0,r.Fl)((function(){return void 0!==e.value&&null!==e.value&&i.value.length>0&&i.value.every((function(e){return e.isIntersecting}))})),a=function(e){i.value=e};return(0,r.bv)((function(){e.value&&(o.value=new IntersectionObserver(a,n),o.value.observe(e.value))})),(0,r.Jd)((function(){var e;null===(e=o.value)||void 0===e||e.disconnect()})),{isIntersecting:s,elements:i}}function Ln(e,t,n){var o=(0,r.iH)(!1),i=(0,r.Fl)((function(){return n.state.scrolledElementId})),s=(0,r.Fl)((function(){return n.state.isWindowScrolling}));return(0,r.YP)(s,(function(t){t||e===i.value&&(o.value=!0,setTimeout((function(){o.value=!1}),1e3),n.actions.updateScrolledElementId(""))}),{immediate:!0}),{isHighlighted:o}}const Rn=(0,r.aZ)({name:"DocMember",components:{DocAnchorTarget:u,DocCollapse:Ke,DocMemberTitle:hn,DocOverloadSelect:xn,DocMemberSignature:Tn},props:{id:{type:String,required:!0},name:{type:String,required:!0},isInherited:{type:Boolean,default:!1},access:{type:String,default:"public"},overloadId:String,type:String,params:String,returns:String,signature:String},setup:function(e){var t=(0,r.iH)(),n=(0,a.oR)().store,o=(0,r.f3)(Ut),i=(0,r.Fl)((function(){return n.state.memberGroups[o][e.id].animations}));!function(e,t,n){Object.keys(n).forEach((function(r){r&&e.actions.setMemberData(t,n.id,r,n[r])}))}(n,o,e);var s=function(e,t,n){var o=(0,r.Fl)((function(){var r,o=null===(r=n.state.memberGroups[t][e.id])||void 0===r?void 0:r.isVisible;return void 0===typeof o||o})),i=(0,r.Fl)((function(){return e.access.split(",").map((function(e){return e.trim()}))})),s=(0,r.Fl)((function(){var r=!e.overloadId||n.state.memberGroups[t][e.id].overloadVisibility,o=i.value.every((function(e){var t;return null===(t=n.state.access)||void 0===t?void 0:t.includes(e)})),s=!e.isInherited||e.isInherited===n.state.inherited,a=e.name.toLowerCase().includes(n.state.memberFilter.toLowerCase());return r&&o&&s&&a}));return(0,r.YP)(s,(function(r){n.actions.setMemberData(t,e.id,"isVisible",r)}),{immediate:!0}),{isVisible:o,memberAccess:i}}(e,o,n),l=s.isVisible,c=s.memberAccess,u=function(e,t,n,o){var i=(0,r.Fl)({get:function(){var r=n.state.memberGroups[t];return!(!r||!r[e])&&r[e].isOpen},set:function(r){n.actions.setMemberData(t,e,"isOpen",r)}}),s=(0,r.Fl)((function(){return n.state.scrolledElementId}));return(0,r.YP)(s,(function(r){e===r&&n.actions.setMemberData(t,e,"isOpen",!0)})),(0,r.YP)(i,(function(e){if(e){var t=o.value;t&&t.classList.contains("pluggable")&&(0,r.Y3)((function(){t.dispatchEvent(new Event("onPluginReady"))}))}})),{isOpen:i}}(e.id,o,n,t).isOpen;return{isOpen:u,isVisible:l,animations:i,memberAccess:c,isHighlighted:Ln(e.id,0,n).isHighlighted,memberRef:t,isIntersecting:On(t).isIntersecting,isWindowScrolling:(0,r.Fl)((function(){return n.state.isWindowScrolling}))}}}),Dn=(0,c.Z)(Rn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-target"),l=(0,r.up)("doc-member-title"),c=(0,r.up)("doc-overload-select"),u=(0,r.up)("doc-member-signature"),d=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.iD)("div",zt,[(0,r.Wm)(a,{id:e.id,class:"absolute top-5 left-0 right-0 bottom-0",style:{"z-index":"-1"}},null,8,["id"]),(0,r.wy)((0,r.Wm)(d,{modelValue:e.isOpen,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isOpen=t}),class:"relative -mt-px border dark:border-dark-650 doc-member",animations:e.animations},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(l,{id:e.id,class:"relative z-10",name:e.name,"overload-id":e.overloadId,type:e.type,params:e.params,returns:e.returns,"member-access":e.memberAccess,"is-visible":e.isVisible,"is-intersecting":e.isIntersecting,"is-window-scrolling":e.isWindowScrolling},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"name")]})),_:3},8,["id","name","overload-id","type","params","returns","member-access","is-visible","is-intersecting","is-window-scrolling"])]})),footer:(0,r.w5)((function(){return[e.isIntersecting?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",qt,$t,512),[[r.F8,e.isHighlighted]])]})),_:1})):(0,r.kq)("",!0)]})),default:(0,r.w5)((function(){return[(0,r._)("div",Vt,[e.isOpen?((0,r.wg)(),(0,r.iD)(r.HY,{key:0},[e.overloadId?((0,r.wg)(),(0,r.j4)(c,{key:0})):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default"),t[0]||((0,r.qZ)(-1),t[0]=e.signature?((0,r.wg)(),(0,r.j4)(u,{key:1,class:"mb-5",signature:e.signature},null,8,["signature"])):(0,r.kq)("",!0),(0,r.qZ)(1),t[0]),(0,r.WI)(e.$slots,"parameters")],64)):(0,r.kq)("",!0)])]})),_:3},8,["modelValue","animations"]),[[r.F8,e.isVisible]])],512)}]]);var An={class:"mb-6 doc-member-group"},In={key:0,class:"flex items-center justify-between"},Mn={class:"group"},Fn=(0,r.Uk)(" # ");const Pn=(0,r.aZ)({name:"MemberGroup",props:{id:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Ut,e.id);var t=(0,a.oR)().store;return{visibleMemberCount:(0,r.Fl)((function(){return t.getters.getVisibleGroupMembers(e.id).length}))}}}),Hn=(0,c.Z)(Pn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger"),l=(0,r.up)("doc-anchor-target");return(0,r.wg)(),(0,r.iD)("div",An,[e.visibleMemberCount>0?((0,r.wg)(),(0,r.iD)("div",In,[(0,r.Wm)(l,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("h2",Mn,[(0,r.Wm)(a,{class:"float-left mt-2 -ml-6 text-lg font-normal text-blue-500 opacity-0 group-hover:opacity-100",to:"#".concat(e.id)},{default:(0,r.w5)((function(){return[Fn]})),_:1},8,["to"]),(0,r.WI)(e.$slots,"title")])]})),_:3},8,["id"])])):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default")])}]]),Nn=(0,r.aZ)({name:"DocOverloadGroup",props:{overloadId:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Zt,e.overloadId);var t=Lt().route,n=Yt(e.overloadId).members;(0,r.m0)((function(){n.value.forEach((function(e,r){e.overloadVisibility=0===r,t.value.hash==="#".concat(e.id)&&0!==r&&(n.value[0].overloadVisibility=!1,e.overloadVisibility=!0)}))}))}}),jn=(0,c.Z)(Nn,[["render",function(e,t,n,o,i,s){return(0,r.WI)(e.$slots,"default")}]]);var Wn=["href"],Bn={class:"docs-panel-content px-5 pb-5"};const zn=(0,r.aZ)({name:"DocPanel",props:{id:{type:String,required:!0},collapsed:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(!e.collapsed),n=Lt().route;return(0,r.bv)((function(){n.value.hash&&n.value.hash==="#".concat(e.id)&&(t.value=!0)})),{isExpanded:t,onClick:function(e){(0,s.pI)(e)?e.stopPropagation():e.preventDefault()}}}}),Vn=(0,c.Z)(zn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-right"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-anchor-target"),u=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.j4)(u,{modelValue:e.isExpanded,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isExpanded=t}),"trigger-class":"relative py-4 pl-5 font-medium text-gray-900 pr-14 dark:text-white",class:"mb-6 border rounded-md dark:border-dark-650"},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(c,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("div",null,[(0,r.WI)(e.$slots,"title")]),(0,r._)("div",{class:(0,r.C_)(["absolute inline-flex items-center justify-center text-blue-500 transition duration-200 ease-out origin-center rounded-full w-7 h-7 right-3 top-4 hover:bg-gray-200 dark:hover:bg-dark-500 z-5",{"rotate-90":e.isExpanded}])},[(0,r.Wm)(l,{width:"22",height:"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})],2)]})),_:3},8,["id"]),(0,r._)("a",{href:"#".concat(e.id),class:"absolute inset-0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,8,Wn)]})),default:(0,r.w5)((function(){return[(0,r._)("div",Bn,[(0,r.WI)(e.$slots,"default")])]})),_:3},8,["modelValue"])}]]),qn=(0,r.aZ)({name:"DocPanels",setup:function(e,t){var n,o=t.slots,i=(null===(n=o.default)||void 0===n?void 0:n.call(o))||[],s=(0,r.Fl)((function(){return i.map((function(e){var t,n;return(0,r.h)(Vn,{id:null===(t=e.props)||void 0===t?void 0:t.id,collapsed:null===(n=e.props)||void 0===n?void 0:n.collapsed},{title:function(){var t;return null===(t=e.children)||void 0===t?void 0:t.title()},default:function(){var t;return null===(t=e.children)||void 0===t?void 0:t.default()}})}))}));return function(){return(0,r.h)("div",{class:"docs-panels mb-6 border rounded-md dark:border-dark-650"},s.value)}}});var $n={class:"relative pl-4 mb-5"},Un={class:"relative mb-1"},Zn=(0,r._)("span",{class:"absolute -ml-4"},"⚬",-1),Yn={class:"font-semibold"},Gn={key:0},Jn=(0,r._)("span",{class:"font-semibold"},":",-1),Kn={key:0,class:"mx-1 text-sm"},Xn={key:1,class:"text-sm text-gray-600"},Qn={key:0,class:"text-sm"},er=(0,r._)("span",{class:"font-medium text-gray-900"},"Default value:",-1);const tr=(0,r.aZ)({name:"DocParamater",props:{name:{type:String,required:!0},type:{type:String,default:""},optional:{type:Boolean,default:!1},defaultValue:{type:String,default:""}}}),nr=(0,c.Z)(tr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",$n,[(0,r._)("div",Un,[Zn,(0,r._)("span",Yn,(0,r.zw)(e.name),1),e.type?((0,r.wg)(),(0,r.iD)("span",Gn,[Jn,(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.type),1)]})),_:1}),e.optional?((0,r.wg)(),(0,r.iD)("span",Kn,"•")):(0,r.kq)("",!0),e.optional?((0,r.wg)(),(0,r.iD)("span",Xn,"optional")):(0,r.kq)("",!0)])):(0,r.kq)("",!0)]),(0,r.WI)(e.$slots,"default"),e.defaultValue?((0,r.wg)(),(0,r.iD)("div",Qn,[(0,r._)("div",null,[er,(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.defaultValue),1)]})),_:1})])])):(0,r.kq)("",!0)])}]]);var rr={class:"p-5 bg-gray-100 rounded parameters dark:bg-dark-800"},or=(0,r._)("div",{class:"mb-4 text-sm text-gray-600 uppercase dark:text-dark-350"}," Parameters ",-1);const ir=(0,r.aZ)({name:"DocParameters"}),sr=(0,c.Z)(ir,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",rr,[or,(0,r.WI)(e.$slots,"default")])}]]);var ar=n(8816),lr={class:"relative"},cr={class:"absolute flex items-center justify-center h-full pl-3"},ur=["placeholder"];const dr=(0,r.aZ)({name:"SearchInput",emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.f3)(ar.xf),i=(0,a.oR)().store,s=(0,r.Fl)({get:function(){return i.state.searchQuery},set:function(e){return i.actions.updateSearchQuery(e)}}),l=(0,r.iH)();return{input:l,focus:function(){var e;null===(e=l.value)||void 0===e||e.focus()},config:St(),query:s,search:o,onKeydown:function(e){"Enter"===e.code&&n("select"),null==o||o.onKeydown(e)},onFocus:function(){o&&(o.isFocused=!0,o.results.length&&(o.isOpen=!0))}}}}),fr=(0,c.Z)(dr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-search"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-icon-x"),u=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",lr,[(0,r._)("div",cr,[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]),(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-10 pl-8 leading-10 text-left text-gray-600 transition-colors duration-200 ease-in bg-gray-200 border border-transparent rounded sm:text-sm hover:bg-white hover:border-gray-300 focus:outline-none focus:border-gray-500 focus:bg-white dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",style:{padding:"0.625rem 0.75rem 0.625rem 2rem"},type:"text",autocomplete:"off",spellcheck:"false","aria-label":"Search",placeholder:e.config.search.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},null,40,ur),[[r.nr,e.query]]),e.query?((0,r.wg)(),(0,r.j4)(u,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-2 mr-2 hover:bg-gray-200",tabindex:"-1",onClick:(0,r.iM)(e.search.clear,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]);var hr=["href","onClick"],pr={class:"w-full"},mr=["innerHTML"],vr=["innerHTML"],gr=["innerHTML"],br={key:1,class:"text-sm px-5 py-4 mb-3"};const yr=(0,r.aZ)({name:"DocSearchResults",props:{isMobile:Boolean},emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.f3)(ar.xf),a=(0,Rt.Rs)(),l=St().search.noResultsFoundMsg;return(0,r.YP)((function(){return o.value}),(function(e){e&&new T.Z(e)})),{rootEl:o,searchApi:i,onResultClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),i.navigateToResult(e.path,a),n("select"))},getFullPath:function(e){return i.getResultFullPath(e,a)},noResultsText:l}}}),wr=(0,c.Z)(yr,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-active-class":"transition duration-300 ease-out overflow-hidden","enter-from-class":"-translate-y-2 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-100 ease-in overflow-hidden","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[e.searchApi.isFocused&&e.searchApi.isOpen?((0,r.wg)(),(0,r.iD)("div",{key:0,ref:"rootEl",class:(0,r.C_)(["z-30 w-full overflow-y-auto rounded bg-white",e.isMobile?"dark:bg-dark-850":"dark:bg-dark-650 dark:border-dark-500"])},[(0,r._)("ul",null,[e.searchApi.results.length?((0,r.wg)(!0),(0,r.iD)(r.HY,{key:0},(0,r.Ko)(e.searchApi.results,(function(t,n){return(0,r.wg)(),(0,r.iD)("li",{key:t.id},[(0,r._)("a",{class:(0,r.C_)(["flex justify-between m-3 mt-0 py-4 px-4 rounded-md group hover:bg-gray-200 dark:hover:bg-dark-450 focus:outline-none overflow-x-clip",n===e.searchApi.focusIndex?"bg-gray-200 dark:bg-dark-450":"bg-gray-100 dark:bg-dark-550"]),href:e.getFullPath(t.path),tabindex:"-1",onClick:function(n){return e.onResultClick(t,n)}},[(0,r._)("div",pr,[t.heading?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"mb-2 font-semibold text-gray-900 dark:text-white",innerHTML:t.heading},null,8,mr)):(0,r.kq)("",!0),(0,r._)("div",{class:"text-sm",innerHTML:t.text},null,8,vr),(0,r._)("div",{class:"mt-2 text-xs font-medium text-gray-900 dark:text-white break-words",innerHTML:t.page},null,8,gr)])],10,hr)])})),128)):((0,r.wg)(),(0,r.iD)("li",br,(0,r.zw)(e.noResultsText),1))])],2)):(0,r.kq)("",!0)]})),_:1})}]]),xr=(0,r.aZ)({name:"DocSearchDesktop",components:{DocSearchInput:fr,DocSearchResults:wr},setup:function(){var e=(0,r.iH)(),t=(0,ar.Rx)(e);(0,r.JJ)(ar.xf,t);var n=(0,r.iH)();return(0,m.zX)(window,"keydown",(function(e){var t,r=e;r.target===document.body&&St().search.hotkeys.includes(r.key)&&(r.preventDefault(),null===(t=n.value)||void 0===t||t.focus())})),{rootEl:e,onRootClick:function(){var e;null===(e=t.input)||void 0===e||e.focus(),t.isFocused=!0},searchInput:n,searchApi:t}}}),kr=(0,c.Z)(xr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-search-results");return(0,r.wg)(),(0,r.iD)("div",{ref:"rootEl",class:(0,r.C_)(["absolute hidden transition-all duration-300 ease-out right-25 lg:flex lg:flex-col lg:ml-auto",e.searchApi.isFocused?"w-[42rem]":"w-40"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onRootClick&&e.onRootClick.apply(e,t)}),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.searchApi.isFocused=!1}),["tab"]))},[(0,r.Wm)(a,{ref:"searchInput",class:(0,r.C_)(["self-end transition-all duration-300 ease-out",e.searchApi.isFocused?"w-96":"w-40"])},null,8,["class"]),(0,r.Wm)(l,{class:"absolute max-h-[32rem] pt-3 mt-2 border flex border-gray-300 shadow-lg dark:border-dark-650"})],34)}]]);var Sr={ref:"searchRoot",class:"flex flex-col h-full"},Er={class:"flex items-center justify-between shrink-0 h-16 bg-white md:h-20 dark:bg-dark-850"},Cr=r.lR;const _r=(0,r.aZ)({name:"DocSearchMobile",components:{Teleport:Cr,DocSearchInput:fr,DocSearchResults:wr},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,ar.Rx)(t);return(0,r.JJ)(ar.xf,n),{Teleport:Cr,docDrawer:e,searchRoot:t,show:function(){e.value.show()},onShown:function(){var e;null===(e=n.input)||void 0===e||e.focus()},onHidden:function(){var e;null===(e=n.input)||void 0===e||e.blur()},hideDrawer:function(){null==e||e.value.hide()},searchApi:n}}}),Tr=(0,c.Z)(_r,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-icon-arrow-right"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-search-results"),d=(0,r.up)("doc-icon-search"),f=(0,r.up)("doc-drawer");return(0,r.wg)(),(0,r.j4)(f,{ref:"docDrawer",class:"md:w-104","hide-event":["swipe-right","click"],onShown:e.onShown,onHidden:e.onHidden},{default:(0,r.w5)((function(){return[(0,r._)("div",Sr,[(0,r._)("div",Er,[(0,r.Wm)(a,{class:"ml-3 w-full",onSelect:e.hideDrawer},null,8,["onSelect"]),(0,r.Wm)(c,{class:"w-10 h-10 ml-3",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hideDrawer},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1},8,["onClick"])]),(0,r.Wm)(u,{class:"pb-6",style:{"max-height":"100%"},"is-mobile":!0,onSelect:e.hideDrawer},null,8,["onSelect"])],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-mobile-search-button"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-10 h-10 lg:hidden","icon-size":"20",onClick:(0,r.iM)(e.show,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1}))]})),_:1},8,["onShown","onHidden"])}]]);var Or={class:"flex items-center shrink-0 h-16 px-6 -ml-6 bg-white border-b border-gray-200 md:hidden dark:bg-dark-800 dark:border-dark-650"},Lr={ref:"sidebarFooter"},Rr={key:0,ref:"sidebarLinksEl",class:"overflow-y-auto h-full"},Dr=n(1296),Ar=n.n(Dr);function Ir(e){return"object"==typeof e&&null!=e&&1===e.nodeType}function Mr(e,t){return(!t||"hidden"!==e)&&"visible"!==e&&"clip"!==e}function Fr(e,t){if(e.clientHeight<e.scrollHeight||e.clientWidth<e.scrollWidth){var n=getComputedStyle(e,null);return Mr(n.overflowY,t)||Mr(n.overflowX,t)||function(e){var t=function(e){if(!e.ownerDocument||!e.ownerDocument.defaultView)return null;try{return e.ownerDocument.defaultView.frameElement}catch(e){return null}}(e);return!!t&&(t.clientHeight<e.scrollHeight||t.clientWidth<e.scrollWidth)}(e)}return!1}function Pr(e,t,n,r,o,i,s,a){return i<e&&s>t||i>e&&s<t?0:i<=e&&a<=n||s>=t&&a>=n?i-e-r:s>t&&a<n||i<e&&a>n?s-t+o:0}function Hr(e,t){var n=window,r=t.scrollMode,o=t.block,i=t.inline,s=t.boundary,a=t.skipOverflowHiddenElements,l="function"==typeof s?s:function(e){return e!==s};if(!Ir(e))throw new TypeError("Invalid target");for(var c=document.scrollingElement||document.documentElement,u=[],d=e;Ir(d)&&l(d);){if((d=d.parentElement)===c){u.push(d);break}null!=d&&d===document.body&&Fr(d)&&!Fr(document.documentElement)||null!=d&&Fr(d,a)&&u.push(d)}for(var f=n.visualViewport?n.visualViewport.width:innerWidth,h=n.visualViewport?n.visualViewport.height:innerHeight,p=window.scrollX||pageXOffset,m=window.scrollY||pageYOffset,v=e.getBoundingClientRect(),g=v.height,b=v.width,y=v.top,w=v.right,x=v.bottom,k=v.left,S="start"===o||"nearest"===o?y:"end"===o?x:y+g/2,E="center"===i?k+b/2:"end"===i?w:k,C=[],_=0;_<u.length;_++){var T=u[_],O=T.getBoundingClientRect(),L=O.height,R=O.width,D=O.top,A=O.right,I=O.bottom,M=O.left;if("if-needed"===r&&y>=0&&k>=0&&x<=h&&w<=f&&y>=D&&x<=I&&k>=M&&w<=A)return C;var F=getComputedStyle(T),P=parseInt(F.borderLeftWidth,10),H=parseInt(F.borderTopWidth,10),N=parseInt(F.borderRightWidth,10),j=parseInt(F.borderBottomWidth,10),W=0,B=0,z="offsetWidth"in T?T.offsetWidth-T.clientWidth-P-N:0,V="offsetHeight"in T?T.offsetHeight-T.clientHeight-H-j:0;if(c===T)W="start"===o?S:"end"===o?S-h:"nearest"===o?Pr(m,m+h,h,H,j,m+S,m+S+g,g):S-h/2,B="start"===i?E:"center"===i?E-f/2:"end"===i?E-f:Pr(p,p+f,f,P,N,p+E,p+E+b,b),W=Math.max(0,W+m),B=Math.max(0,B+p);else{W="start"===o?S-D-H:"end"===o?S-I+j+V:"nearest"===o?Pr(D,I,L,H,j+V,S,S+g,g):S-(D+L/2)+V/2,B="start"===i?E-M-P:"center"===i?E-(M+R/2)+z/2:"end"===i?E-A+N+z:Pr(M,A,R,P,N+z,E,E+b,b);var q=T.scrollLeft,$=T.scrollTop;S+=$-(W=Math.max(0,Math.min($+W,T.scrollHeight-L+V))),E+=q-(B=Math.max(0,Math.min(q+B,T.scrollWidth-R+z)))}C.push({el:T,top:W,left:B})}return C}function Nr(e){return e===Object(e)&&0!==Object.keys(e).length}var jr=["href"],Wr={class:"flex shrink-0 items-center justify-center w-6 h-6 mr-2"},Br=["innerHTML"],zr=["src"],Vr=["textContent"],qr={key:1,class:"absolute right-0 h-full bg-blue-500 dark:bg-blue-400 w-px"},$r={class:"ml-4 transition-all duration-200 ease-out"},Ur=n(2376),Zr=n(2110),Yr=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},Gr=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}};const Jr=(0,r.aZ)({name:"DocSidebarLink",props:{item:{type:Object,required:!0},depth:{type:Number,default:0},isFiltered:{type:Boolean,default:!1,required:!0}},setup:function(e){var t=(0,r.iH)(),n=(0,r.Fl)((function(){return e.item.children&&e.item.children.length>0||e.item.hash})),o=(0,r.Fl)((function(){return!(!e.item.icon&&!e.item.emoji)})),i=(0,Rt.sy)(),l=(0,Rt.Rs)(),c=St().appendDocumentName?St().documentName:"",u=(0,r.Fl)((function(){return e.item.clickable?e.item.url?e.item.url.startsWith(St().base)?l+e.item.url.slice(St().base.length):e.item.url:e.item.path&&"/"!==e.item.path?!St().trailingSlash&&c&&e.item.path?"".concat(l).concat(e.item.path,"/").concat(c):"".concat(l).concat(e.item.path).concat(c):(0,Rt.wE)(l):null})),d=(0,r.Fl)((function(){return e.item.icon&&!e.item.icon.startsWith("<")&&-1==e.item.icon.indexOf("://")?l+e.item.icon:e.item.icon})),f=Lt().route,h=(0,r.Fl)((function(){if(e.item.url)return!1;var t=i+(0,Rt.cD)(f.value.path),n=u.value;return null!=n&&null!=t&&(n.length===t.length&&n===t||n.length===t.length+1&&"/"!==t[t.length-1]&&"/"===n[n.length-1]&&n.startsWith(t)||n.length+1===t.length&&"/"===t[t.length-1]&&"/"!==n[n.length-1]&&t.startsWith(n))})),p=(0,a.oR)().store,m=(0,r.Fl)((function(){return p.state.sidebarLookup})),v=m.value.get(e.item.path);(e.isFiltered||e.item.open)&&E();var g=(0,Ur.i)(),b=g.result,y=g.error,w=g.loading,x=g.execute,k="".concat(location.origin).concat(Zr.as);function S(){return Yr(this,void 0,void 0,(function(){return Gr(this,(function(t){switch(t.label){case 0:return[4,x("".concat(k,"/").concat(e.item.hash,".json"))];case 1:if(t.sent(),y.value)throw new Error("Error fetching sidebar navigation items. ".concat(y.value));return(0,s.rw)(m.value,b.value,St().trailingSlash),[2]}}))}))}function E(t){var n;return Yr(this,void 0,void 0,(function(){var r;return Gr(this,(function(o){switch(o.label){case 0:return(r=t||v)?!e.item.hash||(null===(n=e.item.children)||void 0===n?void 0:n.length)?[3,2]:[4,S()]:[2];case 1:o.sent(),o.label=2;case 2:return p.actions.updateSidebarLookupItem(r,"expanded",!0),[2]}}))}))}function C(){v&&p.actions.updateSidebarLookupItem(v,"expanded",!1)}function _(){v&&v.expanded?C():E()}function T(){var t;h.value&&(n.value&&E(),null===(t=e.item.parentNodes)||void 0===t||t.forEach((function(e){E(m.value.get(e))})))}(0,r.YP)((function(){return e.isFiltered}),(function(e){e?E(v):(C(),T())}));var O=(0,r.iH)(!1);return(0,r.bv)((function(){h.value&&t.value&&p.actions.setActiveSidebarEl(t.value),T(),(0,r.Y3)((function(){O.value=!0}))})),{sidebarLinkRef:t,isGroup:n,hasCustomIcon:o,href:u,icon:d,isActive:h,onLinkClick:function(e){if(!(0,s.pI)(e)){if(h.value)e.preventDefault();else if((null==v?void 0:v.expanded)&&u.value)return;_()}},toggle:_,loading:w,transitionsEnabled:O,onEnter:function(e){O.value&&(e.style.height="0"),(0,r.Y3)((function(){e.style.height="".concat(e.scrollHeight,"px")}))},onAfterEnter:function(e){(0,r.Y3)((function(){e.style.height="auto"}))},onBeforeLeave:function(e){e.style.height="".concat(e.scrollHeight,"px")},onLeave:function(e){e.style.height="0px"}}}}),Kr=(0,c.Z)(Jr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-emoji"),c=(0,r.up)("doc-icon-folder"),u=(0,r.up)("doc-loading-spinner"),d=(0,r.up)("doc-icon-chevron-right"),f=(0,r.up)("doc-sidebar-link");return(0,r.wg)(),(0,r.iD)("li",null,[(0,r._)("div",{class:(0,r.C_)(["relative flex items-center justify-between break-normal pl-3 pr-4 select-none rounded-l transition-colors ease-out duration-150",{"text-blue-500 dark:text-blue-400 bg-blue-100 dark:bg-dark-650 rounded-l":e.isActive,"text-gray-900 dark:text-dark-250 hover:text-blue-500 dark:hover:text-blue-400":!e.isActive}])},[(0,r._)("a",{ref:"sidebarLinkRef",class:"flex flex-1 items-center cursor-pointer",href:e.href,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onLinkClick&&e.onLinkClick.apply(e,t)})},[(0,r._)("span",Wr,[e.item.icon&&e.item.icon.startsWith("<")?((0,r.wg)(),(0,r.j4)(a,{key:0,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r._)("g",{innerHTML:e.item.icon},null,8,Br)]})),_:1})):e.item.icon?((0,r.wg)(),(0,r.iD)("img",{key:1,src:e.icon,class:"w-4.5"},null,8,zr)):e.item.emoji?((0,r.wg)(),(0,r.j4)(l,{key:2,emoji:e.item.emoji},null,8,["emoji"])):!e.item.icon&&0===e.depth&&e.isGroup?((0,r.wg)(),(0,r.j4)(a,{key:3,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1})):(0,r.kq)("",!0)]),(0,r._)("span",{class:"text-sm py-1.5",textContent:(0,r.zw)(e.item.label)},null,8,Vr)],8,jr),e.isGroup?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["flex items-center justify-center w-7 h-7 rounded-full transition-colors ease-linear duration-150 group shrink-0",{"hover:bg-blue-200 hover:bg-opacity-50":e.isActive&&!e.loading,"hover:bg-gray-200 dark:hover:bg-dark-500":!e.loading}])},[e.loading?((0,r.wg)(),(0,r.j4)(u,{key:0,size:16})):((0,r.wg)(),(0,r.iD)("button",{key:1,class:(0,r.C_)(["text-gray-400 dark:text-dark-400 group-hover:text-blue-500 dark:group-hover:text-blue-400 focus:outline-none",{"rotate-90":e.item.expanded,"transition-transform ease-out duration-200":e.transitionsEnabled}]),onClick:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)})},[(0,r.Wm)(a,{class:"w-5 h-5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1})],2))],2)):(0,r.kq)("",!0),e.isActive?((0,r.wg)(),(0,r.iD)("span",qr)):(0,r.kq)("",!0)],2),e.isGroup?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-active-class":"overflow-hidden","leave-active-class":"overflow-hidden",onEnter:e.onEnter,onAfterEnter:e.onAfterEnter,onBeforeLeave:e.onBeforeLeave,onLeave:e.onLeave},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("ul",$r,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t){return(0,r.wg)(),(0,r.j4)(f,{key:t.path,item:t,depth:e.depth+1,"is-filtered":e.isFiltered},null,8,["item","depth","is-filtered"])})),128))],512),[[r.F8,e.isGroup&&e.item.expanded]])]})),_:1},8,["onEnter","onAfterEnter","onBeforeLeave","onLeave"])):(0,r.kq)("",!0)])}]]),Xr=(0,r.aZ)({name:"DocSidebarLinks",components:{DocSidebarLink:Kr},props:{items:{type:Array,required:!0},isFiltered:{type:Boolean,required:!0}},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,r.iH)(0),o=(0,r.iH)(),i=(0,a.oR)().store,s=(0,r.Fl)((function(){return i.state.sidebarActiveEl})),l=On(s,{threshold:1}).elements,c=Ar()((function(){var e,r,o=(null===(e=t.value)||void 0===e?void 0:e.scrollTop)||0;i.state.sidebarScroll!==o&&(n.value=(null===(r=t.value)||void 0===r?void 0:r.scrollTop)||0,i.actions.setSidebarScroll(n.value))}),200);return(0,r.bv)((function(){var n,r;o.value=e.value&&new T.Z(e.value),t.value=null===(n=o.value)||void 0===n?void 0:n.getScrollElement(),null===(r=o.value)||void 0===r||r.getScrollElement().addEventListener("scroll",c),t.value&&(t.value.scrollTop=i.state.sidebarScroll),setTimeout((function(){!l.value.some((function(e){return e.isIntersecting}))&&s.value&&function(e,t){var n=e.isConnected||e.ownerDocument.documentElement.contains(e);if(Nr(t)&&"function"==typeof t.behavior)return t.behavior(n?Hr(e,t):[]);if(n){var r=function(e){return!1===e?{block:"end",inline:"nearest"}:Nr(e)?e:{block:"start",inline:"nearest"}}(t);(function(e,t){void 0===t&&(t="auto");var n="scrollBehavior"in document.body.style;e.forEach((function(e){var r=e.el,o=e.top,i=e.left;r.scroll&&n?r.scroll({top:o,left:i,behavior:t}):(r.scrollTop=o,r.scrollLeft=i)}))})(Hr(e,r),r.behavior)}}(s.value,{behavior:"smooth",block:"center",boundary:t.value})}),200)})),(0,r.Jd)((function(){var e;null===(e=t.value)||void 0===e||e.removeEventListener("scroll",c)})),{sidebarLinksEl:e}}}),Qr=(0,c.Z)(Xr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-sidebar-link");return e.items.length?((0,r.wg)(),(0,r.iD)("ul",Rr,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.items,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.path,item:t,"is-filtered":e.isFiltered},null,8,["item","is-filtered"])})),128))],512)):(0,r.kq)("",!0)}]]);var eo={class:"relative flex items-center w-full"},to=["value","placeholder"];const no=(0,r.aZ)({name:"DocSidebarFilter",props:{modelValue:String,isOpen:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=St().sidebarFilterPlaceholder||"Filter by title",s=Ar()((function(e){n("update:modelValue",e.target.value)}),200);return(0,r.YP)((function(){return e.isOpen}),(function(){var e;null===(e=o.value)||void 0===e||e.blur()})),{input:o,placeholder:i,clear:function(){var e;n("update:modelValue",""),null===(e=o.value)||void 0===e||e.focus()},onInput:s}}}),ro=(0,c.Z)(no,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",eo,[(0,r._)("input",{ref:"input",value:e.modelValue,class:"w-full h-8 px-3 py-2 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:border-dark-450 dark:focus:bg-dark-450 dark:hover:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onInput:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onInput&&e.onInput.apply(e,t)})},null,40,to),e.modelValue?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1 text-gray-600 hover:text-gray-900",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])])}]]);var oo=function(){return oo=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},oo.apply(this,arguments)},io=r.lR;const so=(0,r.aZ)({name:"DocSidebar",components:{Teleport:io,DocSidebarLinks:Qr,DocSidebarFilter:ro,DocOverlay:Qe},setup:function(){var e=(0,r.iH)(!1),t=(0,a.oR)().store,n=(0,r.iH)();!function(e){var t=(0,r.iH)();function n(){e.state.sidebarLookup.forEach((function(t){e.actions.updateSidebarLookupItem(t,"expanded",!1)})),e.actions.setSidebarScroll(0)}(0,r.bv)((function(){t.value=document.querySelector("#docs-site-logo"),t.value&&t.value.addEventListener("click",n)})),(0,r.Jd)((function(){var e;t.value&&(null===(e=t.value)||void 0===e||e.removeEventListener("click",n))}))}(t),function(e){var t=(0,r.Fl)((function(){return e.state.sidebarLookup}));e.state.initialPageLoad&&function(){if(e.state.sidebar.id&&e.state.sidebar.id===St().id)r=new Map,(o=function(e){e.forEach((function(e){e.children&&(r.set(e.path,e),o(e.children))}))})(e.state.sidebar.data),e.actions.setSidebarLookupData(r);else{var n=(0,s.am)(t.value,St().sidebar,St().trailingSlash);e.actions.setSidebarData({id:St().id,data:n})}var r,o}()}(t);var o=function(e){var t=(0,r.iH)(""),n=(0,r.iH)(!1),o=(0,r.Fl)((function(){return e.state.sidebar})),i=(0,r.Fl)((function(){var e=t.value.toLowerCase();return n.value=!!e,function(e){var t=function(n,r){if(!r.visible)return n;if(r.children){var o=r.children.reduce(t,[]);(o.length||r.clickable&&(!e||r.searchLabel.includes(e)))&&n.push(oo(oo({},r),{children:o}))}else e&&!r.searchLabel.includes(e)||n.push(r);return n};return o.value.data.reduce(t,[])}(e)}));return{query:t,isFiltered:n,filteredItems:i}}(t),i=o.query,l=o.isFiltered,c=o.filteredItems,u=tt(),d=u.enableBodyScroll,f=u.disableBodyScroll;return{Teleport:io,sidebarFooter:n,isOpen:e,show:function(){e.value=!0,f()},hide:function(){e.value=!1,d()},filteredItems:c,isFiltered:l,query:i,showSidebarFilter:St().showSidebarFilter}}}),ao=(0,c.Z)(so,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-left"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-filter"),u=(0,r.up)("doc-sidebar-links"),d=(0,r.up)("doc-icon-menu"),f=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("aside",{class:(0,r.C_)(["fixed top-0 z-40 flex flex-col shrink-0 w-4/5 duration-300 ease-in-out bg-gray-100 border-gray-200 sidebar md:top-20 sm:w-1/2 md:w-75 md:z-0 md:border-r md:h-screen md:sticky md:transition-transform dark:bg-dark-800 dark:border-dark-650",{"shadow-2xl md:shadow-none":e.isOpen}]),style:(0,r.j5)({transform:e.isOpen?"translateX(0)":""})},[(0,r._)("div",Or,[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full ml-0.5","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0)]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.query=t}),class:"absolute top-0 left-0 right-0 z-5 bg-gray-100 dark:bg-dark-800 h-16 px-6 hidden md:flex items-center","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"flex-1 pl-3 mt-4 md:mt-16 mb-4",items:e.filteredItems,"is-filtered":e.isFiltered},null,8,["items","is-filtered"]),(0,r._)("div",Lr,[(0,r.WI)(e.$slots,"sidebar-footer")],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-sidebar-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"24",onClick:e.show},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1})),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(f,{"is-open":e.isOpen,onSwipeLeft:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onClick"])]})),_:1}))],6)}]]);var lo={id:"docs-sidebar-right",ref:"content",class:"w-full h-full overflow-auto"},co={key:0,class:"flex items-center justify-between h-16 mb-4 border-b lg:border-none lg:h-auto dark:border-dark-650"},uo={class:"px-5 text-gray-500 dark:text-dark-400"};const fo=(0,r.aZ)({name:"DocSidebarRightToggle",emits:["click"]}),ho=(0,c.Z)(fo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-align-right"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(l,{class:"w-10 h-10 -mr-2.5 md:-mr-12 bg-white dark:bg-dark-850 bg-opacity-80 dark:bg-opacity-80 text-gray-600 hover:text-gray-800 lg:hidden","icon-size":"20",onClick:t[0]||(t[0]=function(t){return e.$emit("click")})},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})}]]);var po={key:0},mo=n(9843);const vo=(0,r.aZ)({name:"DocToc",emits:["link-click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)([]);!function(e){var t,n,o=-1,i=-1,a=document.getElementById("docs-content"),l=null!==(t=null==a?void 0:a.offsetTop)&&void 0!==t?t:24,c=(0,s.vE)();function u(){var t=e.value;if(t&&t.length){var n=(document.documentElement.scrollTop||document.body.scrollTop)+l,r=function(e,t,n){var r=0,o=n.length-1;if(t>=r&&t<=o)if(e>=n[t].el.offsetTop){if(r=t+1,t===o||e<n[r].el.offsetTop)return t}else if(o=t-1,t>0&&e>=n[o].el.offsetTop)return o;for(;r<=o;){var i=o+r>>1,s=e-n[i].el.offsetTop;if(s>0)r=i+1;else{if(!(s<0)){r=i;break}o=i-1}}return r>o?o:r}(n,o,t),s=function(e,t,n,r){var o=Math.max(0,n),i=r.length-1;if(n===i)return i;if(t>=o&&t<=i)if(e>=r[t].el.offsetTop){if(o=t+1,t===i||e<r[o].el.offsetTop)return t}else if(i=t-1,t>0&&e>=r[i].el.offsetTop)return i;if(i<=n)return n;for(;o<=i;){var s=i+o>>1,a=e-r[s].el.offsetTop;if(a>0)o=s+1;else{if(!(a<0)){o=s;break}i=s-1}}return o>i?i:o}(n+Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)+c-2*l,i,r,t);r<0?s>=0&&(r=0):s<r&&(s=r),r<0?o>=0&&d(t,o,i,!1):o<0?d(t,r,s,!0):s<o||r>i?(d(t,r,s,!0),d(t,o,i,!1)):r<=o?s<=i?(d(t,r,o-1,!0),d(t,s+1,i,!1)):(d(t,r,o-1,!0),d(t,i,s,!0)):s<=i?(d(t,o,r-1,!1),d(t,s+1,i,!1)):(d(t,i,s,!0),d(t,o,r-1,!1)),o=r,i=s}}function d(e,t,n,r){for(var o=t;o<=n;++o)e[o].isActive=r}(0,m.Up)(window,"scroll",u,3,300),(0,m.Up)(window,"resize",u,3,300),a&&(n=new mo.ResizeSensor(a,(0,m.BK)(u,3,300))),(0,r.Jd)((function(){n&&(n.detach(),n=void 0)}))}(o);var i=(0,a.oR)().store;return(0,r.bv)((function(){var e;o.value=(e=[],document.querySelectorAll("#docs-content h2, #docs-content h3").forEach((function(t){var n,r,o="H2"===t.tagName?2:3,i=(null===(n=t.querySelector("a"))||void 0===n?void 0:n.href.split("#")[1])||"",s=(null===(r=t.querySelector("span"))||void 0===r?void 0:r.textContent)||"";if(i.length>0&&s.length>0){var a=decodeURIComponent(i);e.push({el:t,level:o,slug:a,title:s,isActive:!1})}})),e),i.state.sidebarRightHasContent=o.value.length>0})),{tocData:o,classList:function(e){return[{"pl-10":3===e.level},e.isActive?"text-blue-500 dark:text-blue-400":"hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400"]},onClick:function(){n("link-click")}}}}),go=(0,c.Z)(vo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return e.tocData&&e.tocData.length?((0,r.wg)(),(0,r.iD)("ul",po,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.tocData,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.slug},[(0,r.Wm)(a,{class:(0,r.C_)(["relative block px-5 py-1 toc-link",e.classList(t)]),to:"#".concat(t.slug),onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(t.title)+" ",1),(0,r._)("div",{style:{width:"1px"},class:(0,r.C_)({"absolute top-0 left-0 h-full bg-blue-500 dark:bg-blue-400":t.isActive})},null,2)]})),_:2},1032,["class","to","onClick"])])})),128))])):(0,r.kq)("",!0)}]]);var bo={key:0,class:"px-5 text-sm"},yo={key:0,class:"mt-3 mb-2 text-gray-600 uppercase dark:text-dark-400"},wo=["href"],xo={key:2,class:"font-semibold text-gray-900 dark:text-blue-400"},ko={key:1};const So=(0,r.aZ)({name:"DocRelatedClassItem",props:{item:{type:Object,default:function(){return{}}},depth:{type:Number,default:0}},setup:function(e){return{hasChildren:(0,r.Fl)((function(){return void 0!==e.item.children&&e.item.children.length>0})),marginLeft:(0,r.Fl)((function(){var t=e.depth>1?.5:0;return"".concat((e.depth-1)*t,"rem")})),showIcon:(0,r.Fl)((function(){return!0!==e.item.isGroup&&void 0!==e.item.children&&e.item.children.length>0})),onItemClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),(0,f.Vn)(e))}}}}),Eo=(0,c.Z)(So,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return(0,r.wg)(),(0,r.iD)("li",{class:(0,r.C_)(["relative",{"pl-1":e.depth>1,"mb-4":0===e.depth}])},[(0,r._)("div",{class:"flex items-center truncate",style:(0,r.j5)({marginLeft:e.marginLeft,minHeight:"1.875rem"})},[e.item.isGroup?((0,r.wg)(),(0,r.iD)("h6",yo,(0,r.zw)(e.item.title),1)):e.item.href?((0,r.wg)(),(0,r.iD)("a",{key:1,class:"truncate transition-colors duration-100 ease-linear cursor-pointer hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400",href:e.item.href,onClick:t[0]||(t[0]=function(t){return e.onItemClick(e.item.href,t)})},(0,r.zw)(e.item.label),9,wo)):((0,r.wg)(),(0,r.iD)("div",xo,(0,r.zw)(e.item.label),1))],4),e.showIcon?((0,r.wg)(),(0,r.iD)("span",{key:0,class:"absolute w-2 h-3 border-b border-l border-gray-600",style:(0,r.j5)({marginLeft:e.marginLeft,marginTop:"0.375rem"})},null,4)):(0,r.kq)("",!0),e.hasChildren?((0,r.wg)(),(0,r.iD)("ul",ko,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t,n){return(0,r.wg)(),(0,r.j4)(a,{key:n,item:t,depth:e.depth+1},null,8,["item","depth"])})),128))])):(0,r.kq)("",!0)],2)}]]),Co=(0,r.aZ)({name:"DocRelatedClasses",components:{DocRelatedClassItem:Eo},setup:function(){var e=Et().pageData;return{relatedClasses:(0,r.Fl)((function(){var t;return(null===(t=e.value)||void 0===t?void 0:t.relatedClasses)||[]}))}}}),_o=(0,c.Z)(Co,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return e.relatedClasses.length?((0,r.wg)(),(0,r.iD)("ul",bo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.relatedClasses,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,item:e},null,8,["item"])})),128))])):(0,r.kq)("",!0)}]]);var To=r.lR;const Oo=(0,r.aZ)({name:"DocSidebarRight",components:{Teleport:To,DocToc:go,DocOverlay:Qe,DocSidebarRightToggle:ho,DocRelatedClasses:_o},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(!1),n=(0,r.iH)(!1),o=Et().pageData,i=(0,a.oR)().store,s=(0,r.Fl)((function(){return o.value?o.value.relatedClasses?"DocRelatedClasses":"DocToc":null})),l=(0,r.Fl)((function(){return"DocToc"===s.value?"Contents":"DocRelatedClasses"===s.value?"Related Classes":null})),c=(0,r.Fl)((function(){return{"translate-x-0 shadow-2xl":t.value,"translate-x-full":!t.value,"lg:top-40":"DocRelatedClasses"===s.value,"lg:top-20":"DocToc"===s.value}})),u=(0,r.Fl)((function(){return{height:"DocRelatedClasses"===s.value?"calc(100vh - 10rem)":"calc(100vh - 5rem"}}));return(0,r.bv)((function(){n.value=!0,e.value&&new T.Z(e.value)})),{Teleport:To,content:e,isOpen:t,isMounted:n,store:i,show:function(){t.value=!0},hide:function(){t.value=!1},currentComponent:s,title:l,classes:c,styles:u}}}),Lo=(0,c.Z)(Oo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-right"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-right-toggle"),u=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 text-sm transition-transform duration-300 ease-in-out bg-white border-gray-200 sidebar-right sm:w-1/2 md:w-104 lg:z-0 lg:sticky lg:w-64 lg:shrink-0 lg:transform-none lg:border-l lg:shadow-none lg:pt-6 focus:outline-none dark:bg-dark-800 lg:dark:bg-dark-850 dark:border-dark-650",e.classes]),style:(0,r.j5)(e.styles),onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",lo,[e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.iD)("div",co,[(0,r._)("h6",uo,(0,r.zw)(e.title),1),(0,r.Wm)(l,{class:"w-10 h-10 ml-3 lg:hidden",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])])):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.currentComponent),{onLinkClick:e.hide},null,8,["onLinkClick"]))],512),e.isMounted&&e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{key:0,to:"#docs-sidebar-right-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"absolute right-0",onClick:e.show},null,8,["onClick"])]})),_:1})):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(u,{"is-open":e.isOpen,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeRight","onClick"])]})),_:1}))],38)}],["__scopeId","data-v-3955b324"]]);var Ro=["aria-checked"],Do=["checked"],Ao={class:"inline-flex items-center"};const Io=(0,r.aZ)({name:"DocSwitch",props:{modelValue:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit;return{isFocused:(0,r.iH)(!1),toggle:function(){n("update:modelValue",!e.modelValue)}}}}),Mo=(0,c.Z)(Io,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("label",{class:"relative inline-block cursor-pointer whitespace-nowrap",role:"switch","aria-checked":e.modelValue},[(0,r._)("input",{type:"checkbox",class:"absolute opacity-0",style:{"z-index":"-1"},checked:e.modelValue,onChange:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)}),onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,Do),(0,r._)("div",Ao,[(0,r._)("div",{class:(0,r.C_)(["w-6 h-2 transition-colors duration-100 ease-linear rounded-full",e.modelValue?"bg-blue-500 dark:bg-blue-400":"bg-gray-400 dark:bg-dark-400"])},null,2),(0,r._)("div",{class:(0,r.C_)(["absolute w-4 h-4 transition-transform duration-100 ease-linear bg-white border border-gray-500 rounded-full",{"shadow-outline":e.isFocused}]),style:(0,r.j5)({transform:e.modelValue?"translateX(8px)":null})},null,6)]),(0,r.WI)(e.$slots,"default")],8,Ro)}]]),Fo=(0,$e.aZ)({name:"DocTab",props:{id:{type:String,required:!0},active:Boolean},setup:function(e,t){var n=t.slots;return function(){return(0,$e.h)((function(){var e;return null===(e=n.default)||void 0===e?void 0:e.call(n)}))}}});var Po=n(2262);const Ho=(0,$e.aZ)({name:"DocTabs",components:{DocAnchorTarget:u},setup:function(e,t){var n,r,o,i,a=t.slots,l=(0,Po.iH)(),c=(0,Po.iH)(""),d=(null===(n=a.default)||void 0===n?void 0:n.call(a))||[],f={};c.value=(null===(o=null===(r=d.find((function(e){var t,n;return""===(null===(t=e.props)||void 0===t?void 0:t.active)||(null===(n=e.props)||void 0===n?void 0:n.active)})))||void 0===r?void 0:r.props)||void 0===o?void 0:o.id)||(null===(i=d[0].props)||void 0===i?void 0:i.id);var h=d.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id;return"#".concat(n)})),p=Lt().route;function m(){if(p.value.hash&&h.includes(p.value.hash)){var e=p.value.hash.substr(1);if(c.value!==e)return c.value=e,!0}return!1}function v(){var e=c.value;if(!f[e]){f[e]=!0;var t=(0,$e.m0)((function(){var e;null===(e=l.value)||void 0===e||e.dispatchEvent(new Event("onPluginReady")),t()}),{flush:"post"})}}m(),f[c.value]=!0,(0,$e.YP)(p,(function(){m()&&v()}));var g=(0,$e.Fl)((function(){return d.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id,r=c.value===n;return(0,$e.h)(u,{id:n},(function(){var t,o;return(0,$e.h)("a",{href:"#".concat(n),class:{"no-link block px-5 py-4 cursor-pointer border-b-2 font-medium":!0,"text-gray-500 dark:text-dark-350 hover:text-blue-500 dark:hover:text-blue-400 border-transparent hover:border-gray-300 dark:hover:border-dark-450":!r,"text-blue-500 dark:text-blue-400 border-blue-500":r},onClick:function(e){(0,s.pI)(e)||(e.preventDefault(),c.value!==n&&(c.value=n,v()))}},null===(o=(t=e.children).title)||void 0===o?void 0:o.call(t))}))}))})),b=(0,$e.Fl)((function(){return d.map((function(e){var t;if(c.value===(null===(t=e.props)||void 0===t?void 0:t.id))return(0,$e.h)((function(){return(0,$e.h)("div",{class:"tab-content"},e)}))}))}));return function(){return(0,$e.h)("div",{ref:l,class:"mb-6 pluggable"},[(0,$e.h)("div",{class:"flex border dark:border-dark-650 -mb-px rounded-t"},g.value),(0,$e.h)("div",{class:"p-5 border dark:border-dark-650 rounded-b-md"},b.value)])}}}),No=Ho,jo=(0,r.aZ)({name:"DocThemeSwitch",setup:function(){var e=(0,r.iH)(null),t=(0,r.Fl)((function(){return"dark"===e.value}));function n(t){document.documentElement.classList.add("no-transitions"),setTimeout((function(){document.documentElement.classList.remove("no-transitions")}),50),t?(document.documentElement.classList.add("dark"),e.value="dark"):(document.documentElement.classList.remove("dark"),e.value="light")}e.value=(0,s.qn)(St().base,localStorage,"doc_theme"),e.value||(e.value=document.documentElement.classList.contains("dark")?"dark":"light");var o,i=(0,r.iH)();return(0,r.bv)((function(){i.value=window.matchMedia("(prefers-color-scheme: dark)"),o=function(e){(0,s.qn)(St().base,localStorage,"doc_theme")||n(e.matches)},i.value.addEventListener("change",o)})),(0,r.Jd)((function(){var e;null===(e=i.value)||void 0===e||e.removeEventListener("change",o)})),{isDark:t,toggleColorMode:n,onSwitchClick:function(){n("light"===e.value),(0,s.Nh)(St().base,localStorage,"doc_theme",e.value)}}}}),Wo=(0,c.Z)(jo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-sun"),l=(0,r.up)("doc-icon-moon"),c=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(c,{class:(0,r.C_)(["w-10 h-10",{"-mb-0.5":!e.isDark}]),"icon-size":"20",onClick:e.onSwitchClick},{default:(0,r.w5)((function(){return[e.isDark?((0,r.wg)(),(0,r.j4)(a,{key:0})):((0,r.wg)(),(0,r.j4)(l,{key:1}))]})),_:1},8,["class","onClick"])}]]);var Bo={id:"docs-toolbar",class:"sticky z-20 flex items-center justify-between h-16 px-6 bg-white border-b border-gray-200 md:h-20 md:pl-16 md:top-20 top-16 dark:bg-dark-850 dark:border-dark-650"},zo={class:"relative"},Vo={ref:"visibleLinksDiv",class:"flex whitespace-nowrap"},qo={class:"block"},$o=["innerHTML"],Uo={ref:"more",class:"mr-3 more-dropdown"},Zo={class:"flex flex-col"},Yo={class:"flex items-center h-5 px-2 text-xs font-semibold text-white bg-blue-500 dark:bg-blue-400 rounded-full md:text-2xs"};const Go=(0,r.aZ)({name:"DocToolbarMemberCount"}),Jo=(0,c.Z)(Go,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",Yo,[(0,r.WI)(e.$slots,"default")])}]]);var Ko=["aria-expanded","aria-disabled","disabled"],Xo={class:"absolute left-0 z-20"},Qo={ref:"dropdownBottom",class:"h-2"},ei={key:0,class:"absolute bottom-0 right-0 z-50 flex items-center h-6 px-2 mb-4 mr-8 text-xs leading-none text-center text-gray-500 bg-white rounded-full shadow-md dark:bg-dark-550 dark:text-dark-200"},ti=function(){return ti=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},ti.apply(this,arguments)};const ni=(0,r.aZ)({name:"ToolbarLinkDropdownContent",components:{DocAnchorTrigger:p},props:{groupId:{type:String,required:!0},members:{type:Array,required:!0},isSingleColumn:{type:Boolean,required:!0},linkWidth:{type:Number,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(3),i=(0,r.iH)(0),s=(0,r.Fl)((function(){return ti({maxHeight:"calc(100vh - 11rem)",minWidth:"".concat(e.linkWidth,"px")},!e.isSingleColumn&&{width:"".concat(i.value,"px")})})),a=(0,r.Fl)((function(){var t=Math.ceil(e.members.length/o.value);return{gridTemplateColumns:"repeat(".concat(o.value,", 1fr)"),gridTemplateRows:"repeat(".concat(t,", 1fr)")}})),l=tt(),c=l.enableBodyScroll,u=l.disableBodyScroll;function d(){var e=document.querySelector("#docs-content");i.value=e?e.clientWidth:0}et((function(){!function(){var e=window.innerWidth;o.value=e<1124&&e>1024||e<900?2:3}(),d()})),(0,r.bv)(d);var f=function(){var e=(0,r.iH)();return{dropdownBottom:e,isIntersecting:On(e).isIntersecting}}(),h=f.dropdownBottom,p=f.isIntersecting;return{memberGridStyles:a,mmemberGridWrapperStyles:s,enableBodyScroll:c,disableBodyScroll:u,onClick:function(){c(),n("click")},dropdownBottom:h,isIntersecting:p}}}),ri=(0,c.Z)(ni,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"gridWrapper",class:"px-2 pt-2 mt-2 overflow-y-auto bg-white border border-gray-300 rounded shadow-lg member-links-dropdown dark:bg-dark-650 dark:border-dark-500",style:(0,r.j5)(e.mmemberGridWrapperStyles),onMouseenter:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.disableBodyScroll&&e.disableBodyScroll.apply(e,t)}),onMouseleave:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.enableBodyScroll&&e.enableBodyScroll.apply(e,t)})},[(0,r._)("div",{class:(0,r.C_)({"sm:grid grid-flow-col":!e.isSingleColumn}),style:(0,r.j5)(e.memberGridStyles)},[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(n){return(0,r.wg)(),(0,r.j4)(a,{key:n.id,to:"#".concat(n.id),onClick:t[0]||(t[0]=function(t){return e.onClick()})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.name),1)]})),_:2},1032,["to"])})),128))],6),(0,r._)("div",Qo,null,512)],36),e.isIntersecting?(0,r.kq)("",!0):((0,r.wg)(),(0,r.iD)("span",ei," More... "))])}],["__scopeId","data-v-ca01e68c"]]),oi=(0,r.aZ)({name:"DocToolbarLinkDropdown",components:{DocToolbarMemberCount:Jo,DocToolbarLinkDropdownContent:ri},props:{value:Boolean,inDropdown:Boolean,isSingleColumn:Boolean,disabled:Boolean,groupId:String,count:Number,members:Array,linkWidth:Number},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1);return(0,st.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),(0,r.YP)(i,(function(e){n("update:modelValue",e)})),{dropdown:o,toggleDropdown:function(){i.value=!i.value},onBodyClick:st.w,isOpen:i}}}),ii=(0,c.Z)(oi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-down"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-toolbar-member-count"),u=(0,r.up)("doc-toolbar-link-dropdown-content");return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:(0,r.C_)({hidden:e.inDropdown})},[(0,r._)("button",{class:(0,r.C_)(["relative z-20 flex items-center justify-center w-6 h-full px-0 border-l border-white rounded-r focus:outline-none focus:bg-gray-400 hover:bg-gray-300 dark:border-dark-850 dark:hover:bg-dark-450 dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isOpen,"bg-gray-200 dark:bg-dark-550":!e.isOpen}]),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,"aria-disabled":e.disabled,disabled:e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleDropdown&&e.toggleDropdown.apply(e,t)})},[(0,r.Wm)(l,{class:"dark:text-white",width:"13",height:"13"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),(0,r.Wm)(c,{class:"absolute top-0 right-0 -mt-3 -mr-2"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1})],10,Ko),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",Xo,[(0,r.Wm)(u,{members:e.members,"is-single-column":e.isSingleColumn,"group-id":e.groupId,"link-width":e.linkWidth,onClick:t[1]||(t[1]=function(t){return e.isOpen=!1})},null,8,["members","is-single-column","group-id","link-width"])],512),[[r.F8,e.isOpen]])]})),_:1})],2)}]]),si=(0,r.aZ)({name:"DocToolbarLink",components:{DocToolbarLinkDropdown:ii,DocToolbarMemberCount:Jo,DocAnchorTrigger:p},props:{link:{type:Object,required:!0},inDropdown:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,a.oR)().store,i=(0,r.Fl)((function(){return o.getters.getVisibleGroupMembers(e.link.id)})),s=(0,r.Fl)((function(){return i.value.length})),l=(0,r.Fl)((function(){return s.value<=12})),c=(0,r.Fl)((function(){return 0===s.value})),u=(0,r.Fl)((function(){return 0===s.value?"":"#".concat(e.link.id)})),d=(0,r.Fl)((function(){return t.value?t.value.clientWidth:0}));return{linkEl:t,linkWidth:d,isSingleColumn:l,isDropdownOpen:n,disabled:c,href:u,count:s,members:i}}}),ai=(0,c.Z)(si,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-member-count"),l=(0,r.up)("doc-anchor-trigger"),c=(0,r.up)("doc-toolbar-link-dropdown");return(0,r.wg)(),(0,r.iD)("div",{ref:"linkEl",class:(0,r.C_)(["inline-flex h-8 text-sm leading-none",{"mr-3":!e.inDropdown,relative:e.isSingleColumn}]),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.isDropdownOpen=!1}),["esc"]))},[(0,r.Wm)(l,{class:(0,r.C_)(["flex items-center justify-between grow px-3 font-medium text-gray-900 focus:bg-gray-400 focus:outline-none dark:text-white dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"px-5 hover:bg-gray-200 dark:hover:bg-dark-500":e.inDropdown,"rounded-l hover:bg-gray-300 dark:hover:bg-dark-450":!e.inDropdown,"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isDropdownOpen,"bg-gray-200 dark:bg-dark-550":!e.isDropdownOpen&&!e.inDropdown}]),to:e.href,disabled:e.disabled},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default"),(0,r.Wm)(a,{class:(0,r.C_)({hidden:!e.inDropdown})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1},8,["class"])]})),_:3},8,["class","to","disabled"]),(0,r.Wm)(c,{modelValue:e.isDropdownOpen,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.isDropdownOpen=t}),"in-dropdown":e.inDropdown,"is-single-column":e.isSingleColumn,disabled:e.disabled,count:e.count,members:e.members,"group-id":e.link.id,"link-width":e.linkWidth},null,8,["modelValue","in-dropdown","is-single-column","disabled","count","members","group-id","link-width"])],34)}]]);const li=(0,r.aZ)({name:"DocToolbarLinks",components:{DocToolbarLink:ai},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(0),n=function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=St().toolbarLinks,o=(0,r.iH)([]),i=(0,r.iH)([]),s=(0,r.iH)([]);(0,r.bv)((function(){o.value=n.slice()}));var a=function(){var e;return null===(e=t.value)||void 0===e?void 0:e.clientWidth},l=function(){var e,t,n,c=(t=document.querySelector("#docs-toolbar"),n=window.innerWidth<960?48:88,(t?t.clientWidth-n:0)-((null===(e=document.querySelector("#docs-filters"))||void 0===e?void 0:e.clientWidth)||0));if(a()>c&&o.value.length){s.value.push(a());var u=o.value.pop();u&&i.value.unshift(u)}else if(c>s.value[s.value.length-1]){var d=i.value[0];i.value.splice(0,1),o.value.push(d),s.value.pop()}(0,r.Y3)((function(){a()>c&&o.value.length&&l()}))};return{more:e,visibleLinksDiv:t,visibleLinks:o,invisibleLinks:i,updateNavLinks:l}}(),o=n.more,i=n.visibleLinksDiv,s=n.visibleLinks,a=n.invisibleLinks,l=n.updateNavLinks,c=(0,r.Fl)((function(){return s.value.length<=1&&t.value<960?"left":"right"}));function u(){t.value=window.innerWidth}return(0,r.bv)((function(){u(),l()})),et((function(){u(),l()})),{dropdown:e,more:o,visibleLinksDiv:i,visibleLinks:s,invisibleLinks:a,dropdownAlignment:c,onClick:function(){e.value.hide()}}}}),ci=(0,c.Z)(li,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-link"),l=(0,r.up)("doc-icon-more-horizontal"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",zo,[(0,r._)("div",Vo,[(0,r._)("div",qo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.visibleLinks,(function(e){return(0,r.wg)(),(0,r.j4)(a,{key:e.id,link:e,"in-dropdown":!1},{default:(0,r.w5)((function(){return[(0,r._)("span",{innerHTML:e.shortLabel?e.shortLabel:e.label},null,8,$o)]})),_:2},1032,["link"])})),128))]),(0,r.wy)((0,r._)("div",Uo,[(0,r.Wm)(u,{ref:"dropdown",class:"inline-block",align:e.dropdownAlignment},{"button-content":(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-8 h-8 bg-gray-200 hover:bg-gray-300 dark:bg-dark-550 dark:hover:bg-dark-450",rounded:!1},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1})]})),default:(0,r.w5)((function(){return[(0,r._)("div",Zo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.invisibleLinks,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.id,link:t,"in-dropdown":!0,onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r._)("span",null,(0,r.zw)(t.label),1)]})),_:2},1032,["link","onClick"])})),128))])]})),_:1},8,["align"])],512),[[r.F8,e.invisibleLinks.length]])],512)])}]]);var ui={id:"docs-filters"},di={class:"items-center hidden lg:flex"},fi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},hi=(0,r._)("span",{class:"hidden sm:inline"},"Filters",-1),pi={class:"pt-2 pb-3"},mi={class:"px-5 pb-4 border-b dark:border-dark-500"},vi={class:"px-5 pt-4"},gi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},bi=(0,r._)("span",null,"Access",-1),yi={class:"pt-1"};const wi=(0,r.aZ)({name:"DocToolbarAccess",setup:function(){var e=(0,a.oR)().store;return{access:St().access,selected:(0,r.Fl)({get:function(){return e.state.access},set:function(t){return e.actions.updateAccess(t)}}),isDirty:(0,r.Fl)((function(){return e.getters.isAccessDirty()}))}}}),xi=(0,c.Z)(wi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-shield"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-checkbox"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r.Wm)(u,{class:"hidden lg:block",align:"right","menu-width":"9rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative text-gray-900 bg-white border btn focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isDirty?((0,r.wg)(),(0,r.iD)("span",gi)):(0,r.kq)("",!0),(0,r.Wm)(l,{class:"mr-1 -ml-1",width:"14",height:"14",style:{"margin-bottom":"0"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),bi],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",yi,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"flex px-5 hover:bg-gray-200 dark:hover:bg-dark-500"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])]})),_:1}),((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"py-0.5 lg:hidden"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])}]]);var ki={class:"relative",style:{width:"12.4375rem"}},Si=["placeholder"];const Ei=(0,r.aZ)({name:"DocToolbarMemberFilter",setup:function(){var e=(0,a.oR)().store,t=(0,r.iH)(),n=St().toolbarFilterPlaceholder||"Filter",o=(0,r.Fl)({get:function(){return e.state.memberFilter},set:Ar()((function(t){e.actions.updateMemberFilter(t)}),400)});function i(){var e;null===(e=t.value)||void 0===e||e.select()}return(0,r.bv)((function(){var e;window.innerWidth>960&&(null===(e=t.value)||void 0===e||e.focus(),i())})),function(e){var t=Lt(),n=t.route,o=t.Router;n.value.query&&n.value.query.q&&(e.value=n.value.query.q),(0,r.YP)(e,(function(e){var t=e?{q:e}:{};n.value.query=t,o.replace(n.value)}))}(o),{input:t,query:o,placeholder:n,select:i,clear:function(){var e;o.value="",null===(e=t.value)||void 0===e||e.focus()}}}}),Ci=(0,c.Z)(Ei,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",ki,[(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-8 px-3 leading-8 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.select&&e.select.apply(e,t)})},null,40,Si),[[r.nr,e.query,void 0,{trim:!0}]]),e.query?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]),_i=(0,r.aZ)({name:"DocToolbarFilters",components:{DocToolbarAccess:xi,DocToolbarMemberFilter:Ci},setup:function(){var e=(0,a.oR)().store;return{isFiltersDirty:(0,r.Fl)((function(){return e.getters.isFiltersDirty()}))}}}),Ti=(0,c.Z)(_i,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-access"),l=(0,r.up)("doc-toolbar-member-filter"),c=(0,r.up)("doc-icon-filter"),u=(0,r.up)("doc-icon"),d=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",ui,[(0,r._)("div",di,[(0,r.Wm)(a,{class:"ml-3"}),(0,r.Wm)(l,{class:"ml-3"})]),(0,r.Wm)(d,{class:"lg:hidden",align:"right","menu-width":"13rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative inline-flex items-center justify-center w-8 h-8 p-0 text-sm font-medium leading-none text-gray-900 whitespace-nowrap bg-white border rounded cursor-pointer select-none sm:w-auto sm:px-3 focus:outline-none focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 transition-colors duration-200 ease-out",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isFiltersDirty?((0,r.wg)(),(0,r.iD)("span",fi)):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"mb-0 sm:mr-1",width:"14",height:"14"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1}),hi],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",pi,[(0,r._)("div",mi,[(0,r.Wm)(l)]),(0,r._)("div",vi,[(0,r.Wm)(a)])])]})),_:1})])}]]),Oi=(0,r.aZ)({name:"DocToolbar",components:{DocToolbarLinks:ci,DocToolbarFilters:Ti},setup:function(){return{checkState:(0,r.iH)(!0),selected:(0,r.iH)([])}}}),Li=(0,c.Z)(Oi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-links"),l=(0,r.up)("doc-toolbar-filters");return(0,r.wg)(),(0,r.iD)("div",Bo,[(0,r.Wm)(a,{class:"grow-0"}),(0,r.Wm)(l)])}]]);var Ri={key:0,class:"w-full px-4 py-3 text-center text-red-800 bg-red-100 rounded dark:bg-red-400 dark:text-white"};const Di=(0,r.aZ)({name:"DocToolbarMemberFilterNoResults",setup:function(){var e=(0,a.oR)().store,t=(0,r.Fl)((function(){return e.state.memberFilter})),n=(0,r.Fl)((function(){var t=0;return St().toolbarLinks.forEach((function(n){t+=e.getters.getVisibleGroupMembers(n.id).length})),t})),o=(0,r.Fl)((function(){return 0===n.value})),i=(0,r.Fl)((function(){return St().filterNotFoundMsg.replace("{query}",t.value)}));return{query:t,noResults:o,notFoundMsg:i}}}),Ai=(0,c.Z)(Di,[["render",function(e,t,n,o,i,s){return e.query&&e.noResults?((0,r.wg)(),(0,r.iD)("div",Ri,(0,r.zw)(e.notFoundMsg),1)):(0,r.kq)("",!0)}]]);var Ii={d:"M21 9H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1zM3 7h18c.55 0 1-.45 1-1s-.45-1-1-1H3c-.55 0-1 .45-1 1s.45 1 1 1zM21 13H3c-.55 0-1 .45-1 1s.45 1 1 1h18c.55 0 1-.45 1-1s-.45-1-1-1zM21 17H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1z"};const Mi=(0,$e.aZ)({name:"DocIconAlignRight"}),Fi=(0,c.Z)(Mi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ii)}]]);var Pi={d:"M19 11H7.41l5.29-5.29a.996.996 0 10-1.41-1.41l-7 7a1 1 0 000 1.42l7 7a1.024 1.024 0 001.42-.01.996.996 0 000-1.41L7.41 13H19c.55 0 1-.45 1-1s-.45-1-1-1z"};const Hi=(0,$e.aZ)({name:"DocIconArrowLeft"}),Ni=(0,c.Z)(Hi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Pi)}]]);var ji={d:"M19.92 12.38a1 1 0 00-.22-1.09l-7-7a.996.996 0 10-1.41 1.41l5.3 5.3H5c-.55 0-1 .45-1 1s.45 1 1 1h11.59l-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l7-7c.09-.09.16-.21.21-.33z"};const Wi=(0,$e.aZ)({name:"DocIconArrowRight"}),Bi=(0,c.Z)(Wi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ji)}]]);var zi={d:"M19.71 11.29l-7-7a1 1 0 00-1.42 0l-7 7A.996.996 0 105.7 12.7L11 7.41V19c0 .55.45 1 1 1s1-.45 1-1V7.41l5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29c.39-.39.39-1.03 0-1.42z"};const Vi=(0,$e.aZ)({name:"DocIconArrowTop"}),qi=(0,c.Z)(Vi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",zi)}]]);var $i={d:"M21.67 6.68c-.02-.07-.03-.15-.07-.22a.967.967 0 00-.25-.28c-.24-.3-.51-.58-.85-.78l-7-4c-.93-.53-2.08-.54-3 0l-7 4c-.35.2-.62.48-.86.79-.09.08-.17.16-.24.27-.03.07-.05.14-.07.21C2.13 7.08 2 7.53 2 8v8c0 1.07.58 2.06 1.5 2.6l7 4c.32.18.66.28 1.01.34.15.09.31.15.49.15s.34-.06.49-.15c.35-.06.69-.15 1.01-.34l7-4c.92-.54 1.5-1.53 1.5-2.6V8c0-.47-.13-.91-.33-1.32zM11.5 3.14c.15-.09.33-.14.5-.14.17 0 .35.05.5.14l6.46 3.69L12 10.85 5.04 6.83l6.46-3.69zm-7 13.73c-.31-.18-.5-.52-.5-.87V8.54l7 4.05v7.99l-6.5-3.71zm15-.01L13 20.58v-7.99l7-4.05V16c0 .35-.19.69-.5.86z"};const Ui=(0,$e.aZ)({name:"DocIconBox"}),Zi=(0,c.Z)(Ui,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",$i)}]]);var Yi={d:"M9 18.5c-.38 0-.77-.15-1.06-.44l-5-5a1.49 1.49 0 010-2.12 1.49 1.49 0 012.12 0L9 14.88l9.94-9.94a1.49 1.49 0 012.12 0c.59.59.59 1.54 0 2.12l-11 11c-.29.29-.68.44-1.06.44z"};const Gi=(0,$e.aZ)({name:"DocIconCheck"}),Ji=(0,c.Z)(Gi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Yi)}]]);var Ki=[(0,r._)("path",{d:"M21 9.09c-.55 0-1 .45-1 1v.92c0 4.96-4.04 8.99-9 8.99-4.97 0-9-4.04-9-9s4.04-9 9-9c1.27 0 2.5.26 3.66.78.51.22 1.1 0 1.32-.51.23-.5 0-1.1-.51-1.32C14.06.32 12.56 0 11.01 0H11C4.94 0 0 4.93 0 10.99 0 17.06 4.93 22 10.99 22H11c6.06 0 11-4.93 11-10.99v-.92c0-.56-.45-1-1-1z"},null,-1),(0,r._)("path",{d:"M8.71 9.31a.996.996 0 10-1.41 1.41l3 3c.19.19.44.29.71.29.27 0 .52-.11.71-.29l10-10.01a.996.996 0 10-1.41-1.41L11 11.6 8.71 9.31z"},null,-1)];const Xi=(0,$e.aZ)({name:"DocIconCheckCircle"}),Qi=(0,c.Z)(Xi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Ki)}]]);var es={d:"M12 16c-.26 0-.51-.1-.71-.29l-6-6A.996.996 0 116.7 8.3l5.3 5.29 5.29-5.29a.996.996 0 111.41 1.41l-6 6c-.19.19-.44.29-.7.29z"};const ts=(0,$e.aZ)({name:"DocIconChevronDown"}),ns=(0,c.Z)(ts,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",es)}]]);var rs={d:"M15.71 11.29l-6-6A.996.996 0 108.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l6-6c.39-.39.39-1.03 0-1.42z"};const os=(0,$e.aZ)({name:"DocIconChevronRight"}),is=(0,c.Z)(os,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",rs)}]]);var ss={d:"M20.92 8.62a.875.875 0 00-.22-.32l-7-7A.995.995 0 0013 1H6C4.35 1 3 2.35 3 4v16c0 1.65 1.35 3 3 3h12c1.65 0 3-1.35 3-3V9c0-.13-.03-.26-.08-.38zM14 4.41L17.59 8H14V4.41zM18 21H6c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h6v6c0 .55.45 1 1 1h6v10c0 .55-.45 1-1 1z"};const as=(0,$e.aZ)({name:"DocIconFile"}),ls=(0,c.Z)(as,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ss)}]]);var cs={d:"M14 22c-.15 0-.31-.04-.45-.11l-4-2A.988.988 0 019 19v-6.17L1.24 3.65a.995.995 0 01-.14-1.07c.16-.35.51-.58.9-.58h20c.39 0 .74.23.91.58s.11.77-.14 1.07L15 12.83V21a.999.999 0 01-1 1zm-3-3.62l2 1v-6.92c0-.24.08-.47.24-.65L19.84 4H4.16l6.61 7.81c.15.18.24.41.24.65v5.92z"};const us=(0,$e.aZ)({name:"DocIconFilter"}),ds=(0,c.Z)(us,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",cs)}]]);var fs=(0,r._)("path",{d:"M20 22H4c-1.65 0-3-1.35-3-3V5c0-1.65 1.35-3 3-3h5c.33 0 .65.17.83.45L11.54 5H20c1.65 0 3 1.35 3 3v11c0 1.65-1.35 3-3 3zM4 4c-.55 0-1 .45-1 1v14c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V8c0-.55-.45-1-1-1h-9c-.33 0-.65-.17-.83-.45L8.46 4H4z"},null,-1),hs=(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1);const ps=(0,$e.aZ)({name:"DocIconFolder"}),ms=(0,c.Z)(ps,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)(r.HY,null,[fs,hs],64)}]]);var vs=[(0,r._)("path",{d:"M12.01 6.01c-.55 0-1 .45-1 1V12a1 1 0 00.4.8l3 2.22a.985.985 0 001.39-.2.996.996 0 00-.21-1.4l-2.6-1.92V7.01c.02-.55-.43-1-.98-1z"},null,-1),(0,r._)("path",{d:"M12.01 1.91c-5.33 0-9.69 4.16-10.05 9.4l-.29-.26a.997.997 0 10-1.34 1.48l1.97 1.79c.19.17.43.26.67.26s.48-.09.67-.26l1.97-1.79a.997.997 0 10-1.34-1.48l-.31.28c.34-4.14 3.82-7.41 8.05-7.41 4.46 0 8.08 3.63 8.08 8.09s-3.63 8.08-8.08 8.08c-2.18 0-4.22-.85-5.75-2.4a.996.996 0 10-1.42 1.4 10.02 10.02 0 007.17 2.99c5.56 0 10.08-4.52 10.08-10.08.01-5.56-4.52-10.09-10.08-10.09z"},null,-1)];const gs=(0,$e.aZ)({name:"DocIconHistory"}),bs=(0,c.Z)(gs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,vs)}]]);var ys={d:"M21.61 8.21l-9-7c-.36-.28-.87-.28-1.23 0l-9 7C2.14 8.4 2 8.69 2 9v11c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3V9c0-.31-.14-.6-.39-.79zM14 21h-4v-8h4v8zm6-1c0 .55-.45 1-1 1h-3v-9c0-.55-.45-1-1-1H9c-.55 0-1 .45-1 1v9H5c-.55 0-1-.45-1-1V9.49l8-6.22 8 6.22V20z"};const ws=(0,$e.aZ)({name:"DocIconHome"}),xs=(0,c.Z)(ws,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ys)}]]);var ks=[(0,r._)("path",{d:"M12 1C5.93 1 1 5.93 1 12s4.93 11 11 11 11-4.93 11-11S18.07 1 12 1zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9z"},null,-1),(0,r._)("path",{d:"M12 11c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1s1-.45 1-1v-4c0-.55-.45-1-1-1zM12.01 7c-.56 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"},null,-1),(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1)];const Ss=(0,$e.aZ)({name:"DocIconInfo"}),Es=(0,c.Z)(Ss,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,ks)}]]);var Cs=[(0,r._)("path",{d:"M.55 6.89l10 5c.14.07.3.11.45.11s.31-.04.45-.11l10-5c.34-.16.55-.51.55-.89s-.21-.73-.55-.89l-10-5a.995.995 0 00-.89 0l-10 5C.21 5.27 0 5.62 0 6s.21.73.55.89zM11 2.12L18.76 6 11 9.88 3.24 6 11 2.12zM20.55 15.11L11 19.88 1.45 15.1c-.49-.25-1.09-.05-1.34.45s-.05 1.09.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1),(0,r._)("path",{d:"M20.55 10.11L11 14.88 1.45 10.1a.993.993 0 00-1.34.45.993.993 0 00.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1)];const _s=(0,$e.aZ)({name:"DocIconLayers"}),Ts=(0,c.Z)(_s,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Cs)}]]);var Os=[(0,r._)("path",{d:"M21.11 2.75a5.98 5.98 0 00-8.35.01l-1.72 1.71a.996.996 0 101.41 1.41l1.71-1.7c1.56-1.5 4-1.5 5.56 0 1.59 1.53 1.63 4.07.11 5.64l-3 3c-.13.13-.28.26-.43.38a4.003 4.003 0 01-5.6-.81c-.33-.44-.96-.53-1.4-.2-.44.33-.53.96-.2 1.4a5.999 5.999 0 004.81 2.4c1.25 0 2.51-.39 3.58-1.19.23-.17.45-.36.65-.56l3.01-3.01a5.991 5.991 0 00-.14-8.48z"},null,-1),(0,r._)("path",{d:"M11.53 18.11l-1.7 1.7c-1.56 1.5-4 1.5-5.56 0-1.59-1.53-1.63-4.07-.11-5.64l3-3c.14-.14.28-.26.43-.38a3.997 3.997 0 015.6.8c.33.44.96.53 1.4.2.44-.33.53-.96.2-1.4a5.93 5.93 0 00-3.95-2.34c-1.58-.22-3.15.18-4.44 1.14-.23.17-.44.36-.65.56l-3.01 3.01c-2.3 2.38-2.23 6.19.15 8.48a5.956 5.956 0 004.16 1.69c1.5 0 3.01-.57 4.19-1.7l1.71-1.71c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0z"},null,-1)];const Ls=(0,$e.aZ)({name:"DocIconLink"}),Rs=(0,c.Z)(Ls,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Os)}]]);var Ds={d:"M2 4h20v2H2zM2 11h20v2H2zM2 18h20v2H2z"};const As=(0,$e.aZ)({name:"DocIconMenu"}),Is=(0,c.Z)(As,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ds)}]]);var Ms={d:"M19 13H5c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1s-.45 1-1 1z"};const Fs=(0,$e.aZ)({name:"DocIconMinus"}),Ps=(0,c.Z)(Fs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ms)}]]);var Hs=[(0,r._)("path",{d:"M11 22C4.93 22 0 17.07 0 11S4.93 0 11 0s11 4.93 11 11-4.93 11-11 11zm0-20c-4.96 0-9 4.04-9 9s4.04 9 9 9 9-4.04 9-9-4.04-9-9-9z"},null,-1),(0,r._)("path",{d:"M16.5 11c0 3.05-2.46 5.51-5.49 5.51-2.16 0-4.02-1.25-4.92-3.05-.11-.22.08-.49.32-.43 1.15.28 2.43.2 3.71-.42 1.88-.9 3.07-2.89 3.06-4.97 0-.42-.05-.83-.15-1.22-.06-.24.21-.43.43-.32 1.79.88 3.04 2.74 3.04 4.9z"},null,-1)];const Ns=(0,$e.aZ)({name:"DocIconMoon"}),js=(0,c.Z)(Ns,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Hs)}]]);var Ws=[(0,r._)("circle",{cx:"12",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"19",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"5",cy:"12",r:"2"},null,-1)];const Bs=(0,$e.aZ)({name:"DocIconMoreHorizontal"}),zs=(0,c.Z)(Bs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Ws)}]]);var Vs={d:"M19 11h-6V5c0-.55-.45-1-1-1s-1 .45-1 1v6H5c-.55 0-1 .45-1 1s.45 1 1 1h6v6c0 .55.45 1 1 1s1-.45 1-1v-6h6c.55 0 1-.45 1-1s-.45-1-1-1z"};const qs=(0,$e.aZ)({name:"DocIconPlus"}),$s=(0,c.Z)(qs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Vs)}]]);var Us={d:"M21.71 20.29l-3.68-3.68A8.963 8.963 0 0020 11c0-4.96-4.04-9-9-9s-9 4.04-9 9 4.04 9 9 9c2.12 0 4.07-.74 5.61-1.97l3.68 3.68c.2.19.45.29.71.29s.51-.1.71-.29c.39-.39.39-1.03 0-1.42zM4 11c0-3.86 3.14-7 7-7s7 3.14 7 7c0 1.92-.78 3.66-2.04 4.93-.01.01-.02.01-.02.01-.01.01-.01.01-.01.02A6.98 6.98 0 0111 18c-3.86 0-7-3.14-7-7z"};const Zs=(0,$e.aZ)({name:"DocIconSearch"}),Ys=(0,c.Z)(Zs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Us)}]]);var Gs={d:"M12 23c-.15 0-.31-.04-.45-.11C11.2 22.72 3 18.54 3 12V5c0-.42.26-.79.65-.94l8-3c.23-.08.48-.08.7 0l8 3c.39.15.65.52.65.94v7c0 6.54-8.2 10.72-8.55 10.89-.14.07-.3.11-.45.11zM5 5.69V12c0 4.55 5.39 7.95 7 8.86 1.61-.92 7-4.33 7-8.86V5.69l-7-2.63-7 2.63z"};const Js=(0,$e.aZ)({name:"DocIconShield"}),Ks=(0,c.Z)(Js,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Gs)}]]);var Xs={d:"M12 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zM12 4c.55 0 1-.45 1-1V1c0-.55-.45-1-1-1s-1 .45-1 1v2c0 .55.45 1 1 1zM12 20c-.55 0-1 .45-1 1v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1zM4.93 6.35c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41L4.93 3.51a.996.996 0 10-1.41 1.41l1.41 1.43zM19.07 17.65a.996.996 0 10-1.41 1.41l1.42 1.42c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41l-1.43-1.42zM4 12c0-.55-.45-1-1-1H1c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1zM23 11h-2c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1s-.45-1-1-1zM4.93 17.65l-1.42 1.42a.996.996 0 00.71 1.7c.26 0 .51-.1.71-.29l1.42-1.42c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0zM18.36 6.64c.26 0 .51-.1.71-.29l1.42-1.42a.996.996 0 10-1.41-1.41l-1.42 1.42a.996.996 0 00.7 1.7z"};const Qs=(0,$e.aZ)({name:"DocIconSun"}),ea=(0,c.Z)(Qs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Xs)}]]);var ta={d:"M13.41 12l5.29-5.29a.996.996 0 10-1.41-1.41L12 10.59l-5.29-5.3A.996.996 0 105.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l5.29-5.3 5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29a.996.996 0 000-1.41l-5.3-5.3z"};const na=(0,$e.aZ)({name:"DocIconX"}),ra=(0,c.Z)(na,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ta)}]])},6850:(e,t,n)=>{"use strict";n.d(t,{w:()=>o});var r=n(7023);function o(e){(0,r.zX)(document.body,"click",(function(t){e(t)}))}},7023:(e,t,n)=>{"use strict";n.d(t,{zX:()=>o,Up:()=>i,BK:()=>s});var r=n(4359);function o(e,t,n){var o=function(){return e.removeEventListener(t,n)};return(0,r.bv)((function(){e&&e.addEventListener(t,n)})),(0,r.Jd)(o),o}function i(e,t,n,r,i){return o(e,t,s(n,r,i))}function s(e,t,n){var r,o=0,i=-1;return function(){++o%t==0?e():(i=o,r||(r=setTimeout((function(){var t=i>=o;o=0,i=-1,r=void 0,t&&e()}),n,null)))}}},2376:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var r=n(4359);function o(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,r.iH)(null);return{result:t,loading:n,error:o,execute:function(r,i){return s=this,a=void 0,c=function(){var s,a,l,c;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}(this,(function(u){switch(u.label){case 0:return u.trys.push([0,6,7,8]),n.value=!0,[4,fetch(r,i)];case 1:if(!(s=u.sent()).ok)throw new Error(s.statusText);return e?[4,e(s)]:[3,3];case 2:return l=u.sent(),[3,5];case 3:return[4,s.json()];case 4:l=u.sent(),u.label=5;case 5:return a=l,t.value=a,[3,8];case 6:return c=u.sent(),o.value=c,[3,8];case 7:return n.value=!1,[7];case 8:return[2]}}))},new((l=void 0)||(l=Promise))((function(e,t){function n(e){try{o(c.next(e))}catch(e){t(e)}}function r(e){try{o(c.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof l?o:new l((function(e){e(o)}))).then(n,r)}o((c=c.apply(s,a||[])).next())}));var s,a,l,c}}}},5701:(e,t,n)=>{"use strict";n.d(t,{Ke:()=>i,Mu:()=>s,ft:()=>a});var r=n(7648),o=n(4359),i=(0,r.MT)("retype","store"),s=Symbol("DocsIdbStore");function a(){return{idbStore:(0,o.f3)(s)}}},8816:(e,t,n)=>{"use strict";n.d(t,{xf:()=>S,v2:()=>O,Rx:()=>L});var r=n(4359),o=n(7648),i=n(1296),s=n.n(i),a=n(6184),l=n(9984),c=n.n(l);const u=()=>window.__DOCS_LUNR__;var d=n.n(u),f=n(5701),h=n(6850),p=n(5184),m=n(2626),v=n(5543),g=n(830),b=n(2376),y=n(2110),w=n(7755),x=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},k=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}},S=Symbol("DocsSearch"),E=(0,f.ft)().idbStore,C=!1;function _(e,t){var n;return x(this,void 0,void 0,(function(){var r,o,i;return k(this,(function(s){switch(s.label){case 0:return r={map:null,index:null},e.length&&t?(r.map=function(e,t){var n=0,r=0,o=new Map,i=c().appendDocumentName?c().documentName:"";return function e(t,s,a){t.forEach((function(t){var l=a?a+" > "+t.label:t.label;t.clickable&&(s[r].forEach((function(e){var r,s,a,u=e.i||(null===(r=e.l)||void 0===r?void 0:r.toLowerCase().replace(/[\s\-.]+/g,"-"));if(u&&(e.l||(null===(s=e.p)||void 0===s?void 0:s.length))){var d=u&&"#"!==u?"#"+u:"",f="/"===t.path?"".concat(i).concat(d):!c().trailingSlash&&i&&t.path?"".concat(t.path,"/").concat(i).concat(d):"".concat(t.path).concat(i).concat(d);e.l&&o.set((++n).toString(),{path:f,text:e.l,page:l}),(null===(a=e.p)||void 0===a?void 0:a.length)&&e.p.forEach((function(t){o.set((++n).toString(),{path:f,text:t,heading:e.l,page:l})}))}})),r++),t.children&&e(t.children,s,l)}))}(e,t,""),o}(e,t),null==r.map?[3,2]:[4,(0,w.T)("lunr-js",d())]):[2,r];case 1:(o=s.sent())&&(i=[],null===(n=r.map)||void 0===n||n.forEach((function(e,t){return i.push([t,e])})),r.index=o.createIndex(i)),s.label=2;case 2:return[2,r]}}))}))}function T(){return"/"===c().base?"search":c().base+"search"}function O(){return x(this,void 0,void 0,(function(){var e;return k(this,(function(t){switch(t.label){case 0:return e=T(),[4,(0,o.IV)(e,E)];case 1:return t.sent(),C=!0,[2]}}))}))}function L(e){var t=this,n=(0,m.oR)().store,i=(0,r.iH)(null),l=(0,r.iH)(null),u=(0,r.Fl)((function(){return n.state.searchQuery})),f=(0,r.iH)([]),S=(0,r.iH)(!1),O=(0,r.iH)(!1),L=(0,r.iH)(0),R=(0,r.Fl)((function(){var t;return null===(t=e.value)||void 0===t?void 0:t.querySelector("input")}));function D(e){var t,n,r,o,s;return x(this,void 0,void 0,(function(){var a,u,h,p,m,v,g,b;return k(this,(function(y){switch(y.label){case 0:return l.value&&i.value?e?e.length>=c().search.minChars?(a=[],[4,(0,w.T)("lunr-js",d())]):[3,2]:(f.value=[],[2]):[2];case 1:for((u=y.sent())&&(h=e.toLowerCase().trim(),a=u.query(l.value,h)),p=[],m=0;m<c().search.maxResults&&a[m];m++)(v=i.value.get(a[m].ref))&&(g=A(null===(t=a[m].matchData)||void 0===t?void 0:t.metadata),b=I(null!==(n=v.text)&&void 0!==n?n:"",g),p.push({id:a[m].ref,path:null!==(r=v.path)&&void 0!==r?r:"",heading:null!==(o=v.heading)&&void 0!==o?o:"",page:null!==(s=v.page)&&void 0!==s?s:"",text:b}));f.value=p,y.label=2;case 2:return[2]}}))}))}function A(e){var t,n,r,o=[],i=e;if(i)for(var s in i){var a=null===(n=null===(t=i[s])||void 0===t?void 0:t.text)||void 0===n?void 0:n.position;if(null==a?void 0:a.length)for(var l=0;l<a.length;++l)2===(null===(r=a[l])||void 0===r?void 0:r.length)&&a[l][1]>0&&o.push([a[l][0],a[l][0]+a[l][1]])}return o}function I(e,t,n){if(void 0===n&&(n=24),!t.length){var r=e.trim().split(/\s+/).filter((function(e){return e}));return r.length>n&&(r=r.slice(0,n)).push("..."),r.join(" ")}t.sort((function(e,t){return e[0]-t[0]}));for(var o=t.length-2;o>=0;--o)t[o][1]>=t[o+1][0]&&(t[o][1]=Math.max(t[o][1],t[o+1][1]),t.splice(o+1,1));var i=[],s=0,a=-1,l=-1;for(o=0;o<t.length;++o){var c=t[o][0],u=t[o][1],d=e.slice(s,c);if(d){var f=d.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,f)}-1===a?(a=i.length,l=i.length):l=i.length,i.push(['<span class="text-blue-500 dark:text-blue-400 font-semibold">'.concat(e.slice(c,u),"</span>"),!0]),s=u}if(s<e.length){var h=e.slice(s);if(h){var p=h.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,p)}}for(var m=0,v=1+l-a,g=i.length-1;v<n;){if(a>0&&(m%2==0||l>=g))--a;else{if(!(l<g))break;++l}++m,++v}v>n&&(l-=v-n);var b=i.slice(a,l+1).map((function(e){return e[0]}));return a>0&&b.splice(0,0,"..."),l<i.length-1&&b.push("..."),b.join(" ")}(0,r.YP)(u,s()((function(e){return x(this,void 0,void 0,(function(){return k(this,(function(t){switch(t.label){case 0:return[4,D(e)];case 1:return t.sent(),e.length>=c().search.minChars||f.value.length>0?S.value=!0:(S.value=!1,L.value=0),[2]}}))}))}),50)),(0,h.w)((function(t){var n,r=t.target;e.value===r||(null===(n=e.value)||void 0===n?void 0:n.contains(r))||(O.value=!1)}));var M=(0,p.B)().scrollTo;function F(e,t){var o;if(S.value=!1,O.value=!1,L.value=0,setTimeout((function(){var e;null===(e=R.value)||void 0===e||e.blur()}),100),e){var i=P(e,t);(0,a.Vn)(i);var s=null===(o=i.split("/").pop())||void 0===o?void 0:o.substring(1);if(s&&document.getElementById(s)){if(s.split("-").length>1){var l=!1;for(var c in n.state.memberGroups){if(l)break;for(var u in n.state.memberGroups[c])if(s===u){n.state.memberGroups[c][u].isOpen=!0,l=!0;break}}}(0,r.Y3)((function(){M("#".concat(s),{offset:v.vE,onDone:function(){n.actions.updateScrolledElementId(s)}})}))}}}function P(e,t){return t=null!=t?t:(0,g.Rs)(),e.startsWith("#")?(0,g.wE)(t)+e:t+e}function H(){var t,n=null===(t=e.value)||void 0===t?void 0:t.querySelector("ul"),r=null==n?void 0:n.children.item(L.value);null==r||r.scrollIntoView({block:"nearest"})}var N=c().preloadSearch?(0,b.i)((function(e){return x(t,void 0,void 0,(function(){var t,n,r;return k(this,(function(o){switch(o.label){case 0:return"file:"===location.protocol.toLowerCase()?[2,void 0]:[4,e.text()];case 1:return t=o.sent(),n=t.indexOf("="),r=t.slice(n+1).trim().slice(0,-1),[2,JSON.parse(r)]}}))}))})):(0,b.i)(),j=N.execute,W=N.error,B=N.result,z=c().preloadSearch?"js":"json",V=c().cacheBustingToken&&"none"!=c().cacheBustingStrategy?"path"==c().cacheBustingStrategy?"".concat(location.origin).concat(y.uj,".").concat(c().cacheBustingToken,".").concat(z):"".concat(location.origin).concat(y.uj,".").concat(z,"?v=").concat(c().cacheBustingToken):"".concat(location.origin).concat(y.uj,".").concat(z),q=(0,r.Fl)((function(){return n.state.sidebar})),$=T();(0,r.YP)(O,(function(e){e&&(function(){x(this,void 0,void 0,(function(){var e,t,n,r,s,a,u;return k(this,(function(f){switch(f.label){case 0:return[4,(0,o.U2)($,E)];case 1:return(e=f.sent())&&e.id===c().id?(i.value||(i.value=e.map),l.value?[3,3]:[4,(0,w.T)("lunr-js",d())]):[3,4];case 2:(t=f.sent())&&(n=JSON.parse(e.index),l.value=t.loadIndex(n)),f.label=3;case 3:return[3,10];case 4:return[4,(0,o.IV)($,E)];case 5:return f.sent(),r=void 0,!C&&c().preloadSearch?[3,7]:[4,j(V)];case 6:if(f.sent(),W.value)throw new Error("Error fetching search data. ".concat(W.value));r=B.value,f.label=7;case 7:return r||(r=window.__DOCS_SEARCH__),C=!1,[4,_(q.value.data,r)];case 8:return s=f.sent(),a=s.index,u=s.map,i.value=u,l.value=a,[4,(0,o.t8)($,{index:JSON.stringify(a),map:u,id:c().id},E)];case 9:f.sent(),f.label=10;case 10:return[2]}}))}))}(),H())}));var U=(0,r.qj)({input:R,isOpen:S,isFocused:O,results:f,focusIndex:L,clear:function(){var e;n.actions.updateSearchQuery(""),null===(e=R.value)||void 0===e||e.focus()},onKeydown:function(e){if(f.value.length)switch(e.code){case"ArrowDown":e.preventDefault(),L.value<f.value.length-1&&(L.value++,H());break;case"ArrowUp":e.preventDefault(),L.value>0&&(L.value--,H());break;case"Enter":e.preventDefault(),F(f.value[L.value].path);break;case"Escape":S.value=!1,n.actions.updateSearchQuery("")}},navigateToResult:F,getResultFullPath:P});return U}},5184:(e,t,n)=>{"use strict";function r(){var e={duration:500,offset:0},t=null;return{scrollTo:function(n,r){var o,i=Object.assign({},e,r),s=decodeURI(n),a=null!==(o=document.getElementById(n.startsWith("#")?s.slice(1):n))&&void 0!==o?o:document.querySelector(s);if(!a)throw new Error("Invalid target");var l="function"==typeof i.offset?i.offset():i.offset,c=a.getBoundingClientRect().top,u=window.scrollY||window.pageYOffset,d=c+u-u+l;i.onStart&&"function"==typeof i.onStart&&i.onStart(),window.requestAnimationFrame((function e(n){t||(t=n);var r=n-t,o=function(e,t,n,r){return-n*(e/=r)*(e-2)+t}(r,u,d,i.duration);window.scrollTo(0,o),r<i.duration?window.requestAnimationFrame(e):(i.onDone&&"function"==typeof i.onDone&&i.onDone(),t=null)}))}}}n.d(t,{B:()=>r})},2110:(e,t,n)=>{"use strict";n.d(t,{as:()=>s,uj:()=>a,bT:()=>l,u:()=>c});var r=n(9984),o=n.n(r),i="resources",s="".concat(o().base).concat(i,"/nav"),a="".concat(o().base).concat(i,"/js/search"),l=new Uint8Array([83,72,65,45,50,53,54]),c=new Uint8Array([82,83,65,83,83,65,45,80,75,67,83,49,45,118,49,95,53])},7755:(e,t,n)=>{"use strict";function r(e,t,n){var o=t();if(o&&o.default)n(o.default);else if(e){var i=document.getElementById(e);i&&i.addEventListener("load",(function(){return r(null,t,n)}))}}function o(e,t){return new Promise((function(n,o){try{r(e,t,(function(e){n(e)}))}catch(e){o(e)}}))}n.d(t,{b:()=>r,T:()=>o})},2626:(e,t,n)=>{"use strict";n.d(t,{$Q:()=>c,h:()=>d,oR:()=>f});var r=n(9984),o=n.n(r),i=n(4359),s=n(5543),a=n(872);(0,i.aZ)({name:"DocStoreDebug",setup:function(){var e=(0,i.iH)(!1),t=(0,i.Fl)((function(){return d.state})),n=(0,i.Fl)((function(){return{"top-0 max-w-md p-5 text-sm":e.value,"px-3 flex items-center text-xs mr-0 mb-0":!e.value}}));return{state:t,isOpen:e,classes:n,toggle:function(){e.value=!e.value}}}});var l=function(){return l=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},l.apply(this,arguments)},c=Symbol("DocsStore"),u={inherited:!0,access:o().access.map((function(e){return e.value}))},d={state:(0,i.qj)({initialPageLoad:!0,unloading:!1,inherited:u.inherited,isWindowScrolling:!1,isScrollPositionRestored:!1,memberFilter:"",scrolledElementId:"",searchQuery:"",sidebarRightHasContent:!1,sidebarScroll:0,sidebarActiveEl:void 0,sidebar:{id:"",data:[]},sidebarLookup:new Map,memberGroups:(0,a.s)(),access:u.access}),actions:{setMemberData:function(e,t,n,r){d.state.memberGroups[e][t]||(d.state.memberGroups[e][t]={isOpen:!1,isVisible:!0,animations:!0,access:"public",name:"UnknownMember"}),d.state.memberGroups[e][t][n]=r},resetMemberData:function(){Object.keys(d.state.memberGroups).forEach((function(e){d.state.memberGroups[e]={}}))},updateAccess:function(e){d.state.access=e,(0,s.Nh)(o().base,localStorage,"doc_access",e)},setInherited:function(e){d.state.inherited=e},toggleInherited:function(){d.state.inherited=!d.state.inherited,(0,s.Nh)(o().base,localStorage,"doc_inherited",d.state.inherited)},updateMemberFilter:function(e){d.state.memberFilter=e},updateScrolledElementId:function(e){d.state.scrolledElementId=e},updateSearchQuery:function(e){d.state.searchQuery=e},setSidebarData:function(e){d.state.sidebar=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",e)},setSidebarLookupData:function(e){d.state.sidebarLookup=e},setSidebarScroll:function(e){d.state.sidebarScroll=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar_scroll",e)},setActiveSidebarEl:function(e){d.state.sidebarActiveEl=e},setWindowScrollingState:function(e){d.state.isWindowScrolling=e},updateSidebarLookupItem:function(e,t,n){e[t]=n;var r=(0,s.qn)(o().base,sessionStorage,"doc_sidebar");r&&(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",l(l({},r),d.state.sidebar))}},getters:{isAccessDirty:function(){return u.access.length!==d.state.access.length},isFiltersDirty:function(){return u.access.length!==d.state.access.length||u.inherited!==d.state.inherited||""!==d.state.memberFilter},getVisibleGroupMembers:function(e){return Object.values(d.state.memberGroups[e]).filter((function(e){return!0===e.isVisible}))}}};function f(){return{store:(0,i.f3)(c)}}},872:(e,t,n)=>{"use strict";n.d(t,{s:()=>s,g:()=>a});var r=n(9984),o=n.n(r),i=n(5543);function s(){var e={};return o().toolbarLinks.forEach((function(t){e[t.id]={}})),e}function a(e){if(e.state.initialPageLoad){var t=(0,i.qn)(o().base,sessionStorage,"doc_sidebar_scroll");null!==t&&e.actions.setSidebarScroll(t);var n=(0,i.qn)(o().base,sessionStorage,"doc_sidebar");null!==n&&e.actions.setSidebarData(n);var r=(0,i.qn)(o().base,localStorage,"doc_inherited");null!==r&&e.actions.setInherited(r);var s=(0,i.qn)(o().base,localStorage,"doc_access");null!==s&&e.actions.updateAccess(s)}}},5543:(e,t,n)=>{"use strict";n.d(t,{qn:()=>o,Nh:()=>i,vE:()=>s,Sy:()=>a,am:()=>l,rw:()=>d,pI:()=>h});var r=function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};function o(e,t,n){var r=c(e,n),o=t.getItem(r);return o&&"null"!==o?"{"===o[0]||"["===o[0]||'"'===o[0]||"true"===o||"false"===o?JSON.parse(o):o:null}function i(e,t,n,r){var o=c(e,n),i="string"!=typeof r?JSON.stringify(r):r;t.setItem(o,i)}function s(){var e=document.getElementById("docs-site-header"),t=document.getElementById("docs-toolbar"),n=20;return n+=e?e.offsetHeight:0,-(n+=t?t.offsetHeight:0)}function a(e){var t,n,r={y:31536e3,mo:2592e3,d:86400,h:3600,m:60,s:1},o=Math.floor((Date.now()-e)/1e3);return Object.keys(r).some((function(e){return t=Math.floor(o/r[e]),n=e,t>=1})),0===t?"just now":"".concat(t).concat(n," ago")}function l(e,t,n,r,o){if(void 0===r&&(r=""),void 0===o&&(o=[]),!t||!t.length)return[];var i=[];return t.forEach((function(t){var s,a=u(e,t,n,r,o);(null===(s=a.parentNodes)||void 0===s?void 0:s.length)&&a.parentNodes.splice(-1,1),i.push(a)})),i}function c(e,t){return e&&"/"!==e?e+t:t}function u(e,t,n,o,i){void 0===o&&(o=""),void 0===i&&(i=[]);var s={};s.path=n?t.n.startsWith("/")?"".concat(t.n.slice(1),"/"):"".concat(o).concat(t.n,"/"):t.n.startsWith("/")?"".concat(t.n.slice(1)):!o||o.endsWith("/")?"".concat(o).concat(t.n):"".concat(o,"/").concat(t.n),s.parentNodes=i.length?r(r([],i,!0),[s.path],!1):[s.path];var a=t.i||t.h;return a&&e.set(s.path,s),s.clickable=!1!==t.c,s.visible=!1!==t.v,t.s&&(s.icon=t.s),t.e&&(s.emoji=t.e),t.h&&(s.hash=t.h),s.label=t.l||t.n,t.u&&(s.url=t.u),s.searchLabel=s.label.toLowerCase(),t.o&&(s.open=t.o),a&&(s.children=l(e,t.i,n,s.path,s.parentNodes)),s}function d(e,t,n,r){void 0===r&&(r=""),t&&t.length&&t.forEach((function(t){var o=n?"".concat(r).concat(t.n,"/"):!r||r.endsWith("/")?"".concat(r).concat(t.n):"".concat(r,"/").concat(t.n);if(e.get(o))d(e,t.i,n,o);else{var i=e.get(r);if(!i)throw new Error("Unexpected state. The parent node must exist at this point.");var s=u(e,t,n,r);if(i.children){var a=function(e,t){var n=0,r=e.length-1;if(r<n)return 0;for(;;){var o=Math.floor((n+r)/2),i=f(e[o].label,t.label);if(i<0){if((n=o+1)>r)return n}else{if(!(i>0))return o;if((r=o-1)<n)return o}}}(i.children,s);i.children.splice(a,0,s)}}}))}function f(e,t){if(null==t)return 1;if(null==e)return-1;var n=e.toUpperCase(),r=t.toUpperCase();return n>r?1:n<r?-1:0}function h(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}},830:(e,t,n)=>{"use strict";n.d(t,{wE:()=>a,cD:()=>l,Rs:()=>c,sy:()=>u});var r=n(9984),o=n.n(r),i=n(4884),s=n.n(i);function a(e){var t=o().appendDocumentName?o().documentName:"";if(o().trailingSlash||t)return"".concat(e).concat(t);var n=e.slice(0,-1);return o().base.length>1&&n.endsWith(".")&&(n=n.length>1?"../"+n+o().base.slice(0,-1):".."+o().base.slice(0,-1)),n}function l(e,t){var n="/"+o().documentName,r=e;if(o().appendDocumentName?r.endsWith(n)||(r=r.endsWith("/")?r+o().documentName:r+n):r.endsWith(n)&&(r=r.slice(0,-n.length)),o().useRelativePaths&&"file:"===location.protocol.toLowerCase()){var i=null!=t?t:s()();if(i){var a=r.split("/");r=a.slice(-i.level-1).join("/")}}else r.startsWith(o().base)?r=r.slice(o().base.length):o().trailingSlash||o().appendDocumentName||r!==o().base.slice(0,-1)||(r="");return r}function c(){if(!o().useRelativePaths)return o().base;var e=s()();if(!e)return o().base;var t=e.level;return o().appendDocumentName||e.isRoot||(o().trailingSlash?location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeBaseCache||(e.relativeBaseCache=t<=0?!e.isRoot||o().trailingSlash||location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")?"./":"."+o().base:"../".repeat(t)),e.relativeBaseCache}function u(){if(!o().useRelativePaths)return"/";var e=s()();if(!e)return"/";var t=e.level;return o().appendDocumentName||e.isRoot||(o().trailingSlash?location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeRootCache||(e.relativeRootCache=t<=0?!e.isRoot||o().trailingSlash||location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")?"./":"."+o().base:"../".repeat(t)),e.relativeRootCache}},3744:(e,t)=>{"use strict";t.Z=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},4359:(e,t,n)=>{"use strict";n.d(t,{HY:()=>o.HY,lR:()=>o.lR,uT:()=>I,Fl:()=>o.Fl,ri:()=>Oe,j4:()=>o.j4,kq:()=>o.kq,iD:()=>o.iD,_:()=>o._,Uk:()=>o.Uk,Wm:()=>o.Wm,aZ:()=>o.aZ,h:()=>o.h,f3:()=>o.f3,Y3:()=>o.Y3,C_:()=>o.C_,j5:()=>o.j5,Jd:()=>o.Jd,bv:()=>o.bv,wg:()=>o.wg,Cn:()=>o.Cn,JJ:()=>o.JJ,dD:()=>o.dD,qj:()=>o.qj,iH:()=>o.iH,Ko:()=>o.Ko,WI:()=>o.WI,up:()=>o.up,LL:()=>o.LL,qZ:()=>o.qZ,zw:()=>o.zw,e8:()=>ie,nr:()=>oe,F8:()=>ye,YP:()=>o.YP,m0:()=>o.m0,w5:()=>o.w5,wy:()=>o.wy,D2:()=>be,iM:()=>ve});var r={};n.r(r),n.d(r,{BaseTransition:()=>o.P$,Comment:()=>o.sv,EffectScope:()=>o.Bj,Fragment:()=>o.HY,KeepAlive:()=>o.Ob,ReactiveEffect:()=>o.qq,Static:()=>o.qG,Suspense:()=>o.n4,Teleport:()=>o.lR,Text:()=>o.xv,Transition:()=>I,TransitionGroup:()=>K,VueElement:()=>_,callWithAsyncErrorHandling:()=>o.$d,callWithErrorHandling:()=>o.KU,camelize:()=>o._A,capitalize:()=>o.kC,cloneVNode:()=>o.Ho,compatUtils:()=>o.ry,computed:()=>o.Fl,createApp:()=>Oe,createBlock:()=>o.j4,createCommentVNode:()=>o.kq,createElementBlock:()=>o.iD,createElementVNode:()=>o._,createHydrationRenderer:()=>o.Eo,createPropsRestProxy:()=>o.p1,createRenderer:()=>o.Us,createSSRApp:()=>Le,createSlots:()=>o.Nv,createStaticVNode:()=>o.uE,createTextVNode:()=>o.Uk,createVNode:()=>o.Wm,customRef:()=>o.ZM,defineAsyncComponent:()=>o.RC,defineComponent:()=>o.aZ,defineCustomElement:()=>S,defineEmits:()=>o.Bz,defineExpose:()=>o.WY,defineProps:()=>o.MW,defineSSRCustomElement:()=>E,devtools:()=>o.mW,effect:()=>o.cE,effectScope:()=>o.B,getCurrentInstance:()=>o.FN,getCurrentScope:()=>o.nZ,getTransitionRawChildren:()=>o.Q6,guardReactiveProps:()=>o.F4,h:()=>o.h,handleError:()=>o.S3,hydrate:()=>Te,initCustomFormatter:()=>o.Mr,initDirectivesForSSR:()=>Ae,inject:()=>o.f3,isMemoSame:()=>o.nQ,isProxy:()=>o.X3,isReactive:()=>o.PG,isReadonly:()=>o.$y,isRef:()=>o.dq,isRuntimeOnly:()=>o.of,isShallow:()=>o.yT,isVNode:()=>o.lA,markRaw:()=>o.Xl,mergeDefaults:()=>o.u_,mergeProps:()=>o.dG,nextTick:()=>o.Y3,normalizeClass:()=>o.C_,normalizeProps:()=>o.vs,normalizeStyle:()=>o.j5,onActivated:()=>o.dl,onBeforeMount:()=>o.wF,onBeforeUnmount:()=>o.Jd,onBeforeUpdate:()=>o.Xn,onDeactivated:()=>o.se,onErrorCaptured:()=>o.d1,onMounted:()=>o.bv,onRenderTracked:()=>o.bT,onRenderTriggered:()=>o.Yq,onScopeDispose:()=>o.EB,onServerPrefetch:()=>o.vl,onUnmounted:()=>o.Ah,onUpdated:()=>o.ic,openBlock:()=>o.wg,popScopeId:()=>o.Cn,provide:()=>o.JJ,proxyRefs:()=>o.WL,pushScopeId:()=>o.dD,queuePostFlushCb:()=>o.qb,reactive:()=>o.qj,readonly:()=>o.OT,ref:()=>o.iH,registerRuntimeCompiler:()=>o.Y1,render:()=>_e,renderList:()=>o.Ko,renderSlot:()=>o.WI,resolveComponent:()=>o.up,resolveDirective:()=>o.Q2,resolveDynamicComponent:()=>o.LL,resolveFilter:()=>o.eq,resolveTransitionHooks:()=>o.U2,setBlockTracking:()=>o.qZ,setDevtoolsHook:()=>o.ec,setTransitionHooks:()=>o.nK,shallowReactive:()=>o.Um,shallowReadonly:()=>o.YS,shallowRef:()=>o.XI,ssrContextKey:()=>o.Uc,ssrUtils:()=>o.G,stop:()=>o.sT,toDisplayString:()=>o.zw,toHandlerKey:()=>o.hR,toHandlers:()=>o.mx,toRaw:()=>o.IU,toRef:()=>o.Vh,toRefs:()=>o.BK,transformVNodeArgs:()=>o.C3,triggerRef:()=>o.oR,unref:()=>o.SU,useAttrs:()=>o.l1,useCssModule:()=>T,useCssVars:()=>O,useSSRContext:()=>o.Zq,useSlots:()=>o.Rr,useTransitionState:()=>o.Y8,vModelCheckbox:()=>ie,vModelDynamic:()=>fe,vModelRadio:()=>ae,vModelSelect:()=>le,vModelText:()=>oe,vShow:()=>ye,version:()=>o.i8,warn:()=>o.ZK,watch:()=>o.YP,watchEffect:()=>o.m0,watchPostEffect:()=>o.Rh,watchSyncEffect:()=>o.yX,withAsyncContext:()=>o.mv,withCtx:()=>o.w5,withDefaults:()=>o.b9,withDirectives:()=>o.wy,withKeys:()=>be,withMemo:()=>o.MX,withModifiers:()=>ve,withScopeId:()=>o.HX});var o=n(6252),i=n(3577),s=n(2262);const a="undefined"!=typeof document?document:null,l=a&&a.createElement("template"),c={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?a.createElementNS("http://www.w3.org/2000/svg",e):a.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>a.createTextNode(e),createComment:e=>a.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>a.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,r,o,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==i&&(o=o.nextSibling););else{l.innerHTML=r?`<svg>${e}</svg>`:e;const o=l.content;if(r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},u=/\s*!important$/;function d(e,t,n){if((0,i.kJ)(n))n.forEach((n=>d(e,t,n)));else if(t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=h[t];if(n)return n;let r=(0,i._A)(t);if("filter"!==r&&r in e)return h[t]=r;r=(0,i.kC)(r);for(let n=0;n<f.length;n++){const o=f[n]+r;if(o in e)return h[t]=o}return t}(e,t);u.test(n)?e.setProperty((0,i.rs)(r),n.replace(u,""),"important"):e[r]=n}}const f=["Webkit","Moz","ms"],h={},p="http://www.w3.org/1999/xlink";let m=Date.now,v=!1;if("undefined"!=typeof window){m()>document.createEvent("Event").timeStamp&&(m=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);v=!!(e&&Number(e[1])<=53)}let g=0;const b=Promise.resolve(),y=()=>{g=0};function w(e,t,n,r){e.addEventListener(t,n,r)}const x=/(?:Once|Passive|Capture)$/,k=/^on[a-z]/;function S(e,t){const n=(0,o.aZ)(e);class r extends _{constructor(e){super(n,e,t)}}return r.def=n,r}const E=e=>S(e,Te),C="undefined"!=typeof HTMLElement?HTMLElement:class{};class _ extends C{constructor(e,t={},n){super(),this._def=e,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):this.attachShadow({mode:"open"})}connectedCallback(){this._connected=!0,this._instance||this._resolveDef()}disconnectedCallback(){this._connected=!1,(0,o.Y3)((()=>{this._connected||(_e(null,this.shadowRoot),this._instance=null)}))}_resolveDef(){if(this._resolved)return;this._resolved=!0;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);new MutationObserver((e=>{for(const t of e)this._setAttr(t.attributeName)})).observe(this,{attributes:!0});const e=e=>{const{props:t,styles:n}=e,r=!(0,i.kJ)(t),o=t?r?Object.keys(t):t:[];let s;if(r)for(const e in this._props){const n=t[e];(n===Number||n&&n.type===Number)&&(this._props[e]=(0,i.He)(this._props[e]),(s||(s=Object.create(null)))[e]=!0)}this._numberProps=s;for(const e of Object.keys(this))"_"!==e[0]&&this._setProp(e,this[e],!0,!1);for(const e of o.map(i._A))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t)}});this._applyStyles(n),this._update()},t=this._def.__asyncLoader;t?t().then(e):e(this._def)}_setAttr(e){let t=this.getAttribute(e);this._numberProps&&this._numberProps[e]&&(t=(0,i.He)(t)),this._setProp((0,i._A)(e),t,!1)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!0){t!==this._props[e]&&(this._props[e]=t,r&&this._instance&&this._update(),n&&(!0===t?this.setAttribute((0,i.rs)(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute((0,i.rs)(e),t+""):t||this.removeAttribute((0,i.rs)(e))))}_update(){_e(this._createVNode(),this.shadowRoot)}_createVNode(){const e=(0,o.Wm)(this._def,(0,i.l7)({},this._props));return this._instance||(e.ce=e=>{this._instance=e,e.isCE=!0,e.emit=(e,...t)=>{this.dispatchEvent(new CustomEvent(e,{detail:t}))};let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof _){e.parent=t._instance;break}}),e}_applyStyles(e){e&&e.forEach((e=>{const t=document.createElement("style");t.textContent=e,this.shadowRoot.appendChild(t)}))}}function T(e="$style"){{const t=(0,o.FN)();if(!t)return i.kT;const n=t.type.__cssModules;if(!n)return i.kT;return n[e]||i.kT}}function O(e){const t=(0,o.FN)();if(!t)return;const n=()=>L(t.subTree,e(t.proxy));(0,o.Rh)(n),(0,o.bv)((()=>{const e=new MutationObserver(n);e.observe(t.subTree.el.parentNode,{childList:!0}),(0,o.Ah)((()=>e.disconnect()))}))}function L(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{L(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el)R(e.el,t);else if(e.type===o.HY)e.children.forEach((e=>L(e,t)));else if(e.type===o.qG){let{el:n,anchor:r}=e;for(;n&&(R(n,t),n!==r);)n=n.nextSibling}}function R(e,t){if(1===e.nodeType){const n=e.style;for(const e in t)n.setProperty(`--${e}`,t[e])}}const D="transition",A="animation",I=(e,{slots:t})=>(0,o.h)(o.P$,N(e),t);I.displayName="Transition";const M={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},F=I.props=(0,i.l7)({},o.P$.props,M),P=(e,t=[])=>{(0,i.kJ)(e)?e.forEach((e=>e(...t))):e&&e(...t)},H=e=>!!e&&((0,i.kJ)(e)?e.some((e=>e.length>1)):e.length>1);function N(e){const t={};for(const n in e)n in M||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=s,appearActiveClass:u=a,appearToClass:d=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=function(e){if(null==e)return null;if((0,i.Kn)(e))return[j(e.enter),j(e.leave)];{const t=j(e);return[t,t]}}(o),v=m&&m[0],g=m&&m[1],{onBeforeEnter:b,onEnter:y,onEnterCancelled:w,onLeave:x,onLeaveCancelled:k,onBeforeAppear:S=b,onAppear:E=y,onAppearCancelled:C=w}=t,_=(e,t,n)=>{B(e,t?d:l),B(e,t?u:a),n&&n()},T=(e,t)=>{B(e,p),B(e,h),t&&t()},O=e=>(t,n)=>{const o=e?E:y,i=()=>_(t,e,n);P(o,[t,i]),z((()=>{B(t,e?c:s),W(t,e?d:l),H(o)||q(t,r,v,i)}))};return(0,i.l7)(t,{onBeforeEnter(e){P(b,[e]),W(e,s),W(e,a)},onBeforeAppear(e){P(S,[e]),W(e,c),W(e,u)},onEnter:O(!1),onAppear:O(!0),onLeave(e,t){const n=()=>T(e,t);W(e,f),Y(),W(e,h),z((()=>{B(e,f),W(e,p),H(x)||q(e,r,g,n)})),P(x,[e,n])},onEnterCancelled(e){_(e,!1),P(w,[e])},onAppearCancelled(e){_(e,!0),P(C,[e])},onLeaveCancelled(e){T(e),P(k,[e])}})}function j(e){return(0,i.He)(e)}function W(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e._vtc||(e._vtc=new Set)).add(t)}function B(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function z(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let V=0;function q(e,t,n,r){const o=e._endId=++V,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:s,timeout:a,propCount:l}=$(e,t);if(!s)return r();const c=s+"end";let u=0;const d=()=>{e.removeEventListener(c,f),i()},f=t=>{t.target===e&&++u>=l&&d()};setTimeout((()=>{u<l&&d()}),a+1),e.addEventListener(c,f)}function $(e,t){const n=window.getComputedStyle(e),r=e=>(n[e]||"").split(", "),o=r("transitionDelay"),i=r("transitionDuration"),s=U(o,i),a=r("animationDelay"),l=r("animationDuration"),c=U(a,l);let u=null,d=0,f=0;return t===D?s>0&&(u=D,d=s,f=i.length):t===A?c>0&&(u=A,d=c,f=l.length):(d=Math.max(s,c),u=d>0?s>c?D:A:null,f=u?u===D?i.length:l.length:0),{type:u,timeout:d,propCount:f,hasTransform:u===D&&/\b(transform|all)(,|$)/.test(n.transitionProperty)}}function U(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map(((t,n)=>Z(t)+Z(e[n]))))}function Z(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function Y(){return document.body.offsetHeight}const G=new WeakMap,J=new WeakMap,K={name:"TransitionGroup",props:(0,i.l7)({},F,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=(0,o.FN)(),r=(0,o.Y8)();let i,a;return(0,o.ic)((()=>{if(!i.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach((e=>{e.split(/\s+/).forEach((e=>e&&r.classList.remove(e)))})),n.split(/\s+/).forEach((e=>e&&r.classList.add(e))),r.style.display="none";const o=1===t.nodeType?t:t.parentNode;o.appendChild(r);const{hasTransform:i}=$(r);return o.removeChild(r),i}(i[0].el,n.vnode.el,t))return;i.forEach(X),i.forEach(Q);const r=i.filter(ee);Y(),r.forEach((e=>{const n=e.el,r=n.style;W(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n._moveCb=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n._moveCb=null,B(n,t))};n.addEventListener("transitionend",o)}))})),()=>{const l=(0,s.IU)(e),c=N(l);let u=l.tag||o.HY;i=a,a=t.default?(0,o.Q6)(t.default()):[];for(let e=0;e<a.length;e++){const t=a[e];null!=t.key&&(0,o.nK)(t,(0,o.U2)(t,c,r,n))}if(i)for(let e=0;e<i.length;e++){const t=i[e];(0,o.nK)(t,(0,o.U2)(t,c,r,n)),G.set(t,t.el.getBoundingClientRect())}return(0,o.Wm)(u,null,a)}}};function X(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function Q(e){J.set(e,e.el.getBoundingClientRect())}function ee(e){const t=G.get(e),n=J.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const t=e.el.style;return t.transform=t.webkitTransform=`translate(${r}px,${o}px)`,t.transitionDuration="0s",e}}const te=e=>{const t=e.props["onUpdate:modelValue"];return(0,i.kJ)(t)?e=>(0,i.ir)(t,e):t};function ne(e){e.target.composing=!0}function re(e){const t=e.target;t.composing&&(t.composing=!1,function(e,t){const n=document.createEvent("HTMLEvents");n.initEvent("input",!0,!0),e.dispatchEvent(n)}(t))}const oe={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e._assign=te(o);const s=r||o.props&&"number"===o.props.type;w(e,t?"change":"input",(t=>{if(t.target.composing)return;let r=e.value;n?r=r.trim():s&&(r=(0,i.He)(r)),e._assign(r)})),n&&w(e,"change",(()=>{e.value=e.value.trim()})),t||(w(e,"compositionstart",ne),w(e,"compositionend",re),w(e,"change",re))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},s){if(e._assign=te(s),e.composing)return;if(document.activeElement===e){if(n)return;if(r&&e.value.trim()===t)return;if((o||"number"===e.type)&&(0,i.He)(e.value)===t)return}const a=null==t?"":t;e.value!==a&&(e.value=a)}},ie={deep:!0,created(e,t,n){e._assign=te(n),w(e,"change",(()=>{const t=e._modelValue,n=ue(e),r=e.checked,o=e._assign;if((0,i.kJ)(t)){const e=(0,i.hq)(t,n),s=-1!==e;if(r&&!s)o(t.concat(n));else if(!r&&s){const n=[...t];n.splice(e,1),o(n)}}else if((0,i.DM)(t)){const e=new Set(t);r?e.add(n):e.delete(n),o(e)}else o(de(e,r))}))},mounted:se,beforeUpdate(e,t,n){e._assign=te(n),se(e,t,n)}};function se(e,{value:t,oldValue:n},r){e._modelValue=t,(0,i.kJ)(t)?e.checked=(0,i.hq)(t,r.props.value)>-1:(0,i.DM)(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=(0,i.WV)(t,de(e,!0)))}const ae={created(e,{value:t},n){e.checked=(0,i.WV)(t,n.props.value),e._assign=te(n),w(e,"change",(()=>{e._assign(ue(e))}))},beforeUpdate(e,{value:t,oldValue:n},r){e._assign=te(r),t!==n&&(e.checked=(0,i.WV)(t,r.props.value))}},le={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=(0,i.DM)(t);w(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?(0,i.He)(ue(e)):ue(e)));e._assign(e.multiple?o?new Set(t):t:t[0])})),e._assign=te(r)},mounted(e,{value:t}){ce(e,t)},beforeUpdate(e,t,n){e._assign=te(n)},updated(e,{value:t}){ce(e,t)}};function ce(e,t){const n=e.multiple;if(!n||(0,i.kJ)(t)||(0,i.DM)(t)){for(let r=0,o=e.options.length;r<o;r++){const o=e.options[r],s=ue(o);if(n)(0,i.kJ)(t)?o.selected=(0,i.hq)(t,s)>-1:o.selected=t.has(s);else if((0,i.WV)(ue(o),t))return void(e.selectedIndex!==r&&(e.selectedIndex=r))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function ue(e){return"_value"in e?e._value:e.value}function de(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const fe={created(e,t,n){he(e,t,n,null,"created")},mounted(e,t,n){he(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){he(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){he(e,t,n,r,"updated")}};function he(e,t,n,r,o){let i;switch(e.tagName){case"SELECT":i=le;break;case"TEXTAREA":i=oe;break;default:switch(n.props&&n.props.type){case"checkbox":i=ie;break;case"radio":i=ae;break;default:i=oe}}const s=i[o];s&&s(e,t,n,r)}const pe=["ctrl","shift","alt","meta"],me={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>pe.some((n=>e[`${n}Key`]&&!t.includes(n)))},ve=(e,t)=>(n,...r)=>{for(let e=0;e<t.length;e++){const r=me[t[e]];if(r&&r(n,t))return}return e(n,...r)},ge={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},be=(e,t)=>n=>{if(!("key"in n))return;const r=(0,i.rs)(n.key);return t.some((e=>e===r||ge[e]===r))?e(n):void 0},ye={beforeMount(e,{value:t},{transition:n}){e._vod="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):we(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),we(e,!0),r.enter(e)):r.leave(e,(()=>{we(e,!1)})):we(e,t))},beforeUnmount(e,{value:t}){we(e,t)}};function we(e,t){e.style.display=t?e._vod:"none"}const xe=(0,i.l7)({patchProp:(e,t,n,r,s=!1,a,l,c,u)=>{"class"===t?function(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,s):"style"===t?function(e,t,n){const r=e.style,o=(0,i.HD)(n);if(n&&!o){for(const e in n)d(r,e,n[e]);if(t&&!(0,i.HD)(t))for(const e in t)null==n[e]&&d(r,e,"")}else{const i=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=i)}}(e,n,r):(0,i.F7)(t)?(0,i.tR)(t)||function(e,t,n,r,s=null){const a=e._vei||(e._vei={}),l=a[t];if(r&&l)l.value=r;else{const[n,c]=function(e){let t;if(x.test(e)){let n;for(t={};n=e.match(x);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[(0,i.rs)(e.slice(2)),t]}(t);if(r){const l=a[t]=function(e,t){const n=e=>{const r=e.timeStamp||m();(v||r>=n.attached-1)&&(0,o.$d)(function(e,t){if((0,i.kJ)(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=g||(b.then(y),g=m()),n}(r,s);w(e,n,l,c)}else l&&(function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,l,c),a[t]=void 0)}}(e,t,0,r,l):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){return r?"innerHTML"===t||"textContent"===t||!!(t in e&&k.test(t)&&(0,i.mf)(n)):"spellcheck"!==t&&"draggable"!==t&&("form"!==t&&(("list"!==t||"INPUT"!==e.tagName)&&(("type"!==t||"TEXTAREA"!==e.tagName)&&((!k.test(t)||!(0,i.HD)(n))&&t in e))))}(e,t,r,s))?function(e,t,n,r,o,s,a){if("innerHTML"===t||"textContent"===t)return r&&a(r,o,s),void(e[t]=null==n?"":n);if("value"===t&&"PROGRESS"!==e.tagName&&!e.tagName.includes("-")){e._value=n;const r=null==n?"":n;return e.value===r&&"OPTION"!==e.tagName||(e.value=r),void(null==n&&e.removeAttribute(t))}if(""===n||null==n){const r=typeof e[t];if("boolean"===r)return void(e[t]=(0,i.yA)(n));if(null==n&&"string"===r)return e[t]="",void e.removeAttribute(t);if("number"===r){try{e[t]=0}catch(e){}return void e.removeAttribute(t)}}try{e[t]=n}catch(e){}}(e,t,r,a,l,c,u):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r,o){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(p,t.slice(6,t.length)):e.setAttributeNS(p,t,n);else{const r=(0,i.Pq)(t);null==n||r&&!(0,i.yA)(n)?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,s))}},c);let ke,Se=!1;function Ee(){return ke||(ke=(0,o.Us)(xe))}function Ce(){return ke=Se?ke:(0,o.Eo)(xe),Se=!0,ke}const _e=(...e)=>{Ee().render(...e)},Te=(...e)=>{Ce().hydrate(...e)},Oe=(...e)=>{const t=Ee().createApp(...e),{mount:n}=t;return t.mount=e=>{const r=Re(e);if(!r)return;const o=t._component;(0,i.mf)(o)||o.render||o.template||(o.template=r.innerHTML),r.innerHTML="";const s=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),s},t},Le=(...e)=>{const t=Ce().createApp(...e),{mount:n}=t;return t.mount=e=>{const t=Re(e);if(t)return n(t,!0,t instanceof SVGElement)},t};function Re(e){return(0,i.HD)(e)?document.querySelector(e):e}let De=!1;const Ae=()=>{De||(De=!0,oe.getSSRProps=({value:e})=>({value:e}),ae.getSSRProps=({value:e},t)=>{if(t.props&&(0,i.WV)(t.props.value,e))return{checked:!0}},ie.getSSRProps=({value:e},t)=>{if((0,i.kJ)(e)){if(t.props&&(0,i.hq)(e,t.props.value)>-1)return{checked:!0}}else if((0,i.DM)(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},ye.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})};function Ie(e){throw e}function Me(e){}function Fe(e,t,n,r){const o=new SyntaxError(String(e));return o.code=e,o.loc=t,o}const Pe=Symbol(""),He=Symbol(""),Ne=Symbol(""),je=Symbol(""),We=Symbol(""),Be=Symbol(""),ze=Symbol(""),Ve=Symbol(""),qe=Symbol(""),$e=Symbol(""),Ue=Symbol(""),Ze=Symbol(""),Ye=Symbol(""),Ge=Symbol(""),Je=Symbol(""),Ke=Symbol(""),Xe=Symbol(""),Qe=Symbol(""),et=Symbol(""),tt=Symbol(""),nt=Symbol(""),rt=Symbol(""),ot=Symbol(""),it=Symbol(""),st=Symbol(""),at=Symbol(""),lt=Symbol(""),ct=Symbol(""),ut=Symbol(""),dt=Symbol(""),ft=Symbol(""),ht=Symbol(""),pt=Symbol(""),mt=Symbol(""),vt=Symbol(""),gt=Symbol(""),bt=Symbol(""),yt=Symbol(""),wt=Symbol(""),xt={[Pe]:"Fragment",[He]:"Teleport",[Ne]:"Suspense",[je]:"KeepAlive",[We]:"BaseTransition",[Be]:"openBlock",[ze]:"createBlock",[Ve]:"createElementBlock",[qe]:"createVNode",[$e]:"createElementVNode",[Ue]:"createCommentVNode",[Ze]:"createTextVNode",[Ye]:"createStaticVNode",[Ge]:"resolveComponent",[Je]:"resolveDynamicComponent",[Ke]:"resolveDirective",[Xe]:"resolveFilter",[Qe]:"withDirectives",[et]:"renderList",[tt]:"renderSlot",[nt]:"createSlots",[rt]:"toDisplayString",[ot]:"mergeProps",[it]:"normalizeClass",[st]:"normalizeStyle",[at]:"normalizeProps",[lt]:"guardReactiveProps",[ct]:"toHandlers",[ut]:"camelize",[dt]:"capitalize",[ft]:"toHandlerKey",[ht]:"setBlockTracking",[pt]:"pushScopeId",[mt]:"popScopeId",[vt]:"withCtx",[gt]:"unref",[bt]:"isRef",[yt]:"withMemo",[wt]:"isMemoSame"},kt={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function St(e,t,n,r,o,i,s,a=!1,l=!1,c=!1,u=kt){return e&&(a?(e.helper(Be),e.helper(Xt(e.inSSR,c))):e.helper(Kt(e.inSSR,c)),s&&e.helper(Qe)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:i,directives:s,isBlock:a,disableTracking:l,isComponent:c,loc:u}}function Et(e,t=kt){return{type:17,loc:t,elements:e}}function Ct(e,t=kt){return{type:15,loc:t,properties:e}}function _t(e,t){return{type:16,loc:kt,key:(0,i.HD)(e)?Tt(e,!0):e,value:t}}function Tt(e,t=!1,n=kt,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Ot(e,t=kt){return{type:8,loc:t,children:e}}function Lt(e,t=[],n=kt){return{type:14,loc:n,callee:e,arguments:t}}function Rt(e,t,n=!1,r=!1,o=kt){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function Dt(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:kt}}const At=e=>4===e.type&&e.isStatic,It=(e,t)=>e===t||e===(0,i.rs)(t);function Mt(e){return It(e,"Teleport")?He:It(e,"Suspense")?Ne:It(e,"KeepAlive")?je:It(e,"BaseTransition")?We:void 0}const Ft=/^\d|[^\$\w]/,Pt=e=>!Ft.test(e),Ht=/[A-Za-z_$\xA0-\uFFFF]/,Nt=/[\.\?\w$\xA0-\uFFFF]/,jt=/\s+[.[]\s*|\s*[.[]\s+/g,Wt=e=>{e=e.trim().replace(jt,(e=>e.trim()));let t=0,n=[],r=0,o=0,i=null;for(let s=0;s<e.length;s++){const a=e.charAt(s);switch(t){case 0:if("["===a)n.push(t),t=1,r++;else if("("===a)n.push(t),t=2,o++;else if(!(0===s?Ht:Nt).test(a))return!1;break;case 1:"'"===a||'"'===a||"`"===a?(n.push(t),t=3,i=a):"["===a?r++:"]"===a&&(--r||(t=n.pop()));break;case 2:if("'"===a||'"'===a||"`"===a)n.push(t),t=3,i=a;else if("("===a)o++;else if(")"===a){if(s===e.length-1)return!1;--o||(t=n.pop())}break;case 3:a===i&&(t=n.pop(),i=null)}}return!r&&!o};function Bt(e,t,n){const r={source:e.source.slice(t,t+n),start:zt(e.start,e.source,t),end:e.end};return null!=n&&(r.end=zt(e.start,e.source,t+n)),r}function zt(e,t,n=t.length){return Vt((0,i.l7)({},e),t,n)}function Vt(e,t,n=t.length){let r=0,o=-1;for(let e=0;e<n;e++)10===t.charCodeAt(e)&&(r++,o=e);return e.offset+=n,e.line+=r,e.column=-1===o?e.column+n:n-o,e}function qt(e,t,n=!1){for(let r=0;r<e.props.length;r++){const o=e.props[r];if(7===o.type&&(n||o.exp)&&((0,i.HD)(t)?o.name===t:t.test(o.name)))return o}}function $t(e,t,n=!1,r=!1){for(let o=0;o<e.props.length;o++){const i=e.props[o];if(6===i.type){if(n)continue;if(i.name===t&&(i.value||r))return i}else if("bind"===i.name&&(i.exp||r)&&Ut(i.arg,t))return i}}function Ut(e,t){return!(!e||!At(e)||e.content!==t)}function Zt(e){return 5===e.type||2===e.type}function Yt(e){return 7===e.type&&"slot"===e.name}function Gt(e){return 1===e.type&&3===e.tagType}function Jt(e){return 1===e.type&&2===e.tagType}function Kt(e,t){return e||t?qe:$e}function Xt(e,t){return e||t?ze:Ve}const Qt=new Set([at,lt]);function en(e,t=[]){if(e&&!(0,i.HD)(e)&&14===e.type){const n=e.callee;if(!(0,i.HD)(n)&&Qt.has(n))return en(e.arguments[0],t.concat(e))}return[e,t]}function tn(e,t,n){let r,o,s=13===e.type?e.props:e.arguments[2],a=[];if(s&&!(0,i.HD)(s)&&14===s.type){const e=en(s);s=e[0],a=e[1],o=a[a.length-1]}if(null==s||(0,i.HD)(s))r=Ct([t]);else if(14===s.type){const e=s.arguments[0];(0,i.HD)(e)||15!==e.type?s.callee===ct?r=Lt(n.helper(ot),[Ct([t]),s]):s.arguments.unshift(Ct([t])):e.properties.unshift(t),!r&&(r=s)}else if(15===s.type){let e=!1;if(4===t.key.type){const n=t.key.content;e=s.properties.some((e=>4===e.key.type&&e.key.content===n))}e||s.properties.unshift(t),r=s}else r=Lt(n.helper(ot),[Ct([t]),s]),o&&o.callee===lt&&(o=a[a.length-2]);13===e.type?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function nn(e,t){return`_${t}_${e.replace(/[^\w]/g,((t,n)=>"-"===t?"_":e.charCodeAt(n).toString()))}`}function rn(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Kt(r,e.isComponent)),t(Be),t(Xt(r,e.isComponent)))}function on(e,t){const n=t.options?t.options.compatConfig:t.compatConfig,r=n&&n[e];return"MODE"===e?r||3:r}function sn(e,t){const n=on("MODE",t),r=on(e,t);return 3===n?!0===r:!1!==r}function an(e,t,n,...r){return sn(e,t)}const ln=/&(gt|lt|amp|apos|quot);/g,cn={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},un={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:i.NO,isPreTag:i.NO,isCustomElement:i.NO,decodeEntities:e=>e.replace(ln,((e,t)=>cn[t])),onError:Ie,onWarn:Me,comments:!1};function dn(e,t,n){const r=_n(n),o=r?r.ns:0,s=[];for(;!An(e,t,n);){const a=e.source;let l;if(0===t||1===t)if(!e.inVPre&&Tn(a,e.options.delimiters[0]))l=xn(e,t);else if(0===t&&"<"===a[0])if(1===a.length)Dn(e,5,1);else if("!"===a[1])Tn(a,"\x3c!--")?l=pn(e):Tn(a,"<!DOCTYPE")?l=mn(e):Tn(a,"<![CDATA[")?0!==o?l=hn(e,n):(Dn(e,1),l=mn(e)):(Dn(e,11),l=mn(e));else if("/"===a[1])if(2===a.length)Dn(e,5,2);else{if(">"===a[2]){Dn(e,14,2),On(e,3);continue}if(/[a-z]/i.test(a[2])){Dn(e,23),bn(e,1,r);continue}Dn(e,12,2),l=mn(e)}else/[a-z]/i.test(a[1])?(l=vn(e,n),sn("COMPILER_NATIVE_TEMPLATE",e)&&l&&"template"===l.tag&&!l.props.some((e=>7===e.type&&gn(e.name)))&&(l=l.children)):"?"===a[1]?(Dn(e,21,1),l=mn(e)):Dn(e,12,1);if(l||(l=kn(e,t)),(0,i.kJ)(l))for(let e=0;e<l.length;e++)fn(s,l[e]);else fn(s,l)}let a=!1;if(2!==t&&1!==t){const t="preserve"!==e.options.whitespace;for(let n=0;n<s.length;n++){const r=s[n];if(e.inPre||2!==r.type)3!==r.type||e.options.comments||(a=!0,s[n]=null);else if(/[^\t\r\n\f ]/.test(r.content))t&&(r.content=r.content.replace(/[\t\r\n\f ]+/g," "));else{const e=s[n-1],o=s[n+1];!e||!o||t&&(3===e.type||3===o.type||1===e.type&&1===o.type&&/[\r\n]/.test(r.content))?(a=!0,s[n]=null):r.content=" "}}if(e.inPre&&r&&e.options.isPreTag(r.tag)){const e=s[0];e&&2===e.type&&(e.content=e.content.replace(/^\r?\n/,""))}}return a?s.filter(Boolean):s}function fn(e,t){if(2===t.type){const n=_n(e);if(n&&2===n.type&&n.loc.end.offset===t.loc.start.offset)return n.content+=t.content,n.loc.end=t.loc.end,void(n.loc.source+=t.loc.source)}e.push(t)}function hn(e,t){On(e,9);const n=dn(e,3,t);return 0===e.source.length?Dn(e,6):On(e,3),n}function pn(e){const t=En(e);let n;const r=/--(\!)?>/.exec(e.source);if(r){r.index<=3&&Dn(e,0),r[1]&&Dn(e,10),n=e.source.slice(4,r.index);const t=e.source.slice(0,r.index);let o=1,i=0;for(;-1!==(i=t.indexOf("\x3c!--",o));)On(e,i-o+1),i+4<t.length&&Dn(e,16),o=i+1;On(e,r.index+r[0].length-o+1)}else n=e.source.slice(4),On(e,e.source.length),Dn(e,7);return{type:3,content:n,loc:Cn(e,t)}}function mn(e){const t=En(e),n="?"===e.source[1]?1:2;let r;const o=e.source.indexOf(">");return-1===o?(r=e.source.slice(n),On(e,e.source.length)):(r=e.source.slice(n,o),On(e,o+1)),{type:3,content:r,loc:Cn(e,t)}}function vn(e,t){const n=e.inPre,r=e.inVPre,o=_n(t),i=bn(e,0,o),s=e.inPre&&!n,a=e.inVPre&&!r;if(i.isSelfClosing||e.options.isVoidTag(i.tag))return s&&(e.inPre=!1),a&&(e.inVPre=!1),i;t.push(i);const l=e.options.getTextMode(i,o),c=dn(e,l,t);t.pop();{const t=i.props.find((e=>6===e.type&&"inline-template"===e.name));if(t&&an("COMPILER_INLINE_TEMPLATE",e,t.loc)){const n=Cn(e,i.loc.end);t.value={type:2,content:n.source,loc:n}}}if(i.children=c,In(e.source,i.tag))bn(e,1,o);else if(Dn(e,24,0,i.loc.start),0===e.source.length&&"script"===i.tag.toLowerCase()){const t=c[0];t&&Tn(t.loc.source,"\x3c!--")&&Dn(e,8)}return i.loc=Cn(e,i.loc.start),s&&(e.inPre=!1),a&&(e.inVPre=!1),i}const gn=(0,i.fY)("if,else,else-if,for,slot");function bn(e,t,n){const r=En(e),o=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(e.source),s=o[1],a=e.options.getNamespace(s,n);On(e,o[0].length),Ln(e);const l=En(e),c=e.source;e.options.isPreTag(s)&&(e.inPre=!0);let u=yn(e,t);0===t&&!e.inVPre&&u.some((e=>7===e.type&&"pre"===e.name))&&(e.inVPre=!0,(0,i.l7)(e,l),e.source=c,u=yn(e,t).filter((e=>"v-pre"!==e.name)));let d=!1;if(0===e.source.length?Dn(e,9):(d=Tn(e.source,"/>"),1===t&&d&&Dn(e,4),On(e,d?2:1)),1===t)return;let f=0;return e.inVPre||("slot"===s?f=2:"template"===s?u.some((e=>7===e.type&&gn(e.name)))&&(f=3):function(e,t,n){const r=n.options;if(r.isCustomElement(e))return!1;if("component"===e||/^[A-Z]/.test(e)||Mt(e)||r.isBuiltInComponent&&r.isBuiltInComponent(e)||r.isNativeTag&&!r.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){const r=t[e];if(6===r.type){if("is"===r.name&&r.value){if(r.value.content.startsWith("vue:"))return!0;if(an("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}else{if("is"===r.name)return!0;if("bind"===r.name&&Ut(r.arg,"is")&&an("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}}(s,u,e)&&(f=1)),{type:1,ns:a,tag:s,tagType:f,props:u,isSelfClosing:d,children:[],loc:Cn(e,r),codegenNode:void 0}}function yn(e,t){const n=[],r=new Set;for(;e.source.length>0&&!Tn(e.source,">")&&!Tn(e.source,"/>");){if(Tn(e.source,"/")){Dn(e,22),On(e,1),Ln(e);continue}1===t&&Dn(e,3);const o=wn(e,r);6===o.type&&o.value&&"class"===o.name&&(o.value.content=o.value.content.replace(/\s+/g," ").trim()),0===t&&n.push(o),/^[^\t\r\n\f />]/.test(e.source)&&Dn(e,15),Ln(e)}return n}function wn(e,t){const n=En(e),r=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(e.source)[0];t.has(r)&&Dn(e,2),t.add(r),"="===r[0]&&Dn(e,19);{const t=/["'<]/g;let n;for(;n=t.exec(r);)Dn(e,17,n.index)}let o;On(e,r.length),/^[\t\r\n\f ]*=/.test(e.source)&&(Ln(e),On(e,1),Ln(e),o=function(e){const t=En(e);let n;const r=e.source[0],o='"'===r||"'"===r;if(o){On(e,1);const t=e.source.indexOf(r);-1===t?n=Sn(e,e.source.length,4):(n=Sn(e,t,4),On(e,1))}else{const t=/^[^\t\r\n\f >]+/.exec(e.source);if(!t)return;const r=/["'<=`]/g;let o;for(;o=r.exec(t[0]);)Dn(e,18,o.index);n=Sn(e,t[0].length,4)}return{content:n,isQuoted:o,loc:Cn(e,t)}}(e),o||Dn(e,13));const i=Cn(e,n);if(!e.inVPre&&/^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(r)){const t=/(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(r);let s,a=Tn(r,"."),l=t[1]||(a||Tn(r,":")?"bind":Tn(r,"@")?"on":"slot");if(t[2]){const o="slot"===l,i=r.lastIndexOf(t[2]),a=Cn(e,Rn(e,n,i),Rn(e,n,i+t[2].length+(o&&t[3]||"").length));let c=t[2],u=!0;c.startsWith("[")?(u=!1,c.endsWith("]")?c=c.slice(1,c.length-1):(Dn(e,27),c=c.slice(1))):o&&(c+=t[3]||""),s={type:4,content:c,isStatic:u,constType:u?3:0,loc:a}}if(o&&o.isQuoted){const e=o.loc;e.start.offset++,e.start.column++,e.end=zt(e.start,o.content),e.source=e.source.slice(1,-1)}const c=t[3]?t[3].slice(1).split("."):[];return a&&c.push("prop"),"bind"===l&&s&&c.includes("sync")&&an("COMPILER_V_BIND_SYNC",e,0,s.loc.source)&&(l="model",c.splice(c.indexOf("sync"),1)),{type:7,name:l,exp:o&&{type:4,content:o.content,isStatic:!1,constType:0,loc:o.loc},arg:s,modifiers:c,loc:i}}return!e.inVPre&&Tn(r,"v-")&&Dn(e,26),{type:6,name:r,value:o&&{type:2,content:o.content,loc:o.loc},loc:i}}function xn(e,t){const[n,r]=e.options.delimiters,o=e.source.indexOf(r,n.length);if(-1===o)return void Dn(e,25);const i=En(e);On(e,n.length);const s=En(e),a=En(e),l=o-n.length,c=e.source.slice(0,l),u=Sn(e,l,t),d=u.trim(),f=u.indexOf(d);return f>0&&Vt(s,c,f),Vt(a,c,l-(u.length-d.length-f)),On(e,r.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:d,loc:Cn(e,s,a)},loc:Cn(e,i)}}function kn(e,t){const n=3===t?["]]>"]:["<",e.options.delimiters[0]];let r=e.source.length;for(let t=0;t<n.length;t++){const o=e.source.indexOf(n[t],1);-1!==o&&r>o&&(r=o)}const o=En(e);return{type:2,content:Sn(e,r,t),loc:Cn(e,o)}}function Sn(e,t,n){const r=e.source.slice(0,t);return On(e,t),2!==n&&3!==n&&r.includes("&")?e.options.decodeEntities(r,4===n):r}function En(e){const{column:t,line:n,offset:r}=e;return{column:t,line:n,offset:r}}function Cn(e,t,n){return{start:t,end:n=n||En(e),source:e.originalSource.slice(t.offset,n.offset)}}function _n(e){return e[e.length-1]}function Tn(e,t){return e.startsWith(t)}function On(e,t){const{source:n}=e;Vt(e,n,t),e.source=n.slice(t)}function Ln(e){const t=/^[\t\r\n\f ]+/.exec(e.source);t&&On(e,t[0].length)}function Rn(e,t,n){return zt(t,e.originalSource.slice(t.offset,n),n)}function Dn(e,t,n,r=En(e)){n&&(r.offset+=n,r.column+=n),e.options.onError(Fe(t,{start:r,end:r,source:""}))}function An(e,t,n){const r=e.source;switch(t){case 0:if(Tn(r,"</"))for(let e=n.length-1;e>=0;--e)if(In(r,n[e].tag))return!0;break;case 1:case 2:{const e=_n(n);if(e&&In(r,e.tag))return!0;break}case 3:if(Tn(r,"]]>"))return!0}return!r}function In(e,t){return Tn(e,"</")&&e.slice(2,2+t.length).toLowerCase()===t.toLowerCase()&&/[\t\r\n\f />]/.test(e[2+t.length]||">")}function Mn(e,t){Pn(e,t,Fn(e,e.children[0]))}function Fn(e,t){const{children:n}=e;return 1===n.length&&1===t.type&&!Jt(t)}function Pn(e,t,n=!1){const{children:r}=e,o=r.length;let s=0;for(let e=0;e<r.length;e++){const o=r[e];if(1===o.type&&0===o.tagType){const e=n?0:Hn(o,t);if(e>0){if(e>=2){o.codegenNode.patchFlag="-1",o.codegenNode=t.hoist(o.codegenNode),s++;continue}}else{const e=o.codegenNode;if(13===e.type){const n=zn(e);if((!n||512===n||1===n)&&Wn(o,t)>=2){const n=Bn(o);n&&(e.props=t.hoist(n))}e.dynamicProps&&(e.dynamicProps=t.hoist(e.dynamicProps))}}}else 12===o.type&&Hn(o.content,t)>=2&&(o.codegenNode=t.hoist(o.codegenNode),s++);if(1===o.type){const e=1===o.tagType;e&&t.scopes.vSlot++,Pn(o,t),e&&t.scopes.vSlot--}else if(11===o.type)Pn(o,t,1===o.children.length);else if(9===o.type)for(let e=0;e<o.branches.length;e++)Pn(o.branches[e],t,1===o.branches[e].children.length)}s&&t.transformHoist&&t.transformHoist(r,t,e),s&&s===o&&1===e.type&&0===e.tagType&&e.codegenNode&&13===e.codegenNode.type&&(0,i.kJ)(e.codegenNode.children)&&(e.codegenNode.children=t.hoist(Et(e.codegenNode.children)))}function Hn(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;const r=n.get(e);if(void 0!==r)return r;const o=e.codegenNode;if(13!==o.type)return 0;if(o.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag)return 0;if(zn(o))return n.set(e,0),0;{let r=3;const i=Wn(e,t);if(0===i)return n.set(e,0),0;i<r&&(r=i);for(let o=0;o<e.children.length;o++){const i=Hn(e.children[o],t);if(0===i)return n.set(e,0),0;i<r&&(r=i)}if(r>1)for(let o=0;o<e.props.length;o++){const i=e.props[o];if(7===i.type&&"bind"===i.name&&i.exp){const o=Hn(i.exp,t);if(0===o)return n.set(e,0),0;o<r&&(r=o)}}return o.isBlock&&(t.removeHelper(Be),t.removeHelper(Xt(t.inSSR,o.isComponent)),o.isBlock=!1,t.helper(Kt(t.inSSR,o.isComponent))),n.set(e,r),r}case 2:case 3:return 3;case 9:case 11:case 10:default:return 0;case 5:case 12:return Hn(e.content,t);case 4:return e.constType;case 8:let s=3;for(let n=0;n<e.children.length;n++){const r=e.children[n];if((0,i.HD)(r)||(0,i.yk)(r))continue;const o=Hn(r,t);if(0===o)return 0;o<s&&(s=o)}return s}}const Nn=new Set([it,st,at,lt]);function jn(e,t){if(14===e.type&&!(0,i.HD)(e.callee)&&Nn.has(e.callee)){const n=e.arguments[0];if(4===n.type)return Hn(n,t);if(14===n.type)return jn(n,t)}return 0}function Wn(e,t){let n=3;const r=Bn(e);if(r&&15===r.type){const{properties:e}=r;for(let r=0;r<e.length;r++){const{key:o,value:i}=e[r],s=Hn(o,t);if(0===s)return s;let a;if(s<n&&(n=s),a=4===i.type?Hn(i,t):14===i.type?jn(i,t):0,0===a)return a;a<n&&(n=a)}}return n}function Bn(e){const t=e.codegenNode;if(13===t.type)return t.props}function zn(e){const t=e.patchFlag;return t?parseInt(t,10):void 0}function Vn(e,t){const n=function(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:r=!1,cacheHandlers:o=!1,nodeTransforms:s=[],directiveTransforms:a={},transformHoist:l=null,isBuiltInComponent:c=i.dG,isCustomElement:u=i.dG,expressionPlugins:d=[],scopeId:f=null,slotted:h=!0,ssr:p=!1,inSSR:m=!1,ssrCssVars:v="",bindingMetadata:g=i.kT,inline:b=!1,isTS:y=!1,onError:w=Ie,onWarn:x=Me,compatConfig:k}){const S=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),E={selfName:S&&(0,i.kC)((0,i._A)(S[1])),prefixIdentifiers:n,hoistStatic:r,cacheHandlers:o,nodeTransforms:s,directiveTransforms:a,transformHoist:l,isBuiltInComponent:c,isCustomElement:u,expressionPlugins:d,scopeId:f,slotted:h,ssr:p,inSSR:m,ssrCssVars:v,bindingMetadata:g,inline:b,isTS:y,onError:w,onWarn:x,compatConfig:k,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new Map,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){const t=E.helpers.get(e)||0;return E.helpers.set(e,t+1),e},removeHelper(e){const t=E.helpers.get(e);if(t){const n=t-1;n?E.helpers.set(e,n):E.helpers.delete(e)}},helperString:e=>`_${xt[E.helper(e)]}`,replaceNode(e){E.parent.children[E.childIndex]=E.currentNode=e},removeNode(e){const t=E.parent.children,n=e?t.indexOf(e):E.currentNode?E.childIndex:-1;e&&e!==E.currentNode?E.childIndex>n&&(E.childIndex--,E.onNodeRemoved()):(E.currentNode=null,E.onNodeRemoved()),E.parent.children.splice(n,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){(0,i.HD)(e)&&(e=Tt(e)),E.hoists.push(e);const t=Tt(`_hoisted_${E.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:kt}}(E.cached++,e,t)};return E.filters=new Set,E}(e,t);qn(e,n),t.hoistStatic&&Mn(e,n),t.ssr||function(e,t){const{helper:n}=t,{children:r}=e;if(1===r.length){const n=r[0];if(Fn(e,n)&&n.codegenNode){const r=n.codegenNode;13===r.type&&rn(r,t),e.codegenNode=r}else e.codegenNode=n}else if(r.length>1){let r=64;i.m[64],e.codegenNode=St(t,n(Pe),void 0,e.children,r+"",void 0,void 0,!0,void 0,!1)}}(e,n),e.helpers=[...n.helpers.keys()],e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.filters=[...n.filters]}function qn(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let o=0;o<n.length;o++){const s=n[o](e,t);if(s&&((0,i.kJ)(s)?r.push(...s):r.push(s)),!t.currentNode)return;e=t.currentNode}switch(e.type){case 3:t.ssr||t.helper(Ue);break;case 5:t.ssr||t.helper(rt);break;case 9:for(let n=0;n<e.branches.length;n++)qn(e.branches[n],t);break;case 10:case 11:case 1:case 0:!function(e,t){let n=0;const r=()=>{n--};for(;n<e.children.length;n++){const o=e.children[n];(0,i.HD)(o)||(t.parent=e,t.childIndex=n,t.onNodeRemoved=r,qn(o,t))}}(e,t)}t.currentNode=e;let o=r.length;for(;o--;)r[o]()}function $n(e,t){const n=(0,i.HD)(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(1===e.type){const{props:o}=e;if(3===e.tagType&&o.some(Yt))return;const i=[];for(let s=0;s<o.length;s++){const a=o[s];if(7===a.type&&n(a.name)){o.splice(s,1),s--;const n=t(e,a,r);n&&i.push(n)}}return i}}}const Un="/*#__PURE__*/";function Zn(e,t,{helper:n,push:r,newline:o,isTS:i}){const s=n("filter"===t?Xe:"component"===t?Ge:Ke);for(let n=0;n<e.length;n++){let a=e[n];const l=a.endsWith("__self");l&&(a=a.slice(0,-6)),r(`const ${nn(a,t)} = ${s}(${JSON.stringify(a)}${l?", true":""})${i?"!":""}`),n<e.length-1&&o()}}function Yn(e,t){const n=e.length>3||!1;t.push("["),n&&t.indent(),Gn(e,t,n),n&&t.deindent(),t.push("]")}function Gn(e,t,n=!1,r=!0){const{push:o,newline:s}=t;for(let a=0;a<e.length;a++){const l=e[a];(0,i.HD)(l)?o(l):(0,i.kJ)(l)?Yn(l,t):Jn(l,t),a<e.length-1&&(n?(r&&o(","),s()):r&&o(", "))}}function Jn(e,t){if((0,i.HD)(e))t.push(e);else if((0,i.yk)(e))t.push(t.helper(e));else switch(e.type){case 1:case 9:case 11:case 12:Jn(e.codegenNode,t);break;case 2:!function(e,t){t.push(JSON.stringify(e.content),e)}(e,t);break;case 4:Kn(e,t);break;case 5:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Un),n(`${r(rt)}(`),Jn(e.content,t),n(")")}(e,t);break;case 8:Xn(e,t);break;case 3:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Un),n(`${r(Ue)}(${JSON.stringify(e.content)})`,e)}(e,t);break;case 13:!function(e,t){const{push:n,helper:r,pure:o}=t,{tag:i,props:s,children:a,patchFlag:l,dynamicProps:c,directives:u,isBlock:d,disableTracking:f,isComponent:h}=e;u&&n(r(Qe)+"("),d&&n(`(${r(Be)}(${f?"true":""}), `),o&&n(Un);n(r(d?Xt(t.inSSR,h):Kt(t.inSSR,h))+"(",e),Gn(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map((e=>e||"null"))}([i,s,a,l,c]),t),n(")"),d&&n(")"),u&&(n(", "),Jn(u,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:r,pure:o}=t,s=(0,i.HD)(e.callee)?e.callee:r(e.callee);o&&n(Un),n(s+"(",e),Gn(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:r,deindent:o,newline:i}=t,{properties:s}=e;if(!s.length)return void n("{}",e);const a=s.length>1||!1;n(a?"{":"{ "),a&&r();for(let e=0;e<s.length;e++){const{key:r,value:o}=s[e];Qn(r,t),n(": "),Jn(o,t),e<s.length-1&&(n(","),i())}a&&o(),n(a?"}":" }")}(e,t);break;case 17:!function(e,t){Yn(e.elements,t)}(e,t);break;case 18:!function(e,t){const{push:n,indent:r,deindent:o}=t,{params:s,returns:a,body:l,newline:c,isSlot:u}=e;u&&n(`_${xt[vt]}(`),n("(",e),(0,i.kJ)(s)?Gn(s,t):s&&Jn(s,t),n(") => "),(c||l)&&(n("{"),r()),a?(c&&n("return "),(0,i.kJ)(a)?Yn(a,t):Jn(a,t)):l&&Jn(l,t),(c||l)&&(o(),n("}")),u&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}(e,t);break;case 19:!function(e,t){const{test:n,consequent:r,alternate:o,newline:i}=e,{push:s,indent:a,deindent:l,newline:c}=t;if(4===n.type){const e=!Pt(n.content);e&&s("("),Kn(n,t),e&&s(")")}else s("("),Jn(n,t),s(")");i&&a(),t.indentLevel++,i||s(" "),s("? "),Jn(r,t),t.indentLevel--,i&&c(),i||s(" "),s(": ");const u=19===o.type;u||t.indentLevel++,Jn(o,t),u||t.indentLevel--,i&&l(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:r,indent:o,deindent:i,newline:s}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(o(),n(`${r(ht)}(-1),`),s()),n(`_cache[${e.index}] = `),Jn(e.value,t),e.isVNode&&(n(","),s(),n(`${r(ht)}(1),`),s(),n(`_cache[${e.index}]`),i()),n(")")}(e,t);break;case 21:Gn(e.body,t,!0,!1)}}function Kn(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,e)}function Xn(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];(0,i.HD)(r)?t.push(r):Jn(r,t)}}function Qn(e,t){const{push:n}=t;8===e.type?(n("["),Xn(e,t),n("]")):e.isStatic?n(Pt(e.content)?e.content:JSON.stringify(e.content),e):n(`[${e.content}]`,e)}new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments,typeof,void".split(",").join("\\b|\\b")+"\\b");const er=$n(/^(if|else|else-if)$/,((e,t,n)=>function(e,t,n,r){if(!("else"===t.name||t.exp&&t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(Fe(28,t.loc)),t.exp=Tt("true",!1,r)}if("if"===t.name){const o=tr(e,t),i={type:9,loc:e.loc,branches:[o]};if(n.replaceNode(i),r)return r(i,o,!0)}else{const o=n.parent.children;let i=o.indexOf(e);for(;i-- >=-1;){const s=o[i];if(!s||2!==s.type||s.content.trim().length){if(s&&9===s.type){"else-if"===t.name&&void 0===s.branches[s.branches.length-1].condition&&n.onError(Fe(30,e.loc)),n.removeNode();const o=tr(e,t);s.branches.push(o);const i=r&&r(s,o,!1);qn(o,n),i&&i(),n.currentNode=null}else n.onError(Fe(30,e.loc));break}n.removeNode(s)}}}(e,t,n,((e,t,r)=>{const o=n.parent.children;let i=o.indexOf(e),s=0;for(;i-- >=0;){const e=o[i];e&&9===e.type&&(s+=e.branches.length)}return()=>{if(r)e.codegenNode=nr(t,s,n);else{const r=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode);r.alternate=nr(t,s+e.branches.length-1,n)}}}))));function tr(e,t){return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:3!==e.tagType||qt(e,"for")?[e]:e.children,userKey:$t(e,"key")}}function nr(e,t,n){return e.condition?Dt(e.condition,rr(e,t,n),Lt(n.helper(Ue),['""',"true"])):rr(e,t,n)}function rr(e,t,n){const{helper:r}=n,o=_t("key",Tt(`${t}`,!1,kt,2)),{children:s}=e,a=s[0];if(1!==s.length||1!==a.type){if(1===s.length&&11===a.type){const e=a.codegenNode;return tn(e,o,n),e}{let t=64;return i.m[64],St(n,r(Pe),Ct([o]),s,t+"",void 0,void 0,!0,!1,!1,e.loc)}}{const e=a.codegenNode,t=14===(l=e).type&&l.callee===yt?l.arguments[1].returns:l;return 13===t.type&&rn(t,n),tn(t,o,n),e}var l}const or=$n("for",((e,t,n)=>{const{helper:r,removeHelper:o}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(Fe(31,t.loc));const o=lr(t.exp);if(!o)return void n.onError(Fe(32,t.loc));const{addIdentifiers:i,removeIdentifiers:s,scopes:a}=n,{source:l,value:c,key:u,index:d}=o,f={type:11,loc:t.loc,source:l,valueAlias:c,keyAlias:u,objectIndexAlias:d,parseResult:o,children:Gt(e)?e.children:[e]};n.replaceNode(f),a.vFor++;const h=r&&r(f);return()=>{a.vFor--,h&&h()}}(e,t,n,(t=>{const i=Lt(r(et),[t.source]),s=Gt(e),a=qt(e,"memo"),l=$t(e,"key"),c=l&&(6===l.type?Tt(l.value.content,!0):l.exp),u=l?_t("key",c):null,d=4===t.source.type&&t.source.constType>0,f=d?64:l?128:256;return t.codegenNode=St(n,r(Pe),void 0,i,f+"",void 0,void 0,!0,!d,!1,e.loc),()=>{let l;const{children:f}=t,h=1!==f.length||1!==f[0].type,p=Jt(e)?e:s&&1===e.children.length&&Jt(e.children[0])?e.children[0]:null;if(p?(l=p.codegenNode,s&&u&&tn(l,u,n)):h?l=St(n,r(Pe),u?Ct([u]):void 0,e.children,"64",void 0,void 0,!0,void 0,!1):(l=f[0].codegenNode,s&&u&&tn(l,u,n),l.isBlock!==!d&&(l.isBlock?(o(Be),o(Xt(n.inSSR,l.isComponent))):o(Kt(n.inSSR,l.isComponent))),l.isBlock=!d,l.isBlock?(r(Be),r(Xt(n.inSSR,l.isComponent))):r(Kt(n.inSSR,l.isComponent))),a){const e=Rt(ur(t.parseResult,[Tt("_cached")]));e.body={type:21,body:[Ot(["const _memo = (",a.exp,")"]),Ot(["if (_cached",...c?[" && _cached.key === ",c]:[],` && ${n.helperString(wt)}(_cached, _memo)) return _cached`]),Ot(["const _item = ",l]),Tt("_item.memo = _memo"),Tt("return _item")],loc:kt},i.arguments.push(e,Tt("_cache"),Tt(String(n.cached++)))}else i.arguments.push(Rt(ur(t.parseResult),l,!0))}}))})),ir=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,sr=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,ar=/^\(|\)$/g;function lr(e,t){const n=e.loc,r=e.content,o=r.match(ir);if(!o)return;const[,i,s]=o,a={source:cr(n,s.trim(),r.indexOf(s,i.length)),value:void 0,key:void 0,index:void 0};let l=i.trim().replace(ar,"").trim();const c=i.indexOf(l),u=l.match(sr);if(u){l=l.replace(sr,"").trim();const e=u[1].trim();let t;if(e&&(t=r.indexOf(e,c+l.length),a.key=cr(n,e,t)),u[2]){const o=u[2].trim();o&&(a.index=cr(n,o,r.indexOf(o,a.key?t+e.length:c+l.length)))}}return l&&(a.value=cr(n,l,c)),a}function cr(e,t,n){return Tt(t,!1,Bt(e,n,t.length))}function ur({value:e,key:t,index:n},r=[]){return function(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map(((e,t)=>e||Tt("_".repeat(t+1),!1)))}([e,t,n,...r])}const dr=Tt("undefined",!1),fr=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=qt(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},hr=(e,t,n)=>Rt(e,t,!1,!0,t.length?t[0].loc:n);function pr(e,t,n=hr){t.helper(vt);const{children:r,loc:o}=e,i=[],s=[];let a=t.scopes.vSlot>0||t.scopes.vFor>0;const l=qt(e,"slot",!0);if(l){const{arg:e,exp:t}=l;e&&!At(e)&&(a=!0),i.push(_t(e||Tt("default",!0),n(t,r,o)))}let c=!1,u=!1;const d=[],f=new Set;for(let e=0;e<r.length;e++){const o=r[e];let h;if(!Gt(o)||!(h=qt(o,"slot",!0))){3!==o.type&&d.push(o);continue}if(l){t.onError(Fe(37,h.loc));break}c=!0;const{children:p,loc:m}=o,{arg:v=Tt("default",!0),exp:g,loc:b}=h;let y;At(v)?y=v?v.content:"default":a=!0;const w=n(g,p,m);let x,k,S;if(x=qt(o,"if"))a=!0,s.push(Dt(x.exp,mr(v,w),dr));else if(k=qt(o,/^else(-if)?$/,!0)){let n,o=e;for(;o--&&(n=r[o],3===n.type););if(n&&Gt(n)&&qt(n,"if")){r.splice(e,1),e--;let t=s[s.length-1];for(;19===t.alternate.type;)t=t.alternate;t.alternate=k.exp?Dt(k.exp,mr(v,w),dr):mr(v,w)}else t.onError(Fe(30,k.loc))}else if(S=qt(o,"for")){a=!0;const e=S.parseResult||lr(S.exp);e?s.push(Lt(t.helper(et),[e.source,Rt(ur(e),mr(v,w),!0)])):t.onError(Fe(32,S.loc))}else{if(y){if(f.has(y)){t.onError(Fe(38,b));continue}f.add(y),"default"===y&&(u=!0)}i.push(_t(v,w))}}if(!l){const e=(e,r)=>{const i=n(e,r,o);return t.compatConfig&&(i.isNonScopedSlot=!0),_t("default",i)};c?d.length&&d.some((e=>gr(e)))&&(u?t.onError(Fe(39,d[0].loc)):i.push(e(void 0,d))):i.push(e(void 0,r))}const h=a?2:vr(e.children)?3:1;let p=Ct(i.concat(_t("_",Tt(h+"",!1))),o);return s.length&&(p=Lt(t.helper(nt),[p,Et(s)])),{slots:p,hasDynamicSlots:a}}function mr(e,t){return Ct([_t("name",e),_t("fn",t)])}function vr(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.type){case 1:if(2===n.tagType||vr(n.children))return!0;break;case 9:if(vr(n.branches))return!0;break;case 10:case 11:if(vr(n.children))return!0}}return!1}function gr(e){return 2!==e.type&&12!==e.type||(2===e.type?!!e.content.trim():gr(e.content))}const br=new WeakMap,yr=(e,t)=>function(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:r}=e,o=1===e.tagType;let s,a,l,c,u,d,f=o?function(e,t,n=!1){let{tag:r}=e;const o=Sr(r),i=$t(e,"is");if(i)if(o||sn("COMPILER_IS_ON_ELEMENT",t)){const e=6===i.type?i.value&&Tt(i.value.content,!0):i.exp;if(e)return Lt(t.helper(Je),[e])}else 6===i.type&&i.value.content.startsWith("vue:")&&(r=i.value.content.slice(4));const s=!o&&qt(e,"is");if(s&&s.exp)return Lt(t.helper(Je),[s.exp]);const a=Mt(r)||t.isBuiltInComponent(r);return a?(n||t.helper(a),a):(t.helper(Ge),t.components.add(r),nn(r,"component"))}(e,t):`"${n}"`,h=0,p=(0,i.Kn)(f)&&f.callee===Je||f===He||f===Ne||!o&&("svg"===n||"foreignObject"===n);if(r.length>0){const n=wr(e,t);s=n.props,h=n.patchFlag,u=n.dynamicPropNames;const r=n.directives;d=r&&r.length?Et(r.map((e=>function(e,t){const n=[],r=br.get(e);r?n.push(t.helperString(r)):(t.helper(Ke),t.directives.add(e.name),n.push(nn(e.name,"directive")));const{loc:o}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push("void 0"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=Tt("true",!1,o);n.push(Ct(e.modifiers.map((e=>_t(e,t))),o))}return Et(n,e.loc)}(e,t)))):void 0,n.shouldUseBlock&&(p=!0)}if(e.children.length>0)if(f===je&&(p=!0,h|=1024),o&&f!==He&&f!==je){const{slots:n,hasDynamicSlots:r}=pr(e,t);a=n,r&&(h|=1024)}else if(1===e.children.length&&f!==He){const n=e.children[0],r=n.type,o=5===r||8===r;o&&0===Hn(n,t)&&(h|=1),a=o||2===r?n:e.children}else a=e.children;0!==h&&(l=String(h),u&&u.length&&(c=function(e){let t="[";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=", ");return t+"]"}(u))),e.codegenNode=St(t,f,s,a,l,c,d,!!p,!1,o,e.loc)};function wr(e,t,n=e.props,r=!1){const{tag:o,loc:s,children:a}=e,l=1===e.tagType;let c=[];const u=[],d=[],f=a.length>0;let h=!1,p=0,m=!1,v=!1,g=!1,b=!1,y=!1,w=!1;const x=[],k=({key:e,value:n})=>{if(At(e)){const r=e.content,o=(0,i.F7)(r);if(l||!o||"onclick"===r.toLowerCase()||"onUpdate:modelValue"===r||(0,i.Gg)(r)||(b=!0),o&&(0,i.Gg)(r)&&(w=!0),20===n.type||(4===n.type||8===n.type)&&Hn(n,t)>0)return;"ref"===r?m=!0:"class"===r?v=!0:"style"===r?g=!0:"key"===r||x.includes(r)||x.push(r),!l||"class"!==r&&"style"!==r||x.includes(r)||x.push(r)}else y=!0};for(let a=0;a<n.length;a++){const p=n[a];if(6===p.type){const{loc:e,name:n,value:r}=p;let i=!0;if("ref"===n&&(m=!0,t.scopes.vFor>0&&c.push(_t(Tt("ref_for",!0),Tt("true")))),"is"===n&&(Sr(o)||r&&r.content.startsWith("vue:")||sn("COMPILER_IS_ON_ELEMENT",t)))continue;c.push(_t(Tt(n,!0,Bt(e,0,n.length)),Tt(r?r.content:"",i,r?r.loc:e)))}else{const{name:n,arg:a,exp:m,loc:v}=p,g="bind"===n,b="on"===n;if("slot"===n){l||t.onError(Fe(40,v));continue}if("once"===n||"memo"===n)continue;if("is"===n||g&&Ut(a,"is")&&(Sr(o)||sn("COMPILER_IS_ON_ELEMENT",t)))continue;if(b&&r)continue;if((g&&Ut(a,"key")||b&&f&&Ut(a,"vue:before-update"))&&(h=!0),g&&Ut(a,"ref")&&t.scopes.vFor>0&&c.push(_t(Tt("ref_for",!0),Tt("true"))),!a&&(g||b)){if(y=!0,m)if(c.length&&(u.push(Ct(xr(c),s)),c=[]),g){if(sn("COMPILER_V_BIND_OBJECT_ORDER",t)){u.unshift(m);continue}u.push(m)}else u.push({type:14,loc:v,callee:t.helper(ct),arguments:[m]});else t.onError(Fe(g?34:35,v));continue}const w=t.directiveTransforms[n];if(w){const{props:n,needRuntime:o}=w(p,e,t);!r&&n.forEach(k),c.push(...n),o&&(d.push(p),(0,i.yk)(o)&&br.set(p,o))}else(0,i.wh)(n)||(d.push(p),f&&(h=!0))}}let S;if(u.length?(c.length&&u.push(Ct(xr(c),s)),S=u.length>1?Lt(t.helper(ot),u,s):u[0]):c.length&&(S=Ct(xr(c),s)),y?p|=16:(v&&!l&&(p|=2),g&&!l&&(p|=4),x.length&&(p|=8),b&&(p|=32)),h||0!==p&&32!==p||!(m||w||d.length>0)||(p|=512),!t.inSSR&&S)switch(S.type){case 15:let e=-1,n=-1,r=!1;for(let t=0;t<S.properties.length;t++){const o=S.properties[t].key;At(o)?"class"===o.content?e=t:"style"===o.content&&(n=t):o.isHandlerKey||(r=!0)}const o=S.properties[e],i=S.properties[n];r?S=Lt(t.helper(at),[S]):(o&&!At(o.value)&&(o.value=Lt(t.helper(it),[o.value])),!i||At(i.value)||!g&&17!==i.value.type||(i.value=Lt(t.helper(st),[i.value])));break;case 14:break;default:S=Lt(t.helper(at),[Lt(t.helper(lt),[S])])}return{props:S,directives:d,patchFlag:p,dynamicPropNames:x,shouldUseBlock:h}}function xr(e){const t=new Map,n=[];for(let r=0;r<e.length;r++){const o=e[r];if(8===o.key.type||!o.key.isStatic){n.push(o);continue}const s=o.key.content,a=t.get(s);a?("style"===s||"class"===s||(0,i.F7)(s))&&kr(a,o):(t.set(s,o),n.push(o))}return n}function kr(e,t){17===e.value.type?e.value.elements.push(t.value):e.value=Et([e.value,t.value],e.loc)}function Sr(e){return"component"===e||"Component"===e}const Er=/-(\w)/g,Cr=(e=>{const t=Object.create(null);return e=>t[e]||(t[e]=(e=>e.replace(Er,((e,t)=>t?t.toUpperCase():"")))(e))})(),_r=(e,t)=>{if(Jt(e)){const{children:n,loc:r}=e,{slotName:o,slotProps:i}=function(e,t){let n,r='"default"';const o=[];for(let t=0;t<e.props.length;t++){const n=e.props[t];6===n.type?n.value&&("name"===n.name?r=JSON.stringify(n.value.content):(n.name=Cr(n.name),o.push(n))):"bind"===n.name&&Ut(n.arg,"name")?n.exp&&(r=n.exp):("bind"===n.name&&n.arg&&At(n.arg)&&(n.arg.content=Cr(n.arg.content)),o.push(n))}if(o.length>0){const{props:r,directives:i}=wr(e,t,o);n=r,i.length&&t.onError(Fe(36,i[0].loc))}return{slotName:r,slotProps:n}}(e,t),s=[t.prefixIdentifiers?"_ctx.$slots":"$slots",o,"{}","undefined","true"];let a=2;i&&(s[2]=i,a=3),n.length&&(s[3]=Rt([],n,!1,!1,r),a=4),t.scopeId&&!t.slotted&&(a=5),s.splice(a),e.codegenNode=Lt(t.helper(tt),s,r)}},Tr=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,Or=(e,t,n,r)=>{const{loc:o,modifiers:s,arg:a}=e;let l;if(e.exp||s.length||n.onError(Fe(35,o)),4===a.type)if(a.isStatic){let e=a.content;e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`),l=Tt((0,i.hR)((0,i._A)(e)),!0,a.loc)}else l=Ot([`${n.helperString(ft)}(`,a,")"]);else l=a,l.children.unshift(`${n.helperString(ft)}(`),l.children.push(")");let c=e.exp;c&&!c.content.trim()&&(c=void 0);let u=n.cacheHandlers&&!c&&!n.inVOnce;if(c){const e=Wt(c.content),t=!(e||Tr.test(c.content)),n=c.content.includes(";");(t||u&&e)&&(c=Ot([`${t?"$event":"(...args)"} => ${n?"{":"("}`,c,n?"}":")"]))}let d={props:[_t(l,c||Tt("() => {}",!1,o))]};return r&&(d=r(d)),u&&(d.props[0].value=n.cache(d.props[0].value)),d.props.forEach((e=>e.key.isHandlerKey=!0)),d},Lr=(e,t,n)=>{const{exp:r,modifiers:o,loc:s}=e,a=e.arg;return 4!==a.type?(a.children.unshift("("),a.children.push(') || ""')):a.isStatic||(a.content=`${a.content} || ""`),o.includes("camel")&&(4===a.type?a.isStatic?a.content=(0,i._A)(a.content):a.content=`${n.helperString(ut)}(${a.content})`:(a.children.unshift(`${n.helperString(ut)}(`),a.children.push(")"))),n.inSSR||(o.includes("prop")&&Rr(a,"."),o.includes("attr")&&Rr(a,"^")),!r||4===r.type&&!r.content.trim()?(n.onError(Fe(34,s)),{props:[_t(a,Tt("",!0,s))]}):{props:[_t(a,r)]}},Rr=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},Dr=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let r,o=!1;for(let e=0;e<n.length;e++){const t=n[e];if(Zt(t)){o=!0;for(let o=e+1;o<n.length;o++){const i=n[o];if(!Zt(i)){r=void 0;break}r||(r=n[e]={type:8,loc:t.loc,children:[t]}),r.children.push(" + ",i),n.splice(o,1),o--}}}if(o&&(1!==n.length||0!==e.type&&(1!==e.type||0!==e.tagType||e.props.find((e=>7===e.type&&!t.directiveTransforms[e.name]))||"template"===e.tag)))for(let e=0;e<n.length;e++){const r=n[e];if(Zt(r)||8===r.type){const o=[];2===r.type&&" "===r.content||o.push(r),t.ssr||0!==Hn(r,t)||o.push("1"),n[e]={type:12,content:r,loc:r.loc,codegenNode:Lt(t.helper(Ze),o)}}}}},Ar=new WeakSet,Ir=(e,t)=>{if(1===e.type&&qt(e,"once",!0)){if(Ar.has(e)||t.inVOnce)return;return Ar.add(e),t.inVOnce=!0,t.helper(ht),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},Mr=(e,t,n)=>{const{exp:r,arg:o}=e;if(!r)return n.onError(Fe(41,e.loc)),Fr();const i=r.loc.source,s=4===r.type?r.content:i;if(n.bindingMetadata[i],!s.trim()||!Wt(s))return n.onError(Fe(42,r.loc)),Fr();const a=o||Tt("modelValue",!0),l=o?At(o)?`onUpdate:${o.content}`:Ot(['"onUpdate:" + ',o]):"onUpdate:modelValue";let c;c=Ot([(n.isTS?"($event: any)":"$event")+" => ((",r,") = $event)"]);const u=[_t(a,e.exp),_t(l,c)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(Pt(e)?e:JSON.stringify(e))+": true")).join(", "),n=o?At(o)?`${o.content}Modifiers`:Ot([o,' + "Modifiers"']):"modelModifiers";u.push(_t(n,Tt(`{ ${t} }`,!1,e.loc,2)))}return Fr(u)};function Fr(e=[]){return{props:e}}const Pr=/[\w).+\-_$\]]/,Hr=(e,t)=>{sn("COMPILER_FILTER",t)&&(5===e.type&&Nr(e.content,t),1===e.type&&e.props.forEach((e=>{7===e.type&&"for"!==e.name&&e.exp&&Nr(e.exp,t)})))};function Nr(e,t){if(4===e.type)jr(e,t);else for(let n=0;n<e.children.length;n++){const r=e.children[n];"object"==typeof r&&(4===r.type?jr(r,t):8===r.type?Nr(e,t):5===r.type&&Nr(r.content,t))}}function jr(e,t){const n=e.content;let r,o,i,s,a=!1,l=!1,c=!1,u=!1,d=0,f=0,h=0,p=0,m=[];for(i=0;i<n.length;i++)if(o=r,r=n.charCodeAt(i),a)39===r&&92!==o&&(a=!1);else if(l)34===r&&92!==o&&(l=!1);else if(c)96===r&&92!==o&&(c=!1);else if(u)47===r&&92!==o&&(u=!1);else if(124!==r||124===n.charCodeAt(i+1)||124===n.charCodeAt(i-1)||d||f||h){switch(r){case 34:l=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:h++;break;case 41:h--;break;case 91:f++;break;case 93:f--;break;case 123:d++;break;case 125:d--}if(47===r){let e,t=i-1;for(;t>=0&&(e=n.charAt(t)," "===e);t--);e&&Pr.test(e)||(u=!0)}}else void 0===s?(p=i+1,s=n.slice(0,i).trim()):v();function v(){m.push(n.slice(p,i).trim()),p=i+1}if(void 0===s?s=n.slice(0,i).trim():0!==p&&v(),m.length){for(i=0;i<m.length;i++)s=Wr(s,m[i],t);e.content=s}}function Wr(e,t,n){n.helper(Xe);const r=t.indexOf("(");if(r<0)return n.filters.add(t),`${nn(t,"filter")}(${e})`;{const o=t.slice(0,r),i=t.slice(r+1);return n.filters.add(o),`${nn(o,"filter")}(${e}${")"!==i?","+i:i}`}}const Br=new WeakSet,zr=(e,t)=>{if(1===e.type){const n=qt(e,"memo");if(!n||Br.has(e))return;return Br.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&rn(r,t),e.codegenNode=Lt(t.helper(yt),[n.exp,Rt(void 0,r),"_cache",String(t.cached++)]))}}};function Vr(e,t={}){const n=t.onError||Ie,r="module"===t.mode;!0===t.prefixIdentifiers?n(Fe(46)):r&&n(Fe(47)),t.cacheHandlers&&n(Fe(48)),t.scopeId&&!r&&n(Fe(49));const o=(0,i.HD)(e)?function(e,t={}){const n=function(e,t){const n=(0,i.l7)({},un);let r;for(r in t)n[r]=void 0===t[r]?un[r]:t[r];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1,onWarn:n.onWarn}}(e,t),r=En(n);return function(e,t=kt){return{type:0,children:e,helpers:[],components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}(dn(n,0,[]),Cn(n,r))}(e,t):e,[s,a]=[[Ir,er,zr,or,Hr,_r,yr,fr,Dr],{on:Or,bind:Lr,model:Mr}];return Vn(o,(0,i.l7)({},t,{prefixIdentifiers:!1,nodeTransforms:[...s,...t.nodeTransforms||[]],directiveTransforms:(0,i.l7)({},a,t.directiveTransforms||{})})),function(e,t={}){const n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:i=null,optimizeImports:s=!1,runtimeGlobalName:a="Vue",runtimeModuleName:l="vue",ssrRuntimeModuleName:c="vue/server-renderer",ssr:u=!1,isTS:d=!1,inSSR:f=!1}){const h={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:i,optimizeImports:s,runtimeGlobalName:a,runtimeModuleName:l,ssrRuntimeModuleName:c,ssr:u,isTS:d,inSSR:f,source:e.loc.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${xt[e]}`,push(e,t){h.code+=e},indent(){p(++h.indentLevel)},deindent(e=!1){e?--h.indentLevel:p(--h.indentLevel)},newline(){p(h.indentLevel)}};function p(e){h.push("\n"+"  ".repeat(e))}return h}(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:o,prefixIdentifiers:i,indent:s,deindent:a,newline:l,scopeId:c,ssr:u}=n,d=e.helpers.length>0,f=!i&&"module"!==r;if(function(e,t){const{ssr:n,prefixIdentifiers:r,push:o,newline:i,runtimeModuleName:s,runtimeGlobalName:a,ssrRuntimeModuleName:l}=t,c=a,u=e=>`${xt[e]}: _${xt[e]}`;e.helpers.length>0&&(o(`const _Vue = ${c}\n`),e.hoists.length)&&o(`const { ${[qe,$e,Ue,Ze,Ye].filter((t=>e.helpers.includes(t))).map(u).join(", ")} } = _Vue\n`),function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r,helper:o,scopeId:i,mode:s}=t;r();for(let o=0;o<e.length;o++){const i=e[o];i&&(n(`const _hoisted_${o+1} = `),Jn(i,t),r())}t.pure=!1}(e.hoists,t),i(),o("return ")}(e,n),o(`function ${u?"ssrRender":"render"}(${(u?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ")}) {`),s(),f&&(o("with (_ctx) {"),s(),d&&(o(`const { ${e.helpers.map((e=>`${xt[e]}: _${xt[e]}`)).join(", ")} } = _Vue`),o("\n"),l())),e.components.length&&(Zn(e.components,"component",n),(e.directives.length||e.temps>0)&&l()),e.directives.length&&(Zn(e.directives,"directive",n),e.temps>0&&l()),e.filters&&e.filters.length&&(l(),Zn(e.filters,"filter",n),l()),e.temps>0){o("let ");for(let t=0;t<e.temps;t++)o(`${t>0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(o("\n"),l()),u||o("return "),e.codegenNode?Jn(e.codegenNode,n):o("null"),f&&(a(),o("}")),a(),o("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}(o,(0,i.l7)({},t,{prefixIdentifiers:!1}))}const qr=Symbol(""),$r=Symbol(""),Ur=Symbol(""),Zr=Symbol(""),Yr=Symbol(""),Gr=Symbol(""),Jr=Symbol(""),Kr=Symbol(""),Xr=Symbol(""),Qr=Symbol("");var eo;let to;eo={[qr]:"vModelRadio",[$r]:"vModelCheckbox",[Ur]:"vModelText",[Zr]:"vModelSelect",[Yr]:"vModelDynamic",[Gr]:"withModifiers",[Jr]:"withKeys",[Kr]:"vShow",[Xr]:"Transition",[Qr]:"TransitionGroup"},Object.getOwnPropertySymbols(eo).forEach((e=>{xt[e]=eo[e]}));const no=(0,i.fY)("style,iframe,script,noscript",!0),ro={isVoidTag:i.WB,isNativeTag:e=>(0,i.eS)(e)||(0,i.aN)(e),isPreTag:e=>"pre"===e,decodeEntities:function(e,t=!1){return to||(to=document.createElement("div")),t?(to.innerHTML=`<div foo="${e.replace(/"/g,"&quot;")}">`,to.children[0].getAttribute("foo")):(to.innerHTML=e,to.textContent)},isBuiltInComponent:e=>It(e,"Transition")?Xr:It(e,"TransitionGroup")?Qr:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else t&&1===n&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0));if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(no(e))return 2}return 0}},oo=(e,t)=>{const n=(0,i.yL)(e);return Tt(JSON.stringify(n),!1,t,3)};function io(e,t){return Fe(e,t)}const so=(0,i.fY)("passive,once,capture"),ao=(0,i.fY)("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),lo=(0,i.fY)("left,right"),co=(0,i.fY)("onkeyup,onkeydown,onkeypress",!0),uo=(e,t)=>At(e)&&"onclick"===e.content.toLowerCase()?Tt(t,!0):4!==e.type?Ot(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,fo=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||(t.onError(io(60,e.loc)),t.removeNode())},ho=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Tt("style",!0,t.loc),exp:oo(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],po={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(50,o)),t.children.length&&(n.onError(io(51,o)),t.children.length=0),{props:[_t(Tt("innerHTML",!0,o),r||Tt("",!0))]}},text:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(52,o)),t.children.length&&(n.onError(io(53,o)),t.children.length=0),{props:[_t(Tt("textContent",!0),r?Lt(n.helperString(rt),[r],o):Tt("",!0))]}},model:(e,t,n)=>{const r=Mr(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(io(55,e.arg.loc));const{tag:o}=t,i=n.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||i){let s=Ur,a=!1;if("input"===o||i){const r=$t(t,"type");if(r){if(7===r.type)s=Yr;else if(r.value)switch(r.value.content){case"radio":s=qr;break;case"checkbox":s=$r;break;case"file":a=!0,n.onError(io(56,e.loc))}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(s=Yr)}else"select"===o&&(s=Zr);a||(r.needRuntime=n.helper(s))}else n.onError(io(54,e.loc));return r.props=r.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),r},on:(e,t,n)=>Or(e,0,n,(t=>{const{modifiers:r}=e;if(!r.length)return t;let{key:o,value:s}=t.props[0];const{keyModifiers:a,nonKeyModifiers:l,eventOptionModifiers:c}=((e,t,n,r)=>{const o=[],i=[],s=[];for(let r=0;r<t.length;r++){const a=t[r];"native"===a&&an("COMPILER_V_ON_NATIVE",n)||so(a)?s.push(a):lo(a)?At(e)?co(e.content)?o.push(a):i.push(a):(o.push(a),i.push(a)):ao(a)?i.push(a):o.push(a)}return{keyModifiers:o,nonKeyModifiers:i,eventOptionModifiers:s}})(o,r,n,e.loc);if(l.includes("right")&&(o=uo(o,"onContextmenu")),l.includes("middle")&&(o=uo(o,"onMouseup")),l.length&&(s=Lt(n.helper(Gr),[s,JSON.stringify(l)])),!a.length||At(o)&&!co(o.content)||(s=Lt(n.helper(Jr),[s,JSON.stringify(a)])),c.length){const e=c.map(i.kC).join("");o=At(o)?Tt(`${o.content}${e}`,!0):Ot(["(",o,`) + "${e}"`])}return{props:[_t(o,s)]}})),show:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(58,o)),{props:[],needRuntime:n.helper(Kr)}}},mo=Object.create(null);(0,o.Y1)((function(e,t){if(!(0,i.HD)(e)){if(!e.nodeType)return i.dG;e=e.innerHTML}const n=e,o=mo[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);e=t?t.innerHTML:""}const{code:s}=function(e,t={}){return Vr(e,(0,i.l7)({},ro,t,{nodeTransforms:[fo,...ho,...t.nodeTransforms||[]],directiveTransforms:(0,i.l7)({},po,t.directiveTransforms||{}),transformHoist:null}))}(e,(0,i.l7)({hoistStatic:!0,onError:void 0,onWarn:i.dG},t)),a=new Function("Vue",s)(r);return a._rc=!0,mo[n]=a}))},4515:(e,t,n)=>{var r={"./index.ts":1528};function o(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=i,e.exports=o,o.id=4515},4884:e=>{"use strict";e.exports=()=>window.__DOCS__},9984:e=>{"use strict";e.exports=__DOCS_CONFIG__},7648:(e,t,n)=>{"use strict";n.d(t,{MT:()=>o,IV:()=>c,U2:()=>a,t8:()=>l});function r(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function o(e,t){const n=(!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise((function(e){var t=function(){return indexedDB.databases().finally(e)};o=setInterval(t,100),t()})).finally((function(){return clearInterval(o)})):Promise.resolve()).then((()=>{const n=indexedDB.open(e);return n.onupgradeneeded=()=>n.result.createObjectStore(t),r(n)}));var o;return(e,r)=>n.then((n=>r(n.transaction(t,e).objectStore(t))))}let i;function s(){return i||(i=o("keyval-store","keyval")),i}function a(e,t=s()){return t("readonly",(t=>r(t.get(e))))}function l(e,t,n=s()){return n("readwrite",(n=>(n.put(t,e),r(n.transaction))))}function c(e,t=s()){return t("readwrite",(t=>(t.delete(e),r(t.transaction))))}}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e=n(4359),t=n(2626),r=n(872),o=n(5701),i=n(9984),s=n.n(i),a=n(2110);function l(e){setTimeout((function(){e(function(){var e;if("number"==typeof s().flags)e=s().flags;else{if(!c())return!1;if("number"!=typeof s().flags)return!1;e=s().flags}var n=h(f("73696465626172"),f("444F432D53494445424152"),f("646F63732D706F77657265642D6279"),document.children),r=0===n.length&&t.h.state.unloading;if(n.length>0)for(var o=0;o<n.length;++o){var i=n[o],a=null==i?void 0:i.firstChild,l=null==i?void 0:i.querySelector("svg");if(!(i&&a&&l&&i.getAttribute(f("68726566"))===f("68747470733A2F2F7265747970652E636F6D2F")&&a.innerHTML===f("506F7765726564206279")&&l.getAttribute(f("7769647468"))===f("3936")&&l.getAttribute(f("686569676874"))===f("3230")&&1045===l.innerHTML.replace(/\s+/g,"").split("").map((function(e){return e.charCodeAt(0)})).reduce((function(e,t){return e^23*t}),0)))return!1;r||i&&(i.offsetWidth||i.offsetHeight||i.getClientRects().length)&&(r=!0)}return r||(1&e)*(2&e)>0}())}),10)}function c(){var e,t=d();if(!t)return!1;for(var n=parseInt(t.checksum.slice(0,-5)||"0"),r=[s().id,t.fingerprint,".",t.signature,s().base,s().host,n.toString()],o=0,i=s().sidebar;o<i.length;o++){var a=i[o];r.push(null!==(e=a.l)&&void 0!==e?e:a.n)}for(var l=0,c=0,u=r;c<u.length;c++)for(var f=u[c],h=0;h<f.length;++h)l^=f.charCodeAt(h);return l===parseInt(t.checksum.slice(-5))&&(s().flags=n,!0)}function u(t,n,r){if(!n){var o="5B464154414C5D3A20436F".concat(727275,"7074656420776"),i=function(){t&&t.unmount();var e="56273697".concat(4652063,"6F6E66696775726174696F6E"),n=document.getElementById(f("646F63732D617070"));n&&(n.innerHTML="",window[f("636F6E736F6C65")][f("6572726F72")](f(o+e)))};r?(0,e.Y3)((function(){return i()})):i()}}function d(){var e=null===s()||void 0===s()?void 0:s().key;if(!e||"string"!=typeof e)return null;var t=e.indexOf(".");if(t<=0)return null;var n=e.lastIndexOf(".");if(n<=t)return null;for(var r={fingerprint:e.slice(0,t),signature:e.slice(t+1,n),checksum:e.slice(n+1)},o=r.signature.length%4;o>0;--o)r.signature+="=";return r}function f(e){for(var t="",n=0;n<e.length;n+=2)t+=String.fromCharCode(parseInt(e.substr(n,2),16));return t}function h(e,t,n,r,o,i){null!=i||(i=[]);for(var s=0;s<r.length;++s){var a=r[s];if("A"===a.nodeName&&a.classList.contains(n)&&a instanceof HTMLElement)i.push(a);else{var l=a.children.length?a.children:"TEMPLATE"===a.nodeName&&a instanceof HTMLTemplateElement&&a.content.children?a.content.children:null;(null==l?void 0:l.length)&&h(e,t,n,l,o,i)}}return i}var p=n(4884),m=n.n(p);const v=()=>window.__DOCS_MERMAID__;var g=n.n(v);const b=()=>window.__DOCS_PRISM__;var y=n.n(b);const w=()=>window.__DOCS_KATEX__;var x,k,S,E,C,_,T=n.n(w),O=n(6184),L=n(7023),R=n(5184),D=n(5543),A=n(8816),I=n(7755),M=n(7924);(0,O.BL)(),"file:"===location.protocol.toLowerCase()&&(O.nP.drive=!1,O.nP.navigator.proposeVisit=function(e){window.location.href=e.toString()});var F="reloadPosition=";null!==(x=window.retype)&&void 0!==x||(window.retype={}),null!==(k=(S=window.retype).reload)&&void 0!==k||(S.reload=function(e,t){if(e){var n=location.pathname.endsWith("/")||/[.]html?$/i.test(location.pathname)?location.pathname:location.pathname+"/";document.cookie="".concat(F).concat(window.scrollX,",").concat(window.scrollY,";path=").concat(n,";max-age=5"),window.location.reload()}else{C=[window.scrollX,window.scrollY],_=window.location.hash;var r=window.location.href,o=_?window.location.pathname+window.location.search:r;(0,O.Vn)(o,{action:"replace"}),t&&(0,A.v2)()}}),document.addEventListener("turbo:load",(function(){var i,f,h;if(t.h.state.initialPageLoad){if(!c())return void u(E,!1);(function(){var e,t,n,r,o;return t=this,n=void 0,o=function(){var t,n,r,o,i,l,c,u,f,h,p,m,v,g,b;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}(this,(function(y){switch(y.label){case 0:if(!(t=d()))return[2,!1];for(n=parseInt(t.checksum.slice(0,-5)||"0"),r=atob(t.signature),o=[],g=0;g<r.length;++g)o.push(r.charCodeAt(g));for(i=[s().id,s().base,s().host,n.toString()],l=0,c=s().sidebar;l<c.length;l++)u=c[l],i.push(null!==(e=u.l)&&void 0!==e?e:u.n);return i.push(t.fingerprint),f=i.join(""),h=new TextEncoder,p=new TextDecoder,[4,crypto.subtle.digest("SHA-256",h.encode(f))];case 1:for(m=y.sent(),v=[48,71,48,115,103,125,49,133,75,132,137,14,25,65,99,18,116,124,42,116,85,72,11,45,125,183,150,91,96,33,111,30,32,103,88,212,96,188,182,160,83,67,148,88,185,171,117,178,221,234,50,86,254,60,165,240,3,106,69,30,235,147,143,222,64,97,80,223,163,20,180,16,45,166,117,156,157,202,217,232,216,165,93,4,176,78,44,97,133,2,3,1,0,1],g=a.u.length+a.bT.length;g>0;--g)v[g%v.length]^=a.u[g%a.u.length]^a.bT[g%a.bT.length];return[4,crypto.subtle.importKey("spki",new Uint8Array(v),{name:p.decode(a.u),hash:p.decode(a.bT)},!1,["verify"])];case 2:return b=y.sent(),[4,crypto.subtle.verify(b.algorithm,b,new Uint8Array(o),m)];case 3:return[2,y.sent()]}}))},new((r=void 0)||(r=Promise))((function(e,i){function s(e){try{l(o.next(e))}catch(e){i(e)}}function a(e){try{l(o.throw(e))}catch(e){i(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}l((o=o.apply(t,n||[])).next())}))})().then((function(e){return u(E,e,!0)}))}else E.unmount();(function(){E=(0,e.ri)((0,e.aZ)({name:"DocApp",compilerOptions:{delimiters:["\0\0","\0\0"]},setup:function(){var n=(0,t.oR)().store;(0,r.g)(n),n.actions.resetMemberData();var o=function(){var t=(0,e.iH)(!1),n=null;return(0,L.zX)(window,"scroll",(function(){t.value=!0,null!==n&&clearTimeout(n),n=setTimeout((function(){t.value=!1}),100)})),{isScrolling:t}}().isScrolling;(0,e.YP)(o,(function(e){n.state.isWindowScrolling=e}),{immediate:!0}),(0,e.bv)((function(){(0,e.Y3)((function(){n.state.initialPageLoad=!1}))})),function(){var e=(0,t.oR)().store,n=(0,R.B)().scrollTo;(0,L.zX)(window,"popstate",(function(){var t;if(window.location.hash){var r=decodeURIComponent(window.location.hash);(null!==(t=document.getElementById(r.slice(1)))&&void 0!==t?t:document.querySelector(r))&&n(r,{offset:D.vE,onStart:function(){e.actions.updateScrolledElementId(r.substr(1))}})}}))}()}})),E.provide(t.$Q,t.h),E.provide(o.Mu,o.Ke);var i=n(4515);i.keys().forEach((function(e){var t=i(e);Object.keys(t).forEach((function(e){E.component(e,t[e])}))}));var s=document.getElementById("docs-app");if(s&&s.parentElement){var a=s.parentElement;s.querySelectorAll("script, style").forEach((function(e){e.remove(),a.appendChild(e)}))}E.mount("#docs-app")})(),l((function(e){return u(E,e)})),(null===(f=null===(i=window.retype)||void 0===i?void 0:i.editor)||void 0===f?void 0:f.initView)&&window.retype.editor.initView();var p=m()();(null==p?void 0:p.hasPrism)&&(0,I.b)("prism-js",y(),(function(e){return null==e?void 0:e.initPrism()})),(null==p?void 0:p.hasMermaid)&&(0,I.b)("mermaid-js",g(),(function(e){return null==e?void 0:e.initMermaid()})),(null==p?void 0:p.hasMath)&&(0,I.b)("katex-js",T(),(function(e){return null==e?void 0:e.initKatex()})),document.querySelectorAll(".scrollbar").forEach((function(e){e.classList.remove("overflow-hidden"),new M.Z(e)})),_&&(history.replaceState(history.state,document.title,window.location.pathname+_+window.location.search),_=null);var v=!1;if(C)window.scrollTo.apply(window,C),C=null,v=!0;else if(t.h.state.initialPageLoad){var b=null===(h=document.cookie.split(";").find((function(e){return e.trim().startsWith(F)})))||void 0===h?void 0:h.trim();if(b){var w=b.slice(F.length).split(",");w&&2==w.length&&/^\d+$/.test(w[0])&&/^\d+$/.test(w[1])&&(t.h.state.isScrollPositionRestored=!0,setTimeout((function(){t.h.state.isScrollPositionRestored=!1}),3e3),window.scrollTo(Number.parseInt(w[0]),Number.parseInt(w[1])),v=!0)}}v&&O.ry.currentVisit&&(O.ry.currentVisit.scrolled=!0),t.h.actions.updateMemberFilter(""),t.h.actions.updateSearchQuery("")})),window.addEventListener("beforeunload",(function(){t.h.state.unloading=!0}))})()})();
\ No newline at end of file
+      `,e.outerHTML);e=e.parentElement}})(),window.Turbo=De,_e()},826:function(e){!function(t){"use strict";function n(e){return parseInt(e)===e}function r(e){if(!n(e.length))return!1;for(var t=0;t<e.length;t++)if(!n(e[t])||e[t]<0||e[t]>255)return!1;return!0}function o(e,t){if(e.buffer&&"Uint8Array"===e.name)return t&&(e=e.slice?e.slice():Array.prototype.slice.call(e)),e;if(Array.isArray(e)){if(!r(e))throw new Error("Array contains invalid value: "+e);return new Uint8Array(e)}if(n(e.length)&&r(e))return new Uint8Array(e);throw new Error("unsupported array-like object")}function i(e){return new Uint8Array(e)}function s(e,t,n,r,o){null==r&&null==o||(e=e.slice?e.slice(r,o):Array.prototype.slice.call(e,r,o)),t.set(e,n)}var a,l={toBytes:function(e){var t=[],n=0;for(e=encodeURI(e);n<e.length;){var r=e.charCodeAt(n++);37===r?(t.push(parseInt(e.substr(n,2),16)),n+=2):t.push(r)}return o(t)},fromBytes:function(e){for(var t=[],n=0;n<e.length;){var r=e[n];r<128?(t.push(String.fromCharCode(r)),n++):r>191&&r<224?(t.push(String.fromCharCode((31&r)<<6|63&e[n+1])),n+=2):(t.push(String.fromCharCode((15&r)<<12|(63&e[n+1])<<6|63&e[n+2])),n+=3)}return t.join("")}},c=(a="0123456789abcdef",{toBytes:function(e){for(var t=[],n=0;n<e.length;n+=2)t.push(parseInt(e.substr(n,2),16));return t},fromBytes:function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];t.push(a[(240&r)>>4]+a[15&r])}return t.join("")}}),u={16:10,24:12,32:14},d=[1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145],h=[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22],p=[82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125],f=[3328402341,4168907908,4000806809,4135287693,4294111757,3597364157,3731845041,2445657428,1613770832,33620227,3462883241,1445669757,3892248089,3050821474,1303096294,3967186586,2412431941,528646813,2311702848,4202528135,4026202645,2992200171,2387036105,4226871307,1101901292,3017069671,1604494077,1169141738,597466303,1403299063,3832705686,2613100635,1974974402,3791519004,1033081774,1277568618,1815492186,2118074177,4126668546,2211236943,1748251740,1369810420,3521504564,4193382664,3799085459,2883115123,1647391059,706024767,134480908,2512897874,1176707941,2646852446,806885416,932615841,168101135,798661301,235341577,605164086,461406363,3756188221,3454790438,1311188841,2142417613,3933566367,302582043,495158174,1479289972,874125870,907746093,3698224818,3025820398,1537253627,2756858614,1983593293,3084310113,2108928974,1378429307,3722699582,1580150641,327451799,2790478837,3117535592,0,3253595436,1075847264,3825007647,2041688520,3059440621,3563743934,2378943302,1740553945,1916352843,2487896798,2555137236,2958579944,2244988746,3151024235,3320835882,1336584933,3992714006,2252555205,2588757463,1714631509,293963156,2319795663,3925473552,67240454,4269768577,2689618160,2017213508,631218106,1269344483,2723238387,1571005438,2151694528,93294474,1066570413,563977660,1882732616,4059428100,1673313503,2008463041,2950355573,1109467491,537923632,3858759450,4260623118,3218264685,2177748300,403442708,638784309,3287084079,3193921505,899127202,2286175436,773265209,2479146071,1437050866,4236148354,2050833735,3362022572,3126681063,840505643,3866325909,3227541664,427917720,2655997905,2749160575,1143087718,1412049534,999329963,193497219,2353415882,3354324521,1807268051,672404540,2816401017,3160301282,369822493,2916866934,3688947771,1681011286,1949973070,336202270,2454276571,201721354,1210328172,3093060836,2680341085,3184776046,1135389935,3294782118,965841320,831886756,3554993207,4068047243,3588745010,2345191491,1849112409,3664604599,26054028,2983581028,2622377682,1235855840,3630984372,2891339514,4092916743,3488279077,3395642799,4101667470,1202630377,268961816,1874508501,4034427016,1243948399,1546530418,941366308,1470539505,1941222599,2546386513,3421038627,2715671932,3899946140,1042226977,2521517021,1639824860,227249030,260737669,3765465232,2084453954,1907733956,3429263018,2420656344,100860677,4160157185,470683154,3261161891,1781871967,2924959737,1773779408,394692241,2579611992,974986535,664706745,3655459128,3958962195,731420851,571543859,3530123707,2849626480,126783113,865375399,765172662,1008606754,361203602,3387549984,2278477385,2857719295,1344809080,2782912378,59542671,1503764984,160008576,437062935,1707065306,3622233649,2218934982,3496503480,2185314755,697932208,1512910199,504303377,2075177163,2824099068,1841019862,739644986],m=[2781242211,2230877308,2582542199,2381740923,234877682,3184946027,2984144751,1418839493,1348481072,50462977,2848876391,2102799147,434634494,1656084439,3863849899,2599188086,1167051466,2636087938,1082771913,2281340285,368048890,3954334041,3381544775,201060592,3963727277,1739838676,4250903202,3930435503,3206782108,4149453988,2531553906,1536934080,3262494647,484572669,2923271059,1783375398,1517041206,1098792767,49674231,1334037708,1550332980,4098991525,886171109,150598129,2481090929,1940642008,1398944049,1059722517,201851908,1385547719,1699095331,1587397571,674240536,2704774806,252314885,3039795866,151914247,908333586,2602270848,1038082786,651029483,1766729511,3447698098,2682942837,454166793,2652734339,1951935532,775166490,758520603,3000790638,4004797018,4217086112,4137964114,1299594043,1639438038,3464344499,2068982057,1054729187,1901997871,2534638724,4121318227,1757008337,0,750906861,1614815264,535035132,3363418545,3988151131,3201591914,1183697867,3647454910,1265776953,3734260298,3566750796,3903871064,1250283471,1807470800,717615087,3847203498,384695291,3313910595,3617213773,1432761139,2484176261,3481945413,283769337,100925954,2180939647,4037038160,1148730428,3123027871,3813386408,4087501137,4267549603,3229630528,2315620239,2906624658,3156319645,1215313976,82966005,3747855548,3245848246,1974459098,1665278241,807407632,451280895,251524083,1841287890,1283575245,337120268,891687699,801369324,3787349855,2721421207,3431482436,959321879,1469301956,4065699751,2197585534,1199193405,2898814052,3887750493,724703513,2514908019,2696962144,2551808385,3516813135,2141445340,1715741218,2119445034,2872807568,2198571144,3398190662,700968686,3547052216,1009259540,2041044702,3803995742,487983883,1991105499,1004265696,1449407026,1316239930,504629770,3683797321,168560134,1816667172,3837287516,1570751170,1857934291,4014189740,2797888098,2822345105,2754712981,936633572,2347923833,852879335,1133234376,1500395319,3084545389,2348912013,1689376213,3533459022,3762923945,3034082412,4205598294,133428468,634383082,2949277029,2398386810,3913789102,403703816,3580869306,2297460856,1867130149,1918643758,607656988,4049053350,3346248884,1368901318,600565992,2090982877,2632479860,557719327,3717614411,3697393085,2249034635,2232388234,2430627952,1115438654,3295786421,2865522278,3633334344,84280067,33027830,303828494,2747425121,1600795957,4188952407,3496589753,2434238086,1486471617,658119965,3106381470,953803233,334231800,3005978776,857870609,3151128937,1890179545,2298973838,2805175444,3056442267,574365214,2450884487,550103529,1233637070,4289353045,2018519080,2057691103,2399374476,4166623649,2148108681,387583245,3664101311,836232934,3330556482,3100665960,3280093505,2955516313,2002398509,287182607,3413881008,4238890068,3597515707,975967766],v=[1671808611,2089089148,2006576759,2072901243,4061003762,1807603307,1873927791,3310653893,810573872,16974337,1739181671,729634347,4263110654,3613570519,2883997099,1989864566,3393556426,2191335298,3376449993,2106063485,4195741690,1508618841,1204391495,4027317232,2917941677,3563566036,2734514082,2951366063,2629772188,2767672228,1922491506,3227229120,3082974647,4246528509,2477669779,644500518,911895606,1061256767,4144166391,3427763148,878471220,2784252325,3845444069,4043897329,1905517169,3631459288,827548209,356461077,67897348,3344078279,593839651,3277757891,405286936,2527147926,84871685,2595565466,118033927,305538066,2157648768,3795705826,3945188843,661212711,2999812018,1973414517,152769033,2208177539,745822252,439235610,455947803,1857215598,1525593178,2700827552,1391895634,994932283,3596728278,3016654259,695947817,3812548067,795958831,2224493444,1408607827,3513301457,0,3979133421,543178784,4229948412,2982705585,1542305371,1790891114,3410398667,3201918910,961245753,1256100938,1289001036,1491644504,3477767631,3496721360,4012557807,2867154858,4212583931,1137018435,1305975373,861234739,2241073541,1171229253,4178635257,33948674,2139225727,1357946960,1011120188,2679776671,2833468328,1374921297,2751356323,1086357568,2408187279,2460827538,2646352285,944271416,4110742005,3168756668,3066132406,3665145818,560153121,271589392,4279952895,4077846003,3530407890,3444343245,202643468,322250259,3962553324,1608629855,2543990167,1154254916,389623319,3294073796,2817676711,2122513534,1028094525,1689045092,1575467613,422261273,1939203699,1621147744,2174228865,1339137615,3699352540,577127458,712922154,2427141008,2290289544,1187679302,3995715566,3100863416,339486740,3732514782,1591917662,186455563,3681988059,3762019296,844522546,978220090,169743370,1239126601,101321734,611076132,1558493276,3260915650,3547250131,2901361580,1655096418,2443721105,2510565781,3828863972,2039214713,3878868455,3359869896,928607799,1840765549,2374762893,3580146133,1322425422,2850048425,1823791212,1459268694,4094161908,3928346602,1706019429,2056189050,2934523822,135794696,3134549946,2022240376,628050469,779246638,472135708,2800834470,3032970164,3327236038,3894660072,3715932637,1956440180,522272287,1272813131,3185336765,2340818315,2323976074,1888542832,1044544574,3049550261,1722469478,1222152264,50660867,4127324150,236067854,1638122081,895445557,1475980887,3117443513,2257655686,3243809217,489110045,2662934430,3778599393,4162055160,2561878936,288563729,1773916777,3648039385,2391345038,2493985684,2612407707,505560094,2274497927,3911240169,3460925390,1442818645,678973480,3749357023,2358182796,2717407649,2306869641,219617805,3218761151,3862026214,1120306242,1756942440,1103331905,2578459033,762796589,252780047,2966125488,1425844308,3151392187,372911126],g=[1667474886,2088535288,2004326894,2071694838,4075949567,1802223062,1869591006,3318043793,808472672,16843522,1734846926,724270422,4278065639,3621216949,2880169549,1987484396,3402253711,2189597983,3385409673,2105378810,4210693615,1499065266,1195886990,4042263547,2913856577,3570689971,2728590687,2947541573,2627518243,2762274643,1920112356,3233831835,3082273397,4261223649,2475929149,640051788,909531756,1061110142,4160160501,3435941763,875846760,2779116625,3857003729,4059105529,1903268834,3638064043,825316194,353713962,67374088,3351728789,589522246,3284360861,404236336,2526454071,84217610,2593830191,117901582,303183396,2155911963,3806477791,3958056653,656894286,2998062463,1970642922,151591698,2206440989,741110872,437923380,454765878,1852748508,1515908788,2694904667,1381168804,993742198,3604373943,3014905469,690584402,3823320797,791638366,2223281939,1398011302,3520161977,0,3991743681,538992704,4244381667,2981218425,1532751286,1785380564,3419096717,3200178535,960056178,1246420628,1280103576,1482221744,3486468741,3503319995,4025428677,2863326543,4227536621,1128514950,1296947098,859002214,2240123921,1162203018,4193849577,33687044,2139062782,1347481760,1010582648,2678045221,2829640523,1364325282,2745433693,1077985408,2408548869,2459086143,2644360225,943212656,4126475505,3166494563,3065430391,3671750063,555836226,269496352,4294908645,4092792573,3537006015,3452783745,202118168,320025894,3974901699,1600119230,2543297077,1145359496,387397934,3301201811,2812801621,2122220284,1027426170,1684319432,1566435258,421079858,1936954854,1616945344,2172753945,1330631070,3705438115,572679748,707427924,2425400123,2290647819,1179044492,4008585671,3099120491,336870440,3739122087,1583276732,185277718,3688593069,3772791771,842159716,976899700,168435220,1229577106,101059084,606366792,1549591736,3267517855,3553849021,2897014595,1650632388,2442242105,2509612081,3840161747,2038008818,3890688725,3368567691,926374254,1835907034,2374863873,3587531953,1313788572,2846482505,1819063512,1448540844,4109633523,3941213647,1701162954,2054852340,2930698567,134748176,3132806511,2021165296,623210314,774795868,471606328,2795958615,3031746419,3334885783,3907527627,3722280097,1953799400,522133822,1263263126,3183336545,2341176845,2324333839,1886425312,1044267644,3048588401,1718004428,1212733584,50529542,4143317495,235803164,1633788866,892690282,1465383342,3115962473,2256965911,3250673817,488449850,2661202215,3789633753,4177007595,2560144171,286339874,1768537042,3654906025,2391705863,2492770099,2610673197,505291324,2273808917,3924369609,3469625735,1431699370,673740880,3755965093,2358021891,2711746649,2307489801,218961690,3217021541,3873845719,1111672452,1751693520,1094828930,2576986153,757954394,252645662,2964376443,1414855848,3149649517,370555436],b=[1374988112,2118214995,437757123,975658646,1001089995,530400753,2902087851,1273168787,540080725,2910219766,2295101073,4110568485,1340463100,3307916247,641025152,3043140495,3736164937,632953703,1172967064,1576976609,3274667266,2169303058,2370213795,1809054150,59727847,361929877,3211623147,2505202138,3569255213,1484005843,1239443753,2395588676,1975683434,4102977912,2572697195,666464733,3202437046,4035489047,3374361702,2110667444,1675577880,3843699074,2538681184,1649639237,2976151520,3144396420,4269907996,4178062228,1883793496,2403728665,2497604743,1383856311,2876494627,1917518562,3810496343,1716890410,3001755655,800440835,2261089178,3543599269,807962610,599762354,33778362,3977675356,2328828971,2809771154,4077384432,1315562145,1708848333,101039829,3509871135,3299278474,875451293,2733856160,92987698,2767645557,193195065,1080094634,1584504582,3178106961,1042385657,2531067453,3711829422,1306967366,2438237621,1908694277,67556463,1615861247,429456164,3602770327,2302690252,1742315127,2968011453,126454664,3877198648,2043211483,2709260871,2084704233,4169408201,0,159417987,841739592,504459436,1817866830,4245618683,260388950,1034867998,908933415,168810852,1750902305,2606453969,607530554,202008497,2472011535,3035535058,463180190,2160117071,1641816226,1517767529,470948374,3801332234,3231722213,1008918595,303765277,235474187,4069246893,766945465,337553864,1475418501,2943682380,4003061179,2743034109,4144047775,1551037884,1147550661,1543208500,2336434550,3408119516,3069049960,3102011747,3610369226,1113818384,328671808,2227573024,2236228733,3535486456,2935566865,3341394285,496906059,3702665459,226906860,2009195472,733156972,2842737049,294930682,1206477858,2835123396,2700099354,1451044056,573804783,2269728455,3644379585,2362090238,2564033334,2801107407,2776292904,3669462566,1068351396,742039012,1350078989,1784663195,1417561698,4136440770,2430122216,775550814,2193862645,2673705150,1775276924,1876241833,3475313331,3366754619,270040487,3902563182,3678124923,3441850377,1851332852,3969562369,2203032232,3868552805,2868897406,566021896,4011190502,3135740889,1248802510,3936291284,699432150,832877231,708780849,3332740144,899835584,1951317047,4236429990,3767586992,866637845,4043610186,1106041591,2144161806,395441711,1984812685,1139781709,3433712980,3835036895,2664543715,1282050075,3240894392,1181045119,2640243204,25965917,4203181171,4211818798,3009879386,2463879762,3910161971,1842759443,2597806476,933301370,1509430414,3943906441,3467192302,3076639029,3776767469,2051518780,2631065433,1441952575,404016761,1942435775,1408749034,1610459739,3745345300,2017778566,3400528769,3110650942,941896748,3265478751,371049330,3168937228,675039627,4279080257,967311729,135050206,3635733660,1683407248,2076935265,3576870512,1215061108,3501741890],y=[1347548327,1400783205,3273267108,2520393566,3409685355,4045380933,2880240216,2471224067,1428173050,4138563181,2441661558,636813900,4233094615,3620022987,2149987652,2411029155,1239331162,1730525723,2554718734,3781033664,46346101,310463728,2743944855,3328955385,3875770207,2501218972,3955191162,3667219033,768917123,3545789473,692707433,1150208456,1786102409,2029293177,1805211710,3710368113,3065962831,401639597,1724457132,3028143674,409198410,2196052529,1620529459,1164071807,3769721975,2226875310,486441376,2499348523,1483753576,428819965,2274680428,3075636216,598438867,3799141122,1474502543,711349675,129166120,53458370,2592523643,2782082824,4063242375,2988687269,3120694122,1559041666,730517276,2460449204,4042459122,2706270690,3446004468,3573941694,533804130,2328143614,2637442643,2695033685,839224033,1973745387,957055980,2856345839,106852767,1371368976,4181598602,1033297158,2933734917,1179510461,3046200461,91341917,1862534868,4284502037,605657339,2547432937,3431546947,2003294622,3182487618,2282195339,954669403,3682191598,1201765386,3917234703,3388507166,0,2198438022,1211247597,2887651696,1315723890,4227665663,1443857720,507358933,657861945,1678381017,560487590,3516619604,975451694,2970356327,261314535,3535072918,2652609425,1333838021,2724322336,1767536459,370938394,182621114,3854606378,1128014560,487725847,185469197,2918353863,3106780840,3356761769,2237133081,1286567175,3152976349,4255350624,2683765030,3160175349,3309594171,878443390,1988838185,3704300486,1756818940,1673061617,3403100636,272786309,1075025698,545572369,2105887268,4174560061,296679730,1841768865,1260232239,4091327024,3960309330,3497509347,1814803222,2578018489,4195456072,575138148,3299409036,446754879,3629546796,4011996048,3347532110,3252238545,4270639778,915985419,3483825537,681933534,651868046,2755636671,3828103837,223377554,2607439820,1649704518,3270937875,3901806776,1580087799,4118987695,3198115200,2087309459,2842678573,3016697106,1003007129,2802849917,1860738147,2077965243,164439672,4100872472,32283319,2827177882,1709610350,2125135846,136428751,3874428392,3652904859,3460984630,3572145929,3593056380,2939266226,824852259,818324884,3224740454,930369212,2801566410,2967507152,355706840,1257309336,4148292826,243256656,790073846,2373340630,1296297904,1422699085,3756299780,3818836405,457992840,3099667487,2135319889,77422314,1560382517,1945798516,788204353,1521706781,1385356242,870912086,325965383,2358957921,2050466060,2388260884,2313884476,4006521127,901210569,3990953189,1014646705,1503449823,1062597235,2031621326,3212035895,3931371469,1533017514,350174575,2256028891,2177544179,1052338372,741876788,1606591296,1914052035,213705253,2334669897,1107234197,1899603969,3725069491,2631447780,2422494913,1635502980,1893020342,1950903388,1120974935],w=[2807058932,1699970625,2764249623,1586903591,1808481195,1173430173,1487645946,59984867,4199882800,1844882806,1989249228,1277555970,3623636965,3419915562,1149249077,2744104290,1514790577,459744698,244860394,3235995134,1963115311,4027744588,2544078150,4190530515,1608975247,2627016082,2062270317,1507497298,2200818878,567498868,1764313568,3359936201,2305455554,2037970062,1047239e3,1910319033,1337376481,2904027272,2892417312,984907214,1243112415,830661914,861968209,2135253587,2011214180,2927934315,2686254721,731183368,1750626376,4246310725,1820824798,4172763771,3542330227,48394827,2404901663,2871682645,671593195,3254988725,2073724613,145085239,2280796200,2779915199,1790575107,2187128086,472615631,3029510009,4075877127,3802222185,4107101658,3201631749,1646252340,4270507174,1402811438,1436590835,3778151818,3950355702,3963161475,4020912224,2667994737,273792366,2331590177,104699613,95345982,3175501286,2377486676,1560637892,3564045318,369057872,4213447064,3919042237,1137477952,2658625497,1119727848,2340947849,1530455833,4007360968,172466556,266959938,516552836,0,2256734592,3980931627,1890328081,1917742170,4294704398,945164165,3575528878,958871085,3647212047,2787207260,1423022939,775562294,1739656202,3876557655,2530391278,2443058075,3310321856,547512796,1265195639,437656594,3121275539,719700128,3762502690,387781147,218828297,3350065803,2830708150,2848461854,428169201,122466165,3720081049,1627235199,648017665,4122762354,1002783846,2117360635,695634755,3336358691,4234721005,4049844452,3704280881,2232435299,574624663,287343814,612205898,1039717051,840019705,2708326185,793451934,821288114,1391201670,3822090177,376187827,3113855344,1224348052,1679968233,2361698556,1058709744,752375421,2431590963,1321699145,3519142200,2734591178,188127444,2177869557,3727205754,2384911031,3215212461,2648976442,2450346104,3432737375,1180849278,331544205,3102249176,4150144569,2952102595,2159976285,2474404304,766078933,313773861,2570832044,2108100632,1668212892,3145456443,2013908262,418672217,3070356634,2594734927,1852171925,3867060991,3473416636,3907448597,2614737639,919489135,164948639,2094410160,2997825956,590424639,2486224549,1723872674,3157750862,3399941250,3501252752,3625268135,2555048196,3673637356,1343127501,4130281361,3599595085,2957853679,1297403050,81781910,3051593425,2283490410,532201772,1367295589,3926170974,895287692,1953757831,1093597963,492483431,3528626907,1446242576,1192455638,1636604631,209336225,344873464,1015671571,669961897,3375740769,3857572124,2973530695,3747192018,1933530610,3464042516,935293895,3454686199,2858115069,1863638845,3683022916,4085369519,3292445032,875313188,1080017571,3279033885,621591778,1233856572,2504130317,24197544,3017672716,3835484340,3247465558,2220981195,3060847922,1551124588,1463996600],S=[4104605777,1097159550,396673818,660510266,2875968315,2638606623,4200115116,3808662347,821712160,1986918061,3430322568,38544885,3856137295,718002117,893681702,1654886325,2975484382,3122358053,3926825029,4274053469,796197571,1290801793,1184342925,3556361835,2405426947,2459735317,1836772287,1381620373,3196267988,1948373848,3764988233,3385345166,3263785589,2390325492,1480485785,3111247143,3780097726,2293045232,548169417,3459953789,3746175075,439452389,1362321559,1400849762,1685577905,1806599355,2174754046,137073913,1214797936,1174215055,3731654548,2079897426,1943217067,1258480242,529487843,1437280870,3945269170,3049390895,3313212038,923313619,679998e3,3215307299,57326082,377642221,3474729866,2041877159,133361907,1776460110,3673476453,96392454,878845905,2801699524,777231668,4082475170,2330014213,4142626212,2213296395,1626319424,1906247262,1846563261,562755902,3708173718,1040559837,3871163981,1418573201,3294430577,114585348,1343618912,2566595609,3186202582,1078185097,3651041127,3896688048,2307622919,425408743,3371096953,2081048481,1108339068,2216610296,0,2156299017,736970802,292596766,1517440620,251657213,2235061775,2933202493,758720310,265905162,1554391400,1532285339,908999204,174567692,1474760595,4002861748,2610011675,3234156416,3693126241,2001430874,303699484,2478443234,2687165888,585122620,454499602,151849742,2345119218,3064510765,514443284,4044981591,1963412655,2581445614,2137062819,19308535,1928707164,1715193156,4219352155,1126790795,600235211,3992742070,3841024952,836553431,1669664834,2535604243,3323011204,1243905413,3141400786,4180808110,698445255,2653899549,2989552604,2253581325,3252932727,3004591147,1891211689,2487810577,3915653703,4237083816,4030667424,2100090966,865136418,1229899655,953270745,3399679628,3557504664,4118925222,2061379749,3079546586,2915017791,983426092,2022837584,1607244650,2118541908,2366882550,3635996816,972512814,3283088770,1568718495,3499326569,3576539503,621982671,2895723464,410887952,2623762152,1002142683,645401037,1494807662,2595684844,1335535747,2507040230,4293295786,3167684641,367585007,3885750714,1865862730,2668221674,2960971305,2763173681,1059270954,2777952454,2724642869,1320957812,2194319100,2429595872,2815956275,77089521,3973773121,3444575871,2448830231,1305906550,4021308739,2857194700,2516901860,3518358430,1787304780,740276417,1699839814,1592394909,2352307457,2272556026,188821243,1729977011,3687994002,274084841,3594982253,3613494426,2701949495,4162096729,322734571,2837966542,1640576439,484830689,1202797690,3537852828,4067639125,349075736,3342319475,4157467219,4255800159,1030690015,1155237496,2951971274,1757691577,607398968,2738905026,499347990,3794078908,1011452712,227885567,2818666809,213114376,3034881240,1455525988,3414450555,850817237,1817998408,3092726480],k=[0,235474187,470948374,303765277,941896748,908933415,607530554,708780849,1883793496,2118214995,1817866830,1649639237,1215061108,1181045119,1417561698,1517767529,3767586992,4003061179,4236429990,4069246893,3635733660,3602770327,3299278474,3400528769,2430122216,2664543715,2362090238,2193862645,2835123396,2801107407,3035535058,3135740889,3678124923,3576870512,3341394285,3374361702,3810496343,3977675356,4279080257,4043610186,2876494627,2776292904,3076639029,3110650942,2472011535,2640243204,2403728665,2169303058,1001089995,899835584,666464733,699432150,59727847,226906860,530400753,294930682,1273168787,1172967064,1475418501,1509430414,1942435775,2110667444,1876241833,1641816226,2910219766,2743034109,2976151520,3211623147,2505202138,2606453969,2302690252,2269728455,3711829422,3543599269,3240894392,3475313331,3843699074,3943906441,4178062228,4144047775,1306967366,1139781709,1374988112,1610459739,1975683434,2076935265,1775276924,1742315127,1034867998,866637845,566021896,800440835,92987698,193195065,429456164,395441711,1984812685,2017778566,1784663195,1683407248,1315562145,1080094634,1383856311,1551037884,101039829,135050206,437757123,337553864,1042385657,807962610,573804783,742039012,2531067453,2564033334,2328828971,2227573024,2935566865,2700099354,3001755655,3168937228,3868552805,3902563182,4203181171,4102977912,3736164937,3501741890,3265478751,3433712980,1106041591,1340463100,1576976609,1408749034,2043211483,2009195472,1708848333,1809054150,832877231,1068351396,766945465,599762354,159417987,126454664,361929877,463180190,2709260871,2943682380,3178106961,3009879386,2572697195,2538681184,2236228733,2336434550,3509871135,3745345300,3441850377,3274667266,3910161971,3877198648,4110568485,4211818798,2597806476,2497604743,2261089178,2295101073,2733856160,2902087851,3202437046,2968011453,3936291284,3835036895,4136440770,4169408201,3535486456,3702665459,3467192302,3231722213,2051518780,1951317047,1716890410,1750902305,1113818384,1282050075,1584504582,1350078989,168810852,67556463,371049330,404016761,841739592,1008918595,775550814,540080725,3969562369,3801332234,4035489047,4269907996,3569255213,3669462566,3366754619,3332740144,2631065433,2463879762,2160117071,2395588676,2767645557,2868897406,3102011747,3069049960,202008497,33778362,270040487,504459436,875451293,975658646,675039627,641025152,2084704233,1917518562,1615861247,1851332852,1147550661,1248802510,1484005843,1451044056,933301370,967311729,733156972,632953703,260388950,25965917,328671808,496906059,1206477858,1239443753,1543208500,1441952575,2144161806,1908694277,1675577880,1842759443,3610369226,3644379585,3408119516,3307916247,4011190502,3776767469,4077384432,4245618683,2809771154,2842737049,3144396420,3043140495,2673705150,2438237621,2203032232,2370213795],x=[0,185469197,370938394,487725847,741876788,657861945,975451694,824852259,1483753576,1400783205,1315723890,1164071807,1950903388,2135319889,1649704518,1767536459,2967507152,3152976349,2801566410,2918353863,2631447780,2547432937,2328143614,2177544179,3901806776,3818836405,4270639778,4118987695,3299409036,3483825537,3535072918,3652904859,2077965243,1893020342,1841768865,1724457132,1474502543,1559041666,1107234197,1257309336,598438867,681933534,901210569,1052338372,261314535,77422314,428819965,310463728,3409685355,3224740454,3710368113,3593056380,3875770207,3960309330,4045380933,4195456072,2471224067,2554718734,2237133081,2388260884,3212035895,3028143674,2842678573,2724322336,4138563181,4255350624,3769721975,3955191162,3667219033,3516619604,3431546947,3347532110,2933734917,2782082824,3099667487,3016697106,2196052529,2313884476,2499348523,2683765030,1179510461,1296297904,1347548327,1533017514,1786102409,1635502980,2087309459,2003294622,507358933,355706840,136428751,53458370,839224033,957055980,605657339,790073846,2373340630,2256028891,2607439820,2422494913,2706270690,2856345839,3075636216,3160175349,3573941694,3725069491,3273267108,3356761769,4181598602,4063242375,4011996048,3828103837,1033297158,915985419,730517276,545572369,296679730,446754879,129166120,213705253,1709610350,1860738147,1945798516,2029293177,1239331162,1120974935,1606591296,1422699085,4148292826,4233094615,3781033664,3931371469,3682191598,3497509347,3446004468,3328955385,2939266226,2755636671,3106780840,2988687269,2198438022,2282195339,2501218972,2652609425,1201765386,1286567175,1371368976,1521706781,1805211710,1620529459,2105887268,1988838185,533804130,350174575,164439672,46346101,870912086,954669403,636813900,788204353,2358957921,2274680428,2592523643,2441661558,2695033685,2880240216,3065962831,3182487618,3572145929,3756299780,3270937875,3388507166,4174560061,4091327024,4006521127,3854606378,1014646705,930369212,711349675,560487590,272786309,457992840,106852767,223377554,1678381017,1862534868,1914052035,2031621326,1211247597,1128014560,1580087799,1428173050,32283319,182621114,401639597,486441376,768917123,651868046,1003007129,818324884,1503449823,1385356242,1333838021,1150208456,1973745387,2125135846,1673061617,1756818940,2970356327,3120694122,2802849917,2887651696,2637442643,2520393566,2334669897,2149987652,3917234703,3799141122,4284502037,4100872472,3309594171,3460984630,3545789473,3629546796,2050466060,1899603969,1814803222,1730525723,1443857720,1560382517,1075025698,1260232239,575138148,692707433,878443390,1062597235,243256656,91341917,409198410,325965383,3403100636,3252238545,3704300486,3620022987,3874428392,3990953189,4042459122,4227665663,2460449204,2578018489,2226875310,2411029155,3198115200,3046200461,2827177882,2743944855],E=[0,218828297,437656594,387781147,875313188,958871085,775562294,590424639,1750626376,1699970625,1917742170,2135253587,1551124588,1367295589,1180849278,1265195639,3501252752,3720081049,3399941250,3350065803,3835484340,3919042237,4270507174,4085369519,3102249176,3051593425,2734591178,2952102595,2361698556,2177869557,2530391278,2614737639,3145456443,3060847922,2708326185,2892417312,2404901663,2187128086,2504130317,2555048196,3542330227,3727205754,3375740769,3292445032,3876557655,3926170974,4246310725,4027744588,1808481195,1723872674,1910319033,2094410160,1608975247,1391201670,1173430173,1224348052,59984867,244860394,428169201,344873464,935293895,984907214,766078933,547512796,1844882806,1627235199,2011214180,2062270317,1507497298,1423022939,1137477952,1321699145,95345982,145085239,532201772,313773861,830661914,1015671571,731183368,648017665,3175501286,2957853679,2807058932,2858115069,2305455554,2220981195,2474404304,2658625497,3575528878,3625268135,3473416636,3254988725,3778151818,3963161475,4213447064,4130281361,3599595085,3683022916,3432737375,3247465558,3802222185,4020912224,4172763771,4122762354,3201631749,3017672716,2764249623,2848461854,2331590177,2280796200,2431590963,2648976442,104699613,188127444,472615631,287343814,840019705,1058709744,671593195,621591778,1852171925,1668212892,1953757831,2037970062,1514790577,1463996600,1080017571,1297403050,3673637356,3623636965,3235995134,3454686199,4007360968,3822090177,4107101658,4190530515,2997825956,3215212461,2830708150,2779915199,2256734592,2340947849,2627016082,2443058075,172466556,122466165,273792366,492483431,1047239e3,861968209,612205898,695634755,1646252340,1863638845,2013908262,1963115311,1446242576,1530455833,1277555970,1093597963,1636604631,1820824798,2073724613,1989249228,1436590835,1487645946,1337376481,1119727848,164948639,81781910,331544205,516552836,1039717051,821288114,669961897,719700128,2973530695,3157750862,2871682645,2787207260,2232435299,2283490410,2667994737,2450346104,3647212047,3564045318,3279033885,3464042516,3980931627,3762502690,4150144569,4199882800,3070356634,3121275539,2904027272,2686254721,2200818878,2384911031,2570832044,2486224549,3747192018,3528626907,3310321856,3359936201,3950355702,3867060991,4049844452,4234721005,1739656202,1790575107,2108100632,1890328081,1402811438,1586903591,1233856572,1149249077,266959938,48394827,369057872,418672217,1002783846,919489135,567498868,752375421,209336225,24197544,376187827,459744698,945164165,895287692,574624663,793451934,1679968233,1764313568,2117360635,1933530610,1343127501,1560637892,1243112415,1192455638,3704280881,3519142200,3336358691,3419915562,3907448597,3857572124,4075877127,4294704398,3029510009,3113855344,2927934315,2744104290,2159976285,2377486676,2594734927,2544078150],C=[0,151849742,303699484,454499602,607398968,758720310,908999204,1059270954,1214797936,1097159550,1517440620,1400849762,1817998408,1699839814,2118541908,2001430874,2429595872,2581445614,2194319100,2345119218,3034881240,3186202582,2801699524,2951971274,3635996816,3518358430,3399679628,3283088770,4237083816,4118925222,4002861748,3885750714,1002142683,850817237,698445255,548169417,529487843,377642221,227885567,77089521,1943217067,2061379749,1640576439,1757691577,1474760595,1592394909,1174215055,1290801793,2875968315,2724642869,3111247143,2960971305,2405426947,2253581325,2638606623,2487810577,3808662347,3926825029,4044981591,4162096729,3342319475,3459953789,3576539503,3693126241,1986918061,2137062819,1685577905,1836772287,1381620373,1532285339,1078185097,1229899655,1040559837,923313619,740276417,621982671,439452389,322734571,137073913,19308535,3871163981,4021308739,4104605777,4255800159,3263785589,3414450555,3499326569,3651041127,2933202493,2815956275,3167684641,3049390895,2330014213,2213296395,2566595609,2448830231,1305906550,1155237496,1607244650,1455525988,1776460110,1626319424,2079897426,1928707164,96392454,213114376,396673818,514443284,562755902,679998e3,865136418,983426092,3708173718,3557504664,3474729866,3323011204,4180808110,4030667424,3945269170,3794078908,2507040230,2623762152,2272556026,2390325492,2975484382,3092726480,2738905026,2857194700,3973773121,3856137295,4274053469,4157467219,3371096953,3252932727,3673476453,3556361835,2763173681,2915017791,3064510765,3215307299,2156299017,2307622919,2459735317,2610011675,2081048481,1963412655,1846563261,1729977011,1480485785,1362321559,1243905413,1126790795,878845905,1030690015,645401037,796197571,274084841,425408743,38544885,188821243,3613494426,3731654548,3313212038,3430322568,4082475170,4200115116,3780097726,3896688048,2668221674,2516901860,2366882550,2216610296,3141400786,2989552604,2837966542,2687165888,1202797690,1320957812,1437280870,1554391400,1669664834,1787304780,1906247262,2022837584,265905162,114585348,499347990,349075736,736970802,585122620,972512814,821712160,2595684844,2478443234,2293045232,2174754046,3196267988,3079546586,2895723464,2777952454,3537852828,3687994002,3234156416,3385345166,4142626212,4293295786,3841024952,3992742070,174567692,57326082,410887952,292596766,777231668,660510266,1011452712,893681702,1108339068,1258480242,1343618912,1494807662,1715193156,1865862730,1948373848,2100090966,2701949495,2818666809,3004591147,3122358053,2235061775,2352307457,2535604243,2653899549,3915653703,3764988233,4219352155,4067639125,3444575871,3294430577,3746175075,3594982253,836553431,953270745,600235211,718002117,367585007,484830689,133361907,251657213,2041877159,1891211689,1806599355,1654886325,1568718495,1418573201,1335535747,1184342925];function _(e){for(var t=[],n=0;n<e.length;n+=4)t.push(e[n]<<24|e[n+1]<<16|e[n+2]<<8|e[n+3]);return t}var T=function(e){if(!(this instanceof T))throw Error("AES must be instanitated with `new`");Object.defineProperty(this,"key",{value:o(e,!0)}),this._prepare()};T.prototype._prepare=function(){var e=u[this.key.length];if(null==e)throw new Error("invalid key size (must be 16, 24 or 32 bytes)");this._Ke=[],this._Kd=[];for(var t=0;t<=e;t++)this._Ke.push([0,0,0,0]),this._Kd.push([0,0,0,0]);var n,r=4*(e+1),o=this.key.length/4,i=_(this.key);for(t=0;t<o;t++)n=t>>2,this._Ke[n][t%4]=i[t],this._Kd[e-n][t%4]=i[t];for(var s,a=0,l=o;l<r;){if(s=i[o-1],i[0]^=h[s>>16&255]<<24^h[s>>8&255]<<16^h[255&s]<<8^h[s>>24&255]^d[a]<<24,a+=1,8!=o)for(t=1;t<o;t++)i[t]^=i[t-1];else{for(t=1;t<o/2;t++)i[t]^=i[t-1];for(s=i[o/2-1],i[o/2]^=h[255&s]^h[s>>8&255]<<8^h[s>>16&255]<<16^h[s>>24&255]<<24,t=o/2+1;t<o;t++)i[t]^=i[t-1]}for(t=0;t<o&&l<r;)c=l>>2,p=l%4,this._Ke[c][p]=i[t],this._Kd[e-c][p]=i[t++],l++}for(var c=1;c<e;c++)for(var p=0;p<4;p++)s=this._Kd[c][p],this._Kd[c][p]=k[s>>24&255]^x[s>>16&255]^E[s>>8&255]^C[255&s]},T.prototype.encrypt=function(e){if(16!=e.length)throw new Error("invalid plaintext size (must be 16 bytes)");for(var t=this._Ke.length-1,n=[0,0,0,0],r=_(e),o=0;o<4;o++)r[o]^=this._Ke[0][o];for(var s=1;s<t;s++){for(o=0;o<4;o++)n[o]=f[r[o]>>24&255]^m[r[(o+1)%4]>>16&255]^v[r[(o+2)%4]>>8&255]^g[255&r[(o+3)%4]]^this._Ke[s][o];r=n.slice()}var a,l=i(16);for(o=0;o<4;o++)a=this._Ke[t][o],l[4*o]=255&(h[r[o]>>24&255]^a>>24),l[4*o+1]=255&(h[r[(o+1)%4]>>16&255]^a>>16),l[4*o+2]=255&(h[r[(o+2)%4]>>8&255]^a>>8),l[4*o+3]=255&(h[255&r[(o+3)%4]]^a);return l},T.prototype.decrypt=function(e){if(16!=e.length)throw new Error("invalid ciphertext size (must be 16 bytes)");for(var t=this._Kd.length-1,n=[0,0,0,0],r=_(e),o=0;o<4;o++)r[o]^=this._Kd[0][o];for(var s=1;s<t;s++){for(o=0;o<4;o++)n[o]=b[r[o]>>24&255]^y[r[(o+3)%4]>>16&255]^w[r[(o+2)%4]>>8&255]^S[255&r[(o+1)%4]]^this._Kd[s][o];r=n.slice()}var a,l=i(16);for(o=0;o<4;o++)a=this._Kd[t][o],l[4*o]=255&(p[r[o]>>24&255]^a>>24),l[4*o+1]=255&(p[r[(o+3)%4]>>16&255]^a>>16),l[4*o+2]=255&(p[r[(o+2)%4]>>8&255]^a>>8),l[4*o+3]=255&(p[255&r[(o+1)%4]]^a);return l};var L=function(e){if(!(this instanceof L))throw Error("AES must be instanitated with `new`");this.description="Electronic Code Block",this.name="ecb",this._aes=new T(e)};L.prototype.encrypt=function(e){if((e=o(e)).length%16!=0)throw new Error("invalid plaintext size (must be multiple of 16 bytes)");for(var t=i(e.length),n=i(16),r=0;r<e.length;r+=16)s(e,n,0,r,r+16),s(n=this._aes.encrypt(n),t,r);return t},L.prototype.decrypt=function(e){if((e=o(e)).length%16!=0)throw new Error("invalid ciphertext size (must be multiple of 16 bytes)");for(var t=i(e.length),n=i(16),r=0;r<e.length;r+=16)s(e,n,0,r,r+16),s(n=this._aes.decrypt(n),t,r);return t};var A=function(e,t){if(!(this instanceof A))throw Error("AES must be instanitated with `new`");if(this.description="Cipher Block Chaining",this.name="cbc",t){if(16!=t.length)throw new Error("invalid initialation vector size (must be 16 bytes)")}else t=i(16);this._lastCipherblock=o(t,!0),this._aes=new T(e)};A.prototype.encrypt=function(e){if((e=o(e)).length%16!=0)throw new Error("invalid plaintext size (must be multiple of 16 bytes)");for(var t=i(e.length),n=i(16),r=0;r<e.length;r+=16){s(e,n,0,r,r+16);for(var a=0;a<16;a++)n[a]^=this._lastCipherblock[a];this._lastCipherblock=this._aes.encrypt(n),s(this._lastCipherblock,t,r)}return t},A.prototype.decrypt=function(e){if((e=o(e)).length%16!=0)throw new Error("invalid ciphertext size (must be multiple of 16 bytes)");for(var t=i(e.length),n=i(16),r=0;r<e.length;r+=16){s(e,n,0,r,r+16),n=this._aes.decrypt(n);for(var a=0;a<16;a++)t[r+a]=n[a]^this._lastCipherblock[a];s(e,this._lastCipherblock,0,r,r+16)}return t};var D=function(e,t,n){if(!(this instanceof D))throw Error("AES must be instanitated with `new`");if(this.description="Cipher Feedback",this.name="cfb",t){if(16!=t.length)throw new Error("invalid initialation vector size (must be 16 size)")}else t=i(16);n||(n=1),this.segmentSize=n,this._shiftRegister=o(t,!0),this._aes=new T(e)};D.prototype.encrypt=function(e){if(e.length%this.segmentSize!=0)throw new Error("invalid plaintext size (must be segmentSize bytes)");for(var t,n=o(e,!0),r=0;r<n.length;r+=this.segmentSize){t=this._aes.encrypt(this._shiftRegister);for(var i=0;i<this.segmentSize;i++)n[r+i]^=t[i];s(this._shiftRegister,this._shiftRegister,0,this.segmentSize),s(n,this._shiftRegister,16-this.segmentSize,r,r+this.segmentSize)}return n},D.prototype.decrypt=function(e){if(e.length%this.segmentSize!=0)throw new Error("invalid ciphertext size (must be segmentSize bytes)");for(var t,n=o(e,!0),r=0;r<n.length;r+=this.segmentSize){t=this._aes.encrypt(this._shiftRegister);for(var i=0;i<this.segmentSize;i++)n[r+i]^=t[i];s(this._shiftRegister,this._shiftRegister,0,this.segmentSize),s(e,this._shiftRegister,16-this.segmentSize,r,r+this.segmentSize)}return n};var O=function(e,t){if(!(this instanceof O))throw Error("AES must be instanitated with `new`");if(this.description="Output Feedback",this.name="ofb",t){if(16!=t.length)throw new Error("invalid initialation vector size (must be 16 bytes)")}else t=i(16);this._lastPrecipher=o(t,!0),this._lastPrecipherIndex=16,this._aes=new T(e)};O.prototype.encrypt=function(e){for(var t=o(e,!0),n=0;n<t.length;n++)16===this._lastPrecipherIndex&&(this._lastPrecipher=this._aes.encrypt(this._lastPrecipher),this._lastPrecipherIndex=0),t[n]^=this._lastPrecipher[this._lastPrecipherIndex++];return t},O.prototype.decrypt=O.prototype.encrypt;var R=function(e){if(!(this instanceof R))throw Error("Counter must be instanitated with `new`");0===e||e||(e=1),"number"==typeof e?(this._counter=i(16),this.setValue(e)):this.setBytes(e)};R.prototype.setValue=function(e){if("number"!=typeof e||parseInt(e)!=e)throw new Error("invalid counter value (must be an integer)");if(e>Number.MAX_SAFE_INTEGER)throw new Error("integer value out of safe range");for(var t=15;t>=0;--t)this._counter[t]=e%256,e=parseInt(e/256)},R.prototype.setBytes=function(e){if(16!=(e=o(e,!0)).length)throw new Error("invalid counter bytes size (must be 16 bytes)");this._counter=e},R.prototype.increment=function(){for(var e=15;e>=0;e--){if(255!==this._counter[e]){this._counter[e]++;break}this._counter[e]=0}};var M=function(e,t){if(!(this instanceof M))throw Error("AES must be instanitated with `new`");this.description="Counter",this.name="ctr",t instanceof R||(t=new R(t)),this._counter=t,this._remainingCounter=null,this._remainingCounterIndex=16,this._aes=new T(e)};M.prototype.encrypt=function(e){for(var t=o(e,!0),n=0;n<t.length;n++)16===this._remainingCounterIndex&&(this._remainingCounter=this._aes.encrypt(this._counter._counter),this._remainingCounterIndex=0,this._counter.increment()),t[n]^=this._remainingCounter[this._remainingCounterIndex++];return t},M.prototype.decrypt=M.prototype.encrypt;var I={AES:T,Counter:R,ModeOfOperation:{ecb:L,cbc:A,cfb:D,ofb:O,ctr:M},utils:{hex:c,utf8:l},padding:{pkcs7:{pad:function(e){var t=16-(e=o(e,!0)).length%16,n=i(e.length+t);s(e,n);for(var r=e.length;r<n.length;r++)n[r]=t;return n},strip:function(e){if((e=o(e,!0)).length<16)throw new Error("PKCS#7 invalid length");var t=e[e.length-1];if(t>16)throw new Error("PKCS#7 padding byte out of range");for(var n=e.length-t,r=0;r<t;r++)if(e[n+r]!==t)throw new Error("PKCS#7 invalid padding byte");var a=i(n);return s(e,a,0,0,n),a}}},_arrayTest:{coerceArray:o,createArray:i,copyArray:s}};e.exports=I}()},807:e=>{var t=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=t},152:function(e){var t;t=function(){return function(){var e={686:function(e,t,n){"use strict";n.d(t,{default:function(){return S}});var r=n(279),o=n.n(r),i=n(370),s=n.n(i),a=n(817),l=n.n(a);function c(e){try{return document.execCommand(e)}catch(e){return!1}}var u=function(e){var t=l()(e);return c("cut"),t},d=function(e,t){var n=function(e){var t="rtl"===document.documentElement.getAttribute("dir"),n=document.createElement("textarea");n.style.fontSize="12pt",n.style.border="0",n.style.padding="0",n.style.margin="0",n.style.position="absolute",n.style[t?"right":"left"]="-9999px";var r=window.pageYOffset||document.documentElement.scrollTop;return n.style.top="".concat(r,"px"),n.setAttribute("readonly",""),n.value=e,n}(e);t.container.appendChild(n);var r=l()(n);return c("copy"),n.remove(),r},h=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body},n="";return"string"==typeof e?n=d(e,t):e instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(null==e?void 0:e.type)?n=d(e.value,t):(n=l()(e),c("copy")),n};function p(e){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p(e)}function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f(e)}function m(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function v(e,t){return v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},v(e,t)}function g(e,t){return!t||"object"!==f(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function b(e){return b=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},b(e)}function y(e,t){var n="data-clipboard-".concat(e);if(t.hasAttribute(n))return t.getAttribute(n)}var w=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(l,e);var t,n,r,o,i,a=(o=l,i=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(o);if(i){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return g(this,e)});function l(e,t){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),(n=a.call(this)).resolveOptions(t),n.listenClick(e),n}return t=l,n=[{key:"resolveOptions",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===f(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=s()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget,n=this.action(t)||"copy",r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.action,n=void 0===t?"copy":t,r=e.container,o=e.target,i=e.text;if("copy"!==n&&"cut"!==n)throw new Error('Invalid "action" value, use either "copy" or "cut"');if(void 0!==o){if(!o||"object"!==p(o)||1!==o.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===n&&o.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===n&&(o.hasAttribute("readonly")||o.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}return i?h(i,{container:r}):o?"cut"===n?u(o):h(o,{container:r}):void 0}({action:n,container:this.container,target:this.target(t),text:this.text(t)});this.emit(r?"success":"error",{action:n,text:r,trigger:t,clearSelection:function(){t&&t.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(e){return y("action",e)}},{key:"defaultTarget",value:function(e){var t=y("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return y("text",e)}},{key:"destroy",value:function(){this.listener.destroy()}}],r=[{key:"copy",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body};return h(e,t)}},{key:"cut",value:function(e){return u(e)}},{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}],n&&m(t.prototype,n),r&&m(t,r),l}(o()),S=w},828:function(e){if("undefined"!=typeof Element&&!Element.prototype.matches){var t=Element.prototype;t.matches=t.matchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector||t.webkitMatchesSelector}e.exports=function(e,t){for(;e&&9!==e.nodeType;){if("function"==typeof e.matches&&e.matches(t))return e;e=e.parentNode}}},438:function(e,t,n){var r=n(828);function o(e,t,n,r,o){var s=i.apply(this,arguments);return e.addEventListener(n,s,o),{destroy:function(){e.removeEventListener(n,s,o)}}}function i(e,t,n,o){return function(n){n.delegateTarget=r(n.target,t),n.delegateTarget&&o.call(e,n)}}e.exports=function(e,t,n,r,i){return"function"==typeof e.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof e&&(e=document.querySelectorAll(e)),Array.prototype.map.call(e,(function(e){return o(e,t,n,r,i)})))}},879:function(e,t){t.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},t.nodeList=function(e){var n=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in e&&(0===e.length||t.node(e[0]))},t.string=function(e){return"string"==typeof e||e instanceof String},t.fn=function(e){return"[object Function]"===Object.prototype.toString.call(e)}},370:function(e,t,n){var r=n(879),o=n(438);e.exports=function(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!r.string(t))throw new TypeError("Second argument must be a String");if(!r.fn(n))throw new TypeError("Third argument must be a Function");if(r.node(e))return function(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}(e,t,n);if(r.nodeList(e))return function(e,t,n){return Array.prototype.forEach.call(e,(function(e){e.addEventListener(t,n)})),{destroy:function(){Array.prototype.forEach.call(e,(function(e){e.removeEventListener(t,n)}))}}}(e,t,n);if(r.string(e))return function(e,t,n){return o(document.body,e,t,n)}(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}},817:function(e){e.exports=function(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var r=window.getSelection(),o=document.createRange();o.selectNodeContents(e),r.removeAllRanges(),r.addRange(o),t=r.toString()}return t}},279:function(e){function t(){}t.prototype={on:function(e,t,n){var r=this.e||(this.e={});return(r[e]||(r[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){var r=this;function o(){r.off(e,o),t.apply(n,arguments)}return o._=t,this.on(e,o,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),r=0,o=n.length;r<o;r++)n[r].fn.apply(n[r].ctx,t);return this},off:function(e,t){var n=this.e||(this.e={}),r=n[e],o=[];if(r&&t)for(var i=0,s=r.length;i<s;i++)r[i].fn!==t&&r[i].fn._!==t&&o.push(r[i]);return o.length?n[e]=o:delete n[e],this}},e.exports=t,e.exports.TinyEmitter=t}},t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}return n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n(686)}().default},e.exports=t()},843:(e,t,n)=>{e.exports={ResizeSensor:n(87),ElementQueries:n(456)}},456:function(e,t,n){"use strict";var r,o,i;"undefined"!=typeof window&&window,o=[n(87)],void 0===(i="function"==typeof(r=function(e){var t=function(){var t,n={},r=[];function o(e){e||(e=document.documentElement);var t=window.getComputedStyle(e,null).fontSize;return parseFloat(t)||16}function i(e,t){var n=t.split(/\d/),r=n[n.length-1];switch(t=parseFloat(t),r){case"px":default:return t;case"em":return t*o(e);case"rem":return t*o();case"vw":return t*document.documentElement.clientWidth/100;case"vh":return t*document.documentElement.clientHeight/100;case"vmin":case"vmax":var i=document.documentElement.clientWidth/100,s=document.documentElement.clientHeight/100;return t*(0,Math["vmin"===r?"min":"max"])(i,s)}}function s(e,t){var r,o,s,a,l,c,u,d;this.element=e;var h=["min-width","min-height","max-width","max-height"];this.call=function(){for(r in s=function(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}(this.element),c={},n[t])n[t].hasOwnProperty(r)&&(o=n[t][r],a=i(this.element,o.value),l="width"===o.property?s.width:s.height,d=o.mode+"-"+o.property,u="","min"===o.mode&&l>=a&&(u+=o.value),"max"===o.mode&&l<=a&&(u+=o.value),c[d]||(c[d]=""),u&&-1===(" "+c[d]+" ").indexOf(" "+u+" ")&&(c[d]+=" "+u));for(var e in h)h.hasOwnProperty(e)&&(c[h[e]]?this.element.setAttribute(h[e],c[h[e]].substr(1)):this.element.removeAttribute(h[e]))}}function a(t,n){t.elementQueriesSetupInformation||(t.elementQueriesSetupInformation=new s(t,n)),t.elementQueriesSensor||(t.elementQueriesSensor=new e(t,(function(){t.elementQueriesSetupInformation.call()})))}function l(e,o,i,s){if(void 0===n[e]){n[e]=[];var a=r.length;t.innerHTML+="\n"+e+" {animation: 0.1s element-queries;}",t.innerHTML+="\n"+e+" > .resize-sensor {min-width: "+a+"px;}",r.push(e)}n[e].push({mode:o,property:i,value:s})}function c(e){var t;if(document.querySelectorAll&&(t=e?e.querySelectorAll.bind(e):document.querySelectorAll.bind(document)),t||"undefined"==typeof $$||(t=$$),t||"undefined"==typeof jQuery||(t=jQuery),!t)throw"No document.querySelectorAll, jQuery or Mootools's $$ found.";return t}function u(t){var n=[],r=[],o=[],i=0,s=-1,a=[];for(var l in t.children)if(t.children.hasOwnProperty(l)&&t.children[l].tagName&&"img"===t.children[l].tagName.toLowerCase()){n.push(t.children[l]);var c=t.children[l].getAttribute("min-width")||t.children[l].getAttribute("data-min-width"),u=t.children[l].getAttribute("data-src")||t.children[l].getAttribute("url");o.push(u);var d={minWidth:c};r.push(d),c?t.children[l].style.display="none":(i=n.length-1,t.children[l].style.display="block")}function h(){var e,l=!1;for(e in n)n.hasOwnProperty(e)&&r[e].minWidth&&t.offsetWidth>r[e].minWidth&&(l=e);if(l||(l=i),s!==l)if(a[l])n[s].style.display="none",n[l].style.display="block",s=l;else{var c=new Image;c.onload=function(){n[l].src=o[l],n[s].style.display="none",n[l].style.display="block",a[l]=!0,s=l},c.src=o[l]}else n[l].src=o[l]}s=i,t.resizeSensorInstance=new e(t,h),h()}var d=/,?[\s\t]*([^,\n]*?)((?:\[[\s\t]*?(?:min|max)-(?:width|height)[\s\t]*?[~$\^]?=[\s\t]*?"[^"]*?"[\s\t]*?])+)([^,\n\s\{]*)/gim,h=/\[[\s\t]*?(min|max)-(width|height)[\s\t]*?[~$\^]?=[\s\t]*?"([^"]*?)"[\s\t]*?]/gim;function p(e){var t,n,r,o;for(e=e.replace(/'/g,'"');null!==(t=d.exec(e));)for(n=t[1]+t[3],r=t[2];null!==(o=h.exec(r));)l(n,o[1],o[2],o[3])}function f(e){var t="";if(e)if("string"==typeof e)-1===(e=e.toLowerCase()).indexOf("min-width")&&-1===e.indexOf("max-width")||p(e);else for(var n=0,r=e.length;n<r;n++)1===e[n].type?-1!==(t=e[n].selectorText||e[n].cssText).indexOf("min-height")||-1!==t.indexOf("max-height")?p(t):-1===t.indexOf("min-width")&&-1===t.indexOf("max-width")||p(t):4===e[n].type?f(e[n].cssRules||e[n].rules):3===e[n].type&&e[n].styleSheet.hasOwnProperty("cssRules")&&f(e[n].styleSheet.cssRules)}var m=!1;this.init=function(){var n="animationstart";void 0!==document.documentElement.style.webkitAnimationName?n="webkitAnimationStart":void 0!==document.documentElement.style.MozAnimationName?n="mozanimationstart":void 0!==document.documentElement.style.OAnimationName&&(n="oanimationstart"),document.body.addEventListener(n,(function(t){var n=t.target,o=n&&window.getComputedStyle(n,null),i=o&&o.getPropertyValue("animation-name");if(i&&-1!==i.indexOf("element-queries")){n.elementQueriesSensor=new e(n,(function(){n.elementQueriesSetupInformation&&n.elementQueriesSetupInformation.call()}));var s=window.getComputedStyle(n.resizeSensor,null).getPropertyValue("min-width");s=parseInt(s.replace("px","")),a(t.target,r[s])}})),m||((t=document.createElement("style")).type="text/css",t.innerHTML="[responsive-image] > img, [data-responsive-image] {overflow: hidden; padding: 0; } [responsive-image] > img, [data-responsive-image] > img {width: 100%;}",t.innerHTML+="\n@keyframes element-queries { 0% { visibility: inherit; } }",document.getElementsByTagName("head")[0].appendChild(t),m=!0);for(var o=0,i=document.styleSheets.length;o<i;o++)try{document.styleSheets[o].href&&0===document.styleSheets[o].href.indexOf("file://")&&console.warn("CssElementQueries: unable to parse local css files, "+document.styleSheets[o].href),f(document.styleSheets[o].cssRules||document.styleSheets[o].rules||document.styleSheets[o].cssText)}catch(e){}!function(){for(var e=c()("[data-responsive-image],[responsive-image]"),t=0,n=e.length;t<n;t++)u(e[t])}()},this.findElementQueriesElements=function(e){!function(e){var t=c(e);for(var r in n)if(n.hasOwnProperty(r))for(var o=t(r,e),i=0,s=o.length;i<s;i++)a(o[i],r)}(e)},this.update=function(){this.init()}};t.update=function(){t.instance.update()},t.detach=function(e){e.elementQueriesSetupInformation?(e.elementQueriesSensor.detach(),delete e.elementQueriesSetupInformation,delete e.elementQueriesSensor):e.resizeSensorInstance&&(e.resizeSensorInstance.detach(),delete e.resizeSensorInstance)},t.init=function(){t.instance||(t.instance=new t),t.instance.init()};return t.findElementQueriesElements=function(e){t.instance.findElementQueriesElements(e)},t.listen=function(){!function(e){if(document.addEventListener)document.addEventListener("DOMContentLoaded",e,!1);else if(/KHTML|WebKit|iCab/i.test(navigator.userAgent))var t=setInterval((function(){/loaded|complete/i.test(document.readyState)&&(e(),clearInterval(t))}),10);else window.onload=e}(t.init)},t})?r.apply(t,o):r)||(e.exports=i)},87:function(e,t,n){"use strict";var r,o;"undefined"!=typeof window&&window,void 0===(o="function"==typeof(r=function(){if("undefined"==typeof window)return null;var e="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),t=e.requestAnimationFrame||e.mozRequestAnimationFrame||e.webkitRequestAnimationFrame||function(t){return e.setTimeout(t,20)},n=e.cancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelAnimationFrame||function(t){e.clearTimeout(t)};function r(e,t){var n=Object.prototype.toString.call(e),r="[object Array]"===n||"[object NodeList]"===n||"[object HTMLCollection]"===n||"[object Object]"===n||"undefined"!=typeof jQuery&&e instanceof jQuery||"undefined"!=typeof Elements&&e instanceof Elements,o=0,i=e.length;if(r)for(;o<i;o++)t(e[o]);else t(e)}function o(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}function i(e,t){Object.keys(t).forEach((function(n){e.style[n]=t[n]}))}var s=function(e,a){var l=0;function c(){var e,t,n=[];this.add=function(e){n.push(e)},this.call=function(r){for(e=0,t=n.length;e<t;e++)n[e].call(this,r)},this.remove=function(r){var o=[];for(e=0,t=n.length;e<t;e++)n[e]!==r&&o.push(n[e]);n=o},this.length=function(){return n.length}}function u(e,n){if(e)if(e.resizedAttached)e.resizedAttached.add(n);else{e.resizedAttached=new c,e.resizedAttached.add(n),e.resizeSensor=document.createElement("div"),e.resizeSensor.dir="ltr",e.resizeSensor.className="resize-sensor";var r={pointerEvents:"none",position:"absolute",left:"0px",top:"0px",right:"0px",bottom:"0px",overflow:"hidden",zIndex:"-1",visibility:"hidden",maxWidth:"100%"},s={position:"absolute",left:"0px",top:"0px",transition:"0s"};i(e.resizeSensor,r);var a=document.createElement("div");a.className="resize-sensor-expand",i(a,r);var u=document.createElement("div");i(u,s),a.appendChild(u);var d=document.createElement("div");d.className="resize-sensor-shrink",i(d,r);var h=document.createElement("div");i(h,s),i(h,{width:"200%",height:"200%"}),d.appendChild(h),e.resizeSensor.appendChild(a),e.resizeSensor.appendChild(d),e.appendChild(e.resizeSensor);var p=window.getComputedStyle(e),f=p?p.getPropertyValue("position"):null;"absolute"!==f&&"relative"!==f&&"fixed"!==f&&"sticky"!==f&&(e.style.position="relative");var m=!1,v=0,g=o(e),b=0,y=0,w=!0;l=0;var S=function(){if(w){if(0===e.offsetWidth&&0===e.offsetHeight)return void(l||(l=t((function(){l=0,S()}))));w=!1}var n,r;n=e.offsetWidth,r=e.offsetHeight,u.style.width=n+10+"px",u.style.height=r+10+"px",a.scrollLeft=n+10,a.scrollTop=r+10,d.scrollLeft=n+10,d.scrollTop=r+10};e.resizeSensor.resetSensor=S;var k=function(){v=0,m&&(b=g.width,y=g.height,e.resizedAttached&&e.resizedAttached.call(g))},x=function(){g=o(e),(m=g.width!==b||g.height!==y)&&!v&&(v=t(k)),S()},E=function(e,t,n){e.attachEvent?e.attachEvent("on"+t,n):e.addEventListener(t,n)};E(a,"scroll",x),E(d,"scroll",x),l=t((function(){l=0,S()}))}}r(e,(function(e){u(e,a)})),this.detach=function(t){l||(n(l),l=0),s.detach(e,t)},this.reset=function(){e.resizeSensor.resetSensor()}};if(s.reset=function(e){r(e,(function(e){e.resizeSensor.resetSensor()}))},s.detach=function(e,t){r(e,(function(e){e&&(e.resizedAttached&&"function"==typeof t&&(e.resizedAttached.remove(t),e.resizedAttached.length())||e.resizeSensor&&(e.contains(e.resizeSensor)&&e.removeChild(e.resizeSensor),delete e.resizeSensor,delete e.resizedAttached))}))},"undefined"!=typeof MutationObserver){var a=new MutationObserver((function(e){for(var t in e)if(e.hasOwnProperty(t))for(var n=e[t].addedNodes,r=0;r<n.length;r++)n[r].resizeSensor&&s.reset(n[r])}));document.addEventListener("DOMContentLoaded",(function(e){a.observe(document.body,{childList:!0,subtree:!0})}))}return s})?r.call(t,n,t,e):r)||(e.exports=o)},296:(e,t,n)=>{var r=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,s=/^0o[0-7]+$/i,a=parseInt,l="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,c="object"==typeof self&&self&&self.Object===Object&&self,u=l||c||Function("return this")(),d=Object.prototype.toString,h=Math.max,p=Math.min,f=function(){return u.Date.now()};function m(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function v(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==d.call(e)}(e))return NaN;if(m(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=m(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=i.test(e);return n||s.test(e)?a(e.slice(2),n?2:8):o.test(e)?NaN:+e}e.exports=function(e,t,n){var r,o,i,s,a,l,c=0,u=!1,d=!1,g=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var n=r,i=o;return r=o=void 0,c=t,s=e.apply(i,n)}function y(e){return c=e,a=setTimeout(S,t),u?b(e):s}function w(e){var n=e-l;return void 0===l||n>=t||n<0||d&&e-c>=i}function S(){var e=f();if(w(e))return k(e);a=setTimeout(S,function(e){var n=t-(e-l);return d?p(n,i-(e-c)):n}(e))}function k(e){return a=void 0,g&&r?b(e):(r=o=void 0,s)}function x(){var e=f(),n=w(e);if(r=arguments,o=this,l=e,n){if(void 0===a)return y(l);if(d)return a=setTimeout(S,t),b(l)}return void 0===a&&(a=setTimeout(S,t)),s}return t=v(t)||0,m(n)&&(u=!!n.leading,i=(d="maxWait"in n)?h(v(n.maxWait)||0,t):i,g="trailing"in n?!!n.trailing:g),x.cancel=function(){void 0!==a&&clearTimeout(a),c=0,r=l=o=a=void 0},x.flush=function(){return void 0===a?s:k(f())},x}},269:(e,t,n)=>{"use strict";n.r(t),n.d(t,{DocAnchorTarget:()=>u,DocAnchorTrigger:()=>f,DocBackToTop:()=>g,DocBadge:()=>y,DocCheckbox:()=>E,DocCodeblock:()=>Qe,DocCollapse:()=>tt,DocDrawer:()=>lt,DocDropdown:()=>ht,DocEmoji:()=>mt,DocHistory:()=>Ft,DocIcon:()=>Wt,DocIconAlignRight:()=>Pi,DocIconArrowLeft:()=>Wi,DocIconArrowRight:()=>ji,DocIconArrowTop:()=>$i,DocIconBox:()=>Ki,DocIconButton:()=>Vt,DocIconCheck:()=>Xi,DocIconCheckCircle:()=>es,DocIconChevronDown:()=>rs,DocIconChevronRight:()=>ss,DocIconCopy:()=>Xe,DocIconFile:()=>cs,DocIconFilter:()=>hs,DocIconFolder:()=>vs,DocIconHistory:()=>ys,DocIconHome:()=>ks,DocIconInfo:()=>Cs,DocIconLayers:()=>Ls,DocIconLink:()=>Os,DocIconMenu:()=>Is,DocIconMinus:()=>Hs,DocIconMoon:()=>Bs,DocIconMoreHorizontal:()=>zs,DocIconPlus:()=>Zs,DocIconSearch:()=>Ys,DocIconShield:()=>Js,DocIconSun:()=>ta,DocIconX:()=>oa,DocLoadingSpinner:()=>zt,DocMember:()=>Mn,DocMemberGroup:()=>Nn,DocOverloadGroup:()=>Bn,DocPanel:()=>qn,DocPanels:()=>$n,DocParameter:()=>rr,DocParameters:()=>ar,DocSearchDesktop:()=>xr,DocSearchMobile:()=>Lr,DocSidebar:()=>lo,DocSidebarRight:()=>Ro,DocSwitch:()=>Ho,DocTab:()=>No,DocTabs:()=>Bo,DocThemeSwitch:()=>jo,DocToolbar:()=>Di,DocToolbarMemberFilterNoResults:()=>Mi});var r=n(166),o=["id"],i=n(65),s=n(543),a=n(208);const l=(0,r.aZ)({name:"DocAnchorTarget",props:{id:{type:String,required:!0}},setup:function(e){var t=(0,a.oR)().store,n=(0,i.B)().scrollTo,o=(0,r.iH)("#".concat(e.id));function l(){n(o.value,{offset:s.vE,onStart:function(){t.actions.updateScrolledElementId(e.id)}})}(0,r.bv)((function(){window.location.hash&&decodeURIComponent(window.location.hash)===o.value&&setTimeout((function(){t.state.isScrollPositionRestored||(window.scrollTo(0,0),setTimeout(l,200))}),1)}))}});var c=n(744);const u=(0,c.Z)(l,[["render",function(e,t,n,i,s,a){return(0,r.wg)(),(0,r.iD)("div",{id:e.id},[(0,r.WI)(e.$slots,"default")],8,o)}]]);var d=["href","tabindex","aria-disabled"],h=n(184);const p=(0,r.aZ)({name:"DocAnchorTrigger",props:{disabled:Boolean,to:{type:String,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,a.oR)().store,l=(0,i.B)().scrollTo;return{onClick:function(t){(0,s.pI)(t)||(t.preventDefault(),(0,h.Vn)(e.to),n("click"),l(e.to,{offset:(0,s.vE)(),onStart:function(){var t="#"===e.to.charAt(0)?e.to.substr(1):e.to;o.actions.updateScrolledElementId(t)}}))},tabindex:(0,r.Fl)((function(){return e.disabled?"-1":null}))}}}),f=(0,c.Z)(p,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("a",{href:e.to,tabindex:e.tabindex,"aria-disabled":e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.WI)(e.$slots,"default")],8,d)}]]);var m=n(23);const v=(0,r.aZ)({name:"DocBackToTop",setup:function(){var e=(0,r.iH)(!1),t=(0,i.B)().scrollTo;return(0,m.zX)(window,"scroll",(function(){document.documentElement.scrollTop>350?e.value=!0:e.value=!1})),{onClick:function(){t("body")},show:e}}}),g=(0,c.Z)(v,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-top"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-from-class":"translate-y-4 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"translate-y-4 opacity-0"},{default:(0,r.w5)((function(){return[e.show?((0,r.wg)(),(0,r.iD)("button",{key:0,class:"fixed bottom-6 right-6 w-12 h-12 flex items-center justify-center rounded-full bg-white bg-opacity-70 hover:bg-gray-200 dark:bg-dark-850 dark:hover:bg-dark-450 z-40 focus:outline-none transition duration-300 linear border border-gray-400 border-opacity-50 hover:border-opacity-10 dark:border-dark-450 dark:bg-opacity-70",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(l,{class:"w-7 h-7 text-blue-500 dark:text-blue-400"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})])):(0,r.kq)("",!0)]})),_:1})}]]),b=(0,r.aZ)({name:"DocBadge",props:{type:{type:String,default:""}},setup:function(e){var t=(0,r.Fl)((function(){return e.type.trim()}));return{badgeClasses:(0,r.Fl)((function(){switch(t.value){case"bindable":return"bg-yellow-100 text-yellow-700 dark:bg-yellow-500 dark:text-white";case"required":return"bg-indigo-100 text-indigo-700 dark:bg-indigo-500 dark:text-white";case"internal":return"bg-gray-700 text-white";case"private":case"primary":case"static":return"bg-blue-100 text-blue-700 dark:bg-blue-400 dark:text-white";case"warning":case"readonly":return"bg-orange-100 text-orange-700 dark:bg-orange-500 dark:text-white";case"chainable":case"public":case"success":return"bg-green-100 text-green-700 dark:bg-green-500 dark:text-white";case"template":case"info":return"bg-teal-100 text-teal-700 dark:bg-teal-500 dark:text-white";case"deprecated":case"removed":case"danger":return"bg-red-100 text-red-700 dark:bg-red-500 dark:text-white";default:return"bg-gray-200 text-gray-900 dark:bg-dark-550 dark:text-dark-250"}}))}}}),y=(0,c.Z)(b,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:(0,r.C_)(["inline-flex items-center justify-center h-6 px-2 text-xs font-medium leading-none whitespace-nowrap rounded",e.badgeClasses])},[(0,r.WI)(e.$slots,"default")],2)}]]);var w={class:"inline-flex py-1.5 cursor-pointer select-none"},S=["value"],k={class:"inline-block ml-2"};const x=(0,r.aZ)({name:"DocCheckbox",props:{value:[Boolean,String],modelValue:[Boolean,Array]},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(e.modelValue),i=(0,r.iH)(!1),s=(0,r.Fl)({get:function(){return o.value},set:function(e){o.value=e,n("update:modelValue",o.value)}}),a=(0,r.Fl)((function(){return Array.isArray(e.modelValue)?e.modelValue.includes(e.value):e.modelValue})),l=(0,r.Fl)((function(){return[{"border-blue-500 bg-blue-500":a.value},{"border-gray-400 bg-gray-100":!a.value},{"shadow-outline":i.value}]}));return(0,r.YP)((function(){return e.modelValue}),(function(e){return o.value=e})),{localValue:o,computedValue:s,isChecked:a,isFocused:i,checkboxClasses:l}}}),E=(0,c.Z)(x,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-check"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("label",w,[(0,r._)("div",{class:(0,r.C_)(["w-4 h-4 mt-px border rounded-sm",e.checkboxClasses])},[(0,r.wy)((0,r.Wm)(l,{width:"14",height:"14",class:"text-white"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},512),[[r.F8,e.isChecked]])],2),(0,r.wy)((0,r._)("input",{"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.computedValue=t}),class:"absolute opacity-0 hidden",style:{"z-index":"-1"},type:"checkbox",value:e.value,onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,S),[[r.e8,e.computedValue]]),(0,r._)("span",k,[(0,r.WI)(e.$slots,"default")])])}]]);var C={class:"absolute top-0 right-0 z-5"},_=["innerHTML"],T=n(430),L={class:"whitespace-nowrap"},A=n(984),D=n.n(A),O=n(152),R=n.n(O),M=function(e){return(0,r.dD)("data-v-cf3656fa"),e=e(),(0,r.Cn)(),e},I={key:0,ref:"tooltip",class:"z-50 px-2 py-1 text-xs text-white bg-gray-900 dark:bg-dark-500 rounded tooltip"},F=M((function(){return(0,r._)("div",{class:"arrow","data-popper-arrow":""},null,-1)}));function P(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function H(e){return e instanceof P(e).Element||e instanceof Element}function N(e){return e instanceof P(e).HTMLElement||e instanceof HTMLElement}function W(e){return"undefined"!=typeof ShadowRoot&&(e instanceof P(e).ShadowRoot||e instanceof ShadowRoot)}var B=Math.max,V=Math.min,j=Math.round;function z(){var e=navigator.userAgentData;return null!=e&&e.brands?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function q(){return!/^((?!chrome|android).)*safari/i.test(z())}function $(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=!1);var r=e.getBoundingClientRect(),o=1,i=1;t&&N(e)&&(o=e.offsetWidth>0&&j(r.width)/e.offsetWidth||1,i=e.offsetHeight>0&&j(r.height)/e.offsetHeight||1);var s=(H(e)?P(e):window).visualViewport,a=!q()&&n,l=(r.left+(a&&s?s.offsetLeft:0))/o,c=(r.top+(a&&s?s.offsetTop:0))/i,u=r.width/o,d=r.height/i;return{width:u,height:d,top:c,right:l+u,bottom:c+d,left:l,x:l,y:c}}function Z(e){var t=P(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function U(e){return e?(e.nodeName||"").toLowerCase():null}function K(e){return((H(e)?e.ownerDocument:e.document)||window.document).documentElement}function Y(e){return $(K(e)).left+Z(e).scrollLeft}function G(e){return P(e).getComputedStyle(e)}function X(e){var t=G(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function J(e,t,n){void 0===n&&(n=!1);var r,o,i=N(t),s=N(t)&&function(e){var t=e.getBoundingClientRect(),n=j(t.width)/e.offsetWidth||1,r=j(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(t),a=K(t),l=$(e,s,n),c={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(i||!i&&!n)&&(("body"!==U(t)||X(a))&&(c=(r=t)!==P(r)&&N(r)?{scrollLeft:(o=r).scrollLeft,scrollTop:o.scrollTop}:Z(r)),N(t)?((u=$(t,!0)).x+=t.clientLeft,u.y+=t.clientTop):a&&(u.x=Y(a))),{x:l.left+c.scrollLeft-u.x,y:l.top+c.scrollTop-u.y,width:l.width,height:l.height}}function Q(e){var t=$(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function ee(e){return"html"===U(e)?e:e.assignedSlot||e.parentNode||(W(e)?e.host:null)||K(e)}function te(e){return["html","body","#document"].indexOf(U(e))>=0?e.ownerDocument.body:N(e)&&X(e)?e:te(ee(e))}function ne(e,t){var n;void 0===t&&(t=[]);var r=te(e),o=r===(null==(n=e.ownerDocument)?void 0:n.body),i=P(r),s=o?[i].concat(i.visualViewport||[],X(r)?r:[]):r,a=t.concat(s);return o?a:a.concat(ne(ee(s)))}function re(e){return["table","td","th"].indexOf(U(e))>=0}function oe(e){return N(e)&&"fixed"!==G(e).position?e.offsetParent:null}function ie(e){for(var t=P(e),n=oe(e);n&&re(n)&&"static"===G(n).position;)n=oe(n);return n&&("html"===U(n)||"body"===U(n)&&"static"===G(n).position)?t:n||function(e){var t=/firefox/i.test(z());if(/Trident/i.test(z())&&N(e)&&"fixed"===G(e).position)return null;var n=ee(e);for(W(n)&&(n=n.host);N(n)&&["html","body"].indexOf(U(n))<0;){var r=G(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t}var se="top",ae="bottom",le="right",ce="left",ue="auto",de=[se,ae,le,ce],he="start",pe="end",fe="viewport",me="popper",ve=de.reduce((function(e,t){return e.concat([t+"-"+he,t+"-"+pe])}),[]),ge=[].concat(de,[ue]).reduce((function(e,t){return e.concat([t,t+"-"+he,t+"-"+pe])}),[]),be=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function ye(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}var we={placement:"bottom",modifiers:[],strategy:"absolute"};function Se(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function ke(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,r=void 0===n?[]:n,o=t.defaultOptions,i=void 0===o?we:o;return function(e,t,n){void 0===n&&(n=i);var o,s,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},we,i),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},l=[],c=!1,u={state:a,setOptions:function(n){var o="function"==typeof n?n(a.options):n;d(),a.options=Object.assign({},i,a.options,o),a.scrollParents={reference:H(e)?ne(e):e.contextElement?ne(e.contextElement):[],popper:ne(t)};var s,c,h=function(e){var t=ye(e);return be.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}((s=[].concat(r,a.options.modifiers),c=s.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{}),Object.keys(c).map((function(e){return c[e]}))));return a.orderedModifiers=h.filter((function(e){return e.enabled})),a.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,r=void 0===n?{}:n,o=e.effect;if("function"==typeof o){var i=o({state:a,name:t,instance:u,options:r});l.push(i||function(){})}})),u.update()},forceUpdate:function(){if(!c){var e=a.elements,t=e.reference,n=e.popper;if(Se(t,n)){a.rects={reference:J(t,ie(n),"fixed"===a.options.strategy),popper:Q(n)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(e){return a.modifiersData[e.name]=Object.assign({},e.data)}));for(var r=0;r<a.orderedModifiers.length;r++)if(!0!==a.reset){var o=a.orderedModifiers[r],i=o.fn,s=o.options,l=void 0===s?{}:s,d=o.name;"function"==typeof i&&(a=i({state:a,options:l,name:d,instance:u})||a)}else a.reset=!1,r=-1}}},update:(o=function(){return new Promise((function(e){u.forceUpdate(),e(a)}))},function(){return s||(s=new Promise((function(e){Promise.resolve().then((function(){s=void 0,e(o())}))}))),s}),destroy:function(){d(),c=!0}};if(!Se(e,t))return u;function d(){l.forEach((function(e){return e()})),l=[]}return u.setOptions(n).then((function(e){!c&&n.onFirstUpdate&&n.onFirstUpdate(e)})),u}}var xe={passive:!0};function Ee(e){return e.split("-")[0]}function Ce(e){return e.split("-")[1]}function _e(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Te(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?Ee(o):null,s=o?Ce(o):null,a=n.x+n.width/2-r.width/2,l=n.y+n.height/2-r.height/2;switch(i){case se:t={x:a,y:n.y-r.height};break;case ae:t={x:a,y:n.y+n.height};break;case le:t={x:n.x+n.width,y:l};break;case ce:t={x:n.x-r.width,y:l};break;default:t={x:n.x,y:n.y}}var c=i?_e(i):null;if(null!=c){var u="y"===c?"height":"width";switch(s){case he:t[c]=t[c]-(n[u]/2-r[u]/2);break;case pe:t[c]=t[c]+(n[u]/2-r[u]/2)}}return t}var Le={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Ae(e){var t,n=e.popper,r=e.popperRect,o=e.placement,i=e.variation,s=e.offsets,a=e.position,l=e.gpuAcceleration,c=e.adaptive,u=e.roundOffsets,d=e.isFixed,h=s.x,p=void 0===h?0:h,f=s.y,m=void 0===f?0:f,v="function"==typeof u?u({x:p,y:m}):{x:p,y:m};p=v.x,m=v.y;var g=s.hasOwnProperty("x"),b=s.hasOwnProperty("y"),y=ce,w=se,S=window;if(c){var k=ie(n),x="clientHeight",E="clientWidth";k===P(n)&&"static"!==G(k=K(n)).position&&"absolute"===a&&(x="scrollHeight",E="scrollWidth"),(o===se||(o===ce||o===le)&&i===pe)&&(w=ae,m-=(d&&k===S&&S.visualViewport?S.visualViewport.height:k[x])-r.height,m*=l?1:-1),o!==ce&&(o!==se&&o!==ae||i!==pe)||(y=le,p-=(d&&k===S&&S.visualViewport?S.visualViewport.width:k[E])-r.width,p*=l?1:-1)}var C,_=Object.assign({position:a},c&&Le),T=!0===u?function(e){var t=e.x,n=e.y,r=window.devicePixelRatio||1;return{x:j(t*r)/r||0,y:j(n*r)/r||0}}({x:p,y:m}):{x:p,y:m};return p=T.x,m=T.y,l?Object.assign({},_,((C={})[w]=b?"0":"",C[y]=g?"0":"",C.transform=(S.devicePixelRatio||1)<=1?"translate("+p+"px, "+m+"px)":"translate3d("+p+"px, "+m+"px, 0)",C)):Object.assign({},_,((t={})[w]=b?m+"px":"",t[y]=g?p+"px":"",t.transform="",t))}var De={left:"right",right:"left",bottom:"top",top:"bottom"};function Oe(e){return e.replace(/left|right|bottom|top/g,(function(e){return De[e]}))}var Re={start:"end",end:"start"};function Me(e){return e.replace(/start|end/g,(function(e){return Re[e]}))}function Ie(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&W(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function Fe(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Pe(e,t,n){return t===fe?Fe(function(e,t){var n=P(e),r=K(e),o=n.visualViewport,i=r.clientWidth,s=r.clientHeight,a=0,l=0;if(o){i=o.width,s=o.height;var c=q();(c||!c&&"fixed"===t)&&(a=o.offsetLeft,l=o.offsetTop)}return{width:i,height:s,x:a+Y(e),y:l}}(e,n)):H(t)?function(e,t){var n=$(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(t,n):Fe(function(e){var t,n=K(e),r=Z(e),o=null==(t=e.ownerDocument)?void 0:t.body,i=B(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=B(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-r.scrollLeft+Y(e),l=-r.scrollTop;return"rtl"===G(o||n).direction&&(a+=B(n.clientWidth,o?o.clientWidth:0)-i),{width:i,height:s,x:a,y:l}}(K(e)))}function He(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function Ne(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function We(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=void 0===r?e.placement:r,i=n.strategy,s=void 0===i?e.strategy:i,a=n.boundary,l=void 0===a?"clippingParents":a,c=n.rootBoundary,u=void 0===c?fe:c,d=n.elementContext,h=void 0===d?me:d,p=n.altBoundary,f=void 0!==p&&p,m=n.padding,v=void 0===m?0:m,g=He("number"!=typeof v?v:Ne(v,de)),b=h===me?"reference":me,y=e.rects.popper,w=e.elements[f?b:h],S=function(e,t,n,r){var o="clippingParents"===t?function(e){var t=ne(ee(e)),n=["absolute","fixed"].indexOf(G(e).position)>=0&&N(e)?ie(e):e;return H(n)?t.filter((function(e){return H(e)&&Ie(e,n)&&"body"!==U(e)})):[]}(e):[].concat(t),i=[].concat(o,[n]),s=i[0],a=i.reduce((function(t,n){var o=Pe(e,n,r);return t.top=B(o.top,t.top),t.right=V(o.right,t.right),t.bottom=V(o.bottom,t.bottom),t.left=B(o.left,t.left),t}),Pe(e,s,r));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(H(w)?w:w.contextElement||K(e.elements.popper),l,u,s),k=$(e.elements.reference),x=Te({reference:k,element:y,strategy:"absolute",placement:o}),E=Fe(Object.assign({},y,x)),C=h===me?E:k,_={top:S.top-C.top+g.top,bottom:C.bottom-S.bottom+g.bottom,left:S.left-C.left+g.left,right:C.right-S.right+g.right},T=e.modifiersData.offset;if(h===me&&T){var L=T[o];Object.keys(_).forEach((function(e){var t=[le,ae].indexOf(e)>=0?1:-1,n=[se,ae].indexOf(e)>=0?"y":"x";_[e]+=L[n]*t}))}return _}const Be={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0===s||s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,d=n.rootBoundary,h=n.altBoundary,p=n.flipVariations,f=void 0===p||p,m=n.allowedAutoPlacements,v=t.options.placement,g=Ee(v),b=l||(g!==v&&f?function(e){if(Ee(e)===ue)return[];var t=Oe(e);return[Me(e),t,Me(t)]}(v):[Oe(v)]),y=[v].concat(b).reduce((function(e,n){return e.concat(Ee(n)===ue?function(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?ge:l,u=Ce(r),d=u?a?ve:ve.filter((function(e){return Ce(e)===u})):de,h=d.filter((function(e){return c.indexOf(e)>=0}));0===h.length&&(h=d);var p=h.reduce((function(t,n){return t[n]=We(e,{placement:n,boundary:o,rootBoundary:i,padding:s})[Ee(n)],t}),{});return Object.keys(p).sort((function(e,t){return p[e]-p[t]}))}(t,{placement:n,boundary:u,rootBoundary:d,padding:c,flipVariations:f,allowedAutoPlacements:m}):n)}),[]),w=t.rects.reference,S=t.rects.popper,k=new Map,x=!0,E=y[0],C=0;C<y.length;C++){var _=y[C],T=Ee(_),L=Ce(_)===he,A=[se,ae].indexOf(T)>=0,D=A?"width":"height",O=We(t,{placement:_,boundary:u,rootBoundary:d,altBoundary:h,padding:c}),R=A?L?le:ce:L?ae:se;w[D]>S[D]&&(R=Oe(R));var M=Oe(R),I=[];if(i&&I.push(O[T]<=0),a&&I.push(O[R]<=0,O[M]<=0),I.every((function(e){return e}))){E=_,x=!1;break}k.set(_,I)}if(x)for(var F=function(e){var t=y.find((function(t){var n=k.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},P=f?3:1;P>0&&"break"!==F(P);P--);t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Ve(e,t,n){return B(e,V(t,n))}function je(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ze(e){return[se,le,ae,ce].some((function(t){return e[t]>=0}))}var qe=ke({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,i=void 0===o||o,s=r.resize,a=void 0===s||s,l=P(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&c.forEach((function(e){e.addEventListener("scroll",n.update,xe)})),a&&l.addEventListener("resize",n.update,xe),function(){i&&c.forEach((function(e){e.removeEventListener("scroll",n.update,xe)})),a&&l.removeEventListener("resize",n.update,xe)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=Te({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,s=void 0===i||i,a=n.roundOffsets,l=void 0===a||a,c={placement:Ee(t.placement),variation:Ce(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,Ae(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,Ae(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];N(o)&&U(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});N(r)&&U(r)&&(Object.assign(r.style,i),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,i=void 0===o?[0,0]:o,s=ge.reduce((function(e,n){return e[n]=function(e,t,n){var r=Ee(e),o=[ce,se].indexOf(r)>=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,s=i[0],a=i[1];return s=s||0,a=(a||0)*o,[ce,le].indexOf(r)>=0?{x:a,y:s}:{x:s,y:a}}(n,t.rects,i),e}),{}),a=s[t.placement],l=a.x,c=a.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=s}},Be,{name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,d=n.padding,h=n.tether,p=void 0===h||h,f=n.tetherOffset,m=void 0===f?0:f,v=We(t,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),g=Ee(t.placement),b=Ce(t.placement),y=!b,w=_e(g),S="x"===w?"y":"x",k=t.modifiersData.popperOffsets,x=t.rects.reference,E=t.rects.popper,C="function"==typeof m?m(Object.assign({},t.rects,{placement:t.placement})):m,_="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),T=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,L={x:0,y:0};if(k){if(i){var A,D="y"===w?se:ce,O="y"===w?ae:le,R="y"===w?"height":"width",M=k[w],I=M+v[D],F=M-v[O],P=p?-E[R]/2:0,H=b===he?x[R]:E[R],N=b===he?-E[R]:-x[R],W=t.elements.arrow,j=p&&W?Q(W):{width:0,height:0},z=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},q=z[D],$=z[O],Z=Ve(0,x[R],j[R]),U=y?x[R]/2-P-Z-q-_.mainAxis:H-Z-q-_.mainAxis,K=y?-x[R]/2+P+Z+$+_.mainAxis:N+Z+$+_.mainAxis,Y=t.elements.arrow&&ie(t.elements.arrow),G=Y?"y"===w?Y.clientTop||0:Y.clientLeft||0:0,X=null!=(A=null==T?void 0:T[w])?A:0,J=M+K-X,ee=Ve(p?V(I,M+U-X-G):I,M,p?B(F,J):F);k[w]=ee,L[w]=ee-M}if(a){var te,ne="x"===w?se:ce,re="x"===w?ae:le,oe=k[S],ue="y"===S?"height":"width",de=oe+v[ne],pe=oe-v[re],fe=-1!==[se,ce].indexOf(g),me=null!=(te=null==T?void 0:T[S])?te:0,ve=fe?de:oe-x[ue]-E[ue]-me+_.altAxis,ge=fe?oe+x[ue]+E[ue]-me-_.altAxis:pe,be=p&&fe?function(e,t,n){var r=Ve(e,t,n);return r>n?n:r}(ve,oe,ge):Ve(p?ve:de,oe,p?ge:pe);k[S]=be,L[S]=be-oe}t.modifiersData[r]=L}},requiresIfExists:["offset"]},{name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,s=n.modifiersData.popperOffsets,a=Ee(n.placement),l=_e(a),c=[ce,le].indexOf(a)>=0?"height":"width";if(i&&s){var u=function(e,t){return He("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:Ne(e,de))}(o.padding,n),d=Q(i),h="y"===l?se:ce,p="y"===l?ae:le,f=n.rects.reference[c]+n.rects.reference[l]-s[l]-n.rects.popper[c],m=s[l]-n.rects.reference[l],v=ie(i),g=v?"y"===l?v.clientHeight||0:v.clientWidth||0:0,b=f/2-m/2,y=u[h],w=g-d[c]-u[p],S=g/2-d[c]/2+b,k=Ve(y,S,w),x=l;n.modifiersData[r]=((t={})[x]=k,t.centerOffset=k-S,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&Ie(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,s=We(t,{elementContext:"reference"}),a=We(t,{altBoundary:!0}),l=je(s,r),c=je(a,o,i),u=ze(l),d=ze(c);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}}]});const $e=(0,r.aZ)({name:"DocTooltip",props:{placement:{type:String,default:"top"},offset:{type:Array,default:function(){return[0,8]}},delay:{type:Number,default:250}},emits:["show","hide"],setup:function(e,t){var n,o=t.emit,i=(0,r.iH)(),s=(0,r.iH)(),a=(0,r.iH)(!1),l=null;return{trigger:i,tooltip:s,isOpen:a,show:function(){clearTimeout(n),n=setTimeout((function(){a.value=!0,(0,r.Y3)((function(){!function(){var t=document.querySelector("body"),n={placement:e.placement,modifiers:[{name:"offset",options:{offset:e.offset}},{name:"preventOverflow",options:{boundary:t}},{name:"flip",options:{boundary:t}}]};if(!i.value||!s.value)throw new Error("Tooltip trigger or tooltip element not found in DOM");l=qe(i.value,s.value,n)}(),o("show")}))}),e.delay)},hide:function(){clearTimeout(n),o("hide"),a.value=!1,l&&(l.destroy(),l=null)},update:function(){l&&l.update()}}}}),Ze=(0,c.Z)($e,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"trigger","aria-describedby":"tooltip",onMouseenter:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.show&&e.show.apply(e,t)}),onMouseleave:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger",{},void 0,!0)],544),e.isOpen?((0,r.wg)(),(0,r.iD)("div",I,[(0,r.WI)(e.$slots,"default",{},void 0,!0),F],512)):(0,r.kq)("",!0)])}],["__scopeId","data-v-cf3656fa"]]),Ue=(0,r.aZ)({name:"DocCopyButton",components:{DocTooltip:Ze},props:{copyText:String,tooltipText:{type:String,default:D().resources.API_CopyHint_Label},tooltipPlacement:{type:String,default:"top"},tooltipOffset:{type:Array,default:function(){return[0,8]}},buttonClass:{type:String,default:""}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(),o=(0,r.iH)(e.tooltipText),i=null;return(0,r.bv)((function(){(i=new(R())(n.value,{text:function(){return e.copyText}})).on("success",(function(){o.value=D().resources.API_CopiedAckHint_Label,t.value.update()}))})),(0,r.Jd)((function(){null!==i&&i.destroy()})),{tooltip:t,button:n,btnLabel:o}}}),Ke=(0,c.Z)(Ue,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-tooltip");return(0,r.wg)(),(0,r.j4)(a,{ref:"tooltip",placement:e.tooltipPlacement,offset:e.tooltipOffset},{trigger:(0,r.w5)((function(){return[(0,r._)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 transition-colors duration-200 ease-in focus:outline-none",e.buttonClass]),onMouseleave:t[0]||(t[0]=function(t){return e.btnLabel=e.tooltipText})},[(0,r.WI)(e.$slots,"default")],34)]})),default:(0,r.w5)((function(){return[(0,r._)("span",L,(0,r.zw)(e.btnLabel),1)]})),_:3},8,["placement","offset"])}]]);var Ye=[(0,r._)("path",{d:"M20 8h-9c-1.65 0-3 1.35-3 3v9c0 1.65 1.35 3 3 3h9c1.65 0 3-1.35 3-3v-9c0-1.65-1.35-3-3-3zm1 12c0 .55-.45 1-1 1h-9c-.55 0-1-.45-1-1v-9c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v9z"},null,-1),(0,r._)("path",{d:"M5 14H4c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v1c0 .55.45 1 1 1s1-.45 1-1V4c0-1.65-1.35-3-3-3H4C2.35 1 1 2.35 1 4v9c0 1.65 1.35 3 3 3h1c.55 0 1-.45 1-1s-.45-1-1-1z"},null,-1)];const Ge=(0,r.aZ)({name:"DocIconCopy"}),Xe=(0,c.Z)(Ge,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Ye)}]]),Je=(0,r.aZ)({name:"DocCodeblock",components:{DocCopyButton:Ke,DocIconCopy:Xe},props:{lineNumbers:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(""),o=(0,r.iH)(""),i=(0,r.iH)(!1);return(0,r.bv)((function(){var r,s,a,l;i.value="string"==typeof(null===(s=null===(r=t.value)||void 0===r?void 0:r.querySelector(".codeblock-title"))||void 0===s?void 0:s.textContent);var c=null===(a=t.value)||void 0===a?void 0:a.querySelector("code[class*='language-']");n.value=(null==c?void 0:c.innerText.trim())||"",e.lineNumbers&&(o.value=function(e){return e.split("\n").map((function(e,t){return"<div>".concat(t+1,"</div>")})).join("")}(n.value)),"PRE"===(null===(l=null==c?void 0:c.parentElement)||void 0===l?void 0:l.nodeName)&&new T.Z(c.parentElement)})),{codeblockRef:t,hasTitle:i,code:n,lineNumbersHtml:o}}}),Qe=(0,c.Z)(Je,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-copy"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",{ref:"codeblockRef",class:(0,r.C_)(["codeblock relative",{"line-numbers":e.lineNumbers}])},[(0,r._)("div",C,[(0,r.Wm)(c,{"copy-text":e.code,"tooltip-placement":"left","tooltip-offset":[-1,0],class:(0,r.C_)(["mr-1.5",e.hasTitle?"mt-14":"mt-1.5"]),"button-class":"w-10 h-10 text-dark-350 hover:text-white bg-dark-850 dark:bg-dark-800 bg-opacity-50 dark:bg-opacity-50 rounded-full"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]})),_:1},8,["copy-text","class"])]),(0,r.WI)(e.$slots,"default"),e.lineNumbers?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["absolute top-0 w-14 py-4 pr-3 bg-dark-850 dark:bg-dark-800 font-mono leading-normal text-dark-350 text-xs text-right",{"mt-12":e.hasTitle}]),innerHTML:e.lineNumbersHtml},null,10,_)):(0,r.kq)("",!0)],2)}]]),et=(0,r.aZ)({name:"DocCollapse",props:{modelValue:Boolean,animations:{type:Boolean,default:!0},triggerClass:{type:String,default:null}},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(!1),i=(0,r.iH)();function s(){n("update:modelValue",!e.modelValue)}return(0,r.YP)((function(){return e.modelValue}),(function(e){e?(0,r.Y3)((function(){if(i.value){var e=i.value.scrollHeight;i.value.style.height="".concat(e,"px")}})):i.value&&(i.value.style.height="0px")}),{immediate:!0}),{toggleCollapse:s,onKeydown:function(e){"Enter"===e.key&&s()},toggleMousedown:function(){o.value=!o.value},onFocus:function(e){o.value&&e.target.blur()},content:i}}}),tt=(0,c.Z)(et,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{class:(0,r.C_)(["cursor-pointer focus:outline-none focus:bg-gray-200 dark:focus:bg-dark-750",e.triggerClass]),tabindex:"0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleCollapse&&e.toggleCollapse.apply(e,t)}),onMousedown:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onMouseup:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onFocus:t[3]||(t[3]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[4]||(t[4]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger")],34),(0,r._)("div",{ref:"content",class:(0,r.C_)(["collapse-content overflow-hidden",e.animations?"transition-all duration-200 ease-out":null]),style:{height:"0"}},[(0,r.WI)(e.$slots,"default")],2),(0,r.WI)(e.$slots,"footer")])}]]),nt=(0,r.aZ)({name:"DocOverlay",props:{isOpen:Boolean},emits:["swipe-left","swipe-right","click"],setup:function(e,t){var n=t.emit,o=(0,r.qj)({x:0,y:0});return{onTouchStart:function(e){o.x=e.changedTouches[0].clientX,o.y=e.changedTouches[0].clientY},onTouchEnd:function(e){var t=e.changedTouches[0].clientX-o.x,r=e.changedTouches[0].clientY-o.y;Math.abs(t)>Math.abs(r)&&Math.abs(t)>40&&(t<0&&n("swipe-left",[e,"swipe-left"]),t>0&&n("swipe-right",[e,"swipe-right"]))},onClick:function(e){n("click",[e,"click"])}}}}),rt=(0,c.Z)(nt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed z-30 transition-opacity duration-300 ease-in-out bg-gray-600 dark:bg-dark-900",e.isOpen?"inset-0 opacity-50 dark:bg-opacity-70":"opacity-0"]),onTouchstart:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchStart&&e.onTouchStart.apply(e,t)}),onTouchend:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchEnd&&e.onTouchEnd.apply(e,t)}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,34)}]]);function ot(e){(0,m.zX)(window,"resize",(function(t){e(t)}))}function it(){var e=document.body,t=(0,r.iH)(0),n=e.offsetWidth;(0,r.bv)((function(){return n=e.offsetWidth})),ot((function(){return n=e.offsetWidth}));var o=(0,r.iH)(!1);return{enableBodyScroll:function(){o.value&&(e.classList.remove("overflow-hidden","fixed"),e.style.width="",e.style.top="",window.scrollTo(0,t.value),o.value=!1)},disableBodyScroll:function(){o.value||(t.value=window.scrollY,e.style.width="".concat(n,"px"),e.style.top="".concat(-t.value,"px"),e.classList.add("overflow-hidden","fixed"),o.value=!0)},isBodyScrollDisabled:o}}var st=r.lR;const at=(0,r.aZ)({name:"DocDrawer",components:{DocOverlay:rt,Teleport:st},props:{hideEvent:{type:Array,required:!0}},emits:["show","shown","hide","hidden"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=it(),a=s.enableBodyScroll,l=s.disableBodyScroll;return{Teleport:st,isOpen:i,show:function(){n("show"),i.value=!0,l(),(0,r.Y3)((function(){n("shown")}))},hide:function(t){var s;if(n("hide"),!t||!t[0])return i.value=!1,a(),void(0,r.Y3)((function(){n("hidden")}));var l=t[0].target;o.value!==l&&!(null===(s=o.value)||void 0===s?void 0:s.contains(l))&&e.hideEvent.includes(t[1])&&(i.value=!1,a(),(0,r.Y3)((function(){n("hidden")})))}}}}),lt=(0,c.Z)(at,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{ref:"el",class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 h-full transition-transform duration-300 ease-in-out bg-white focus:outline-none dark:bg-dark-850",e.isOpen?"translate-x-0 shadow-2xl":"translate-x-full"]),tabindex:"-1",onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r.WI)(e.$slots,"default"),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,{"is-open":e.isOpen,onSwipeLeft:e.hide,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onSwipeRight","onClick"])]})),_:1}))],34)}]]);var ct=["aria-expanded"],ut=n(850);const dt=(0,r.aZ)({name:"DocDropdown",props:{buttonClass:{type:String,default:""},align:{type:String,default:"left"},menuWidth:{type:String,default:"12rem"}},setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=(0,r.iH)(!1);return(0,r.YP)(i,(function(){var e=i.value?"open":"close";n(e)})),(0,ut.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),{isOpen:i,isFocused:s,onButtonClick:function(){i.value=!i.value},dropdown:o,hide:function(){i.value=!1}}}}),ht=(0,c.Z)(dt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:"relative",onKeydown:t[4]||(t[4]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",{class:(0,r.C_)(e.buttonClass),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,onFocus:t[0]||(t[0]=function(t){return e.isFocused=!0}),onBlur:t[1]||(t[1]=function(t){return e.isFocused=!1}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onButtonClick&&e.onButtonClick.apply(e,t)})},[(0,r.WI)(e.$slots,"button-content",{isOpen:e.isOpen,isFocused:e.isFocused})],42,ct),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",{class:(0,r.C_)(["absolute z-30 py-2 mt-2 bg-white border border-gray-300 rounded shadow-lg dark:bg-dark-650 dark:border-dark-500","right"===e.align?"right-0":"left-0"]),style:(0,r.j5)({"min-width":e.menuWidth}),onClick:t[3]||(t[3]=(0,r.iM)((function(){}),["stop"]))},[(0,r.WI)(e.$slots,"default")],6),[[r.F8,e.isOpen]])]})),_:3})],544)}]]);var pt=["innerHTML"];const ft=(0,r.aZ)({name:"DocEmoji",props:{emoji:{type:String,required:!0}},setup:function(e){return{emojiHtml:(0,r.Fl)((function(){return"&#x".concat(e.emoji.replace(/-/g,"&#x"))}))}}}),mt=(0,c.Z)(ft,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:"docs-emoji",innerHTML:e.emojiHtml},null,8,pt)}]]);var vt={class:"flex justify-between px-5 py-3 -mt-1 border-b border-gray-200 dark:border-dark-650"},gt={class:"flex text-sm text-gray-500 dark:text-dark-350"},bt={key:0,class:"flex flex-col items-center py-6"},yt=(0,r._)("svg",{class:"mb-2",xmlns:"http://www.w3.org/2000/svg",width:"60",height:"60"},[(0,r._)("circle",{cx:"30",cy:"30",r:"30",fill:"#e1edff"}),(0,r._)("path",{d:"M36.5 20.5h-2v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-6v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-2c-1.65 0-3 1.35-3 3v14c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3v-14c0-1.65-1.35-3-3-3zm-14 2h2v1c0 .55.45 1 1 1s1-.45 1-1v-1h6v1c0 .55.45 1 1 1s1-.45 1-1v-1h2c.55 0 1 .45 1 1v3h-16v-3c0-.55.45-1 1-1zm14 16h-14c-.55 0-1-.45-1-1v-9h16v9c0 .55-.45 1-1 1z",fill:"#8dbbff"})],-1),wt={class:"text-sm text-gray-500"},St={key:1,class:"mt-2"},kt=["href","onClick"],xt={class:"flex"},Et=["textContent"],Ct={class:"invisible ml-5 text-xs text-gray-600 group-hover:visible dark:text-dark-350"};function _t(){var e=(0,r.iH)(null);return(0,r.bv)((function(){e.value=window.__DOCS__})),{pageData:e}}function Tt(e){var t={};return""===e||"?"===e||(e=e.trim().replace(/^(\?|#|&)/,"")).split("&").forEach((function(e){var n=e.split("="),r=n[0],o=n[1];r=decodeURIComponent(r);var i=null==o?null:decodeURIComponent(o);t[r]=i})),t}var Lt=(0,r.iH)({path:"/"});function At(e,t){if("string"==typeof t)"push"===e?window.history.pushState(null,"",t):"replace"===e&&window.history.replaceState(null,"",t);else{if("object"!=typeof t)throw new Error("Invalid type. Expected a string or a Route object for new route location.");var n=t.path?t.path:window.location.href,r="";t.query&&(r=function(e){if(!Object.keys(e).length)return"";var t=[];return Object.keys(e).forEach((function(n){t.push("".concat(n,"=").concat(e[n]))})),"?"+t.join("&")}(t.query));var o="".concat(n).concat(r).concat(t.hash);"push"===e?window.history.pushState(null,"",o):"replace"===e&&window.history.replaceState(null,"",o)}Lt.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Tt(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}}var Dt={replace:function(e){return At("replace",e)},push:function(e){return At("push",e)}};function Ot(){return Lt.value.path=window.location.pathname?decodeURIComponent(window.location.pathname):"",Lt.value.query=Tt(window.location.search),Lt.value.hash=window.location.hash?decodeURIComponent(window.location.hash):"",(0,m.zX)(window,"turbo:visit",(function(){Lt.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Tt(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}})),{route:Lt,Router:Dt}}var Rt=n(830),Mt=function(){return Mt=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},Mt.apply(this,arguments)};const It=(0,r.aZ)({name:"DocHistory",components:{DocDropdown:ht},setup:function(){var e=(0,r.iH)(),t=D().maxHistoryItems,n=(0,r.iH)([]),o=D().resources.History_Title_Label,i=D().resources.History_ClearLink_Label,a=D().resources.History_NoHistory_Label,l=_t().pageData,c=Ot().route,u=(0,Rt.Rs)();function d(e){return e&&"/"!==e?u+e:(0,Rt.wE)(u)}return(0,r.bv)((function(){var e;null==(e=(0,s.qn)(D().base,localStorage,"doc_history"))||("version"in e?n.value=e.items:(function(e){if(e.length){var t=l.value;if(t)for(var n=0,r=e;n<r.length;n++){var o=r[n];o.path=(0,Rt.cD)(o.path,t)}}}(e),n.value=e)),function(){var e=l.value;if(e){var r=(0,Rt.cD)(c.value.path,e),o={title:e.title,path:r,timestamp:Date.now(),icon:"doc-icon-".concat(e.icon)};!function(e){var t=n.value.findIndex((function(t){return t.path===e.path}));t>-1&&n.value.splice(t,1)}(o),n.value.unshift(o),n.value.length>t&&n.value.pop();var i={version:1,items:n.value};(0,s.Nh)(D().base,localStorage,"doc_history",i)}}()})),{dropdown:e,history:n,clearHistory:function(){n.value=[],(0,s.Nh)(D().base,localStorage,"doc_history",[])},setTimeVisited:function(){n.value=n.value.map((function(e){return Mt(Mt({},e),{timeAgo:(0,s.Sy)(e.timestamp)})}))},onHistoryItemClick:function(t,n){(0,s.pI)(n)||(n.preventDefault(),(0,h.Vn)(d(t)),e.value.hide())},getFullPath:d,titleLabel:o,clearButtonLabel:i,noHistoryLabel:a}}}),Ft=(0,c.Z)(It,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-history"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-icon"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.j4)(u,{ref:"dropdown",style:{"margin-right":"-0.625rem"},align:"right","menu-width":"18rem",onOpen:e.setTimeVisited},{"button-content":(0,r.w5)((function(){var t;return[(0,r.Wm)(l,{class:(0,r.C_)([{"bg-gray-300 dark:bg-dark-450":null===(t=e.dropdown)||void 0===t?void 0:t.isOpen},"w-10 h-10 -mb-0.5"]),"icon-size":"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["class"])]})),default:(0,r.w5)((function(){return[(0,r._)("div",vt,[(0,r._)("div",gt,[(0,r.Wm)(c,{width:"15",height:"15",class:"mr-3 mt-0.75"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),(0,r._)("span",null,(0,r.zw)(e.titleLabel),1)]),(0,r._)("button",{class:"text-xs text-blue-500 dark:text-blue-400 focus:outline-none hover:text-blue-900 dark:hover:text-blue-200",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.clearHistory&&e.clearHistory.apply(e,t)})},(0,r.zw)(e.clearButtonLabel),1)]),e.history.length?((0,r.wg)(),(0,r.iD)("ul",St,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.history,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.timestamp},[(0,r._)("a",{class:"flex justify-between px-5 py-1.5 text-sm whitespace-nowrap group hover:bg-gray-200 dark:hover:bg-dark-500",href:e.getFullPath(t.path),onClick:function(n){return e.onHistoryItemClick(t.path,n)}},[(0,r._)("span",xt,[(0,r.Wm)(c,{class:"mr-3 mt-0.75",width:"15",height:"15"},{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(t.icon)))]})),_:2},1024),(0,r._)("span",{textContent:(0,r.zw)(t.title)},null,8,Et)]),(0,r._)("span",Ct,(0,r.zw)(t.timeAgo),1)],8,kt)])})),128))])):((0,r.wg)(),(0,r.iD)("div",bt,[yt,(0,r._)("div",wt,(0,r.zw)(e.noHistoryLabel),1)]))]})),_:1},8,["onOpen"])}]]);var Pt=["width","height"],Ht=["fill"];const Nt=(0,r.aZ)({name:"DocIcon",props:{width:{type:[Number,String],default:16},height:{type:[Number,String],default:16},iconColor:{type:String,default:"currentColor"}}}),Wt=(0,c.Z)(Nt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("svg",{xmlns:"http://www.w3.org/2000/svg",class:"mb-px",width:e.width,height:e.height,viewBox:"0 0 24 24",role:"presentation"},[(0,r._)("g",{fill:e.iconColor},[(0,r.WI)(e.$slots,"default")],8,Ht)],8,Pt)}]]),Bt=(0,r.aZ)({name:"DocIconButton",props:{iconSize:{type:[Number,String],default:16},rounded:{type:Boolean,default:!0}},setup:function(){var e=(0,r.iH)();return{button:e,onClick:function(){var t;null===(t=e.value)||void 0===t||t.blur()}}}}),Vt=(0,c.Z)(Bt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 overflow-hidden transition-colors duration-200 ease-in hover:bg-gray-200 focus:outline-none focus:bg-gray-300 dark:text-white dark:hover:bg-dark-500 dark:focus:bg-dark-450",e.rounded?"rounded-full":"rounded"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(a,{class:"shrink-0",style:{"margin-bottom":"0"},width:e.iconSize,height:e.iconSize},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default")]})),_:3},8,["width","height"])],2)}]]),jt=(0,r.aZ)({name:"LoadingSpinner",props:{size:{type:Number,default:20}},setup:function(e){return{styles:(0,r.Fl)((function(){return{width:"".concat(e.size,"px"),height:"".concat(e.size,"px"),borderWidth:"".concat(Math.round(e.size/8),"px")}}))}}}),zt=(0,c.Z)(jt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:"spinner inline-block rounded-full border-gray-400 dark:border-dark-450 border-solid animate-spin",style:(0,r.j5)(e.styles)},null,4)}],["__scopeId","data-v-79806448"]]);var qt={ref:"memberRef",class:"relative pluggable"},$t={class:"relative z-10 px-5 pb-5"},Zt={class:"absolute inset-0 transition-all duration-200 ease-linear z-5",style:{margin:"-1px"}},Ut=[(0,r._)("div",{class:"absolute inset-0 bg-blue-200 bg-opacity-25 border border-blue-300 dark:bg-dark-550 dark:border-dark-600"},null,-1)],Kt=Symbol("DocsGroupId"),Yt=Symbol("DocsOverloadId");function Gt(e){var t=(0,a.oR)().store,n=(0,r.f3)(Kt),o=(0,r.Fl)((function(){return Object.values(t.state.memberGroups[n]).filter((function(n){return function(e,t,n){var r=e.overloadId===n,o=e.access.split(",").map((function(e){return e.trim()})),i=o.every((function(e){var n;return null===(n=t.state.access)||void 0===n?void 0:n.includes(e)})),s=!e.isInherited||e.isInherited===t.state.inherited;return r&&i&&s}(n,t,e)}))}));return{members:o}}var Xt={class:"flex justify-between h-16 px-5"},Jt={class:"flex items-center truncate"},Qt={ref:"memberName",class:"flex items-center group"},en={class:"font-mono text-sm truncate whitespace-nowrap dark:text-dark-350"},tn={key:0,class:"ml-2"},nn={key:1,class:"ml-2 text-gray-600 dark:text-dark-350"},rn={key:2},on={key:3,class:"ml-1"},sn={key:0,class:"flex items-center h-6 px-2 ml-3 text-xs leading-none whitespace-nowrap border border-gray-400 rounded dark:border-dark-650"},an={class:"flex"},ln={class:"z-10 inline-flex bg-white border border-gray-300 rounded shadow-sm dark:bg-dark-650 dark:border-dark-650",style:{padding:"2px"}};const cn=(0,r.aZ)({name:"DocMemberToolbar",components:{DocCopyButton:Ke},props:{id:String,name:String},setup:function(e){return{buttons:(0,r.Fl)((function(){var t=window.location,n=t.origin,r=t.pathname,o="".concat(n).concat(r,"#").concat(e.id);return[{id:1,copyText:e.name,tooltipText:D().resources.API_CopyNameHint_Label,icon:"DocIconCopy"},{id:2,copyText:o,tooltipText:D().resources.API_CopyLinkHint_Label,icon:"DocIconLink"}]}))}}}),un=(0,c.Z)(cn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",ln,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.buttons,(function(e){return(0,r.wg)(),(0,r.j4)(l,{key:e.id,"copy-text":e.copyText,"tooltip-text":e.tooltipText,"button-class":"w-7 h-7 hover:bg-gray-200 focus:bg-gray-300 dark:hover:bg-dark-500",onClick:t[0]||(t[0]=(0,r.iM)((function(){}),["stop"]))},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(e.icon)))]})),_:2},1024)]})),_:2},1032,["copy-text","tooltip-text"])})),128))])}]]);var dn={class:"flex items-center"};const hn=(0,r.aZ)({name:"DocMemberAccessBadges",props:{access:{type:Array}},setup:function(e){var t=(0,r.Fl)((function(){var t;return null===(t=e.access)||void 0===t?void 0:t.filter((function(e){return"public"!==e}))}));return{badges:t}}}),pn=(0,c.Z)(hn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",dn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.badges,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,class:"ml-3",type:e},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e),1)]})),_:2},1032,["type"])})),128))])}]]),fn=(0,r.aZ)({name:"DocMemberTitle",components:{DocMemberToolbar:un,DocMemberAccessBadges:pn},props:{isVisible:{type:Boolean,required:!0,default:!1},isIntersecting:Boolean,isWindowScrolling:Boolean,id:String,name:String,overloadId:String,type:String,params:String,returns:String,memberAccess:Array},setup:function(e){var t,n,o=(0,r.Fl)((function(){return e.overloadId?Gt(e.overloadId).members.value.length-1:0})),i=(0,r.Fl)((function(){return e.type&&e.type.split(",").join(" | ")})),s=(0,r.Fl)((function(){return e.params?"(".concat(e.params.trim(),")"):""})),a=(0,r.Fl)((function(){return e.returns&&e.returns.split(",").join(" | ")})),l=(t=(0,r.iH)(),n=(0,r.iH)({}),(0,r.bv)((function(){var e,r=null===(e=t.value)||void 0===e?void 0:e.querySelector("h3");setTimeout((function(){var e=r?"".concat(r.clientWidth,"px"):"0";n.value={width:e,minWidth:"3.75rem",height:"2.625rem"}}),1e3)})),{memberName:t,hoverTriggerStyles:n});return{overloadCount:o,memberType:i,memberParams:s,memberReturnType:a,memberName:l.memberName,hoverTriggerStyles:l.hoverTriggerStyles,moreLabel:D().resources.API_MoreOverloads_Label}}}),mn=(0,c.Z)(fn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-toolbar"),l=(0,r.up)("doc-member-access-badges");return(0,r.wg)(),(0,r.iD)("div",Xt,[(0,r._)("div",Jt,[(0,r._)("div",Qt,[(0,r.WI)(e.$slots,"default"),e.isIntersecting&&!e.isWindowScrolling?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"absolute top-0 rounded-br-full",style:(0,r.j5)(e.hoverTriggerStyles)},[(0,r.Wm)(a,{id:e.id,class:"absolute top-0 left-0 hidden -mt-5 group-hover:inline-flex",name:e.name},null,8,["id","name"])],4)):(0,r.kq)("",!0)],512),(0,r._)("div",en,[e.memberType?((0,r.wg)(),(0,r.iD)("span",tn,": "+(0,r.zw)(e.memberType),1)):(0,r.kq)("",!0),e.memberParams?((0,r.wg)(),(0,r.iD)("span",nn,(0,r.zw)(e.memberParams),1)):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",rn,":")):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",on,(0,r.zw)(e.memberReturnType),1)):(0,r.kq)("",!0)]),e.overloadCount?((0,r.wg)(),(0,r.iD)("div",sn," +"+(0,r.zw)(e.overloadCount)+" "+(0,r.zw)(e.moreLabel),1)):(0,r.kq)("",!0)]),(0,r._)("div",an,[(0,r.Wm)(l,{access:e.memberAccess},null,8,["access"])])])}]]);var vn={class:"mb-5"},gn=(0,r._)("span",{class:"relative z-10 px-2 mb-2 ml-2 text-sm text-gray-600 uppercase bg-white rounded dark:bg-dark-850 dark:text-dark-350"}," Overloads ",-1),bn={class:"max-h-60 pt-4 pb-2 -mt-3.5 mb-6 overflow-x-hidden overflow-y-auto border border-gray-200 rounded dark:border-dark-650"},yn={class:"pl-0"},wn=["onClick"],Sn={class:"font-mono text-sm truncate whitespace-nowrap"};const kn=(0,r.aZ)({name:"DocOverloadSelect",components:{DocMemberAccessBadges:pn},setup:function(){var e=Gt((0,r.f3)(Yt)).members;return{members:e,memberLabel:function(e){var t=e.name;return(t+=e.params?" (".concat(e.params,")"):" ()")+(e.returns?": ".concat(e.returns):"")},memberAccess:function(e){return e.access?e.access.split(",").map((function(e){return e.trim()})):[]},memberClasses:function(e){var t="boolean"==typeof e.overloadVisibility&&e.overloadVisibility;return{"bg-blue-100 text-blue-600 font-semibold dark:bg-dark-550 dark:bg-opacity-50":t,"hover:bg-gray-200 dark:hover:bg-dark-500 dark:hover:bg-opacity-50":!t}},onMemberClick:function(t){e.value.forEach((function(e){e.overloadVisibility=e.isOpen=e.id===t.id,function(e){e.animations=!1,setTimeout((function(){e.animations=!0}),100)}(e)}))}}}}),xn=(0,c.Z)(kn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-access-badges");return(0,r.wy)(((0,r.wg)(),(0,r.iD)("div",vn,[gn,(0,r._)("div",bn,[(0,r._)("ul",yn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.id,class:(0,r.C_)(["flex px-4 py-1 list-none transition-colors duration-150 ease-linear cursor-pointer",e.memberClasses(t)]),onClick:function(n){return e.onMemberClick(t)}},[(0,r._)("div",Sn,(0,r.zw)(e.memberLabel(t)),1),(0,r.Wm)(a,{class:"ml-auto",access:e.memberAccess(t)},null,8,["access"])],10,wn)})),128))])])],512)),[[r.F8,e.members.length>1]])}]]);var En={class:"mb-2 text-sm text-gray-600 dark:text-dark-350 uppercase"},Cn={class:"codeblock-wrapper"},_n={class:"member-signature language-csharp m-0 px-5 py-4 text-dark-300 text-xs"},Tn={class:"member-signature language-csharp"};const Ln=(0,r.aZ)({name:"DocMemberSignature",props:{signature:String},setup:function(){return{signatureLabel:D().resources.API_SignatureSection_Label}}}),An=(0,c.Z)(Ln,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-codeblock");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",En,(0,r.zw)(e.signatureLabel),1),(0,r._)("div",Cn,[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[(0,r._)("pre",_n,[(0,r._)("code",Tn,(0,r.zw)(e.signature),1)])]})),_:1})])])}]]);function Dn(e,t){var n=Object.assign({},{root:null,rootMargin:"0px",threshold:0},t),o=(0,r.iH)(),i=(0,r.iH)([]),s=(0,r.Fl)((function(){return void 0!==e.value&&null!==e.value&&i.value.length>0&&i.value.every((function(e){return e.isIntersecting}))})),a=function(e){i.value=e};return(0,r.bv)((function(){e.value&&(o.value=new IntersectionObserver(a,n),o.value.observe(e.value))})),(0,r.Jd)((function(){var e;null===(e=o.value)||void 0===e||e.disconnect()})),{isIntersecting:s,elements:i}}function On(e,t,n){var o=(0,r.iH)(!1),i=(0,r.Fl)((function(){return n.state.scrolledElementId})),s=(0,r.Fl)((function(){return n.state.isWindowScrolling}));return(0,r.YP)(s,(function(t){t||e===i.value&&(o.value=!0,setTimeout((function(){o.value=!1}),1e3),n.actions.updateScrolledElementId(""))}),{immediate:!0}),{isHighlighted:o}}const Rn=(0,r.aZ)({name:"DocMember",components:{DocAnchorTarget:u,DocCollapse:tt,DocMemberTitle:mn,DocOverloadSelect:xn,DocMemberSignature:An},props:{id:{type:String,required:!0},name:{type:String,required:!0},isInherited:{type:Boolean,default:!1},access:{type:String,default:"public"},overloadId:String,type:String,params:String,returns:String,signature:String},setup:function(e){var t=(0,r.iH)(),n=(0,a.oR)().store,o=(0,r.f3)(Kt),i=(0,r.Fl)((function(){return n.state.memberGroups[o][e.id].animations}));!function(e,t,n){Object.keys(n).forEach((function(r){r&&e.actions.setMemberData(t,n.id,r,n[r])}))}(n,o,e);var s=function(e,t,n){var o=(0,r.Fl)((function(){var r,o=null===(r=n.state.memberGroups[t][e.id])||void 0===r?void 0:r.isVisible;return void 0===o||o})),i=(0,r.Fl)((function(){return e.access.split(",").map((function(e){return e.trim()}))})),s=(0,r.Fl)((function(){var r=!e.overloadId||n.state.memberGroups[t][e.id].overloadVisibility,o=i.value.every((function(e){var t;return null===(t=n.state.access)||void 0===t?void 0:t.includes(e)})),s=!e.isInherited||e.isInherited===n.state.inherited,a=e.name.toLowerCase().includes(n.state.memberFilter.toLowerCase());return r&&o&&s&&a}));return(0,r.YP)(s,(function(r){n.actions.setMemberData(t,e.id,"isVisible",r)}),{immediate:!0}),{isVisible:o,memberAccess:i}}(e,o,n),l=s.isVisible,c=s.memberAccess,u=function(e,t,n,o){var i=(0,r.Fl)({get:function(){var r=n.state.memberGroups[t];return!(!r||!r[e])&&r[e].isOpen},set:function(r){n.actions.setMemberData(t,e,"isOpen",r)}}),s=(0,r.Fl)((function(){return n.state.scrolledElementId}));return(0,r.YP)(s,(function(r){e===r&&n.actions.setMemberData(t,e,"isOpen",!0)})),(0,r.YP)(i,(function(e){if(e){var t=o.value;t&&t.classList.contains("pluggable")&&(0,r.Y3)((function(){t.dispatchEvent(new Event("onPluginReady"))}))}})),{isOpen:i}}(e.id,o,n,t).isOpen;return{isOpen:u,isVisible:l,animations:i,memberAccess:c,isHighlighted:On(e.id,0,n).isHighlighted,memberRef:t,isIntersecting:Dn(t).isIntersecting,isWindowScrolling:(0,r.Fl)((function(){return n.state.isWindowScrolling}))}}}),Mn=(0,c.Z)(Rn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-target"),l=(0,r.up)("doc-member-title"),c=(0,r.up)("doc-overload-select"),u=(0,r.up)("doc-member-signature"),d=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.iD)("div",qt,[(0,r.Wm)(a,{id:e.id,class:"absolute top-5 left-0 right-0 bottom-0",style:{"z-index":"-1"}},null,8,["id"]),(0,r.wy)((0,r.Wm)(d,{modelValue:e.isOpen,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isOpen=t}),class:"relative -mt-px border dark:border-dark-650 doc-member",animations:e.animations},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(l,{id:e.id,class:"relative z-10",name:e.name,"overload-id":e.overloadId,type:e.type,params:e.params,returns:e.returns,"member-access":e.memberAccess,"is-visible":e.isVisible,"is-intersecting":e.isIntersecting,"is-window-scrolling":e.isWindowScrolling},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"name")]})),_:3},8,["id","name","overload-id","type","params","returns","member-access","is-visible","is-intersecting","is-window-scrolling"])]})),footer:(0,r.w5)((function(){return[e.isIntersecting?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",Zt,Ut,512),[[r.F8,e.isHighlighted]])]})),_:1})):(0,r.kq)("",!0)]})),default:(0,r.w5)((function(){return[(0,r._)("div",$t,[e.isOpen?((0,r.wg)(),(0,r.iD)(r.HY,{key:0},[e.overloadId?((0,r.wg)(),(0,r.j4)(c,{key:0})):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default"),t[0]||((0,r.qZ)(-1),t[0]=e.signature?((0,r.wg)(),(0,r.j4)(u,{key:1,class:"mb-5",signature:e.signature},null,8,["signature"])):(0,r.kq)("",!0),(0,r.qZ)(1),t[0]),(0,r.WI)(e.$slots,"parameters")],64)):(0,r.kq)("",!0)])]})),_:3},8,["modelValue","animations"]),[[r.F8,e.isVisible]])],512)}]]);var In={class:"mb-6 doc-member-group"},Fn={key:0,class:"flex items-center justify-between"},Pn={class:"group"};const Hn=(0,r.aZ)({name:"MemberGroup",props:{id:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Kt,e.id);var t=(0,a.oR)().store;return{visibleMemberCount:(0,r.Fl)((function(){return t.getters.getVisibleGroupMembers(e.id).length}))}}}),Nn=(0,c.Z)(Hn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger"),l=(0,r.up)("doc-anchor-target");return(0,r.wg)(),(0,r.iD)("div",In,[e.visibleMemberCount>0?((0,r.wg)(),(0,r.iD)("div",Fn,[(0,r.Wm)(l,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("h2",Pn,[(0,r.Wm)(a,{class:"float-left mt-2 -ml-6 text-lg font-normal text-blue-500 opacity-0 group-hover:opacity-100",to:"#".concat(e.id)},{default:(0,r.w5)((function(){return[(0,r.Uk)(" # ")]})),_:1},8,["to"]),(0,r.WI)(e.$slots,"title")])]})),_:3},8,["id"])])):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default")])}]]),Wn=(0,r.aZ)({name:"DocOverloadGroup",props:{overloadId:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Yt,e.overloadId);var t=Ot().route,n=Gt(e.overloadId).members;(0,r.m0)((function(){n.value.forEach((function(e,r){e.overloadVisibility=0===r,t.value.hash==="#".concat(e.id)&&0!==r&&(n.value[0].overloadVisibility=!1,e.overloadVisibility=!0)}))}))}}),Bn=(0,c.Z)(Wn,[["render",function(e,t,n,o,i,s){return(0,r.WI)(e.$slots,"default")}]]);var Vn=["href"],jn={class:"docs-panel-content px-5 pb-5"};const zn=(0,r.aZ)({name:"DocPanel",props:{id:{type:String,required:!0},collapsed:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(!e.collapsed),n=Ot().route;return(0,r.bv)((function(){n.value.hash&&n.value.hash==="#".concat(e.id)&&(t.value=!0)})),{isExpanded:t,onClick:function(e){(0,s.pI)(e)?e.stopPropagation():e.preventDefault()}}}}),qn=(0,c.Z)(zn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-right"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-anchor-target"),u=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.j4)(u,{modelValue:e.isExpanded,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isExpanded=t}),"trigger-class":"relative py-4 pl-5 font-medium text-gray-900 pr-14 dark:text-white",class:"mb-6 border rounded-md dark:border-dark-650"},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(c,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("div",null,[(0,r.WI)(e.$slots,"title")]),(0,r._)("div",{class:(0,r.C_)(["absolute inline-flex items-center justify-center text-blue-500 transition duration-200 ease-out origin-center rounded-full w-7 h-7 right-3 top-4 hover:bg-gray-200 dark:hover:bg-dark-500 z-5",{"rotate-90":e.isExpanded}])},[(0,r.Wm)(l,{width:"22",height:"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})],2)]})),_:3},8,["id"]),(0,r._)("a",{href:"#".concat(e.id),class:"absolute inset-0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,8,Vn)]})),default:(0,r.w5)((function(){return[(0,r._)("div",jn,[(0,r.WI)(e.$slots,"default")])]})),_:3},8,["modelValue"])}]]),$n=(0,r.aZ)({name:"DocPanels",setup:function(e,t){var n,o=t.slots,i=(null===(n=o.default)||void 0===n?void 0:n.call(o))||[],s=(0,r.Fl)((function(){return i.map((function(e){var t,n;return(0,r.h)(qn,{id:null===(t=e.props)||void 0===t?void 0:t.id,collapsed:null===(n=e.props)||void 0===n?void 0:n.collapsed},{title:function(){var t;return null===(t=e.children)||void 0===t?void 0:t.title()},default:function(){var t,n;return null===(n=null===(t=e.children)||void 0===t?void 0:t.default)||void 0===n?void 0:n.call(t)}})}))}));return function(){return(0,r.h)("div",{class:"docs-panels mb-6 border rounded-md dark:border-dark-650"},s.value)}}});var Zn={class:"relative pl-4 mb-5"},Un={class:"relative mb-1"},Kn=(0,r._)("span",{class:"absolute -ml-4"},"⚬",-1),Yn={class:"font-semibold"},Gn={key:0},Xn=(0,r._)("span",{class:"font-semibold"},":",-1),Jn={key:0,class:"mx-1 text-sm"},Qn={key:1,class:"text-sm text-gray-600"},er={key:0,class:"text-sm"},tr={class:"font-medium text-gray-900"};const nr=(0,r.aZ)({name:"DocParamater",props:{name:{type:String,required:!0},type:{type:String,default:""},optional:{type:Boolean,default:!1},defaultValue:{type:String,default:""}},setup:function(){return{optionalLabel:D().resources.API_OptionalParameter_Label,defaultValueLabel:D().resources.API_DefaultParameterValue_Label}}}),rr=(0,c.Z)(nr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",Zn,[(0,r._)("div",Un,[Kn,(0,r._)("span",Yn,(0,r.zw)(e.name),1),e.type?((0,r.wg)(),(0,r.iD)("span",Gn,[Xn,(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.type),1)]})),_:1}),e.optional?((0,r.wg)(),(0,r.iD)("span",Jn,"•")):(0,r.kq)("",!0),e.optional?((0,r.wg)(),(0,r.iD)("span",Qn,(0,r.zw)(e.optionalLabel),1)):(0,r.kq)("",!0)])):(0,r.kq)("",!0)]),(0,r.WI)(e.$slots,"default"),e.defaultValue?((0,r.wg)(),(0,r.iD)("div",er,[(0,r._)("div",null,[(0,r._)("span",tr,(0,r.zw)(e.defaultValueLabel)+":",1),(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.defaultValue),1)]})),_:1})])])):(0,r.kq)("",!0)])}]]);var or={class:"p-5 bg-gray-100 rounded parameters dark:bg-dark-800"},ir={class:"mb-4 text-sm text-gray-600 uppercase dark:text-dark-350"};const sr=(0,r.aZ)({name:"DocParameters",setup:function(){return{parametersLabel:D().resources.API_ParameterSection_Label}}}),ar=(0,c.Z)(sr,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",or,[(0,r._)("div",ir,(0,r.zw)(e.parametersLabel),1),(0,r.WI)(e.$slots,"default")])}]]);var lr=n(816),cr={class:"relative"},ur={class:"absolute flex items-center justify-center h-full pl-3"},dr=["placeholder"];const hr=(0,r.aZ)({name:"SearchInput",emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.f3)(lr.xf),i=(0,a.oR)().store,s=(0,r.Fl)({get:function(){return i.state.searchQuery},set:function(e){return i.actions.updateSearchQuery(e)}}),l=(0,r.iH)(),c=D().resources.Search_Input_Placeholder;return{input:l,focus:function(){var e;null===(e=l.value)||void 0===e||e.focus()},config:D(),query:s,search:o,onKeydown:function(e){"Enter"===e.code&&n("select"),null==o||o.onKeydown(e)},onFocus:function(){o&&(o.isFocused=!0,o.results.length&&(o.isOpen=!0))},searchLabel:c}}}),pr=(0,c.Z)(hr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-search"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-icon-x"),u=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",cr,[(0,r._)("div",ur,[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]),(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-10 pl-8 leading-10 text-left text-gray-600 transition-colors duration-200 ease-in bg-gray-200 border border-transparent rounded sm:text-sm hover:bg-white hover:border-gray-300 focus:outline-none focus:border-gray-500 focus:bg-white dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",style:{padding:"0.625rem 0.75rem 0.625rem 2rem"},type:"text",autocomplete:"off",spellcheck:"false","aria-label":"{{ searchLabel }}",placeholder:e.config.search.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},null,40,dr),[[r.nr,e.query]]),e.query?((0,r.wg)(),(0,r.j4)(u,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-2 mr-2 hover:bg-gray-200",tabindex:"-1",onClick:(0,r.iM)(e.search.clear,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]);var fr=["href","onClick"],mr={class:"w-full"},vr=["innerHTML"],gr=["innerHTML"],br=["innerHTML"],yr={key:1,class:"text-sm px-5 py-4 mb-3"};const wr=(0,r.aZ)({name:"DocSearchResults",props:{isMobile:Boolean},emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.f3)(lr.xf),a=(0,Rt.Rs)(),l=D().search.noResultsFoundMsg;return(0,r.YP)((function(){return o.value}),(function(e){e&&new T.Z(e)})),{rootEl:o,searchApi:i,onResultClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),i.navigateToResult(e.path,a),n("select"))},getFullPath:function(e){return i.getResultFullPath(e,a)},noResultsText:l}}}),Sr=(0,c.Z)(wr,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-active-class":"transition duration-300 ease-out overflow-hidden","enter-from-class":"-translate-y-2 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-100 ease-in overflow-hidden","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[e.searchApi.isFocused&&e.searchApi.isOpen?((0,r.wg)(),(0,r.iD)("div",{key:0,ref:"rootEl",class:(0,r.C_)(["z-30 w-full overflow-y-auto rounded bg-white",e.isMobile?"dark:bg-dark-850":"dark:bg-dark-650 dark:border-dark-500"])},[(0,r._)("ul",null,[e.searchApi.results.length?((0,r.wg)(!0),(0,r.iD)(r.HY,{key:0},(0,r.Ko)(e.searchApi.results,(function(t,n){return(0,r.wg)(),(0,r.iD)("li",{key:t.id},[(0,r._)("a",{class:(0,r.C_)(["flex justify-between m-3 mt-0 py-4 px-4 rounded-md group hover:bg-gray-200 dark:hover:bg-dark-450 focus:outline-none overflow-x-clip",n===e.searchApi.focusIndex?"bg-gray-200 dark:bg-dark-450":"bg-gray-100 dark:bg-dark-550"]),href:e.getFullPath(t.path),tabindex:"-1",onClick:function(n){return e.onResultClick(t,n)}},[(0,r._)("div",mr,[t.heading?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"mb-2 font-semibold text-gray-900 dark:text-white",innerHTML:t.heading},null,8,vr)):(0,r.kq)("",!0),(0,r._)("div",{class:"text-sm",innerHTML:t.text},null,8,gr),(0,r._)("div",{class:"mt-2 text-xs font-medium text-gray-900 dark:text-white break-words",innerHTML:t.page},null,8,br)])],10,fr)])})),128)):((0,r.wg)(),(0,r.iD)("li",yr,(0,r.zw)(e.noResultsText),1))])],2)):(0,r.kq)("",!0)]})),_:1})}]]),kr=(0,r.aZ)({name:"DocSearchDesktop",components:{DocSearchInput:pr,DocSearchResults:Sr},setup:function(){var e=(0,r.iH)(),t=(0,lr.Rx)(e);(0,r.JJ)(lr.xf,t);var n=(0,r.iH)();return(0,m.zX)(window,"keydown",(function(e){var t,r=e;r.target===document.body&&D().search.hotkeys.includes(r.key)&&(r.preventDefault(),null===(t=n.value)||void 0===t||t.focus())})),{rootEl:e,onRootClick:function(){var e;null===(e=t.input)||void 0===e||e.focus(),t.isFocused=!0},searchInput:n,searchApi:t}}}),xr=(0,c.Z)(kr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-search-results");return(0,r.wg)(),(0,r.iD)("div",{ref:"rootEl",class:(0,r.C_)(["absolute hidden transition-all duration-300 ease-out right-25 lg:flex lg:flex-col lg:ml-auto",e.searchApi.isFocused?"w-[42rem]":"w-40"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onRootClick&&e.onRootClick.apply(e,t)}),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.searchApi.isFocused=!1}),["tab"]))},[(0,r.Wm)(a,{ref:"searchInput",class:(0,r.C_)(["self-end transition-all duration-300 ease-out",e.searchApi.isFocused?"w-96":"w-40"])},null,8,["class"]),(0,r.Wm)(l,{class:"absolute max-h-[32rem] pt-3 mt-2 border flex border-gray-300 shadow-lg dark:border-dark-650"})],34)}]]);var Er={ref:"searchRoot",class:"flex flex-col h-full"},Cr={class:"flex items-center justify-between shrink-0 h-16 bg-white md:h-20 dark:bg-dark-850"},_r=r.lR;const Tr=(0,r.aZ)({name:"DocSearchMobile",components:{Teleport:_r,DocSearchInput:pr,DocSearchResults:Sr},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,lr.Rx)(t);return(0,r.JJ)(lr.xf,n),{Teleport:_r,docDrawer:e,searchRoot:t,show:function(){e.value.show()},onShown:function(){var e;null===(e=n.input)||void 0===e||e.focus()},onHidden:function(){var e;null===(e=n.input)||void 0===e||e.blur()},hideDrawer:function(){null==e||e.value.hide()},searchApi:n}}}),Lr=(0,c.Z)(Tr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-icon-arrow-right"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-search-results"),d=(0,r.up)("doc-icon-search"),h=(0,r.up)("doc-drawer");return(0,r.wg)(),(0,r.j4)(h,{ref:"docDrawer",class:"md:w-104","hide-event":["swipe-right","click"],onShown:e.onShown,onHidden:e.onHidden},{default:(0,r.w5)((function(){return[(0,r._)("div",Er,[(0,r._)("div",Cr,[(0,r.Wm)(a,{class:"ml-3 w-full",onSelect:e.hideDrawer},null,8,["onSelect"]),(0,r.Wm)(c,{class:"w-10 h-10 ml-3",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hideDrawer},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1},8,["onClick"])]),(0,r.Wm)(u,{class:"pb-6",style:{"max-height":"100%"},"is-mobile":!0,onSelect:e.hideDrawer},null,8,["onSelect"])],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-mobile-search-button"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-10 h-10 lg:hidden","icon-size":"20",onClick:(0,r.iM)(e.show,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1}))]})),_:1},8,["onShown","onHidden"])}]]);var Ar={class:"flex items-center shrink-0 h-16 px-6 -ml-6 bg-white border-b border-gray-200 md:hidden dark:bg-dark-800 dark:border-dark-650"},Dr={ref:"sidebarFooter"},Or={key:0,ref:"sidebarLinksEl",class:"overflow-y-auto h-full"},Rr=n(296),Mr=n.n(Rr);let Ir=e=>"object"==typeof e&&null!=e&&1===e.nodeType,Fr=(e,t)=>(!t||"hidden"!==e)&&"visible"!==e&&"clip"!==e,Pr=(e,t)=>{if(e.clientHeight<e.scrollHeight||e.clientWidth<e.scrollWidth){let n=getComputedStyle(e,null);return Fr(n.overflowY,t)||Fr(n.overflowX,t)||(e=>{let t=(e=>{if(!e.ownerDocument||!e.ownerDocument.defaultView)return null;try{return e.ownerDocument.defaultView.frameElement}catch(e){return null}})(e);return!!t&&(t.clientHeight<e.scrollHeight||t.clientWidth<e.scrollWidth)})(e)}return!1},Hr=(e,t,n,r,o,i,s,a)=>i<e&&s>t||i>e&&s<t?0:i<=e&&a<=n||s>=t&&a>=n?i-e-r:s>t&&a<n||i<e&&a>n?s-t+o:0,Nr=e=>{let t=e.parentElement;return null==t?e.getRootNode().host||null:t},Wr=(e,t)=>{var n,r,o,i;if("undefined"==typeof document)return[];let{scrollMode:s,block:a,inline:l,boundary:c,skipOverflowHiddenElements:u}=t,d="function"==typeof c?c:e=>e!==c;if(!Ir(e))throw new TypeError("Invalid target");let h=document.scrollingElement||document.documentElement,p=[],f=e;for(;Ir(f)&&d(f);){if(f=Nr(f),f===h){p.push(f);break}null!=f&&f===document.body&&Pr(f)&&!Pr(document.documentElement)||null!=f&&Pr(f,u)&&p.push(f)}let m=null!=(r=null==(n=window.visualViewport)?void 0:n.width)?r:innerWidth,v=null!=(i=null==(o=window.visualViewport)?void 0:o.height)?i:innerHeight,{scrollX:g,scrollY:b}=window,{height:y,width:w,top:S,right:k,bottom:x,left:E}=e.getBoundingClientRect(),C="start"===a||"nearest"===a?S:"end"===a?x:S+y/2,_="center"===l?E+w/2:"end"===l?k:E,T=[];for(let e=0;e<p.length;e++){let t=p[e],{height:n,width:r,top:o,right:i,bottom:c,left:u}=t.getBoundingClientRect();if("if-needed"===s&&S>=0&&E>=0&&x<=v&&k<=m&&S>=o&&x<=c&&E>=u&&k<=i)return T;let d=getComputedStyle(t),f=parseInt(d.borderLeftWidth,10),L=parseInt(d.borderTopWidth,10),A=parseInt(d.borderRightWidth,10),D=parseInt(d.borderBottomWidth,10),O=0,R=0,M="offsetWidth"in t?t.offsetWidth-t.clientWidth-f-A:0,I="offsetHeight"in t?t.offsetHeight-t.clientHeight-L-D:0,F="offsetWidth"in t?0===t.offsetWidth?0:r/t.offsetWidth:0,P="offsetHeight"in t?0===t.offsetHeight?0:n/t.offsetHeight:0;if(h===t)O="start"===a?C:"end"===a?C-v:"nearest"===a?Hr(b,b+v,v,L,D,b+C,b+C+y,y):C-v/2,R="start"===l?_:"center"===l?_-m/2:"end"===l?_-m:Hr(g,g+m,m,f,A,g+_,g+_+w,w),O=Math.max(0,O+b),R=Math.max(0,R+g);else{O="start"===a?C-o-L:"end"===a?C-c+D+I:"nearest"===a?Hr(o,c,n,L,D+I,C,C+y,y):C-(o+n/2)+I/2,R="start"===l?_-u-f:"center"===l?_-(u+r/2)+M/2:"end"===l?_-i+A+M:Hr(u,i,r,f,A+M,_,_+w,w);let{scrollLeft:e,scrollTop:s}=t;O=Math.max(0,Math.min(s+O/P,t.scrollHeight-n/P+I)),R=Math.max(0,Math.min(e+R/F,t.scrollWidth-r/F+M)),C+=s-O,_+=e-R}T.push({el:t,top:O,left:R})}return T};var Br=["href"],Vr={class:"flex shrink-0 items-center justify-center w-6 h-6 mr-2"},jr=["innerHTML"],zr=["src"],qr=["textContent"],$r={key:1,class:"absolute right-0 h-full bg-blue-500 dark:bg-blue-400 w-px"},Zr={class:"ml-4 transition-all duration-200 ease-out"},Ur=n(376),Kr=n(110),Yr=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},Gr=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,a[0]&&(s=0)),s;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,r=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){s.label=a[1];break}if(6===a[0]&&s.label<o[1]){s.label=o[1],o=a;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(a);break}o[2]&&s.ops.pop(),s.trys.pop();continue}a=t.call(e,s)}catch(e){a=[6,e],r=0}finally{n=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,l])}}};const Xr=(0,r.aZ)({name:"DocSidebarLink",props:{item:{type:Object,required:!0},depth:{type:Number,default:0},isFiltered:{type:Boolean,default:!1,required:!0}},setup:function(e){var t=(0,r.iH)(),n=(0,r.Fl)((function(){return e.item.children&&e.item.children.length>0||e.item.hash})),o=(0,r.Fl)((function(){return!(!e.item.icon&&!e.item.emoji)})),i=(0,Rt.sy)(),l=(0,Rt.Rs)(),c=D().appendDocumentName?D().documentName:"",u=(0,r.Fl)((function(){return e.item.clickable?e.item.url?e.item.url.startsWith(D().base)?l+e.item.url.slice(D().base.length):e.item.url:e.item.path&&"/"!==e.item.path?!D().trailingSlash&&c&&e.item.path?"".concat(l).concat(e.item.path,"/").concat(c):"".concat(l).concat(e.item.path).concat(c):(0,Rt.wE)(l):null})),d=(0,r.Fl)((function(){return e.item.icon&&!e.item.icon.startsWith("<")&&-1==e.item.icon.indexOf("://")?l+e.item.icon:e.item.icon})),h=Ot().route,p=(0,r.Fl)((function(){if(e.item.url)return!1;var t=i+(0,Rt.cD)(h.value.path),n=u.value;return null!=n&&null!=t&&(n.length===t.length&&n===t||n.length===t.length+1&&"/"!==t[t.length-1]&&"/"===n[n.length-1]&&n.startsWith(t)||n.length+1===t.length&&"/"===t[t.length-1]&&"/"!==n[n.length-1]&&t.startsWith(n))})),f=(0,a.oR)().store,m=(0,r.Fl)((function(){return f.state.sidebarLookup})),v=m.value.get(e.item.path);(e.isFiltered||e.item.open)&&E();var g=(0,Ur.i)(),b=g.result,y=g.error,w=g.loading,S=g.execute,k="".concat(location.origin).concat(Kr.as);function x(){return Yr(this,void 0,void 0,(function(){return Gr(this,(function(t){switch(t.label){case 0:return[4,S("".concat(k,"/").concat(e.item.hash,".json"))];case 1:if(t.sent(),y.value)throw new Error("Error fetching sidebar navigation items. ".concat(y.value));return(0,s.rw)(m.value,b.value,D().trailingSlash),[2]}}))}))}function E(t){var n;return Yr(this,void 0,void 0,(function(){var r;return Gr(this,(function(o){switch(o.label){case 0:return(r=t||v)?!e.item.hash||(null===(n=e.item.children)||void 0===n?void 0:n.length)?[3,2]:[4,x()]:[2];case 1:o.sent(),o.label=2;case 2:return f.actions.updateSidebarLookupItem(r,"expanded",!0),[2]}}))}))}function C(){v&&f.actions.updateSidebarLookupItem(v,"expanded",!1)}function _(){v&&v.expanded?C():E()}function T(){var t;p.value&&(n.value&&E(),null===(t=e.item.parentNodes)||void 0===t||t.forEach((function(e){E(m.value.get(e))})))}(0,r.YP)((function(){return e.isFiltered}),(function(e){e?E(v):(C(),T())}));var L=(0,r.iH)(!1);return(0,r.bv)((function(){p.value&&t.value&&f.actions.setActiveSidebarEl(t.value),T(),(0,r.Y3)((function(){L.value=!0}))})),{sidebarLinkRef:t,isGroup:n,hasCustomIcon:o,href:u,icon:d,isActive:p,onLinkClick:function(e){if(!(0,s.pI)(e)){if(p.value)e.preventDefault();else if((null==v?void 0:v.expanded)&&u.value)return;_()}},toggle:_,loading:w,transitionsEnabled:L,onEnter:function(e){L.value&&(e.style.height="0"),(0,r.Y3)((function(){e.style.height="".concat(e.scrollHeight,"px")}))},onAfterEnter:function(e){(0,r.Y3)((function(){e.style.height="auto"}))},onBeforeLeave:function(e){e.style.height="".concat(e.scrollHeight,"px")},onLeave:function(e){e.style.height="0px"}}}}),Jr=(0,c.Z)(Xr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-emoji"),c=(0,r.up)("doc-icon-folder"),u=(0,r.up)("doc-loading-spinner"),d=(0,r.up)("doc-icon-chevron-right"),h=(0,r.up)("doc-sidebar-link");return(0,r.wg)(),(0,r.iD)("li",null,[(0,r._)("div",{class:(0,r.C_)(["relative flex items-center justify-between break-normal pl-3 pr-4 select-none rounded-l transition-colors ease-out duration-150",{"text-blue-500 dark:text-blue-400 bg-blue-100 dark:bg-dark-650 rounded-l":e.isActive,"text-gray-900 dark:text-dark-250 hover:text-blue-500 dark:hover:text-blue-400":!e.isActive}])},[(0,r._)("a",{ref:"sidebarLinkRef",class:"flex flex-1 items-center cursor-pointer",href:e.href,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onLinkClick&&e.onLinkClick.apply(e,t)})},[(0,r._)("span",Vr,[e.item.icon&&e.item.icon.startsWith("<")?((0,r.wg)(),(0,r.j4)(a,{key:0,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r._)("g",{innerHTML:e.item.icon},null,8,jr)]})),_:1})):e.item.icon?((0,r.wg)(),(0,r.iD)("img",{key:1,src:e.icon,class:"w-4.5"},null,8,zr)):e.item.emoji?((0,r.wg)(),(0,r.j4)(l,{key:2,emoji:e.item.emoji},null,8,["emoji"])):!e.item.icon&&0===e.depth&&e.isGroup?((0,r.wg)(),(0,r.j4)(a,{key:3,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1})):(0,r.kq)("",!0)]),(0,r._)("span",{class:"text-sm py-1.5",textContent:(0,r.zw)(e.item.label)},null,8,qr)],8,Br),e.isGroup?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["flex items-center justify-center w-7 h-7 rounded-full transition-colors ease-linear duration-150 group shrink-0",{"hover:bg-blue-200 hover:bg-opacity-50":e.isActive&&!e.loading,"hover:bg-gray-200 dark:hover:bg-dark-500":!e.loading}])},[e.loading?((0,r.wg)(),(0,r.j4)(u,{key:0,size:16})):((0,r.wg)(),(0,r.iD)("button",{key:1,class:(0,r.C_)(["text-gray-400 dark:text-dark-400 group-hover:text-blue-500 dark:group-hover:text-blue-400 focus:outline-none",{"rotate-90":e.item.expanded,"transition-transform ease-out duration-200":e.transitionsEnabled}]),onClick:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)})},[(0,r.Wm)(a,{class:"w-5 h-5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1})],2))],2)):(0,r.kq)("",!0),e.isActive?((0,r.wg)(),(0,r.iD)("span",$r)):(0,r.kq)("",!0)],2),e.isGroup?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-active-class":"overflow-hidden","leave-active-class":"overflow-hidden",onEnter:e.onEnter,onAfterEnter:e.onAfterEnter,onBeforeLeave:e.onBeforeLeave,onLeave:e.onLeave},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("ul",Zr,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t){return(0,r.wg)(),(0,r.j4)(h,{key:t.path,item:t,depth:e.depth+1,"is-filtered":e.isFiltered},null,8,["item","depth","is-filtered"])})),128))],512),[[r.F8,e.isGroup&&e.item.expanded]])]})),_:1},8,["onEnter","onAfterEnter","onBeforeLeave","onLeave"])):(0,r.kq)("",!0)])}]]),Qr=(0,r.aZ)({name:"DocSidebarLinks",components:{DocSidebarLink:Jr},props:{items:{type:Array,required:!0},isFiltered:{type:Boolean,required:!0}},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,r.iH)(0),o=(0,r.iH)(),i=(0,a.oR)().store,s=(0,r.Fl)((function(){return i.state.sidebarActiveEl})),l=Dn(s,{threshold:1}).elements,c=Mr()((function(){var e,r,o=(null===(e=t.value)||void 0===e?void 0:e.scrollTop)||0;i.state.sidebarScroll!==o&&(n.value=(null===(r=t.value)||void 0===r?void 0:r.scrollTop)||0,i.actions.setSidebarScroll(n.value))}),200);return(0,r.bv)((function(){var n,r,a;o.value=e.value&&new T.Z(e.value),t.value=null===(n=o.value)||void 0===n?void 0:n.getScrollElement(),null===(a=null===(r=o.value)||void 0===r?void 0:r.getScrollElement())||void 0===a||a.addEventListener("scroll",c),t.value&&(t.value.scrollTop=i.state.sidebarScroll),setTimeout((function(){!l.value.some((function(e){return e.isIntersecting}))&&s.value&&function(e,t){if(!e.isConnected||!e.ownerDocument.documentElement.contains(e))return;if((e=>"object"==typeof e&&"function"==typeof e.behavior)(t))return t.behavior(Wr(e,t));let n="boolean"==typeof t||null==t?void 0:t.behavior;for(let{el:r,top:o,left:i}of Wr(e,(e=>!1===e?{block:"end",inline:"nearest"}:(e=>e===Object(e)&&0!==Object.keys(e).length)(e)?e:{block:"start",inline:"nearest"})(t)))r.scroll({top:o,left:i,behavior:n})}(s.value,{behavior:"smooth",block:"center",boundary:t.value})}),200)})),(0,r.Jd)((function(){var e;null===(e=t.value)||void 0===e||e.removeEventListener("scroll",c)})),{sidebarLinksEl:e}}}),eo=(0,c.Z)(Qr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-sidebar-link");return e.items.length?((0,r.wg)(),(0,r.iD)("ul",Or,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.items,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.path,item:t,"is-filtered":e.isFiltered},null,8,["item","is-filtered"])})),128))],512)):(0,r.kq)("",!0)}]]);var to={class:"relative flex items-center w-full"},no=["value","placeholder"];const ro=(0,r.aZ)({name:"DocSidebarFilter",props:{modelValue:String,isOpen:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=D().sidebarFilterPlaceholder,s=Mr()((function(e){n("update:modelValue",e.target.value)}),200);return(0,r.YP)((function(){return e.isOpen}),(function(){var e;null===(e=o.value)||void 0===e||e.blur()})),{input:o,placeholder:i,clear:function(){var e;n("update:modelValue",""),null===(e=o.value)||void 0===e||e.focus()},onInput:s}}}),oo=(0,c.Z)(ro,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",to,[(0,r._)("input",{ref:"input",value:e.modelValue,class:"w-full h-8 px-3 py-2 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:border-dark-450 dark:focus:bg-dark-450 dark:hover:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onInput:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onInput&&e.onInput.apply(e,t)})},null,40,no),e.modelValue?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1 text-gray-600 hover:text-gray-900",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])])}]]);var io=function(){return io=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},io.apply(this,arguments)},so=r.lR;const ao=(0,r.aZ)({name:"DocSidebar",components:{Teleport:so,DocSidebarLinks:eo,DocSidebarFilter:oo,DocOverlay:rt},setup:function(){var e=(0,r.iH)(!1),t=(0,a.oR)().store,n=(0,r.iH)();!function(e){var t=(0,r.iH)();function n(){e.state.sidebarLookup.forEach((function(t){e.actions.updateSidebarLookupItem(t,"expanded",!1)})),e.actions.setSidebarScroll(0)}(0,r.bv)((function(){t.value=document.querySelector("#docs-site-logo"),t.value&&t.value.addEventListener("click",n)})),(0,r.Jd)((function(){var e;t.value&&(null===(e=t.value)||void 0===e||e.removeEventListener("click",n))}))}(t),function(e){var t=(0,r.Fl)((function(){return e.state.sidebarLookup}));e.state.initialPageLoad&&function(){if(e.state.sidebar.id&&e.state.sidebar.id===D().id)r=new Map,(o=function(e){e.forEach((function(e){e.children&&(r.set(e.path,e),o(e.children))}))})(e.state.sidebar.data),e.actions.setSidebarLookupData(r);else{var n=(0,s.am)(t.value,D().sidebar,D().trailingSlash);e.actions.setSidebarData({id:D().id,data:n})}var r,o}()}(t);var o=function(e){var t=(0,r.iH)(""),n=(0,r.iH)(!1),o=(0,r.Fl)((function(){return e.state.sidebar})),i=(0,r.Fl)((function(){var e=t.value.toLowerCase();return n.value=!!e,function(e){var t=function(n,r){if(!r.visible)return n;if(r.children){var o=r.children.reduce(t,[]);(o.length||r.clickable&&(!e||r.searchLabel.includes(e)))&&n.push(io(io({},r),{children:o}))}else e&&!r.searchLabel.includes(e)||n.push(r);return n};return o.value.data.reduce(t,[])}(e)}));return{query:t,isFiltered:n,filteredItems:i}}(t),i=o.query,l=o.isFiltered,c=o.filteredItems,u=it(),d=u.enableBodyScroll,h=u.disableBodyScroll;return{Teleport:so,sidebarFooter:n,isOpen:e,show:function(){e.value=!0,h()},hide:function(){e.value=!1,d()},filteredItems:c,isFiltered:l,query:i,showSidebarFilter:D().showSidebarFilter}}}),lo=(0,c.Z)(ao,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-left"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-filter"),u=(0,r.up)("doc-sidebar-links"),d=(0,r.up)("doc-icon-menu"),h=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("aside",{class:(0,r.C_)(["fixed top-0 z-40 flex flex-col shrink-0 w-4/5 duration-300 ease-in-out bg-gray-100 border-gray-200 sidebar md:top-20 sm:w-1/2 md:w-75 md:z-0 md:border-r md:h-screen md:sticky md:transition-transform dark:bg-dark-800 dark:border-dark-650",{"shadow-2xl md:shadow-none":e.isOpen}]),style:(0,r.j5)({transform:e.isOpen?"translateX(0)":""})},[(0,r._)("div",Ar,[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full ml-0.5","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0)]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.query=t}),class:"absolute top-0 left-0 right-0 z-5 bg-gray-100 dark:bg-dark-800 h-16 px-6 hidden md:flex items-center","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"flex-1 pl-3 mt-4 md:mt-16 mb-4",items:e.filteredItems,"is-filtered":e.isFiltered},null,8,["items","is-filtered"]),(0,r._)("div",Dr,[(0,r.WI)(e.$slots,"sidebar-footer")],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-sidebar-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"24",onClick:e.show},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1})),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(h,{"is-open":e.isOpen,onSwipeLeft:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onClick"])]})),_:1}))],6)}]]);var co={id:"docs-sidebar-right",ref:"content",class:"w-full h-full overflow-auto"},uo={key:0,class:"flex items-center justify-between h-16 mb-4 border-b lg:border-none lg:h-auto dark:border-dark-650"},ho={class:"px-5 text-gray-500 dark:text-dark-400"};const po=(0,r.aZ)({name:"DocSidebarRightToggle",emits:["click"]}),fo=(0,c.Z)(po,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-align-right"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(l,{class:"w-10 h-10 bg-white dark:bg-dark-850 bg-opacity-80 dark:bg-opacity-80 text-gray-600 hover:text-gray-800 lg:hidden","icon-size":"20",onClick:t[0]||(t[0]=function(t){return e.$emit("click")})},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})}]]);var mo={key:0},vo=n(843);const go=(0,r.aZ)({name:"DocToc",emits:["link-click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)([]);!function(e){var t,n,o=-1,i=-1,a=document.getElementById("docs-content"),l=null!==(t=null==a?void 0:a.offsetTop)&&void 0!==t?t:24,c=(0,s.vE)();function u(){var t=e.value;if(t&&t.length){var n=(document.documentElement.scrollTop||document.body.scrollTop)+l,r=function(e,t,n){var r=0,o=n.length-1;if(t>=r&&t<=o)if(e>=n[t].el.offsetTop){if(r=t+1,t===o||e<n[r].el.offsetTop)return t}else if(o=t-1,t>0&&e>=n[o].el.offsetTop)return o;for(;r<=o;){var i=o+r>>1,s=e-n[i].el.offsetTop;if(s>0)r=i+1;else{if(!(s<0)){r=i;break}o=i-1}}return r>o?o:r}(n,o,t),s=function(e,t,n,r){var o=Math.max(0,n),i=r.length-1;if(n===i)return i;if(t>=o&&t<=i)if(e>=r[t].el.offsetTop){if(o=t+1,t===i||e<r[o].el.offsetTop)return t}else if(i=t-1,t>0&&e>=r[i].el.offsetTop)return i;if(i<=n)return n;for(;o<=i;){var s=i+o>>1,a=e-r[s].el.offsetTop;if(a>0)o=s+1;else{if(!(a<0)){o=s;break}i=s-1}}return o>i?i:o}(n+Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)+c-2*l,i,r,t);r<0?s>=0&&(r=0):s<r&&(s=r),r<0?o>=0&&d(t,o,i,!1):o<0?d(t,r,s,!0):s<o||r>i?(d(t,r,s,!0),d(t,o,i,!1)):r<=o?s<=i?(d(t,r,o-1,!0),d(t,s+1,i,!1)):(d(t,r,o-1,!0),d(t,i,s,!0)):s<=i?(d(t,o,r-1,!1),d(t,s+1,i,!1)):(d(t,i,s,!0),d(t,o,r-1,!1)),o=r,i=s}}function d(e,t,n,r){for(var o=t;o<=n;++o)e[o].isActive=r}(0,m.Up)(window,"scroll",u,3,300),(0,m.Up)(window,"resize",u,3,300),a&&(n=new vo.ResizeSensor(a,(0,m.BK)(u,3,300))),(0,r.Jd)((function(){n&&(n.detach(),n=void 0)}))}(o);var i=(0,a.oR)().store;return(0,r.bv)((function(){var e;o.value=(e=[],document.querySelectorAll("#docs-content h2, #docs-content h3").forEach((function(t){var n,r,o="H2"===t.tagName?2:3,i=(null===(n=t.querySelector("a"))||void 0===n?void 0:n.href.split("#")[1])||"",s=(null===(r=t.querySelector("span"))||void 0===r?void 0:r.textContent)||"";if(i.length>0&&s.length>0){var a=decodeURIComponent(i);e.push({el:t,level:o,slug:a,title:s,isActive:!1})}})),e),i.state.sidebarRightHasContent=o.value.length>0})),{tocData:o,classList:function(e){return[{"pl-10":3===e.level},e.isActive?"text-blue-500 dark:text-blue-400":"hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400"]},onClick:function(){n("link-click")}}}}),bo=(0,c.Z)(go,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return e.tocData&&e.tocData.length?((0,r.wg)(),(0,r.iD)("ul",mo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.tocData,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.slug},[(0,r.Wm)(a,{class:(0,r.C_)(["relative block px-5 py-1 toc-link",e.classList(t)]),to:"#".concat(t.slug),onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(t.title)+" ",1),(0,r._)("div",{style:{width:"1px"},class:(0,r.C_)({"absolute top-0 left-0 h-full bg-blue-500 dark:bg-blue-400":t.isActive})},null,2)]})),_:2},1032,["class","to","onClick"])])})),128))])):(0,r.kq)("",!0)}]]);var yo={key:0,class:"px-5 text-sm"},wo={key:0,class:"mt-3 mb-2 text-gray-600 uppercase dark:text-dark-400"},So=["href"],ko={key:2,class:"font-semibold text-gray-900 dark:text-blue-400"},xo={key:1};const Eo=(0,r.aZ)({name:"DocRelatedClassItem",props:{item:{type:Object,default:function(){return{}}},depth:{type:Number,default:0}},setup:function(e){var t=(0,r.Fl)((function(){return void 0!==e.item.children&&e.item.children.length>0})),n=(0,r.Fl)((function(){var t=e.depth>1?.5:0;return"".concat((e.depth-1)*t,"rem")}));return{hasChildren:t,marginLeft:n,showIcon:(0,r.Fl)((function(){return!0!==e.item.isGroup&&void 0!==e.item.children&&e.item.children.length>0})),onItemClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),(0,h.Vn)(e))}}}}),Co=(0,c.Z)(Eo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return(0,r.wg)(),(0,r.iD)("li",{class:(0,r.C_)(["relative",{"pl-1":e.depth>1,"mb-4":0===e.depth}])},[(0,r._)("div",{class:"flex items-center truncate",style:(0,r.j5)({marginLeft:e.marginLeft,minHeight:"1.875rem"})},[e.item.isGroup?((0,r.wg)(),(0,r.iD)("h6",wo,(0,r.zw)(e.item.title),1)):e.item.href?((0,r.wg)(),(0,r.iD)("a",{key:1,class:"truncate transition-colors duration-100 ease-linear cursor-pointer hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400",href:e.item.href,onClick:t[0]||(t[0]=function(t){return e.onItemClick(e.item.href,t)})},(0,r.zw)(e.item.label),9,So)):((0,r.wg)(),(0,r.iD)("div",ko,(0,r.zw)(e.item.label),1))],4),e.showIcon?((0,r.wg)(),(0,r.iD)("span",{key:0,class:"absolute w-2 h-3 border-b border-l border-gray-600",style:(0,r.j5)({marginLeft:e.marginLeft,marginTop:"0.375rem"})},null,4)):(0,r.kq)("",!0),e.hasChildren?((0,r.wg)(),(0,r.iD)("ul",xo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t,n){return(0,r.wg)(),(0,r.j4)(a,{key:n,item:t,depth:e.depth+1},null,8,["item","depth"])})),128))])):(0,r.kq)("",!0)],2)}]]),_o=Co,To=(0,r.aZ)({name:"DocRelatedClasses",components:{DocRelatedClassItem:_o},setup:function(){var e=_t().pageData;return{relatedClasses:(0,r.Fl)((function(){var t;return(null===(t=e.value)||void 0===t?void 0:t.relatedClasses)||[]}))}}}),Lo=(0,c.Z)(To,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return e.relatedClasses.length?((0,r.wg)(),(0,r.iD)("ul",yo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.relatedClasses,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,item:e},null,8,["item"])})),128))])):(0,r.kq)("",!0)}]]),Ao=Lo;var Do=r.lR;const Oo=(0,r.aZ)({name:"DocSidebarRight",components:{Teleport:Do,DocToc:bo,DocOverlay:rt,DocSidebarRightToggle:fo,DocRelatedClasses:Ao},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(!1),n=(0,r.iH)(!1),o=_t().pageData,i=(0,a.oR)().store,s=(0,r.Fl)((function(){return o.value?o.value.relatedClasses?"DocRelatedClasses":"DocToc":null})),l=(0,r.Fl)((function(){return"DocToc"===s.value?D().resources.Toc_Contents_Label:"DocRelatedClasses"===s.value?D().resources.Toc_RelatedClasses_Label:null})),c=(0,r.Fl)((function(){return{"translate-x-0 shadow-2xl":t.value,"translate-x-full":!t.value,"lg:top-40":"DocRelatedClasses"===s.value,"lg:top-20":"DocToc"===s.value}})),u=(0,r.Fl)((function(){return{height:"DocRelatedClasses"===s.value?"calc(100vh - 10rem)":"calc(100vh - 5rem"}}));return(0,r.bv)((function(){n.value=!0,e.value&&new T.Z(e.value)})),{Teleport:Do,content:e,isOpen:t,isMounted:n,store:i,show:function(){t.value=!0},hide:function(){t.value=!1},currentComponent:s,title:l,classes:c,styles:u}}}),Ro=(0,c.Z)(Oo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-right"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-right-toggle"),u=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 text-sm transition-transform duration-300 ease-in-out bg-white border-gray-200 sidebar-right sm:w-1/2 md:w-104 lg:z-0 lg:sticky lg:w-64 lg:shrink-0 lg:transform-none lg:border-l lg:shadow-none lg:pt-6 focus:outline-none dark:bg-dark-800 lg:dark:bg-dark-850 dark:border-dark-650",e.classes]),style:(0,r.j5)(e.styles),onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",co,[e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.iD)("div",uo,[(0,r._)("h6",ho,(0,r.zw)(e.title),1),(0,r.Wm)(l,{class:"w-10 h-10 ml-3 lg:hidden",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])])):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.currentComponent),{onLinkClick:e.hide},null,40,["onLinkClick"]))],512),e.isMounted&&e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{key:0,to:"#docs-sidebar-right-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"fixed right-3 z-40",onClick:e.show},null,8,["onClick"])]})),_:1})):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(u,{"is-open":e.isOpen,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeRight","onClick"])]})),_:1}))],38)}],["__scopeId","data-v-edee482e"]]);var Mo=["aria-checked"],Io=["checked"],Fo={class:"inline-flex items-center"};const Po=(0,r.aZ)({name:"DocSwitch",props:{modelValue:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit;return{isFocused:(0,r.iH)(!1),toggle:function(){n("update:modelValue",!e.modelValue)}}}}),Ho=(0,c.Z)(Po,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("label",{class:"relative inline-block cursor-pointer whitespace-nowrap",role:"switch","aria-checked":e.modelValue},[(0,r._)("input",{type:"checkbox",class:"absolute opacity-0",style:{"z-index":"-1"},checked:e.modelValue,onChange:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)}),onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,Io),(0,r._)("div",Fo,[(0,r._)("div",{class:(0,r.C_)(["w-6 h-2 transition-colors duration-100 ease-linear rounded-full",e.modelValue?"bg-blue-500 dark:bg-blue-400":"bg-gray-400 dark:bg-dark-400"])},null,2),(0,r._)("div",{class:(0,r.C_)(["absolute w-4 h-4 transition-transform duration-100 ease-linear bg-white border border-gray-500 rounded-full",{"shadow-outline":e.isFocused}]),style:(0,r.j5)({transform:e.modelValue?"translateX(8px)":null})},null,6)]),(0,r.WI)(e.$slots,"default")],8,Mo)}]]),No=(0,r.aZ)({name:"DocTab",props:{id:{type:String,required:!0},active:Boolean},setup:function(e,t){var n=t.slots;return function(){return(0,r.h)((function(){var e;return null===(e=n.default)||void 0===e?void 0:e.call(n)}))}}}),Wo=(0,r.aZ)({name:"DocTabs",components:{DocAnchorTarget:u},setup:function(e,t){var n,o,i,a,l=t.slots,c=(0,r.iH)(),d=(0,r.iH)(""),h=(null===(n=l.default)||void 0===n?void 0:n.call(l))||[],p={};d.value=(null===(i=null===(o=h.find((function(e){var t,n;return""===(null===(t=e.props)||void 0===t?void 0:t.active)||(null===(n=e.props)||void 0===n?void 0:n.active)})))||void 0===o?void 0:o.props)||void 0===i?void 0:i.id)||(null===(a=h[0].props)||void 0===a?void 0:a.id);var f=h.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id;return"#".concat(n)})),m=Ot().route;function v(){if(m.value.hash&&f.includes(m.value.hash)){var e=m.value.hash.substr(1);if(d.value!==e)return d.value=e,!0}return!1}function g(){var e=d.value;p[e],p[e]=!0;var t=(0,r.m0)((function(){var e;null===(e=c.value)||void 0===e||e.dispatchEvent(new Event("onPluginReady")),t()}),{flush:"post"})}v(),p[d.value]=!0,(0,r.YP)(m,(function(){v()&&g()}));var b=(0,r.Fl)((function(){return h.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id,o=d.value===n;return(0,r.h)(u,{id:n},(function(){var t,i;return(0,r.h)("a",{href:"#".concat(n),class:{"no-link block px-5 py-4 cursor-pointer border-b-2 font-medium":!0,"text-gray-500 dark:text-dark-350 hover:text-blue-500 dark:hover:text-blue-400 border-transparent hover:border-gray-300 dark:hover:border-dark-450":!o,"text-blue-500 dark:text-blue-400 border-blue-500":o},onClick:function(e){(0,s.pI)(e)||(e.preventDefault(),d.value!==n&&(d.value=n,g()))}},null===(i=(t=e.children).title)||void 0===i?void 0:i.call(t))}))}))})),y=(0,r.Fl)((function(){return h.map((function(e){var t;if(d.value===(null===(t=e.props)||void 0===t?void 0:t.id))return(0,r.h)((function(){return(0,r.h)("div",{class:"tab-content"},e)}))}))}));return function(){return(0,r.h)("div",{ref:c,class:"mb-6 pluggable"},[(0,r.h)("div",{class:"flex border dark:border-dark-650 -mb-px rounded-t"},b.value),(0,r.h)("div",{class:"p-5 border dark:border-dark-650 rounded-b-md"},y.value)])}}}),Bo=Wo,Vo=(0,r.aZ)({name:"DocThemeSwitch",setup:function(){var e=(0,r.iH)(null),t=(0,r.Fl)((function(){return"dark"===e.value}));function n(t){document.documentElement.classList.add("no-transitions"),setTimeout((function(){document.documentElement.classList.remove("no-transitions")}),50),t?(document.documentElement.classList.add("dark"),e.value="dark"):(document.documentElement.classList.remove("dark"),e.value="light")}e.value=(0,s.qn)(D().base,localStorage,"doc_theme"),e.value||(e.value=document.documentElement.classList.contains("dark")?"dark":"light");var o,i=(0,r.iH)();return(0,r.bv)((function(){i.value=window.matchMedia("(prefers-color-scheme: dark)"),o=function(e){(0,s.qn)(D().base,localStorage,"doc_theme")||n(e.matches)},i.value.addEventListener("change",o)})),(0,r.Jd)((function(){var e;null===(e=i.value)||void 0===e||e.removeEventListener("change",o)})),{isDark:t,toggleColorMode:n,onSwitchClick:function(){n("light"===e.value),(0,s.Nh)(D().base,localStorage,"doc_theme",e.value)}}}}),jo=(0,c.Z)(Vo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-sun"),l=(0,r.up)("doc-icon-moon"),c=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(c,{class:(0,r.C_)(["w-10 h-10",{"-mb-0.5":!e.isDark}]),"icon-size":"20",onClick:e.onSwitchClick},{default:(0,r.w5)((function(){return[e.isDark?((0,r.wg)(),(0,r.j4)(a,{key:0})):((0,r.wg)(),(0,r.j4)(l,{key:1}))]})),_:1},8,["class","onClick"])}]]);var zo={id:"docs-toolbar",class:"sticky z-20 flex items-center justify-between h-16 px-6 bg-white border-b border-gray-200 md:h-20 md:pl-16 md:top-20 top-16 dark:bg-dark-850 dark:border-dark-650"},qo={class:"relative"},$o={ref:"visibleLinksDiv",class:"flex whitespace-nowrap"},Zo={class:"block"},Uo=["innerHTML"],Ko={ref:"more",class:"mr-3 more-dropdown"},Yo={class:"flex flex-col"},Go={class:"flex items-center h-5 px-2 text-xs font-semibold text-white bg-blue-500 dark:bg-blue-400 rounded-full md:text-2xs"};const Xo=(0,r.aZ)({name:"DocToolbarMemberCount"}),Jo=(0,c.Z)(Xo,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",Go,[(0,r.WI)(e.$slots,"default")])}]]);var Qo=["aria-expanded","aria-disabled","disabled"],ei={class:"absolute left-0 z-20"},ti={ref:"dropdownBottom",class:"h-2"},ni={key:0,class:"absolute bottom-0 right-0 z-50 flex items-center h-6 px-2 mb-4 mr-8 text-xs leading-none text-center text-gray-500 bg-white rounded-full shadow-md dark:bg-dark-550 dark:text-dark-200"},ri=function(){return ri=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},ri.apply(this,arguments)};const oi=(0,r.aZ)({name:"ToolbarLinkDropdownContent",components:{DocAnchorTrigger:f},props:{groupId:{type:String,required:!0},members:{type:Array,required:!0},isSingleColumn:{type:Boolean,required:!0},linkWidth:{type:Number,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(3),i=(0,r.iH)(0),s=(0,r.Fl)((function(){return ri({maxHeight:"calc(100vh - 11rem)",minWidth:"".concat(e.linkWidth,"px")},!e.isSingleColumn&&{width:"".concat(i.value,"px")})})),a=(0,r.Fl)((function(){var t=Math.ceil(e.members.length/o.value);return{gridTemplateColumns:"repeat(".concat(o.value,", 1fr)"),gridTemplateRows:"repeat(".concat(t,", 1fr)")}})),l=it(),c=l.enableBodyScroll,u=l.disableBodyScroll;function d(){var e=document.querySelector("#docs-content");i.value=e?e.clientWidth:0}ot((function(){!function(){var e=window.innerWidth;o.value=e<1124&&e>1024||e<900?2:3}(),d()})),(0,r.bv)(d);var h=function(){var e=(0,r.iH)();return{dropdownBottom:e,isIntersecting:Dn(e).isIntersecting}}(),p=h.dropdownBottom,f=h.isIntersecting,m=D().resources.API_MoreDropdownItems_Label;return{memberGridStyles:a,mmemberGridWrapperStyles:s,enableBodyScroll:c,disableBodyScroll:u,onClick:function(){c(),n("click")},dropdownBottom:p,isIntersecting:f,moreLabel:m}}}),ii=(0,c.Z)(oi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"gridWrapper",class:"px-2 pt-2 mt-2 overflow-y-auto bg-white border border-gray-300 rounded shadow-lg member-links-dropdown dark:bg-dark-650 dark:border-dark-500",style:(0,r.j5)(e.mmemberGridWrapperStyles),onMouseenter:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.disableBodyScroll&&e.disableBodyScroll.apply(e,t)}),onMouseleave:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.enableBodyScroll&&e.enableBodyScroll.apply(e,t)})},[(0,r._)("div",{class:(0,r.C_)({"sm:grid grid-flow-col":!e.isSingleColumn}),style:(0,r.j5)(e.memberGridStyles)},[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(n){return(0,r.wg)(),(0,r.j4)(a,{key:n.id,to:"#".concat(n.id),onClick:t[0]||(t[0]=function(t){return e.onClick()})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.name),1)]})),_:2},1032,["to"])})),128))],6),(0,r._)("div",ti,null,512)],36),e.isIntersecting?(0,r.kq)("",!0):((0,r.wg)(),(0,r.iD)("span",ni,(0,r.zw)(e.moreLabel)+"... ",1))])}],["__scopeId","data-v-13960e2c"]]),si=(0,r.aZ)({name:"DocToolbarLinkDropdown",components:{DocToolbarMemberCount:Jo,DocToolbarLinkDropdownContent:ii},props:{value:Boolean,inDropdown:Boolean,isSingleColumn:Boolean,disabled:Boolean,groupId:String,count:Number,members:Array,linkWidth:Number},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1);return(0,ut.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),(0,r.YP)(i,(function(e){n("update:modelValue",e)})),{dropdown:o,toggleDropdown:function(){i.value=!i.value},onBodyClick:ut.w,isOpen:i}}}),ai=(0,c.Z)(si,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-down"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-toolbar-member-count"),u=(0,r.up)("doc-toolbar-link-dropdown-content");return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:(0,r.C_)({hidden:e.inDropdown})},[(0,r._)("button",{class:(0,r.C_)(["relative z-20 flex items-center justify-center w-6 h-full px-0 border-l border-white rounded-r focus:outline-none focus:bg-gray-400 hover:bg-gray-300 dark:border-dark-850 dark:hover:bg-dark-450 dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isOpen,"bg-gray-200 dark:bg-dark-550":!e.isOpen}]),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,"aria-disabled":e.disabled,disabled:e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleDropdown&&e.toggleDropdown.apply(e,t)})},[(0,r.Wm)(l,{class:"dark:text-white",width:"13",height:"13"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),(0,r.Wm)(c,{class:"absolute top-0 right-0 -mt-3 -mr-2"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1})],10,Qo),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",ei,[(0,r.Wm)(u,{members:e.members,"is-single-column":e.isSingleColumn,"group-id":e.groupId,"link-width":e.linkWidth,onClick:t[1]||(t[1]=function(t){return e.isOpen=!1})},null,8,["members","is-single-column","group-id","link-width"])],512),[[r.F8,e.isOpen]])]})),_:1})],2)}]]),li=(0,r.aZ)({name:"DocToolbarLink",components:{DocToolbarLinkDropdown:ai,DocToolbarMemberCount:Jo,DocAnchorTrigger:f},props:{link:{type:Object,required:!0},inDropdown:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,a.oR)().store,i=(0,r.Fl)((function(){return o.getters.getVisibleGroupMembers(e.link.id)})),s=(0,r.Fl)((function(){return i.value.length})),l=(0,r.Fl)((function(){return s.value<=12})),c=(0,r.Fl)((function(){return 0===s.value})),u=(0,r.Fl)((function(){return 0===s.value?"":"#".concat(e.link.id)})),d=(0,r.Fl)((function(){return t.value?t.value.clientWidth:0}));return{linkEl:t,linkWidth:d,isSingleColumn:l,isDropdownOpen:n,disabled:c,href:u,count:s,members:i}}}),ci=(0,c.Z)(li,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-member-count"),l=(0,r.up)("doc-anchor-trigger"),c=(0,r.up)("doc-toolbar-link-dropdown");return(0,r.wg)(),(0,r.iD)("div",{ref:"linkEl",class:(0,r.C_)(["inline-flex h-8 text-sm leading-none",{"mr-3":!e.inDropdown,relative:e.isSingleColumn}]),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.isDropdownOpen=!1}),["esc"]))},[(0,r.Wm)(l,{class:(0,r.C_)(["flex items-center justify-between grow px-3 font-medium text-gray-900 focus:bg-gray-400 focus:outline-none dark:text-white dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"px-5 hover:bg-gray-200 dark:hover:bg-dark-500":e.inDropdown,"rounded-l hover:bg-gray-300 dark:hover:bg-dark-450":!e.inDropdown,"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isDropdownOpen,"bg-gray-200 dark:bg-dark-550":!e.isDropdownOpen&&!e.inDropdown}]),to:e.href,disabled:e.disabled},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default"),(0,r.Wm)(a,{class:(0,r.C_)({hidden:!e.inDropdown})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1},8,["class"])]})),_:3},8,["class","to","disabled"]),(0,r.Wm)(c,{modelValue:e.isDropdownOpen,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.isDropdownOpen=t}),"in-dropdown":e.inDropdown,"is-single-column":e.isSingleColumn,disabled:e.disabled,count:e.count,members:e.members,"group-id":e.link.id,"link-width":e.linkWidth},null,8,["modelValue","in-dropdown","is-single-column","disabled","count","members","group-id","link-width"])],34)}]]);const ui=(0,r.aZ)({name:"DocToolbarLinks",components:{DocToolbarLink:ci},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(0),n=function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=D().toolbarLinks,o=(0,r.iH)([]),i=(0,r.iH)([]),s=(0,r.iH)([]);(0,r.bv)((function(){o.value=n.slice()}));var a=function(){var e;return null===(e=t.value)||void 0===e?void 0:e.clientWidth},l=function(){var e,t,n,c=(t=document.querySelector("#docs-toolbar"),n=window.innerWidth<960?48:88,(t?t.clientWidth-n:0)-((null===(e=document.querySelector("#docs-filters"))||void 0===e?void 0:e.clientWidth)||0));if(a()>c&&o.value.length){s.value.push(a());var u=o.value.pop();u&&i.value.unshift(u)}else if(c>s.value[s.value.length-1]){var d=i.value[0];i.value.splice(0,1),o.value.push(d),s.value.pop()}(0,r.Y3)((function(){a()>c&&o.value.length&&l()}))};return{more:e,visibleLinksDiv:t,visibleLinks:o,invisibleLinks:i,updateNavLinks:l}}(),o=n.more,i=n.visibleLinksDiv,s=n.visibleLinks,a=n.invisibleLinks,l=n.updateNavLinks,c=(0,r.Fl)((function(){return s.value.length<=1&&t.value<960?"left":"right"}));function u(){t.value=window.innerWidth}return(0,r.bv)((function(){u(),l()})),ot((function(){u(),l()})),{dropdown:e,more:o,visibleLinksDiv:i,visibleLinks:s,invisibleLinks:a,dropdownAlignment:c,onClick:function(){e.value.hide()}}}}),di=(0,c.Z)(ui,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-link"),l=(0,r.up)("doc-icon-more-horizontal"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",qo,[(0,r._)("div",$o,[(0,r._)("div",Zo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.visibleLinks,(function(e){return(0,r.wg)(),(0,r.j4)(a,{key:e.id,link:e,"in-dropdown":!1},{default:(0,r.w5)((function(){return[(0,r._)("span",{innerHTML:e.shortLabel?e.shortLabel:e.label},null,8,Uo)]})),_:2},1032,["link"])})),128))]),(0,r.wy)((0,r._)("div",Ko,[(0,r.Wm)(u,{ref:"dropdown",class:"inline-block",align:e.dropdownAlignment},{"button-content":(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-8 h-8 bg-gray-200 hover:bg-gray-300 dark:bg-dark-550 dark:hover:bg-dark-450",rounded:!1},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1})]})),default:(0,r.w5)((function(){return[(0,r._)("div",Yo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.invisibleLinks,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.id,link:t,"in-dropdown":!0,onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r._)("span",null,(0,r.zw)(t.label),1)]})),_:2},1032,["link","onClick"])})),128))])]})),_:1},8,["align"])],512),[[r.F8,e.invisibleLinks.length]])],512)])}]]);var hi={id:"docs-filters"},pi={class:"items-center hidden lg:flex"},fi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},mi=(0,r._)("span",{class:"hidden sm:inline"},"Filters",-1),vi={class:"pt-2 pb-3"},gi={class:"px-5 pb-4 border-b dark:border-dark-500"},bi={class:"px-5 pt-4"},yi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},wi={class:"pt-1"};const Si=(0,r.aZ)({name:"DocToolbarAccess",setup:function(){var e=(0,a.oR)().store;return{access:D().access,accessLabel:D().resources.API_AccessFilter_Label,selected:(0,r.Fl)({get:function(){return e.state.access},set:function(t){return e.actions.updateAccess(t)}}),isDirty:(0,r.Fl)((function(){return e.getters.isAccessDirty()}))}}}),ki=(0,c.Z)(Si,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-shield"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-checkbox"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r.Wm)(u,{class:"hidden lg:block",align:"right","menu-width":"9rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative text-gray-900 bg-white border btn focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isDirty?((0,r.wg)(),(0,r.iD)("span",yi)):(0,r.kq)("",!0),(0,r.Wm)(l,{class:"mr-1 -ml-1",width:"14",height:"14",style:{"margin-bottom":"0"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),(0,r._)("span",null,(0,r.zw)(e.accessLabel),1)],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",wi,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"flex px-5 hover:bg-gray-200 dark:hover:bg-dark-500"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])]})),_:1}),((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"py-0.5 lg:hidden"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])}]]);var xi={class:"relative",style:{width:"12.4375rem"}},Ei=["placeholder"];const Ci=(0,r.aZ)({name:"DocToolbarMemberFilter",setup:function(){var e=(0,a.oR)().store,t=(0,r.iH)(),n=D().toolbarFilterPlaceholder,o=(0,r.Fl)({get:function(){return e.state.memberFilter},set:Mr()((function(t){e.actions.updateMemberFilter(t)}),400)});function i(){var e;null===(e=t.value)||void 0===e||e.select()}return(0,r.bv)((function(){var e;window.innerWidth>960&&(null===(e=t.value)||void 0===e||e.focus(),i())})),function(e){var t=Ot(),n=t.route,o=t.Router;n.value.query&&n.value.query.q&&(e.value=n.value.query.q),(0,r.YP)(e,(function(e){var t=e?{q:e}:{};n.value.query=t,o.replace(n.value)}))}(o),{input:t,query:o,placeholder:n,select:i,clear:function(){var e;o.value="",null===(e=t.value)||void 0===e||e.focus()}}}}),_i=(0,c.Z)(Ci,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",xi,[(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-8 px-3 leading-8 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.select&&e.select.apply(e,t)})},null,40,Ei),[[r.nr,e.query,void 0,{trim:!0}]]),e.query?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]),Ti=(0,r.aZ)({name:"DocToolbarFilters",components:{DocToolbarAccess:ki,DocToolbarMemberFilter:_i},setup:function(){var e=(0,a.oR)().store;return{isFiltersDirty:(0,r.Fl)((function(){return e.getters.isFiltersDirty()}))}}}),Li=(0,c.Z)(Ti,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-access"),l=(0,r.up)("doc-toolbar-member-filter"),c=(0,r.up)("doc-icon-filter"),u=(0,r.up)("doc-icon"),d=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",hi,[(0,r._)("div",pi,[(0,r.Wm)(a,{class:"ml-3"}),(0,r.Wm)(l,{class:"ml-3"})]),(0,r.Wm)(d,{class:"lg:hidden",align:"right","menu-width":"13rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative inline-flex items-center justify-center w-8 h-8 p-0 text-sm font-medium leading-none text-gray-900 whitespace-nowrap bg-white border rounded cursor-pointer select-none sm:w-auto sm:px-3 focus:outline-none focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 transition-colors duration-200 ease-out",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isFiltersDirty?((0,r.wg)(),(0,r.iD)("span",fi)):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"mb-0 sm:mr-1",width:"14",height:"14"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1}),mi],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",vi,[(0,r._)("div",gi,[(0,r.Wm)(l)]),(0,r._)("div",bi,[(0,r.Wm)(a)])])]})),_:1})])}]]),Ai=(0,r.aZ)({name:"DocToolbar",components:{DocToolbarLinks:di,DocToolbarFilters:Li},setup:function(){return{checkState:(0,r.iH)(!0),selected:(0,r.iH)([])}}}),Di=(0,c.Z)(Ai,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-links"),l=(0,r.up)("doc-toolbar-filters");return(0,r.wg)(),(0,r.iD)("div",zo,[(0,r.Wm)(a,{class:"grow-0"}),(0,r.Wm)(l)])}]]);var Oi={key:0,class:"w-full px-4 py-3 text-center text-red-800 bg-red-100 rounded dark:bg-red-400 dark:text-white"};const Ri=(0,r.aZ)({name:"DocToolbarMemberFilterNoResults",setup:function(){var e=(0,a.oR)().store,t=(0,r.Fl)((function(){return e.state.memberFilter})),n=(0,r.Fl)((function(){var t=0;return D().toolbarLinks.forEach((function(n){t+=e.getters.getVisibleGroupMembers(n.id).length})),t})),o=(0,r.Fl)((function(){return 0===n.value})),i=(0,r.Fl)((function(){return D().filterNotFoundMsg.replace("{query}",t.value)}));return{query:t,noResults:o,notFoundMsg:i}}}),Mi=(0,c.Z)(Ri,[["render",function(e,t,n,o,i,s){return e.query&&e.noResults?((0,r.wg)(),(0,r.iD)("div",Oi,(0,r.zw)(e.notFoundMsg),1)):(0,r.kq)("",!0)}]]);var Ii={d:"M21 9H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1zM3 7h18c.55 0 1-.45 1-1s-.45-1-1-1H3c-.55 0-1 .45-1 1s.45 1 1 1zM21 13H3c-.55 0-1 .45-1 1s.45 1 1 1h18c.55 0 1-.45 1-1s-.45-1-1-1zM21 17H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1z"};const Fi=(0,r.aZ)({name:"DocIconAlignRight"}),Pi=(0,c.Z)(Fi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ii)}]]);var Hi={d:"M19 11H7.41l5.29-5.29a.996.996 0 10-1.41-1.41l-7 7a1 1 0 000 1.42l7 7a1.024 1.024 0 001.42-.01.996.996 0 000-1.41L7.41 13H19c.55 0 1-.45 1-1s-.45-1-1-1z"};const Ni=(0,r.aZ)({name:"DocIconArrowLeft"}),Wi=(0,c.Z)(Ni,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Hi)}]]);var Bi={d:"M19.92 12.38a1 1 0 00-.22-1.09l-7-7a.996.996 0 10-1.41 1.41l5.3 5.3H5c-.55 0-1 .45-1 1s.45 1 1 1h11.59l-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l7-7c.09-.09.16-.21.21-.33z"};const Vi=(0,r.aZ)({name:"DocIconArrowRight"}),ji=(0,c.Z)(Vi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Bi)}]]);var zi={d:"M19.71 11.29l-7-7a1 1 0 00-1.42 0l-7 7A.996.996 0 105.7 12.7L11 7.41V19c0 .55.45 1 1 1s1-.45 1-1V7.41l5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29c.39-.39.39-1.03 0-1.42z"};const qi=(0,r.aZ)({name:"DocIconArrowTop"}),$i=(0,c.Z)(qi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",zi)}]]);var Zi={d:"M21.67 6.68c-.02-.07-.03-.15-.07-.22a.967.967 0 00-.25-.28c-.24-.3-.51-.58-.85-.78l-7-4c-.93-.53-2.08-.54-3 0l-7 4c-.35.2-.62.48-.86.79-.09.08-.17.16-.24.27-.03.07-.05.14-.07.21C2.13 7.08 2 7.53 2 8v8c0 1.07.58 2.06 1.5 2.6l7 4c.32.18.66.28 1.01.34.15.09.31.15.49.15s.34-.06.49-.15c.35-.06.69-.15 1.01-.34l7-4c.92-.54 1.5-1.53 1.5-2.6V8c0-.47-.13-.91-.33-1.32zM11.5 3.14c.15-.09.33-.14.5-.14.17 0 .35.05.5.14l6.46 3.69L12 10.85 5.04 6.83l6.46-3.69zm-7 13.73c-.31-.18-.5-.52-.5-.87V8.54l7 4.05v7.99l-6.5-3.71zm15-.01L13 20.58v-7.99l7-4.05V16c0 .35-.19.69-.5.86z"};const Ui=(0,r.aZ)({name:"DocIconBox"}),Ki=(0,c.Z)(Ui,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Zi)}]]);var Yi={d:"M9 18.5c-.38 0-.77-.15-1.06-.44l-5-5a1.49 1.49 0 010-2.12 1.49 1.49 0 012.12 0L9 14.88l9.94-9.94a1.49 1.49 0 012.12 0c.59.59.59 1.54 0 2.12l-11 11c-.29.29-.68.44-1.06.44z"};const Gi=(0,r.aZ)({name:"DocIconCheck"}),Xi=(0,c.Z)(Gi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Yi)}]]);var Ji=[(0,r._)("path",{d:"M21 9.09c-.55 0-1 .45-1 1v.92c0 4.96-4.04 8.99-9 8.99-4.97 0-9-4.04-9-9s4.04-9 9-9c1.27 0 2.5.26 3.66.78.51.22 1.1 0 1.32-.51.23-.5 0-1.1-.51-1.32C14.06.32 12.56 0 11.01 0H11C4.94 0 0 4.93 0 10.99 0 17.06 4.93 22 10.99 22H11c6.06 0 11-4.93 11-10.99v-.92c0-.56-.45-1-1-1z"},null,-1),(0,r._)("path",{d:"M8.71 9.31a.996.996 0 10-1.41 1.41l3 3c.19.19.44.29.71.29.27 0 .52-.11.71-.29l10-10.01a.996.996 0 10-1.41-1.41L11 11.6 8.71 9.31z"},null,-1)];const Qi=(0,r.aZ)({name:"DocIconCheckCircle"}),es=(0,c.Z)(Qi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Ji)}]]);var ts={d:"M12 16c-.26 0-.51-.1-.71-.29l-6-6A.996.996 0 116.7 8.3l5.3 5.29 5.29-5.29a.996.996 0 111.41 1.41l-6 6c-.19.19-.44.29-.7.29z"};const ns=(0,r.aZ)({name:"DocIconChevronDown"}),rs=(0,c.Z)(ns,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ts)}]]);var os={d:"M15.71 11.29l-6-6A.996.996 0 108.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l6-6c.39-.39.39-1.03 0-1.42z"};const is=(0,r.aZ)({name:"DocIconChevronRight"}),ss=(0,c.Z)(is,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",os)}]]);var as={d:"M20.92 8.62a.875.875 0 00-.22-.32l-7-7A.995.995 0 0013 1H6C4.35 1 3 2.35 3 4v16c0 1.65 1.35 3 3 3h12c1.65 0 3-1.35 3-3V9c0-.13-.03-.26-.08-.38zM14 4.41L17.59 8H14V4.41zM18 21H6c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h6v6c0 .55.45 1 1 1h6v10c0 .55-.45 1-1 1z"};const ls=(0,r.aZ)({name:"DocIconFile"}),cs=(0,c.Z)(ls,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",as)}]]);var us={d:"M14 22c-.15 0-.31-.04-.45-.11l-4-2A.988.988 0 019 19v-6.17L1.24 3.65a.995.995 0 01-.14-1.07c.16-.35.51-.58.9-.58h20c.39 0 .74.23.91.58s.11.77-.14 1.07L15 12.83V21a.999.999 0 01-1 1zm-3-3.62l2 1v-6.92c0-.24.08-.47.24-.65L19.84 4H4.16l6.61 7.81c.15.18.24.41.24.65v5.92z"};const ds=(0,r.aZ)({name:"DocIconFilter"}),hs=(0,c.Z)(ds,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",us)}]]);var ps=(0,r._)("path",{d:"M20 22H4c-1.65 0-3-1.35-3-3V5c0-1.65 1.35-3 3-3h5c.33 0 .65.17.83.45L11.54 5H20c1.65 0 3 1.35 3 3v11c0 1.65-1.35 3-3 3zM4 4c-.55 0-1 .45-1 1v14c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V8c0-.55-.45-1-1-1h-9c-.33 0-.65-.17-.83-.45L8.46 4H4z"},null,-1),fs=(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1);const ms=(0,r.aZ)({name:"DocIconFolder"}),vs=(0,c.Z)(ms,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)(r.HY,null,[ps,fs],64)}]]);var gs=[(0,r._)("path",{d:"M12.01 6.01c-.55 0-1 .45-1 1V12a1 1 0 00.4.8l3 2.22a.985.985 0 001.39-.2.996.996 0 00-.21-1.4l-2.6-1.92V7.01c.02-.55-.43-1-.98-1z"},null,-1),(0,r._)("path",{d:"M12.01 1.91c-5.33 0-9.69 4.16-10.05 9.4l-.29-.26a.997.997 0 10-1.34 1.48l1.97 1.79c.19.17.43.26.67.26s.48-.09.67-.26l1.97-1.79a.997.997 0 10-1.34-1.48l-.31.28c.34-4.14 3.82-7.41 8.05-7.41 4.46 0 8.08 3.63 8.08 8.09s-3.63 8.08-8.08 8.08c-2.18 0-4.22-.85-5.75-2.4a.996.996 0 10-1.42 1.4 10.02 10.02 0 007.17 2.99c5.56 0 10.08-4.52 10.08-10.08.01-5.56-4.52-10.09-10.08-10.09z"},null,-1)];const bs=(0,r.aZ)({name:"DocIconHistory"}),ys=(0,c.Z)(bs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,gs)}]]);var ws={d:"M21.61 8.21l-9-7c-.36-.28-.87-.28-1.23 0l-9 7C2.14 8.4 2 8.69 2 9v11c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3V9c0-.31-.14-.6-.39-.79zM14 21h-4v-8h4v8zm6-1c0 .55-.45 1-1 1h-3v-9c0-.55-.45-1-1-1H9c-.55 0-1 .45-1 1v9H5c-.55 0-1-.45-1-1V9.49l8-6.22 8 6.22V20z"};const Ss=(0,r.aZ)({name:"DocIconHome"}),ks=(0,c.Z)(Ss,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ws)}]]);var xs=[(0,r._)("path",{d:"M12 1C5.93 1 1 5.93 1 12s4.93 11 11 11 11-4.93 11-11S18.07 1 12 1zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9z"},null,-1),(0,r._)("path",{d:"M12 11c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1s1-.45 1-1v-4c0-.55-.45-1-1-1zM12.01 7c-.56 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"},null,-1),(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1)];const Es=(0,r.aZ)({name:"DocIconInfo"}),Cs=(0,c.Z)(Es,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,xs)}]]);var _s=[(0,r._)("path",{d:"M.55 6.89l10 5c.14.07.3.11.45.11s.31-.04.45-.11l10-5c.34-.16.55-.51.55-.89s-.21-.73-.55-.89l-10-5a.995.995 0 00-.89 0l-10 5C.21 5.27 0 5.62 0 6s.21.73.55.89zM11 2.12L18.76 6 11 9.88 3.24 6 11 2.12zM20.55 15.11L11 19.88 1.45 15.1c-.49-.25-1.09-.05-1.34.45s-.05 1.09.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1),(0,r._)("path",{d:"M20.55 10.11L11 14.88 1.45 10.1a.993.993 0 00-1.34.45.993.993 0 00.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1)];const Ts=(0,r.aZ)({name:"DocIconLayers"}),Ls=(0,c.Z)(Ts,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,_s)}]]);var As=[(0,r._)("path",{d:"M21.11 2.75a5.98 5.98 0 00-8.35.01l-1.72 1.71a.996.996 0 101.41 1.41l1.71-1.7c1.56-1.5 4-1.5 5.56 0 1.59 1.53 1.63 4.07.11 5.64l-3 3c-.13.13-.28.26-.43.38a4.003 4.003 0 01-5.6-.81c-.33-.44-.96-.53-1.4-.2-.44.33-.53.96-.2 1.4a5.999 5.999 0 004.81 2.4c1.25 0 2.51-.39 3.58-1.19.23-.17.45-.36.65-.56l3.01-3.01a5.991 5.991 0 00-.14-8.48z"},null,-1),(0,r._)("path",{d:"M11.53 18.11l-1.7 1.7c-1.56 1.5-4 1.5-5.56 0-1.59-1.53-1.63-4.07-.11-5.64l3-3c.14-.14.28-.26.43-.38a3.997 3.997 0 015.6.8c.33.44.96.53 1.4.2.44-.33.53-.96.2-1.4a5.93 5.93 0 00-3.95-2.34c-1.58-.22-3.15.18-4.44 1.14-.23.17-.44.36-.65.56l-3.01 3.01c-2.3 2.38-2.23 6.19.15 8.48a5.956 5.956 0 004.16 1.69c1.5 0 3.01-.57 4.19-1.7l1.71-1.71c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0z"},null,-1)];const Ds=(0,r.aZ)({name:"DocIconLink"}),Os=(0,c.Z)(Ds,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,As)}]]);var Rs={d:"M2 4h20v2H2zM2 11h20v2H2zM2 18h20v2H2z"};const Ms=(0,r.aZ)({name:"DocIconMenu"}),Is=(0,c.Z)(Ms,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Rs)}]]);var Fs={d:"M19 13H5c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1s-.45 1-1 1z"};const Ps=(0,r.aZ)({name:"DocIconMinus"}),Hs=(0,c.Z)(Ps,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Fs)}]]);var Ns=[(0,r._)("path",{d:"M11 22C4.93 22 0 17.07 0 11S4.93 0 11 0s11 4.93 11 11-4.93 11-11 11zm0-20c-4.96 0-9 4.04-9 9s4.04 9 9 9 9-4.04 9-9-4.04-9-9-9z"},null,-1),(0,r._)("path",{d:"M16.5 11c0 3.05-2.46 5.51-5.49 5.51-2.16 0-4.02-1.25-4.92-3.05-.11-.22.08-.49.32-.43 1.15.28 2.43.2 3.71-.42 1.88-.9 3.07-2.89 3.06-4.97 0-.42-.05-.83-.15-1.22-.06-.24.21-.43.43-.32 1.79.88 3.04 2.74 3.04 4.9z"},null,-1)];const Ws=(0,r.aZ)({name:"DocIconMoon"}),Bs=(0,c.Z)(Ws,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Ns)}]]);var Vs=[(0,r._)("circle",{cx:"12",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"19",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"5",cy:"12",r:"2"},null,-1)];const js=(0,r.aZ)({name:"DocIconMoreHorizontal"}),zs=(0,c.Z)(js,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Vs)}]]);var qs={d:"M19 11h-6V5c0-.55-.45-1-1-1s-1 .45-1 1v6H5c-.55 0-1 .45-1 1s.45 1 1 1h6v6c0 .55.45 1 1 1s1-.45 1-1v-6h6c.55 0 1-.45 1-1s-.45-1-1-1z"};const $s=(0,r.aZ)({name:"DocIconPlus"}),Zs=(0,c.Z)($s,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",qs)}]]);var Us={d:"M21.71 20.29l-3.68-3.68A8.963 8.963 0 0020 11c0-4.96-4.04-9-9-9s-9 4.04-9 9 4.04 9 9 9c2.12 0 4.07-.74 5.61-1.97l3.68 3.68c.2.19.45.29.71.29s.51-.1.71-.29c.39-.39.39-1.03 0-1.42zM4 11c0-3.86 3.14-7 7-7s7 3.14 7 7c0 1.92-.78 3.66-2.04 4.93-.01.01-.02.01-.02.01-.01.01-.01.01-.01.02A6.98 6.98 0 0111 18c-3.86 0-7-3.14-7-7z"};const Ks=(0,r.aZ)({name:"DocIconSearch"}),Ys=(0,c.Z)(Ks,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Us)}]]);var Gs={d:"M12 23c-.15 0-.31-.04-.45-.11C11.2 22.72 3 18.54 3 12V5c0-.42.26-.79.65-.94l8-3c.23-.08.48-.08.7 0l8 3c.39.15.65.52.65.94v7c0 6.54-8.2 10.72-8.55 10.89-.14.07-.3.11-.45.11zM5 5.69V12c0 4.55 5.39 7.95 7 8.86 1.61-.92 7-4.33 7-8.86V5.69l-7-2.63-7 2.63z"};const Xs=(0,r.aZ)({name:"DocIconShield"}),Js=(0,c.Z)(Xs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Gs)}]]);var Qs={d:"M12 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zM12 4c.55 0 1-.45 1-1V1c0-.55-.45-1-1-1s-1 .45-1 1v2c0 .55.45 1 1 1zM12 20c-.55 0-1 .45-1 1v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1zM4.93 6.35c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41L4.93 3.51a.996.996 0 10-1.41 1.41l1.41 1.43zM19.07 17.65a.996.996 0 10-1.41 1.41l1.42 1.42c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41l-1.43-1.42zM4 12c0-.55-.45-1-1-1H1c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1zM23 11h-2c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1s-.45-1-1-1zM4.93 17.65l-1.42 1.42a.996.996 0 00.71 1.7c.26 0 .51-.1.71-.29l1.42-1.42c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0zM18.36 6.64c.26 0 .51-.1.71-.29l1.42-1.42a.996.996 0 10-1.41-1.41l-1.42 1.42a.996.996 0 00.7 1.7z"};const ea=(0,r.aZ)({name:"DocIconSun"}),ta=(0,c.Z)(ea,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Qs)}]]);var na={d:"M13.41 12l5.29-5.29a.996.996 0 10-1.41-1.41L12 10.59l-5.29-5.3A.996.996 0 105.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l5.29-5.3 5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29a.996.996 0 000-1.41l-5.3-5.3z"};const ra=(0,r.aZ)({name:"DocIconX"}),oa=(0,c.Z)(ra,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",na)}]])},850:(e,t,n)=>{"use strict";n.d(t,{w:()=>o});var r=n(23);function o(e){(0,r.zX)(document.body,"click",(function(t){e(t)}))}},23:(e,t,n)=>{"use strict";n.d(t,{BK:()=>s,Up:()=>i,zX:()=>o});var r=n(166);function o(e,t,n){var o=function(){return e.removeEventListener(t,n)};return(0,r.bv)((function(){e&&e.addEventListener(t,n)})),(0,r.Jd)(o),o}function i(e,t,n,r,i){return o(e,t,s(n,r,i))}function s(e,t,n){var r,o=0,i=-1;return function(){++o%t==0?e():(i=o,r||(r=setTimeout((function(){var t=i>=o;o=0,i=-1,r=void 0,t&&e()}),n,null)))}}},376:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var r=n(166);function o(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,r.iH)(null);return{result:t,loading:n,error:o,execute:function(r,i){return s=this,a=void 0,c=function(){var s,a,l,c;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,a[0]&&(s=0)),s;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,r=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){s.label=a[1];break}if(6===a[0]&&s.label<o[1]){s.label=o[1],o=a;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(a);break}o[2]&&s.ops.pop(),s.trys.pop();continue}a=t.call(e,s)}catch(e){a=[6,e],r=0}finally{n=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,l])}}}(this,(function(u){switch(u.label){case 0:return u.trys.push([0,6,7,8]),n.value=!0,[4,fetch(r,i)];case 1:if(!(s=u.sent()).ok)throw new Error(s.statusText);return e?[4,e(s)]:[3,3];case 2:return l=u.sent(),[3,5];case 3:return[4,s.json()];case 4:l=u.sent(),u.label=5;case 5:return a=l,t.value=a,[3,8];case 6:return c=u.sent(),o.value=c,[3,8];case 7:return n.value=!1,[7];case 8:return[2]}}))},new((l=void 0)||(l=Promise))((function(e,t){function n(e){try{o(c.next(e))}catch(e){t(e)}}function r(e){try{o(c.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof l?o:new l((function(e){e(o)}))).then(n,r)}o((c=c.apply(s,a||[])).next())}));var s,a,l,c}}}},701:(e,t,n)=>{"use strict";n.d(t,{Ke:()=>i,Mu:()=>s,ft:()=>a});var r=n(678),o=n(166),i=(0,r.MT)("retype","store"),s=Symbol("DocsIdbStore");function a(){return{idbStore:(0,o.f3)(s)}}},816:(e,t,n)=>{"use strict";n.d(t,{xf:()=>x,v2:()=>L,Rx:()=>A});var r=n(166),o=n(678),i=n(296),s=n.n(i),a=n(184),l=n(984),c=n.n(l);const u=()=>window.__DOCS_LUNR__;var d=n.n(u),h=n(701),p=n(850),f=n(65),m=n(208),v=n(543),g=n(830),b=n(376),y=n(110),w=n(755),S=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},k=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,a[0]&&(s=0)),s;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,r=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){s.label=a[1];break}if(6===a[0]&&s.label<o[1]){s.label=o[1],o=a;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(a);break}o[2]&&s.ops.pop(),s.trys.pop();continue}a=t.call(e,s)}catch(e){a=[6,e],r=0}finally{n=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,l])}}},x=Symbol("DocsSearch"),E=(0,h.ft)().idbStore,C=!1;function _(e,t){var n;return S(this,void 0,void 0,(function(){var r,o,i;return k(this,(function(s){switch(s.label){case 0:return r={map:null,index:null},e.length&&t?(r.map=function(e,t){var n=0,r=0,o=new Map,i=c().appendDocumentName?c().documentName:"";return function e(t,s,a){t.forEach((function(t){var l=a?a+" > "+t.label:t.label;t.clickable&&(s[r].forEach((function(e){var r,s,a,u=e.i||(null===(r=e.l)||void 0===r?void 0:r.toLowerCase().replace(/[\s\-.]+/g,"-"));if(u&&(e.l||(null===(s=e.p)||void 0===s?void 0:s.length))){var d=u&&"#"!==u?"#"+u:"",h="/"===t.path?"".concat(i).concat(d):!c().trailingSlash&&i&&t.path?"".concat(t.path,"/").concat(i).concat(d):"".concat(t.path).concat(i).concat(d);e.l&&o.set((++n).toString(),{path:h,text:e.l,page:l}),(null===(a=e.p)||void 0===a?void 0:a.length)&&e.p.forEach((function(t){o.set((++n).toString(),{path:h,text:t,heading:e.l,page:l})}))}})),r++),t.children&&e(t.children,s,l)}))}(e,t,""),o}(e,t),null==r.map?[3,2]:[4,(0,w.T)("lunr-js",d())]):[2,r];case 1:(o=s.sent())&&(i=[],null===(n=r.map)||void 0===n||n.forEach((function(e,t){return i.push([t,e])})),r.index=o.createIndex(i)),s.label=2;case 2:return[2,r]}}))}))}function T(){return"/"===c().base?"search":c().base+"search"}function L(){return S(this,void 0,void 0,(function(){var e;return k(this,(function(t){switch(t.label){case 0:return e=T(),[4,(0,o.IV)(e,E)];case 1:return t.sent(),C=!0,[2]}}))}))}function A(e){var t=this,n=(0,m.oR)().store,i=(0,r.iH)(null),l=(0,r.iH)(null),u=(0,r.Fl)((function(){return n.state.searchQuery})),h=(0,r.iH)([]),x=(0,r.iH)(!1),L=(0,r.iH)(!1),A=(0,r.iH)(0),D=(0,r.Fl)((function(){var t;return null===(t=e.value)||void 0===t?void 0:t.querySelector("input")}));function O(e){var t,n,r,o,s;return S(this,void 0,void 0,(function(){var a,u,p,f,m,v,g,b;return k(this,(function(y){switch(y.label){case 0:return l.value&&i.value?e?e.length>=c().search.minChars?(a=[],[4,(0,w.T)("lunr-js",d())]):[3,2]:(h.value=[],[2]):[2];case 1:for((u=y.sent())&&(p=e.toLowerCase().trim(),a=u.query(l.value,p)),f=[],m=0;m<c().search.maxResults&&a[m];m++)(v=i.value.get(a[m].ref))&&(g=R(null===(t=a[m].matchData)||void 0===t?void 0:t.metadata),b=M(null!==(n=v.text)&&void 0!==n?n:"",g),f.push({id:a[m].ref,path:null!==(r=v.path)&&void 0!==r?r:"",heading:null!==(o=v.heading)&&void 0!==o?o:"",page:null!==(s=v.page)&&void 0!==s?s:"",text:b}));h.value=f,y.label=2;case 2:return[2]}}))}))}function R(e){var t,n,r,o=[],i=e;if(i)for(var s in i){var a=null===(n=null===(t=i[s])||void 0===t?void 0:t.text)||void 0===n?void 0:n.position;if(null==a?void 0:a.length)for(var l=0;l<a.length;++l)2===(null===(r=a[l])||void 0===r?void 0:r.length)&&a[l][1]>0&&o.push([a[l][0],a[l][0]+a[l][1]])}return o}function M(e,t,n){if(void 0===n&&(n=24),!t.length){var r=e.trim().split(/\s+/).filter((function(e){return e}));return r.length>n&&(r=r.slice(0,n)).push("..."),r.join(" ")}t.sort((function(e,t){return e[0]-t[0]}));for(var o=t.length-2;o>=0;--o)t[o][1]>=t[o+1][0]&&(t[o][1]=Math.max(t[o][1],t[o+1][1]),t.splice(o+1,1));var i=[],s=0,a=-1,l=-1;for(o=0;o<t.length;++o){var c=t[o][0],u=t[o][1],d=e.slice(s,c);if(d){var h=d.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,h)}-1===a?(a=i.length,l=i.length):l=i.length,i.push(['<span class="text-blue-500 dark:text-blue-400 font-semibold">'.concat(e.slice(c,u),"</span>"),!0]),s=u}if(s<e.length){var p=e.slice(s);if(p){var f=p.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,f)}}for(var m=0,v=1+l-a,g=i.length-1;v<n;){if(a>0&&(m%2==0||l>=g))--a;else{if(!(l<g))break;++l}++m,++v}v>n&&(l-=v-n);var b=i.slice(a,l+1).map((function(e){return e[0]}));return a>0&&b.splice(0,0,"..."),l<i.length-1&&b.push("..."),b.join(" ")}(0,r.YP)(u,s()((function(e){return S(this,void 0,void 0,(function(){return k(this,(function(t){switch(t.label){case 0:return[4,O(e)];case 1:return t.sent(),e.length>=c().search.minChars||h.value.length>0?x.value=!0:(x.value=!1,A.value=0),[2]}}))}))}),50)),(0,p.w)((function(t){var n,r=t.target;e.value===r||(null===(n=e.value)||void 0===n?void 0:n.contains(r))||(L.value=!1)}));var I=(0,f.B)().scrollTo;function F(e,t){var o;if(x.value=!1,L.value=!1,A.value=0,setTimeout((function(){var e;null===(e=D.value)||void 0===e||e.blur()}),100),e){var i=P(e,t);(0,a.Vn)(i);var s=null===(o=i.split("/").pop())||void 0===o?void 0:o.substring(1);if(s&&document.getElementById(s)){if(s.split("-").length>1){var l=!1;for(var c in n.state.memberGroups){if(l)break;for(var u in n.state.memberGroups[c])if(s===u){n.state.memberGroups[c][u].isOpen=!0,l=!0;break}}}(0,r.Y3)((function(){I("#".concat(s),{offset:v.vE,onDone:function(){n.actions.updateScrolledElementId(s)}})}))}}}function P(e,t){return t=null!=t?t:(0,g.Rs)(),e.startsWith("#")?(0,g.wE)(t)+e:t+e}function H(){var t,n=null===(t=e.value)||void 0===t?void 0:t.querySelector("ul"),r=null==n?void 0:n.children.item(A.value);null==r||r.scrollIntoView({block:"nearest"})}var N=c().preloadSearch?(0,b.i)((function(e){return S(t,void 0,void 0,(function(){var t,n,r;return k(this,(function(o){switch(o.label){case 0:return"file:"===location.protocol.toLowerCase()?[2,void 0]:[4,e.text()];case 1:return t=o.sent(),n=t.indexOf("="),r=t.slice(n+1).trim().slice(0,-1),[2,JSON.parse(r)]}}))}))})):(0,b.i)(),W=N.execute,B=N.error,V=N.result,j=c().preloadSearch?"js":"json",z=c().cacheBustingToken&&"none"!=c().cacheBustingStrategy?"path"==c().cacheBustingStrategy?"".concat(location.origin).concat(y.uj,".").concat(c().cacheBustingToken,".").concat(j):"".concat(location.origin).concat(y.uj,".").concat(j,"?v=").concat(c().cacheBustingToken):"".concat(location.origin).concat(y.uj,".").concat(j),q=(0,r.Fl)((function(){return n.state.sidebar})),$=T();(0,r.YP)(L,(function(e){e&&(function(){S(this,void 0,void 0,(function(){var e,t,n,r,s,a,u;return k(this,(function(h){switch(h.label){case 0:return[4,(0,o.U2)($,E)];case 1:return(e=h.sent())&&e.id===c().id?(i.value||(i.value=e.map),l.value?[3,3]:[4,(0,w.T)("lunr-js",d())]):[3,4];case 2:(t=h.sent())&&(n=JSON.parse(e.index),l.value=t.loadIndex(n)),h.label=3;case 3:return[3,10];case 4:return[4,(0,o.IV)($,E)];case 5:return h.sent(),r=void 0,!C&&c().preloadSearch?[3,7]:[4,W(z)];case 6:if(h.sent(),B.value)throw new Error("Error fetching search data. ".concat(B.value));r=V.value,h.label=7;case 7:return r||(r=window.__DOCS_SEARCH__),C=!1,[4,_(q.value.data,r)];case 8:return s=h.sent(),a=s.index,u=s.map,i.value=u,l.value=a,[4,(0,o.t8)($,{index:JSON.stringify(a),map:u,id:c().id},E)];case 9:h.sent(),h.label=10;case 10:return[2]}}))}))}(),H())}));var Z=(0,r.qj)({input:D,isOpen:x,isFocused:L,results:h,focusIndex:A,clear:function(){var e;n.actions.updateSearchQuery(""),null===(e=D.value)||void 0===e||e.focus()},onKeydown:function(e){if(h.value.length)switch(e.code){case"ArrowDown":e.preventDefault(),A.value<h.value.length-1&&(A.value++,H());break;case"ArrowUp":e.preventDefault(),A.value>0&&(A.value--,H());break;case"Enter":e.preventDefault(),F(h.value[A.value].path);break;case"Escape":x.value=!1,n.actions.updateSearchQuery("")}},navigateToResult:F,getResultFullPath:P});return Z}},65:(e,t,n)=>{"use strict";function r(){var e={duration:500,offset:0},t=null;return{scrollTo:function(n,r){var o,i=Object.assign({},e,r),s=decodeURI(n),a=null!==(o=document.getElementById(n.startsWith("#")?s.slice(1):n))&&void 0!==o?o:document.querySelector(s);if(!a)throw new Error("Invalid target");var l="function"==typeof i.offset?i.offset():i.offset,c=a.getBoundingClientRect().top,u=window.scrollY||window.pageYOffset,d=c+u-u+l;i.onStart&&"function"==typeof i.onStart&&i.onStart(),window.requestAnimationFrame((function e(n){t||(t=n);var r=n-t,o=function(e,t,n,r){return-n*(e/=r)*(e-2)+t}(r,u,d,i.duration);window.scrollTo(0,o),r<i.duration?window.requestAnimationFrame(e):(i.onDone&&"function"==typeof i.onDone&&i.onDone(),t=null)}))}}}n.d(t,{B:()=>r})},110:(e,t,n)=>{"use strict";n.d(t,{as:()=>s,bT:()=>l,u:()=>c,uj:()=>a});var r=n(984),o=n.n(r),i="resources",s="".concat(o().base).concat(i,"/nav"),a="".concat(o().base).concat(i,"/js/search"),l=new Uint8Array([83,72,65,45,50,53,54]),c=new Uint8Array([82,83,65,83,83,65,45,80,75,67,83,49,45,118,49,95,53])},755:(e,t,n)=>{"use strict";function r(e,t,n){var o=t();if(o&&o.default)n(o.default);else if(e){var i=document.getElementById(e);i&&i.addEventListener("load",(function(){return r(null,t,n)}))}}function o(e,t){return new Promise((function(n,o){try{r(e,t,(function(e){n(e)}))}catch(e){o(e)}}))}n.d(t,{T:()=>o,b:()=>r})},208:(e,t,n)=>{"use strict";n.d(t,{$Q:()=>c,h:()=>d,oR:()=>h});var r=n(984),o=n.n(r),i=n(166),s=n(543),a=n(872);(0,i.aZ)({name:"DocStoreDebug",setup:function(){var e=(0,i.iH)(!1),t=(0,i.Fl)((function(){return d.state})),n=(0,i.Fl)((function(){return{"top-0 max-w-md p-5 text-sm":e.value,"px-3 flex items-center text-xs mr-0 mb-0":!e.value}}));return{state:t,isOpen:e,classes:n,toggle:function(){e.value=!e.value}}}});var l=function(){return l=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},l.apply(this,arguments)},c=Symbol("DocsStore"),u={inherited:!0,access:o().access.map((function(e){return e.value}))},d={state:(0,i.qj)({initialPageLoad:!0,unloading:!1,inherited:u.inherited,isWindowScrolling:!1,isScrollPositionRestored:!1,memberFilter:"",scrolledElementId:"",searchQuery:"",sidebarRightHasContent:!1,sidebarScroll:0,sidebarActiveEl:void 0,sidebar:{id:"",data:[]},sidebarLookup:new Map,memberGroups:(0,a.s)(),access:u.access}),actions:{setMemberData:function(e,t,n,r){d.state.memberGroups[e][t]||(d.state.memberGroups[e][t]={isOpen:!1,isVisible:!0,animations:!0,access:"public",name:"UnknownMember"}),d.state.memberGroups[e][t][n]=r},resetMemberData:function(){Object.keys(d.state.memberGroups).forEach((function(e){d.state.memberGroups[e]={}}))},updateAccess:function(e){d.state.access=e,(0,s.Nh)(o().base,localStorage,"doc_access",e)},setInherited:function(e){d.state.inherited=e},toggleInherited:function(){d.state.inherited=!d.state.inherited,(0,s.Nh)(o().base,localStorage,"doc_inherited",d.state.inherited)},updateMemberFilter:function(e){d.state.memberFilter=e},updateScrolledElementId:function(e){d.state.scrolledElementId=e},updateSearchQuery:function(e){d.state.searchQuery=e},setSidebarData:function(e){d.state.sidebar=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",e)},setSidebarLookupData:function(e){d.state.sidebarLookup=e},setSidebarScroll:function(e){d.state.sidebarScroll=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar_scroll",e)},setActiveSidebarEl:function(e){d.state.sidebarActiveEl=e},setWindowScrollingState:function(e){d.state.isWindowScrolling=e},updateSidebarLookupItem:function(e,t,n){e[t]=n;var r=(0,s.qn)(o().base,sessionStorage,"doc_sidebar");r&&(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",l(l({},r),d.state.sidebar))}},getters:{isAccessDirty:function(){return u.access.length!==d.state.access.length},isFiltersDirty:function(){return u.access.length!==d.state.access.length||u.inherited!==d.state.inherited||""!==d.state.memberFilter},getVisibleGroupMembers:function(e){return Object.values(d.state.memberGroups[e]).filter((function(e){return!0===e.isVisible}))}}};function h(){return{store:(0,i.f3)(c)}}},872:(e,t,n)=>{"use strict";n.d(t,{g:()=>a,s:()=>s});var r=n(984),o=n.n(r),i=n(543);function s(){var e={};return o().toolbarLinks.forEach((function(t){e[t.id]={}})),e}function a(e){if(e.state.initialPageLoad){var t=(0,i.qn)(o().base,sessionStorage,"doc_sidebar_scroll");null!==t&&e.actions.setSidebarScroll(t);var n=(0,i.qn)(o().base,sessionStorage,"doc_sidebar");null!==n&&e.actions.setSidebarData(n);var r=(0,i.qn)(o().base,localStorage,"doc_inherited");null!==r&&e.actions.setInherited(r);var s=(0,i.qn)(o().base,localStorage,"doc_access");null!==s&&e.actions.updateAccess(s)}}},543:(e,t,n)=>{"use strict";n.d(t,{Nh:()=>a,Sy:()=>c,am:()=>u,pI:()=>m,qn:()=>s,rw:()=>p,vE:()=>l});var r=n(984),o=n.n(r),i=function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};function s(e,t,n){var r=d(e,n),o=t.getItem(r);return o&&"null"!==o?"{"===o[0]||"["===o[0]||'"'===o[0]||"true"===o||"false"===o?JSON.parse(o):o:null}function a(e,t,n,r){var o=d(e,n),i="string"!=typeof r?JSON.stringify(r):r;t.setItem(o,i)}function l(){var e=document.getElementById("docs-site-header"),t=document.getElementById("docs-toolbar"),n=20;return n+=e?e.offsetHeight:0,-(n+=t?t.offsetHeight:0)}function c(e){var t,n,r,i=((t={})[o().resources.History_YearTime_Label]=31536e3,t[o().resources.History_MonthTime_Label]=2592e3,t[o().resources.History_DayTime_Label]=86400,t[o().resources.History_HourTime_Label]=3600,t[o().resources.History_MinuteTime_Label]=60,t[o().resources.History_SecondTime_Label]=1,t),s=Math.floor((Date.now()-e)/1e3);return Object.keys(i).some((function(e){return n=Math.floor(s/i[e]),r=e,n>=1})),0===n?o().resources.History_JustNowTime_Label:"".concat(n).concat(r," ").concat(o().resources.History_AgoTime_Label)}function u(e,t,n,r,o){if(void 0===r&&(r=""),void 0===o&&(o=[]),!t||!t.length)return[];var i=[];return t.forEach((function(t){var s,a=h(e,t,n,r,o);(null===(s=a.parentNodes)||void 0===s?void 0:s.length)&&a.parentNodes.splice(-1,1),i.push(a)})),i}function d(e,t){return e&&"/"!==e?e+t:t}function h(e,t,n,r,o){void 0===r&&(r=""),void 0===o&&(o=[]);var s={};s.path=n?t.n.startsWith("/")?"".concat(t.n.slice(1),"/"):"".concat(r).concat(t.n,"/"):t.n.startsWith("/")?"".concat(t.n.slice(1)):!r||r.endsWith("/")?"".concat(r).concat(t.n):"".concat(r,"/").concat(t.n),s.parentNodes=o.length?i(i([],o,!0),[s.path],!1):[s.path];var a=t.i||t.h;return a&&e.set(s.path,s),s.clickable=!1!==t.c,s.visible=!1!==t.v,t.s&&(s.icon=t.s),t.e&&(s.emoji=t.e),t.h&&(s.hash=t.h),s.label=t.l||t.n,t.u&&(s.url=t.u),s.searchLabel=s.label.toLowerCase(),t.o&&(s.open=t.o),a&&(s.children=u(e,t.i,n,s.path,s.parentNodes)),s}function p(e,t,n,r){void 0===r&&(r=""),t&&t.length&&t.forEach((function(t){var o=n?"".concat(r).concat(t.n,"/"):!r||r.endsWith("/")?"".concat(r).concat(t.n):"".concat(r,"/").concat(t.n);if(e.get(o))p(e,t.i,n,o);else{var i=e.get(r);if(!i)throw new Error("Unexpected state. The parent node must exist at this point.");var s=h(e,t,n,r);if(i.children){var a=function(e,t){var n=0,r=e.length-1;if(r<n)return 0;for(;;){var o=Math.floor((n+r)/2),i=f(e[o].label,t.label);if(i<0){if((n=o+1)>r)return n}else{if(!(i>0))return o;if((r=o-1)<n)return o}}}(i.children,s);i.children.splice(a,0,s)}}}))}function f(e,t){if(null==t)return 1;if(null==e)return-1;var n=e.toUpperCase(),r=t.toUpperCase();return n>r?1:n<r?-1:0}function m(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}},830:(e,t,n)=>{"use strict";n.d(t,{Rs:()=>c,cD:()=>l,sy:()=>u,wE:()=>a});var r=n(984),o=n.n(r),i=n(884),s=n.n(i);function a(e){var t=o().appendDocumentName?o().documentName:"";if(o().trailingSlash||t)return"".concat(e).concat(t);var n=e.slice(0,-1);return o().base.length>1&&n.endsWith(".")&&(n=n.length>1?"../"+n+o().base.slice(0,-1):".."+o().base.slice(0,-1)),n}function l(e,t){var n="/"+o().documentName,r=e;if(o().appendDocumentName?r.endsWith(n)||(r=r.endsWith("/")?r+o().documentName:r+n):r.endsWith(n)&&(r=r.slice(0,-n.length)),o().useRelativePaths&&"file:"===location.protocol.toLowerCase()){var i=null!=t?t:s()();if(i){var a=r.split("/");r=a.slice(-i.level-1).join("/")}}else r.startsWith(o().base)?r=r.slice(o().base.length):o().trailingSlash||o().appendDocumentName||r!==o().base.slice(0,-1)||(r="");return r}function c(){if(!o().useRelativePaths)return o().base;var e=s()();if(!e)return o().base;var t=e.level;return o().appendDocumentName||e.isRoot||(o().trailingSlash?location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeBaseCache||(e.relativeBaseCache=t<=0?!e.isRoot||o().trailingSlash||location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")?"./":"."+o().base:"../".repeat(t)),e.relativeBaseCache}function u(){if(!o().useRelativePaths)return"/";var e=s()();if(!e)return"/";var t=e.level;return o().appendDocumentName||e.isRoot||(o().trailingSlash?location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeRootCache||(e.relativeRootCache=t<=0?!e.isRoot||o().trailingSlash||location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")?"./":"."+o().base:"../".repeat(t)),e.relativeRootCache}},744:(e,t)=>{"use strict";t.Z=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},166:(e,t,n)=>{"use strict";n.d(t,{HY:()=>Ko,lR:()=>Zo,uT:()=>Fs,Fl:()=>$i,ri:()=>Oa,j4:()=>ai,kq:()=>wi,iD:()=>si,_:()=>fi,Uk:()=>bi,Wm:()=>mi,aZ:()=>mr,h:()=>ns,f3:()=>Gn,Y3:()=>fn,C_:()=>d,j5:()=>s,Jd:()=>Ir,bv:()=>Or,wg:()=>ei,Cn:()=>In,JJ:()=>Yn,dD:()=>Mn,qj:()=>kt,iH:()=>Nt,Ko:()=>Yr,WI:()=>Xr,up:()=>zr,LL:()=>$r,qZ:()=>oi,zw:()=>w,e8:()=>aa,nr:()=>sa,F8:()=>ka,YP:()=>tr,m0:()=>Xn,w5:()=>Pn,wy:()=>Br,D2:()=>Sa,iM:()=>ya});var r={};function o(e,t){const n=Object.create(null),r=e.split(",");for(let e=0;e<r.length;e++)n[r[e]]=!0;return t?e=>!!n[e.toLowerCase()]:e=>!!n[e]}n.r(r),n.d(r,{BaseTransition:()=>lr,Comment:()=>Go,EffectScope:()=>le,Fragment:()=>Ko,KeepAlive:()=>wr,ReactiveEffect:()=>ke,Static:()=>Xo,Suspense:()=>zn,Teleport:()=>Zo,Text:()=>Yo,Transition:()=>Fs,TransitionGroup:()=>Qs,VueElement:()=>Ls,assertNumber:()=>en,callWithAsyncErrorHandling:()=>nn,callWithErrorHandling:()=>tn,camelize:()=>G,capitalize:()=>Q,cloneVNode:()=>gi,compatUtils:()=>ds,computed:()=>$i,createApp:()=>Oa,createBlock:()=>ai,createCommentVNode:()=>wi,createElementBlock:()=>si,createElementVNode:()=>fi,createHydrationRenderer:()=>No,createPropsRestProxy:()=>es,createRenderer:()=>Ho,createSSRApp:()=>Ra,createSlots:()=>Gr,createStaticVNode:()=>yi,createTextVNode:()=>bi,createVNode:()=>mi,customRef:()=>Ut,defineAsyncComponent:()=>gr,defineComponent:()=>mr,defineCustomElement:()=>Cs,defineEmits:()=>Ui,defineExpose:()=>Ki,defineProps:()=>Zi,defineSSRCustomElement:()=>_s,devtools:()=>xn,effect:()=>Ee,effectScope:()=>ce,getCurrentInstance:()=>Di,getCurrentScope:()=>de,getTransitionRawChildren:()=>fr,guardReactiveProps:()=>vi,h:()=>ns,handleError:()=>rn,hydrate:()=>Da,initCustomFormatter:()=>is,initDirectivesForSSR:()=>Fa,inject:()=>Gn,isMemoSame:()=>as,isProxy:()=>Dt,isReactive:()=>Tt,isReadonly:()=>Lt,isRef:()=>Ht,isRuntimeOnly:()=>Bi,isShallow:()=>At,isVNode:()=>li,markRaw:()=>Rt,mergeDefaults:()=>Qi,mergeProps:()=>Ei,nextTick:()=>fn,normalizeClass:()=>d,normalizeProps:()=>h,normalizeStyle:()=>s,onActivated:()=>kr,onBeforeMount:()=>Dr,onBeforeUnmount:()=>Ir,onBeforeUpdate:()=>Rr,onDeactivated:()=>xr,onErrorCaptured:()=>Wr,onMounted:()=>Or,onRenderTracked:()=>Nr,onRenderTriggered:()=>Hr,onScopeDispose:()=>he,onServerPrefetch:()=>Pr,onUnmounted:()=>Fr,onUpdated:()=>Mr,openBlock:()=>ei,popScopeId:()=>In,provide:()=>Yn,proxyRefs:()=>$t,pushScopeId:()=>Mn,queuePostFlushCb:()=>gn,reactive:()=>kt,readonly:()=>Et,ref:()=>Nt,registerRuntimeCompiler:()=>Wi,render:()=>Aa,renderList:()=>Yr,renderSlot:()=>Xr,resolveComponent:()=>zr,resolveDirective:()=>Zr,resolveDynamicComponent:()=>$r,resolveFilter:()=>us,resolveTransitionHooks:()=>ur,setBlockTracking:()=>oi,setDevtoolsHook:()=>_n,setTransitionHooks:()=>pr,shallowReactive:()=>xt,shallowReadonly:()=>Ct,shallowRef:()=>Wt,ssrContextKey:()=>rs,ssrUtils:()=>cs,stop:()=>Ce,toDisplayString:()=>w,toHandlerKey:()=>ee,toHandlers:()=>Qr,toRaw:()=>Ot,toRef:()=>Gt,toRefs:()=>Kt,transformVNodeArgs:()=>ui,triggerRef:()=>jt,unref:()=>zt,useAttrs:()=>Xi,useCssModule:()=>As,useCssVars:()=>Ds,useSSRContext:()=>os,useSlots:()=>Gi,useTransitionState:()=>sr,vModelCheckbox:()=>aa,vModelDynamic:()=>fa,vModelRadio:()=>ca,vModelSelect:()=>ua,vModelText:()=>sa,vShow:()=>ka,version:()=>ls,warn:()=>Qt,watch:()=>tr,watchEffect:()=>Xn,watchPostEffect:()=>Jn,watchSyncEffect:()=>Qn,withAsyncContext:()=>ts,withCtx:()=>Pn,withDefaults:()=>Yi,withDirectives:()=>Br,withKeys:()=>Sa,withMemo:()=>ss,withModifiers:()=>ya,withScopeId:()=>Fn});const i=o("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt");function s(e){if(M(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],o=N(r)?u(r):s(r);if(o)for(const e in o)t[e]=o[e]}return t}return N(e)||B(e)?e:void 0}const a=/;(?![^(]*\))/g,l=/:([^]+)/,c=/\/\*.*?\*\//gs;function u(e){const t={};return e.replace(c,"").split(a).forEach((e=>{if(e){const n=e.split(l);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function d(e){let t="";if(N(e))t=e;else if(M(e))for(let n=0;n<e.length;n++){const r=d(e[n]);r&&(t+=r+" ")}else if(B(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}function h(e){if(!e)return null;let{class:t,style:n}=e;return t&&!N(t)&&(e.class=d(t)),n&&(e.style=s(n)),e}const p=o("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),f=o("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),m=o("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"),v=o("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function g(e){return!!e||""===e}function b(e,t){if(e===t)return!0;let n=P(e),r=P(t);if(n||r)return!(!n||!r)&&e.getTime()===t.getTime();if(n=W(e),r=W(t),n||r)return e===t;if(n=M(e),r=M(t),n||r)return!(!n||!r)&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=b(e[r],t[r]);return n}(e,t);if(n=B(e),r=B(t),n||r){if(!n||!r)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e){const r=e.hasOwnProperty(n),o=t.hasOwnProperty(n);if(r&&!o||!r&&o||!b(e[n],t[n]))return!1}}return String(e)===String(t)}function y(e,t){return e.findIndex((e=>b(e,t)))}const w=e=>N(e)?e:null==e?"":M(e)||B(e)&&(e.toString===j||!H(e.toString))?JSON.stringify(e,S,2):String(e),S=(e,t)=>t&&t.__v_isRef?S(e,t.value):I(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:F(t)?{[`Set(${t.size})`]:[...t.values()]}:!B(t)||M(t)||q(t)?t:String(t),k={},x=[],E=()=>{},C=()=>!1,_=/^on[^a-z]/,T=e=>_.test(e),L=e=>e.startsWith("onUpdate:"),A=Object.assign,D=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},O=Object.prototype.hasOwnProperty,R=(e,t)=>O.call(e,t),M=Array.isArray,I=e=>"[object Map]"===z(e),F=e=>"[object Set]"===z(e),P=e=>"[object Date]"===z(e),H=e=>"function"==typeof e,N=e=>"string"==typeof e,W=e=>"symbol"==typeof e,B=e=>null!==e&&"object"==typeof e,V=e=>B(e)&&H(e.then)&&H(e.catch),j=Object.prototype.toString,z=e=>j.call(e),q=e=>"[object Object]"===z(e),$=e=>N(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,Z=o(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),U=o("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),K=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Y=/-(\w)/g,G=K((e=>e.replace(Y,((e,t)=>t?t.toUpperCase():"")))),X=/\B([A-Z])/g,J=K((e=>e.replace(X,"-$1").toLowerCase())),Q=K((e=>e.charAt(0).toUpperCase()+e.slice(1))),ee=K((e=>e?`on${Q(e)}`:"")),te=(e,t)=>!Object.is(e,t),ne=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},re=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},oe=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ie=e=>{const t=N(e)?Number(e):NaN;return isNaN(t)?e:t};let se,ae;class le{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=ae,!e&&ae&&(this.index=(ae.scopes||(ae.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const t=ae;try{return ae=this,e()}finally{ae=t}}}on(){ae=this}off(){ae=this.parent}stop(e){if(this._active){let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);if(!this.detached&&this.parent&&!e){const e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.parent=void 0,this._active=!1}}}function ce(e){return new le(e)}function ue(e,t=ae){t&&t.active&&t.effects.push(e)}function de(){return ae}function he(e){ae&&ae.cleanups.push(e)}const pe=e=>{const t=new Set(e);return t.w=0,t.n=0,t},fe=e=>(e.w&ye)>0,me=e=>(e.n&ye)>0,ve=new WeakMap;let ge,be=0,ye=1;const we=Symbol(""),Se=Symbol("");class ke{constructor(e,t=null,n){this.fn=e,this.scheduler=t,this.active=!0,this.deps=[],this.parent=void 0,ue(this,n)}run(){if(!this.active)return this.fn();let e=ge,t=_e;for(;e;){if(e===this)return;e=e.parent}try{return this.parent=ge,ge=this,_e=!0,ye=1<<++be,be<=30?(({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=ye})(this):xe(this),this.fn()}finally{be<=30&&(e=>{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r<t.length;r++){const o=t[r];fe(o)&&!me(o)?o.delete(e):t[n++]=o,o.w&=~ye,o.n&=~ye}t.length=n}})(this),ye=1<<--be,ge=this.parent,_e=t,this.parent=void 0,this.deferStop&&this.stop()}}stop(){ge===this?this.deferStop=!0:this.active&&(xe(this),this.onStop&&this.onStop(),this.active=!1)}}function xe(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}function Ee(e,t){e.effect&&(e=e.effect.fn);const n=new ke(e);t&&(A(n,t),t.scope&&ue(n,t.scope)),t&&t.lazy||n.run();const r=n.run.bind(n);return r.effect=n,r}function Ce(e){e.effect.stop()}let _e=!0;const Te=[];function Le(){Te.push(_e),_e=!1}function Ae(){const e=Te.pop();_e=void 0===e||e}function De(e,t,n){if(_e&&ge){let t=ve.get(e);t||ve.set(e,t=new Map);let r=t.get(n);r||t.set(n,r=pe()),Oe(r)}}function Oe(e,t){let n=!1;be<=30?me(e)||(e.n|=ye,n=!fe(e)):n=!e.has(ge),n&&(e.add(ge),ge.deps.push(e))}function Re(e,t,n,r,o,i){const s=ve.get(e);if(!s)return;let a=[];if("clear"===t)a=[...s.values()];else if("length"===n&&M(e)){const e=Number(r);s.forEach(((t,n)=>{("length"===n||n>=e)&&a.push(t)}))}else switch(void 0!==n&&a.push(s.get(n)),t){case"add":M(e)?$(n)&&a.push(s.get("length")):(a.push(s.get(we)),I(e)&&a.push(s.get(Se)));break;case"delete":M(e)||(a.push(s.get(we)),I(e)&&a.push(s.get(Se)));break;case"set":I(e)&&a.push(s.get(we))}if(1===a.length)a[0]&&Me(a[0]);else{const e=[];for(const t of a)t&&e.push(...t);Me(pe(e))}}function Me(e,t){const n=M(e)?e:[...e];for(const e of n)e.computed&&Ie(e);for(const e of n)e.computed||Ie(e)}function Ie(e,t){(e!==ge||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const Fe=o("__proto__,__v_isRef,__isVue"),Pe=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter(W)),He=qe(),Ne=qe(!1,!0),We=qe(!0),Be=qe(!0,!0),Ve=je();function je(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=Ot(this);for(let e=0,t=this.length;e<t;e++)De(n,0,e+"");const r=n[t](...e);return-1===r||!1===r?n[t](...e.map(Ot)):r}})),["push","pop","shift","unshift","splice"].forEach((t=>{e[t]=function(...e){Le();const n=Ot(this)[t].apply(this,e);return Ae(),n}})),e}function ze(e){const t=Ot(this);return De(t,0,e),t.hasOwnProperty(e)}function qe(e=!1,t=!1){return function(n,r,o){if("__v_isReactive"===r)return!e;if("__v_isReadonly"===r)return e;if("__v_isShallow"===r)return t;if("__v_raw"===r&&o===(e?t?St:wt:t?yt:bt).get(n))return n;const i=M(n);if(!e){if(i&&R(Ve,r))return Reflect.get(Ve,r,o);if("hasOwnProperty"===r)return ze}const s=Reflect.get(n,r,o);return(W(r)?Pe.has(r):Fe(r))?s:(e||De(n,0,r),t?s:Ht(s)?i&&$(r)?s:s.value:B(s)?e?Et(s):kt(s):s)}}function $e(e=!1){return function(t,n,r,o){let i=t[n];if(Lt(i)&&Ht(i)&&!Ht(r))return!1;if(!e&&(At(r)||Lt(r)||(i=Ot(i),r=Ot(r)),!M(t)&&Ht(i)&&!Ht(r)))return i.value=r,!0;const s=M(t)&&$(n)?Number(n)<t.length:R(t,n),a=Reflect.set(t,n,r,o);return t===Ot(o)&&(s?te(r,i)&&Re(t,"set",n,r):Re(t,"add",n,r)),a}}const Ze={get:He,set:$e(),deleteProperty:function(e,t){const n=R(e,t),r=(e[t],Reflect.deleteProperty(e,t));return r&&n&&Re(e,"delete",t,void 0),r},has:function(e,t){const n=Reflect.has(e,t);return W(t)&&Pe.has(t)||De(e,0,t),n},ownKeys:function(e){return De(e,0,M(e)?"length":we),Reflect.ownKeys(e)}},Ue={get:We,set:(e,t)=>!0,deleteProperty:(e,t)=>!0},Ke=A({},Ze,{get:Ne,set:$e(!0)}),Ye=A({},Ue,{get:Be}),Ge=e=>e,Xe=e=>Reflect.getPrototypeOf(e);function Je(e,t,n=!1,r=!1){const o=Ot(e=e.__v_raw),i=Ot(t);n||(t!==i&&De(o,0,t),De(o,0,i));const{has:s}=Xe(o),a=r?Ge:n?It:Mt;return s.call(o,t)?a(e.get(t)):s.call(o,i)?a(e.get(i)):void(e!==o&&e.get(t))}function Qe(e,t=!1){const n=this.__v_raw,r=Ot(n),o=Ot(e);return t||(e!==o&&De(r,0,e),De(r,0,o)),e===o?n.has(e):n.has(e)||n.has(o)}function et(e,t=!1){return e=e.__v_raw,!t&&De(Ot(e),0,we),Reflect.get(e,"size",e)}function tt(e){e=Ot(e);const t=Ot(this);return Xe(t).has.call(t,e)||(t.add(e),Re(t,"add",e,e)),this}function nt(e,t){t=Ot(t);const n=Ot(this),{has:r,get:o}=Xe(n);let i=r.call(n,e);i||(e=Ot(e),i=r.call(n,e));const s=o.call(n,e);return n.set(e,t),i?te(t,s)&&Re(n,"set",e,t):Re(n,"add",e,t),this}function rt(e){const t=Ot(this),{has:n,get:r}=Xe(t);let o=n.call(t,e);o||(e=Ot(e),o=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return o&&Re(t,"delete",e,void 0),i}function ot(){const e=Ot(this),t=0!==e.size,n=e.clear();return t&&Re(e,"clear",void 0,void 0),n}function it(e,t){return function(n,r){const o=this,i=o.__v_raw,s=Ot(i),a=t?Ge:e?It:Mt;return!e&&De(s,0,we),i.forEach(((e,t)=>n.call(r,a(e),a(t),o)))}}function st(e,t,n){return function(...r){const o=this.__v_raw,i=Ot(o),s=I(i),a="entries"===e||e===Symbol.iterator&&s,l="keys"===e&&s,c=o[e](...r),u=n?Ge:t?It:Mt;return!t&&De(i,0,l?Se:we),{next(){const{value:e,done:t}=c.next();return t?{value:e,done:t}:{value:a?[u(e[0]),u(e[1])]:u(e),done:t}},[Symbol.iterator](){return this}}}}function at(e){return function(...t){return"delete"!==e&&this}}function lt(){const e={get(e){return Je(this,e)},get size(){return et(this)},has:Qe,add:tt,set:nt,delete:rt,clear:ot,forEach:it(!1,!1)},t={get(e){return Je(this,e,!1,!0)},get size(){return et(this)},has:Qe,add:tt,set:nt,delete:rt,clear:ot,forEach:it(!1,!0)},n={get(e){return Je(this,e,!0)},get size(){return et(this,!0)},has(e){return Qe.call(this,e,!0)},add:at("add"),set:at("set"),delete:at("delete"),clear:at("clear"),forEach:it(!0,!1)},r={get(e){return Je(this,e,!0,!0)},get size(){return et(this,!0)},has(e){return Qe.call(this,e,!0)},add:at("add"),set:at("set"),delete:at("delete"),clear:at("clear"),forEach:it(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((o=>{e[o]=st(o,!1,!1),n[o]=st(o,!0,!1),t[o]=st(o,!1,!0),r[o]=st(o,!0,!0)})),[e,n,t,r]}const[ct,ut,dt,ht]=lt();function pt(e,t){const n=t?e?ht:dt:e?ut:ct;return(t,r,o)=>"__v_isReactive"===r?!e:"__v_isReadonly"===r?e:"__v_raw"===r?t:Reflect.get(R(n,r)&&r in t?n:t,r,o)}const ft={get:pt(!1,!1)},mt={get:pt(!1,!0)},vt={get:pt(!0,!1)},gt={get:pt(!0,!0)},bt=new WeakMap,yt=new WeakMap,wt=new WeakMap,St=new WeakMap;function kt(e){return Lt(e)?e:_t(e,!1,Ze,ft,bt)}function xt(e){return _t(e,!1,Ke,mt,yt)}function Et(e){return _t(e,!0,Ue,vt,wt)}function Ct(e){return _t(e,!0,Ye,gt,St)}function _t(e,t,n,r,o){if(!B(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const s=(a=e).__v_skip||!Object.isExtensible(a)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((e=>z(e).slice(8,-1))(a));var a;if(0===s)return e;const l=new Proxy(e,2===s?r:n);return o.set(e,l),l}function Tt(e){return Lt(e)?Tt(e.__v_raw):!(!e||!e.__v_isReactive)}function Lt(e){return!(!e||!e.__v_isReadonly)}function At(e){return!(!e||!e.__v_isShallow)}function Dt(e){return Tt(e)||Lt(e)}function Ot(e){const t=e&&e.__v_raw;return t?Ot(t):e}function Rt(e){return re(e,"__v_skip",!0),e}const Mt=e=>B(e)?kt(e):e,It=e=>B(e)?Et(e):e;function Ft(e){_e&&ge&&Oe((e=Ot(e)).dep||(e.dep=pe()))}function Pt(e,t){const n=(e=Ot(e)).dep;n&&Me(n)}function Ht(e){return!(!e||!0!==e.__v_isRef)}function Nt(e){return Bt(e,!1)}function Wt(e){return Bt(e,!0)}function Bt(e,t){return Ht(e)?e:new Vt(e,t)}class Vt{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:Ot(e),this._value=t?e:Mt(e)}get value(){return Ft(this),this._value}set value(e){const t=this.__v_isShallow||At(e)||Lt(e);e=t?e:Ot(e),te(e,this._rawValue)&&(this._rawValue=e,this._value=t?e:Mt(e),Pt(this))}}function jt(e){Pt(e)}function zt(e){return Ht(e)?e.value:e}const qt={get:(e,t,n)=>zt(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Ht(o)&&!Ht(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function $t(e){return Tt(e)?e:new Proxy(e,qt)}class Zt{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Ft(this)),(()=>Pt(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function Ut(e){return new Zt(e)}function Kt(e){const t=M(e)?new Array(e.length):{};for(const n in e)t[n]=Gt(e,n);return t}class Yt{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return e=Ot(this._object),t=this._key,null===(n=ve.get(e))||void 0===n?void 0:n.get(t);var e,t,n}}function Gt(e,t,n){const r=e[t];return Ht(r)?r:new Yt(e,t,n)}var Xt;class Jt{constructor(e,t,n,r){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this[Xt]=!1,this._dirty=!0,this.effect=new ke(e,(()=>{this._dirty||(this._dirty=!0,Pt(this))})),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=Ot(this);return Ft(e),!e._dirty&&e._cacheable||(e._dirty=!1,e._value=e.effect.run()),e._value}set value(e){this._setter(e)}}function Qt(e,...t){}function en(e,t){}function tn(e,t,n,r){let o;try{o=r?e(...r):e()}catch(e){rn(e,t,n)}return o}function nn(e,t,n,r){if(H(e)){const o=tn(e,t,n,r);return o&&V(o)&&o.catch((e=>{rn(e,t,n)})),o}const o=[];for(let i=0;i<e.length;i++)o.push(nn(e[i],t,n,r));return o}function rn(e,t,n,r=!0){if(t&&t.vnode,t){let r=t.parent;const o=t.proxy,i=n;for(;r;){const t=r.ec;if(t)for(let n=0;n<t.length;n++)if(!1===t[n](e,o,i))return;r=r.parent}const s=t.appContext.config.errorHandler;if(s)return void tn(s,null,10,[e,o,i])}!function(e,t,n,r=!0){console.error(e)}(e,0,0,r)}Xt="__v_isReadonly";let on=!1,sn=!1;const an=[];let ln=0;const cn=[];let un=null,dn=0;const hn=Promise.resolve();let pn=null;function fn(e){const t=pn||hn;return e?t.then(this?e.bind(this):e):t}function mn(e){an.length&&an.includes(e,on&&e.allowRecurse?ln+1:ln)||(null==e.id?an.push(e):an.splice(function(e){let t=ln+1,n=an.length;for(;t<n;){const r=t+n>>>1;wn(an[r])<e?t=r+1:n=r}return t}(e.id),0,e),vn())}function vn(){on||sn||(sn=!0,pn=hn.then(kn))}function gn(e){M(e)?cn.push(...e):un&&un.includes(e,e.allowRecurse?dn+1:dn)||cn.push(e),vn()}function bn(e,t=(on?ln+1:0)){for(;t<an.length;t++){const e=an[t];e&&e.pre&&(an.splice(t,1),t--,e())}}function yn(e){if(cn.length){const e=[...new Set(cn)];if(cn.length=0,un)return void un.push(...e);for(un=e,un.sort(((e,t)=>wn(e)-wn(t))),dn=0;dn<un.length;dn++)un[dn]();un=null,dn=0}}const wn=e=>null==e.id?1/0:e.id,Sn=(e,t)=>{const n=wn(e)-wn(t);if(0===n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function kn(e){sn=!1,on=!0,an.sort(Sn);try{for(ln=0;ln<an.length;ln++){const e=an[ln];e&&!1!==e.active&&tn(e,null,14)}}finally{ln=0,an.length=0,yn(),on=!1,pn=null,(an.length||cn.length)&&kn(e)}}new Set,new Map;let xn,En=[],Cn=!1;function _n(e,t){var n,r;xn=e,xn?(xn.enabled=!0,En.forEach((({event:e,args:t})=>xn.emit(e,...t))),En=[]):"undefined"!=typeof window&&window.HTMLElement&&!(null===(r=null===(n=window.navigator)||void 0===n?void 0:n.userAgent)||void 0===r?void 0:r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push((e=>{_n(e,t)})),setTimeout((()=>{xn||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,Cn=!0,En=[])}),3e3)):(Cn=!0,En=[])}function Tn(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||k;let o=n;const i=t.startsWith("update:"),s=i&&t.slice(7);if(s&&s in r){const e=`${"modelValue"===s?"model":s}Modifiers`,{number:t,trim:i}=r[e]||k;i&&(o=n.map((e=>N(e)?e.trim():e))),t&&(o=n.map(oe))}let a,l=r[a=ee(t)]||r[a=ee(G(t))];!l&&i&&(l=r[a=ee(J(t))]),l&&nn(l,e,6,o);const c=r[a+"Once"];if(c){if(e.emitted){if(e.emitted[a])return}else e.emitted={};e.emitted[a]=!0,nn(c,e,6,o)}}function Ln(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(void 0!==o)return o;const i=e.emits;let s={},a=!1;if(!H(e)){const r=e=>{const n=Ln(e,t,!0);n&&(a=!0,A(s,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return i||a?(M(i)?i.forEach((e=>s[e]=null)):A(s,i),B(e)&&r.set(e,s),s):(B(e)&&r.set(e,null),null)}function An(e,t){return!(!e||!T(t))&&(t=t.slice(2).replace(/Once$/,""),R(e,t[0].toLowerCase()+t.slice(1))||R(e,J(t))||R(e,t))}let Dn=null,On=null;function Rn(e){const t=Dn;return Dn=e,On=e&&e.type.__scopeId||null,t}function Mn(e){On=e}function In(){On=null}const Fn=e=>Pn;function Pn(e,t=Dn,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&oi(-1);const o=Rn(t);let i;try{i=e(...n)}finally{Rn(o),r._d&&oi(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Hn(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:i,propsOptions:[s],slots:a,attrs:l,emit:c,render:u,renderCache:d,data:h,setupState:p,ctx:f,inheritAttrs:m}=e;let v,g;const b=Rn(e);try{if(4&n.shapeFlag){const e=o||r;v=Si(u.call(e,e,d,i,p,h,f)),g=l}else{const e=t;v=Si(e.length>1?e(i,{attrs:l,slots:a,emit:c}):e(i,null)),g=t.props?l:Nn(l)}}catch(t){Jo.length=0,rn(t,e,1),v=mi(Go)}let y=v;if(g&&!1!==m){const e=Object.keys(g),{shapeFlag:t}=y;e.length&&7&t&&(s&&e.some(L)&&(g=Wn(g,s)),y=gi(y,g))}return n.dirs&&(y=gi(y),y.dirs=y.dirs?y.dirs.concat(n.dirs):n.dirs),n.transition&&(y.transition=n.transition),v=y,Rn(b),v}const Nn=e=>{let t;for(const n in e)("class"===n||"style"===n||T(n))&&((t||(t={}))[n]=e[n]);return t},Wn=(e,t)=>{const n={};for(const r in e)L(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function Bn(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;o<r.length;o++){const i=r[o];if(t[i]!==e[i]&&!An(n,i))return!0}return!1}function Vn({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const jn=e=>e.__isSuspense,zn={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,s,a,l,c){null==e?function(e,t,n,r,o,i,s,a,l){const{p:c,o:{createElement:u}}=l,d=u("div"),h=e.suspense=$n(e,o,r,t,d,n,i,s,a,l);c(null,h.pendingBranch=e.ssContent,d,null,r,h,i,s),h.deps>0?(qn(e,"onPending"),qn(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,i,s),Kn(h,e.ssFallback)):h.resolve()}(t,n,r,o,i,s,a,l,c):function(e,t,n,r,o,i,s,a,{p:l,um:c,o:{createElement:u}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const h=t.ssContent,p=t.ssFallback,{activeBranch:f,pendingBranch:m,isInFallback:v,isHydrating:g}=d;if(m)d.pendingBranch=h,ci(h,m)?(l(m,h,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():v&&(l(f,p,n,r,o,null,i,s,a),Kn(d,p))):(d.pendingId++,g?(d.isHydrating=!1,d.activeBranch=m):c(m,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=u("div"),v?(l(null,h,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():(l(f,p,n,r,o,null,i,s,a),Kn(d,p))):f&&ci(h,f)?(l(f,h,n,r,o,d,i,s,a),d.resolve(!0)):(l(null,h,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0&&d.resolve()));else if(f&&ci(h,f))l(f,h,n,r,o,d,i,s,a),Kn(d,h);else if(qn(t,"onPending"),d.pendingBranch=h,d.pendingId++,l(null,h,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0)d.resolve();else{const{timeout:e,pendingId:t}=d;e>0?setTimeout((()=>{d.pendingId===t&&d.fallback(p)}),e):0===e&&d.fallback(p)}}(e,t,n,r,o,s,a,l,c)},hydrate:function(e,t,n,r,o,i,s,a,l){const c=t.suspense=$n(t,r,n,e.parentNode,document.createElement("div"),null,o,i,s,a,!0),u=l(e,c.pendingBranch=t.ssContent,n,c,i,s);return 0===c.deps&&c.resolve(),u},create:$n,normalize:function(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=Zn(r?n.default:n),e.ssFallback=r?Zn(n.fallback):mi(Go)}};function qn(e,t){const n=e.props&&e.props[t];H(n)&&n()}function $n(e,t,n,r,o,i,s,a,l,c,u=!1){const{p:d,m:h,um:p,n:f,o:{parentNode:m,remove:v}}=c,g=e.props?ie(e.props.timeout):void 0,b={vnode:e,parent:t,parentComponent:n,isSVG:s,container:r,hiddenContainer:o,anchor:i,deps:0,pendingId:0,timeout:"number"==typeof g?g:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:u,isUnmounted:!1,effects:[],resolve(e=!1){const{vnode:t,activeBranch:n,pendingBranch:r,pendingId:o,effects:i,parentComponent:s,container:a}=b;if(b.isHydrating)b.isHydrating=!1;else if(!e){const e=n&&r.transition&&"out-in"===r.transition.mode;e&&(n.transition.afterLeave=()=>{o===b.pendingId&&h(r,a,t,0)});let{anchor:t}=b;n&&(t=f(n),p(n,s,b,!0)),e||h(r,a,t,0)}Kn(b,r),b.pendingBranch=null,b.isInFallback=!1;let l=b.parent,c=!1;for(;l;){if(l.pendingBranch){l.effects.push(...i),c=!0;break}l=l.parent}c||gn(i),b.effects=[],qn(t,"onResolve")},fallback(e){if(!b.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,isSVG:i}=b;qn(t,"onFallback");const s=f(n),c=()=>{b.isInFallback&&(d(null,e,o,s,r,null,i,a,l),Kn(b,e))},u=e.transition&&"out-in"===e.transition.mode;u&&(n.transition.afterLeave=c),b.isInFallback=!0,p(n,r,null,!0),u||c()},move(e,t,n){b.activeBranch&&h(b.activeBranch,e,t,n),b.container=e},next:()=>b.activeBranch&&f(b.activeBranch),registerDep(e,t){const n=!!b.pendingBranch;n&&b.deps++;const r=e.vnode.el;e.asyncDep.catch((t=>{rn(t,e,0)})).then((o=>{if(e.isUnmounted||b.isUnmounted||b.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:i}=e;Ni(e,o,!1),r&&(i.el=r);const a=!r&&e.subTree.el;t(e,i,m(r||e.subTree.el),r?null:f(e.subTree),b,s,l),a&&v(a),Vn(e,i.el),n&&0==--b.deps&&b.resolve()}))},unmount(e,t){b.isUnmounted=!0,b.activeBranch&&p(b.activeBranch,n,e,t),b.pendingBranch&&p(b.pendingBranch,n,e,t)}};return b}function Zn(e){let t;if(H(e)){const n=ri&&e._c;n&&(e._d=!1,ei()),e=e(),n&&(e._d=!0,t=Qo,ti())}if(M(e)){const t=function(e){let t;for(let n=0;n<e.length;n++){const r=e[n];if(!li(r))return;if(r.type!==Go||"v-if"===r.children){if(t)return;t=r}}return t}(e);e=t}return e=Si(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter((t=>t!==e))),e}function Un(e,t){t&&t.pendingBranch?M(e)?t.effects.push(...e):t.effects.push(e):gn(e)}function Kn(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e,o=n.el=t.el;r&&r.subTree===n&&(r.vnode.el=o,Vn(r,o))}function Yn(e,t){if(Ai){let n=Ai.provides;const r=Ai.parent&&Ai.parent.provides;r===n&&(n=Ai.provides=Object.create(r)),n[e]=t}}function Gn(e,t,n=!1){const r=Ai||Dn;if(r){const o=null==r.parent?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&H(t)?t.call(r.proxy):t}}function Xn(e,t){return nr(e,null,t)}function Jn(e,t){return nr(e,null,{flush:"post"})}function Qn(e,t){return nr(e,null,{flush:"sync"})}const er={};function tr(e,t,n){return nr(e,t,n)}function nr(e,t,{immediate:n,deep:r,flush:o,onTrack:i,onTrigger:s}=k){const a=de()===(null==Ai?void 0:Ai.scope)?Ai:null;let l,c,u=!1,d=!1;if(Ht(e)?(l=()=>e.value,u=At(e)):Tt(e)?(l=()=>e,r=!0):M(e)?(d=!0,u=e.some((e=>Tt(e)||At(e))),l=()=>e.map((e=>Ht(e)?e.value:Tt(e)?ir(e):H(e)?tn(e,a,2):void 0))):l=H(e)?t?()=>tn(e,a,2):()=>{if(!a||!a.isUnmounted)return c&&c(),nn(e,a,3,[p])}:E,t&&r){const e=l;l=()=>ir(e())}let h,p=e=>{c=g.onStop=()=>{tn(e,a,4)}};if(Pi){if(p=E,t?n&&nn(t,a,3,[l(),d?[]:void 0,p]):l(),"sync"!==o)return E;{const e=os();h=e.__watcherHandles||(e.__watcherHandles=[])}}let f=d?new Array(e.length).fill(er):er;const m=()=>{if(g.active)if(t){const e=g.run();(r||u||(d?e.some(((e,t)=>te(e,f[t]))):te(e,f)))&&(c&&c(),nn(t,a,3,[e,f===er?void 0:d&&f[0]===er?[]:f,p]),f=e)}else g.run()};let v;m.allowRecurse=!!t,"sync"===o?v=m:"post"===o?v=()=>Po(m,a&&a.suspense):(m.pre=!0,a&&(m.id=a.uid),v=()=>mn(m));const g=new ke(l,v);t?n?m():f=g.run():"post"===o?Po(g.run.bind(g),a&&a.suspense):g.run();const b=()=>{g.stop(),a&&a.scope&&D(a.scope.effects,g)};return h&&h.push(b),b}function rr(e,t,n){const r=this.proxy,o=N(e)?e.includes(".")?or(r,e):()=>r[e]:e.bind(r,r);let i;H(t)?i=t:(i=t.handler,n=t);const s=Ai;Oi(this);const a=nr(o,i.bind(r),n);return s?Oi(s):Ri(),a}function or(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}function ir(e,t){if(!B(e)||e.__v_skip)return e;if((t=t||new Set).has(e))return e;if(t.add(e),Ht(e))ir(e.value,t);else if(M(e))for(let n=0;n<e.length;n++)ir(e[n],t);else if(F(e)||I(e))e.forEach((e=>{ir(e,t)}));else if(q(e))for(const n in e)ir(e[n],t);return e}function sr(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Or((()=>{e.isMounted=!0})),Ir((()=>{e.isUnmounting=!0})),e}const ar=[Function,Array],lr={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ar,onEnter:ar,onAfterEnter:ar,onEnterCancelled:ar,onBeforeLeave:ar,onLeave:ar,onAfterLeave:ar,onLeaveCancelled:ar,onBeforeAppear:ar,onAppear:ar,onAfterAppear:ar,onAppearCancelled:ar},setup(e,{slots:t}){const n=Di(),r=sr();let o;return()=>{const i=t.default&&fr(t.default(),!0);if(!i||!i.length)return;let s=i[0];if(i.length>1){let e=!1;for(const t of i)if(t.type!==Go){s=t,e=!0;break}}const a=Ot(e),{mode:l}=a;if(r.isLeaving)return dr(s);const c=hr(s);if(!c)return dr(s);const u=ur(c,a,r,n);pr(c,u);const d=n.subTree,h=d&&hr(d);let p=!1;const{getTransitionKey:f}=c.type;if(f){const e=f();void 0===o?o=e:e!==o&&(o=e,p=!0)}if(h&&h.type!==Go&&(!ci(c,h)||p)){const e=ur(h,a,r,n);if(pr(h,e),"out-in"===l)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,!1!==n.update.active&&n.update()},dr(s);"in-out"===l&&c.type!==Go&&(e.delayLeave=(e,t,n)=>{cr(r,h)[String(h.key)]=h,e._leaveCb=()=>{t(),e._leaveCb=void 0,delete u.delayedLeave},u.delayedLeave=n})}return s}}};function cr(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function ur(e,t,n,r){const{appear:o,mode:i,persisted:s=!1,onBeforeEnter:a,onEnter:l,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:d,onLeave:h,onAfterLeave:p,onLeaveCancelled:f,onBeforeAppear:m,onAppear:v,onAfterAppear:g,onAppearCancelled:b}=t,y=String(e.key),w=cr(n,e),S=(e,t)=>{e&&nn(e,r,9,t)},k=(e,t)=>{const n=t[1];S(e,t),M(e)?e.every((e=>e.length<=1))&&n():e.length<=1&&n()},x={mode:i,persisted:s,beforeEnter(t){let r=a;if(!n.isMounted){if(!o)return;r=m||a}t._leaveCb&&t._leaveCb(!0);const i=w[y];i&&ci(e,i)&&i.el._leaveCb&&i.el._leaveCb(),S(r,[t])},enter(e){let t=l,r=c,i=u;if(!n.isMounted){if(!o)return;t=v||l,r=g||c,i=b||u}let s=!1;const a=e._enterCb=t=>{s||(s=!0,S(t?i:r,[e]),x.delayedLeave&&x.delayedLeave(),e._enterCb=void 0)};t?k(t,[e,a]):a()},leave(t,r){const o=String(e.key);if(t._enterCb&&t._enterCb(!0),n.isUnmounting)return r();S(d,[t]);let i=!1;const s=t._leaveCb=n=>{i||(i=!0,r(),S(n?f:p,[t]),t._leaveCb=void 0,w[o]===e&&delete w[o])};w[o]=e,h?k(h,[t,s]):s()},clone:e=>ur(e,t,n,r)};return x}function dr(e){if(yr(e))return(e=gi(e)).children=null,e}function hr(e){return yr(e)?e.children?e.children[0]:void 0:e}function pr(e,t){6&e.shapeFlag&&e.component?pr(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function fr(e,t=!1,n){let r=[],o=0;for(let i=0;i<e.length;i++){let s=e[i];const a=null==n?s.key:String(n)+String(null!=s.key?s.key:i);s.type===Ko?(128&s.patchFlag&&o++,r=r.concat(fr(s.children,t,a))):(t||s.type!==Go)&&r.push(null!=a?gi(s,{key:a}):s)}if(o>1)for(let e=0;e<r.length;e++)r[e].patchFlag=-2;return r}function mr(e){return H(e)?{setup:e,name:e.name}:e}const vr=e=>!!e.type.__asyncLoader;function gr(e){H(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:i,suspensible:s=!0,onError:a}=e;let l,c=null,u=0;const d=()=>{let e;return c||(e=c=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),a)return new Promise(((t,n)=>{a(e,(()=>t((u++,c=null,d()))),(()=>n(e)),u+1)}));throw e})).then((t=>e!==c&&c?c:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),l=t,t))))};return mr({name:"AsyncComponentWrapper",__asyncLoader:d,get __asyncResolved(){return l},setup(){const e=Ai;if(l)return()=>br(l,e);const t=t=>{c=null,rn(t,e,13,!r)};if(s&&e.suspense||Pi)return d().then((t=>()=>br(t,e))).catch((e=>(t(e),()=>r?mi(r,{error:e}):null)));const a=Nt(!1),u=Nt(),h=Nt(!!o);return o&&setTimeout((()=>{h.value=!1}),o),null!=i&&setTimeout((()=>{if(!a.value&&!u.value){const e=new Error(`Async component timed out after ${i}ms.`);t(e),u.value=e}}),i),d().then((()=>{a.value=!0,e.parent&&yr(e.parent.vnode)&&mn(e.parent.update)})).catch((e=>{t(e),u.value=e})),()=>a.value&&l?br(l,e):u.value&&r?mi(r,{error:u.value}):n&&!h.value?mi(n):void 0}})}function br(e,t){const{ref:n,props:r,children:o,ce:i}=t.vnode,s=mi(e,r,o);return s.ref=n,s.ce=i,delete t.vnode.ce,s}const yr=e=>e.type.__isKeepAlive,wr={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Di(),r=n.ctx;if(!r.renderer)return()=>{const e=t.default&&t.default();return e&&1===e.length?e[0]:e};const o=new Map,i=new Set;let s=null;const a=n.suspense,{renderer:{p:l,m:c,um:u,o:{createElement:d}}}=r,h=d("div");function p(e){_r(e),u(e,n,a,!0)}function f(e){o.forEach(((t,n)=>{const r=qi(t.type);!r||e&&e(r)||m(n)}))}function m(e){const t=o.get(e);s&&ci(t,s)?s&&_r(s):p(t),o.delete(e),i.delete(e)}r.activate=(e,t,n,r,o)=>{const i=e.component;c(e,t,n,0,a),l(i.vnode,e,t,n,i,a,r,e.slotScopeIds,o),Po((()=>{i.isDeactivated=!1,i.a&&ne(i.a);const t=e.props&&e.props.onVnodeMounted;t&&Ci(t,i.parent,e)}),a)},r.deactivate=e=>{const t=e.component;c(e,h,null,1,a),Po((()=>{t.da&&ne(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&Ci(n,t.parent,e),t.isDeactivated=!0}),a)},tr((()=>[e.include,e.exclude]),(([e,t])=>{e&&f((t=>Sr(e,t))),t&&f((e=>!Sr(t,e)))}),{flush:"post",deep:!0});let v=null;const g=()=>{null!=v&&o.set(v,Tr(n.subTree))};return Or(g),Mr(g),Ir((()=>{o.forEach((e=>{const{subTree:t,suspense:r}=n,o=Tr(t);if(e.type!==o.type||e.key!==o.key)p(e);else{_r(o);const e=o.component.da;e&&Po(e,r)}}))})),()=>{if(v=null,!t.default)return null;const n=t.default(),r=n[0];if(n.length>1)return s=null,n;if(!li(r)||!(4&r.shapeFlag||128&r.shapeFlag))return s=null,r;let a=Tr(r);const l=a.type,c=qi(vr(a)?a.type.__asyncResolved||{}:l),{include:u,exclude:d,max:h}=e;if(u&&(!c||!Sr(u,c))||d&&c&&Sr(d,c))return s=a,r;const p=null==a.key?l:a.key,f=o.get(p);return a.el&&(a=gi(a),128&r.shapeFlag&&(r.ssContent=a)),v=p,f?(a.el=f.el,a.component=f.component,a.transition&&pr(a,a.transition),a.shapeFlag|=512,i.delete(p),i.add(p)):(i.add(p),h&&i.size>parseInt(h,10)&&m(i.values().next().value)),a.shapeFlag|=256,s=a,jn(r.type)?r:a}}};function Sr(e,t){return M(e)?e.some((e=>Sr(e,t))):N(e)?e.split(",").includes(t):"[object RegExp]"===z(e)&&e.test(t)}function kr(e,t){Er(e,"a",t)}function xr(e,t){Er(e,"da",t)}function Er(e,t,n=Ai){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(Lr(t,r,n),n){let e=n.parent;for(;e&&e.parent;)yr(e.parent.vnode)&&Cr(r,t,n,e),e=e.parent}}function Cr(e,t,n,r){const o=Lr(t,e,r,!0);Fr((()=>{D(r[t],o)}),n)}function _r(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Tr(e){return 128&e.shapeFlag?e.ssContent:e}function Lr(e,t,n=Ai,r=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Le(),Oi(n);const o=nn(t,n,e,r);return Ri(),Ae(),o});return r?o.unshift(i):o.push(i),i}}const Ar=e=>(t,n=Ai)=>(!Pi||"sp"===e)&&Lr(e,((...e)=>t(...e)),n),Dr=Ar("bm"),Or=Ar("m"),Rr=Ar("bu"),Mr=Ar("u"),Ir=Ar("bum"),Fr=Ar("um"),Pr=Ar("sp"),Hr=Ar("rtg"),Nr=Ar("rtc");function Wr(e,t=Ai){Lr("ec",e,t)}function Br(e,t){const n=Dn;if(null===n)return e;const r=zi(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let e=0;e<t.length;e++){let[n,i,s,a=k]=t[e];n&&(H(n)&&(n={mounted:n,updated:n}),n.deep&&ir(i),o.push({dir:n,instance:r,value:i,oldValue:void 0,arg:s,modifiers:a}))}return e}function Vr(e,t,n,r){const o=e.dirs,i=t&&t.dirs;for(let s=0;s<o.length;s++){const a=o[s];i&&(a.oldValue=i[s].value);let l=a.dir[r];l&&(Le(),nn(l,n,8,[e.el,a,e,t]),Ae())}}const jr="components";function zr(e,t){return Ur(jr,e,!0,t)||e}const qr=Symbol();function $r(e){return N(e)?Ur(jr,e,!1)||e:e||qr}function Zr(e){return Ur("directives",e)}function Ur(e,t,n=!0,r=!1){const o=Dn||Ai;if(o){const n=o.type;if(e===jr){const e=qi(n,!1);if(e&&(e===t||e===G(t)||e===Q(G(t))))return n}const i=Kr(o[e]||n[e],t)||Kr(o.appContext[e],t);return!i&&r?n:i}}function Kr(e,t){return e&&(e[t]||e[G(t)]||e[Q(G(t))])}function Yr(e,t,n,r){let o;const i=n&&n[r];if(M(e)||N(e)){o=new Array(e.length);for(let n=0,r=e.length;n<r;n++)o[n]=t(e[n],n,void 0,i&&i[n])}else if("number"==typeof e){o=new Array(e);for(let n=0;n<e;n++)o[n]=t(n+1,n,void 0,i&&i[n])}else if(B(e))if(e[Symbol.iterator])o=Array.from(e,((e,n)=>t(e,n,void 0,i&&i[n])));else{const n=Object.keys(e);o=new Array(n.length);for(let r=0,s=n.length;r<s;r++){const s=n[r];o[r]=t(e[s],s,r,i&&i[r])}}else o=[];return n&&(n[r]=o),o}function Gr(e,t){for(let n=0;n<t.length;n++){const r=t[n];if(M(r))for(let t=0;t<r.length;t++)e[r[t].name]=r[t].fn;else r&&(e[r.name]=r.key?(...e)=>{const t=r.fn(...e);return t&&(t.key=r.key),t}:r.fn)}return e}function Xr(e,t,n={},r,o){if(Dn.isCE||Dn.parent&&vr(Dn.parent)&&Dn.parent.isCE)return"default"!==t&&(n.name=t),mi("slot",n,r&&r());let i=e[t];i&&i._c&&(i._d=!1),ei();const s=i&&Jr(i(n)),a=ai(Ko,{key:n.key||s&&s.key||`_${t}`},s||(r?r():[]),s&&1===e._?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),i&&i._c&&(i._d=!0),a}function Jr(e){return e.some((e=>!li(e)||e.type!==Go&&!(e.type===Ko&&!Jr(e.children))))?e:null}function Qr(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:ee(r)]=e[r];return n}const eo=e=>e?Mi(e)?zi(e)||e.proxy:eo(e.parent):null,to=A(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>eo(e.parent),$root:e=>eo(e.root),$emit:e=>e.emit,$options:e=>lo(e),$forceUpdate:e=>e.f||(e.f=()=>mn(e.update)),$nextTick:e=>e.n||(e.n=fn.bind(e.proxy)),$watch:e=>rr.bind(e)}),no=(e,t)=>e!==k&&!e.__isScriptSetup&&R(e,t),ro={get({_:e},t){const{ctx:n,setupState:r,data:o,props:i,accessCache:s,type:a,appContext:l}=e;let c;if("$"!==t[0]){const a=s[t];if(void 0!==a)switch(a){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(no(r,t))return s[t]=1,r[t];if(o!==k&&R(o,t))return s[t]=2,o[t];if((c=e.propsOptions[0])&&R(c,t))return s[t]=3,i[t];if(n!==k&&R(n,t))return s[t]=4,n[t];io&&(s[t]=0)}}const u=to[t];let d,h;return u?("$attrs"===t&&De(e,0,t),u(e)):(d=a.__cssModules)&&(d=d[t])?d:n!==k&&R(n,t)?(s[t]=4,n[t]):(h=l.config.globalProperties,R(h,t)?h[t]:void 0)},set({_:e},t,n){const{data:r,setupState:o,ctx:i}=e;return no(o,t)?(o[t]=n,!0):r!==k&&R(r,t)?(r[t]=n,!0):!(R(e.props,t)||"$"===t[0]&&t.slice(1)in e||(i[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:i}},s){let a;return!!n[s]||e!==k&&R(e,s)||no(t,s)||(a=i[0])&&R(a,s)||R(r,s)||R(to,s)||R(o.config.globalProperties,s)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:R(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},oo=A({},ro,{get(e,t){if(t!==Symbol.unscopables)return ro.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!i(t)});let io=!0;function so(e,t,n){nn(M(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function ao(e,t,n,r){const o=r.includes(".")?or(n,r):()=>n[r];if(N(e)){const n=t[e];H(n)&&tr(o,n)}else if(H(e))tr(o,e.bind(n));else if(B(e))if(M(e))e.forEach((e=>ao(e,t,n,r)));else{const r=H(e.handler)?e.handler.bind(n):t[e.handler];H(r)&&tr(o,r,e)}}function lo(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:s}}=e.appContext,a=i.get(t);let l;return a?l=a:o.length||n||r?(l={},o.length&&o.forEach((e=>co(l,e,s,!0))),co(l,t,s)):l=t,B(t)&&i.set(t,l),l}function co(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&co(e,i,n,!0),o&&o.forEach((t=>co(e,t,n,!0)));for(const o in t)if(r&&"expose"===o);else{const r=uo[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const uo={data:ho,props:mo,emits:mo,methods:mo,computed:mo,beforeCreate:fo,created:fo,beforeMount:fo,mounted:fo,beforeUpdate:fo,updated:fo,beforeDestroy:fo,beforeUnmount:fo,destroyed:fo,unmounted:fo,activated:fo,deactivated:fo,errorCaptured:fo,serverPrefetch:fo,components:mo,directives:mo,watch:function(e,t){if(!e)return t;if(!t)return e;const n=A(Object.create(null),e);for(const r in t)n[r]=fo(e[r],t[r]);return n},provide:ho,inject:function(e,t){return mo(po(e),po(t))}};function ho(e,t){return t?e?function(){return A(H(e)?e.call(this,this):e,H(t)?t.call(this,this):t)}:t:e}function po(e){if(M(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function fo(e,t){return e?[...new Set([].concat(e,t))]:t}function mo(e,t){return e?A(A(Object.create(null),e),t):t}function vo(e,t,n,r){const[o,i]=e.propsOptions;let s,a=!1;if(t)for(let l in t){if(Z(l))continue;const c=t[l];let u;o&&R(o,u=G(l))?i&&i.includes(u)?(s||(s={}))[u]=c:n[u]=c:An(e.emitsOptions,l)||l in r&&c===r[l]||(r[l]=c,a=!0)}if(i){const t=Ot(n),r=s||k;for(let s=0;s<i.length;s++){const a=i[s];n[a]=go(o,t,a,r[a],e,!R(r,a))}}return a}function go(e,t,n,r,o,i){const s=e[n];if(null!=s){const e=R(s,"default");if(e&&void 0===r){const e=s.default;if(s.type!==Function&&H(e)){const{propsDefaults:i}=o;n in i?r=i[n]:(Oi(o),r=i[n]=e.call(null,t),Ri())}else r=e}s[0]&&(i&&!e?r=!1:!s[1]||""!==r&&r!==J(n)||(r=!0))}return r}function bo(e,t,n=!1){const r=t.propsCache,o=r.get(e);if(o)return o;const i=e.props,s={},a=[];let l=!1;if(!H(e)){const r=e=>{l=!0;const[n,r]=bo(e,t,!0);A(s,n),r&&a.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!i&&!l)return B(e)&&r.set(e,x),x;if(M(i))for(let e=0;e<i.length;e++){const t=G(i[e]);yo(t)&&(s[t]=k)}else if(i)for(const e in i){const t=G(e);if(yo(t)){const n=i[e],r=s[t]=M(n)||H(n)?{type:n}:Object.assign({},n);if(r){const e=ko(Boolean,r.type),n=ko(String,r.type);r[0]=e>-1,r[1]=n<0||e<n,(e>-1||R(r,"default"))&&a.push(t)}}}const c=[s,a];return B(e)&&r.set(e,c),c}function yo(e){return"$"!==e[0]}function wo(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:null===e?"null":""}function So(e,t){return wo(e)===wo(t)}function ko(e,t){return M(t)?t.findIndex((t=>So(t,e))):H(t)&&So(t,e)?0:-1}const xo=e=>"_"===e[0]||"$stable"===e,Eo=e=>M(e)?e.map(Si):[Si(e)],Co=(e,t,n)=>{if(t._n)return t;const r=Pn(((...e)=>Eo(t(...e))),n);return r._c=!1,r},_o=(e,t,n)=>{const r=e._ctx;for(const n in e){if(xo(n))continue;const o=e[n];if(H(o))t[n]=Co(0,o,r);else if(null!=o){const e=Eo(o);t[n]=()=>e}}},To=(e,t)=>{const n=Eo(t);e.slots.default=()=>n};function Lo(){return{app:null,config:{isNativeTag:C,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Ao=0;function Do(e,t){return function(n,r=null){H(n)||(n=Object.assign({},n)),null==r||B(r)||(r=null);const o=Lo(),i=new Set;let s=!1;const a=o.app={_uid:Ao++,_component:n,_props:r,_container:null,_context:o,_instance:null,version:ls,get config(){return o.config},set config(e){},use:(e,...t)=>(i.has(e)||(e&&H(e.install)?(i.add(e),e.install(a,...t)):H(e)&&(i.add(e),e(a,...t))),a),mixin:e=>(o.mixins.includes(e)||o.mixins.push(e),a),component:(e,t)=>t?(o.components[e]=t,a):o.components[e],directive:(e,t)=>t?(o.directives[e]=t,a):o.directives[e],mount(i,l,c){if(!s){const u=mi(n,r);return u.appContext=o,l&&t?t(u,i):e(u,i,c),s=!0,a._container=i,i.__vue_app__=a,zi(u.component)||u.component.proxy}},unmount(){s&&(e(null,a._container),delete a._container.__vue_app__)},provide:(e,t)=>(o.provides[e]=t,a)};return a}}function Oo(e,t,n,r,o=!1){if(M(e))return void e.forEach(((e,i)=>Oo(e,t&&(M(t)?t[i]:t),n,r,o)));if(vr(r)&&!o)return;const i=4&r.shapeFlag?zi(r.component)||r.component.proxy:r.el,s=o?null:i,{i:a,r:l}=e,c=t&&t.r,u=a.refs===k?a.refs={}:a.refs,d=a.setupState;if(null!=c&&c!==l&&(N(c)?(u[c]=null,R(d,c)&&(d[c]=null)):Ht(c)&&(c.value=null)),H(l))tn(l,a,12,[s,u]);else{const t=N(l),r=Ht(l);if(t||r){const a=()=>{if(e.f){const n=t?R(d,l)?d[l]:u[l]:l.value;o?M(n)&&D(n,i):M(n)?n.includes(i)||n.push(i):t?(u[l]=[i],R(d,l)&&(d[l]=u[l])):(l.value=[i],e.k&&(u[e.k]=l.value))}else t?(u[l]=s,R(d,l)&&(d[l]=s)):r&&(l.value=s,e.k&&(u[e.k]=s))};s?(a.id=-1,Po(a,n)):a()}}}let Ro=!1;const Mo=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,Io=e=>8===e.nodeType;function Fo(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:i,parentNode:s,remove:a,insert:l,createComment:c}}=e,u=(n,r,a,c,v,g=!1)=>{const b=Io(n)&&"["===n.data,y=()=>f(n,r,a,c,v,b),{type:w,ref:S,shapeFlag:k,patchFlag:x}=r;let E=n.nodeType;r.el=n,-2===x&&(g=!1,r.dynamicChildren=null);let C=null;switch(w){case Yo:3!==E?""===r.children?(l(r.el=o(""),s(n),n),C=n):C=y():(n.data!==r.children&&(Ro=!0,n.data=r.children),C=i(n));break;case Go:C=8!==E||b?y():i(n);break;case Xo:if(b&&(E=(n=i(n)).nodeType),1===E||3===E){C=n;const e=!r.children.length;for(let t=0;t<r.staticCount;t++)e&&(r.children+=1===C.nodeType?C.outerHTML:C.data),t===r.staticCount-1&&(r.anchor=C),C=i(C);return b?i(C):C}y();break;case Ko:C=b?p(n,r,a,c,v,g):y();break;default:if(1&k)C=1!==E||r.type.toLowerCase()!==n.tagName.toLowerCase()?y():d(n,r,a,c,v,g);else if(6&k){r.slotScopeIds=v;const e=s(n);if(t(r,e,null,a,c,Mo(e),g),C=b?m(n):i(n),C&&Io(C)&&"teleport end"===C.data&&(C=i(C)),vr(r)){let t;b?(t=mi(Ko),t.anchor=C?C.previousSibling:e.lastChild):t=3===n.nodeType?bi(""):mi("div"),t.el=n,r.component.subTree=t}}else 64&k?C=8!==E?y():r.type.hydrate(n,r,a,c,v,g,e,h):128&k&&(C=r.type.hydrate(n,r,a,c,Mo(s(n)),v,g,e,u))}return null!=S&&Oo(S,null,c,r),C},d=(e,t,n,o,i,s)=>{s=s||!!t.dynamicChildren;const{type:l,props:c,patchFlag:u,shapeFlag:d,dirs:p}=t,f="input"===l&&p||"option"===l;if(f||-1!==u){if(p&&Vr(t,null,n,"created"),c)if(f||!s||48&u)for(const t in c)(f&&t.endsWith("value")||T(t)&&!Z(t))&&r(e,t,null,c[t],!1,void 0,n);else c.onClick&&r(e,"onClick",null,c.onClick,!1,void 0,n);let l;if((l=c&&c.onVnodeBeforeMount)&&Ci(l,n,t),p&&Vr(t,null,n,"beforeMount"),((l=c&&c.onVnodeMounted)||p)&&Un((()=>{l&&Ci(l,n,t),p&&Vr(t,null,n,"mounted")}),o),16&d&&(!c||!c.innerHTML&&!c.textContent)){let r=h(e.firstChild,t,e,n,o,i,s);for(;r;){Ro=!0;const e=r;r=r.nextSibling,a(e)}}else 8&d&&e.textContent!==t.children&&(Ro=!0,e.textContent=t.children)}return e.nextSibling},h=(e,t,r,o,i,s,a)=>{a=a||!!t.dynamicChildren;const l=t.children,c=l.length;for(let t=0;t<c;t++){const c=a?l[t]:l[t]=Si(l[t]);if(e)e=u(e,c,o,i,s,a);else{if(c.type===Yo&&!c.children)continue;Ro=!0,n(null,c,r,null,o,i,Mo(r),s)}}return e},p=(e,t,n,r,o,a)=>{const{slotScopeIds:u}=t;u&&(o=o?o.concat(u):u);const d=s(e),p=h(i(e),t,d,n,r,o,a);return p&&Io(p)&&"]"===p.data?i(t.anchor=p):(Ro=!0,l(t.anchor=c("]"),d,p),p)},f=(e,t,r,o,l,c)=>{if(Ro=!0,t.el=null,c){const t=m(e);for(;;){const n=i(e);if(!n||n===t)break;a(n)}}const u=i(e),d=s(e);return a(e),n(null,t,d,u,r,o,Mo(d),l),u},m=e=>{let t=0;for(;e;)if((e=i(e))&&Io(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return i(e);t--}return e};return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),yn(),void(t._vnode=e);Ro=!1,u(t.firstChild,e,null,null,null),yn(),t._vnode=e,Ro&&console.error("Hydration completed but contains mismatches.")},u]}const Po=Un;function Ho(e){return Wo(e)}function No(e){return Wo(e,Fo)}function Wo(e,t){(se||(se="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{})).__VUE__=!0;const{insert:r,remove:o,patchProp:i,createElement:s,createText:a,createComment:l,setText:c,setElementText:u,parentNode:d,nextSibling:h,setScopeId:p=E,insertStaticContent:f}=e,m=(e,t,n,r=null,o=null,i=null,s=!1,a=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!ci(e,t)&&(r=U(e),V(e,o,i,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);const{type:c,ref:u,shapeFlag:d}=t;switch(c){case Yo:v(e,t,n,r);break;case Go:g(e,t,n,r);break;case Xo:null==e&&b(t,n,r,s);break;case Ko:D(e,t,n,r,o,i,s,a,l);break;default:1&d?y(e,t,n,r,o,i,s,a,l):6&d?O(e,t,n,r,o,i,s,a,l):(64&d||128&d)&&c.process(e,t,n,r,o,i,s,a,l,Y)}null!=u&&o&&Oo(u,e&&e.ref,i,t||e,!t)},v=(e,t,n,o)=>{if(null==e)r(t.el=a(t.children),n,o);else{const n=t.el=e.el;t.children!==e.children&&c(n,t.children)}},g=(e,t,n,o)=>{null==e?r(t.el=l(t.children||""),n,o):t.el=e.el},b=(e,t,n,r)=>{[e.el,e.anchor]=f(e.children,t,n,r,e.el,e.anchor)},y=(e,t,n,r,o,i,s,a,l)=>{s=s||"svg"===t.type,null==e?w(t,n,r,o,i,s,a,l):_(e,t,o,i,s,a,l)},w=(e,t,n,o,a,l,c,d)=>{let h,p;const{type:f,props:m,shapeFlag:v,transition:g,dirs:b}=e;if(h=e.el=s(e.type,l,m&&m.is,m),8&v?u(h,e.children):16&v&&C(e.children,h,null,o,a,l&&"foreignObject"!==f,c,d),b&&Vr(e,null,o,"created"),S(h,e,e.scopeId,c,o),m){for(const t in m)"value"===t||Z(t)||i(h,t,null,m[t],l,e.children,o,a,$);"value"in m&&i(h,"value",null,m.value),(p=m.onVnodeBeforeMount)&&Ci(p,o,e)}b&&Vr(e,null,o,"beforeMount");const y=(!a||a&&!a.pendingBranch)&&g&&!g.persisted;y&&g.beforeEnter(h),r(h,t,n),((p=m&&m.onVnodeMounted)||y||b)&&Po((()=>{p&&Ci(p,o,e),y&&g.enter(h),b&&Vr(e,null,o,"mounted")}),a)},S=(e,t,n,r,o)=>{if(n&&p(e,n),r)for(let t=0;t<r.length;t++)p(e,r[t]);if(o&&t===o.subTree){const t=o.vnode;S(e,t,t.scopeId,t.slotScopeIds,o.parent)}},C=(e,t,n,r,o,i,s,a,l=0)=>{for(let c=l;c<e.length;c++){const l=e[c]=a?ki(e[c]):Si(e[c]);m(null,l,t,n,r,o,i,s,a)}},_=(e,t,n,r,o,s,a)=>{const l=t.el=e.el;let{patchFlag:c,dynamicChildren:d,dirs:h}=t;c|=16&e.patchFlag;const p=e.props||k,f=t.props||k;let m;n&&Bo(n,!1),(m=f.onVnodeBeforeUpdate)&&Ci(m,n,t,e),h&&Vr(t,e,n,"beforeUpdate"),n&&Bo(n,!0);const v=o&&"foreignObject"!==t.type;if(d?T(e.dynamicChildren,d,l,n,r,v,s):a||H(e,t,l,null,n,r,v,s,!1),c>0){if(16&c)L(l,t,p,f,n,r,o);else if(2&c&&p.class!==f.class&&i(l,"class",null,f.class,o),4&c&&i(l,"style",p.style,f.style,o),8&c){const s=t.dynamicProps;for(let t=0;t<s.length;t++){const a=s[t],c=p[a],u=f[a];u===c&&"value"!==a||i(l,a,c,u,o,e.children,n,r,$)}}1&c&&e.children!==t.children&&u(l,t.children)}else a||null!=d||L(l,t,p,f,n,r,o);((m=f.onVnodeUpdated)||h)&&Po((()=>{m&&Ci(m,n,t,e),h&&Vr(t,e,n,"updated")}),r)},T=(e,t,n,r,o,i,s)=>{for(let a=0;a<t.length;a++){const l=e[a],c=t[a],u=l.el&&(l.type===Ko||!ci(l,c)||70&l.shapeFlag)?d(l.el):n;m(l,c,u,null,r,o,i,s,!0)}},L=(e,t,n,r,o,s,a)=>{if(n!==r){if(n!==k)for(const l in n)Z(l)||l in r||i(e,l,n[l],null,a,t.children,o,s,$);for(const l in r){if(Z(l))continue;const c=r[l],u=n[l];c!==u&&"value"!==l&&i(e,l,u,c,a,t.children,o,s,$)}"value"in r&&i(e,"value",n.value,r.value)}},D=(e,t,n,o,i,s,l,c,u)=>{const d=t.el=e?e.el:a(""),h=t.anchor=e?e.anchor:a("");let{patchFlag:p,dynamicChildren:f,slotScopeIds:m}=t;m&&(c=c?c.concat(m):m),null==e?(r(d,n,o),r(h,n,o),C(t.children,n,h,i,s,l,c,u)):p>0&&64&p&&f&&e.dynamicChildren?(T(e.dynamicChildren,f,n,i,s,l,c),(null!=t.key||i&&t===i.subTree)&&Vo(e,t,!0)):H(e,t,n,h,i,s,l,c,u)},O=(e,t,n,r,o,i,s,a,l)=>{t.slotScopeIds=a,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,s,l):M(t,n,r,o,i,s,l):I(e,t,l)},M=(e,t,n,r,o,i,s)=>{const a=e.component=Li(e,r,o);if(yr(e)&&(a.ctx.renderer=Y),Hi(a),a.asyncDep){if(o&&o.registerDep(a,F),!e.el){const e=a.subTree=mi(Go);g(null,e,t,n)}}else F(a,e,t,n,o,i,s)},I=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:i}=e,{props:s,children:a,patchFlag:l}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return!(!o&&!a||a&&a.$stable)||r!==s&&(r?!s||Bn(r,s,c):!!s);if(1024&l)return!0;if(16&l)return r?Bn(r,s,c):!!s;if(8&l){const e=t.dynamicProps;for(let t=0;t<e.length;t++){const n=e[t];if(s[n]!==r[n]&&!An(c,n))return!0}}return!1}(e,t,n)){if(r.asyncDep&&!r.asyncResolved)return void P(r,t,n);r.next=t,function(e){const t=an.indexOf(e);t>ln&&an.splice(t,1)}(r.update),r.update()}else t.el=e.el,r.vnode=t},F=(e,t,n,r,o,i,s)=>{const a=e.effect=new ke((()=>{if(e.isMounted){let t,{next:n,bu:r,u:a,parent:l,vnode:c}=e,u=n;Bo(e,!1),n?(n.el=c.el,P(e,n,s)):n=c,r&&ne(r),(t=n.props&&n.props.onVnodeBeforeUpdate)&&Ci(t,l,n,c),Bo(e,!0);const h=Hn(e),p=e.subTree;e.subTree=h,m(p,h,d(p.el),U(p),e,o,i),n.el=h.el,null===u&&Vn(e,h.el),a&&Po(a,o),(t=n.props&&n.props.onVnodeUpdated)&&Po((()=>Ci(t,l,n,c)),o)}else{let s;const{el:a,props:l}=t,{bm:c,m:u,parent:d}=e,h=vr(t);if(Bo(e,!1),c&&ne(c),!h&&(s=l&&l.onVnodeBeforeMount)&&Ci(s,d,t),Bo(e,!0),a&&Q){const n=()=>{e.subTree=Hn(e),Q(a,e.subTree,e,o,null)};h?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{const s=e.subTree=Hn(e);m(null,s,n,r,e,o,i),t.el=s.el}if(u&&Po(u,o),!h&&(s=l&&l.onVnodeMounted)){const e=t;Po((()=>Ci(s,d,e)),o)}(256&t.shapeFlag||d&&vr(d.vnode)&&256&d.vnode.shapeFlag)&&e.a&&Po(e.a,o),e.isMounted=!0,t=n=r=null}}),(()=>mn(l)),e.scope),l=e.update=()=>a.run();l.id=e.uid,Bo(e,!0),l()},P=(e,t,n)=>{t.component=e;const r=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,r){const{props:o,attrs:i,vnode:{patchFlag:s}}=e,a=Ot(o),[l]=e.propsOptions;let c=!1;if(!(r||s>0)||16&s){let r;vo(e,t,o,i)&&(c=!0);for(const i in a)t&&(R(t,i)||(r=J(i))!==i&&R(t,r))||(l?!n||void 0===n[i]&&void 0===n[r]||(o[i]=go(l,a,i,void 0,e,!0)):delete o[i]);if(i!==a)for(const e in i)t&&R(t,e)||(delete i[e],c=!0)}else if(8&s){const n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let s=n[r];if(An(e.emitsOptions,s))continue;const u=t[s];if(l)if(R(i,s))u!==i[s]&&(i[s]=u,c=!0);else{const t=G(s);o[t]=go(l,a,t,u,e,!1)}else u!==i[s]&&(i[s]=u,c=!0)}}c&&Re(e,"set","$attrs")}(e,t.props,r,n),((e,t,n)=>{const{vnode:r,slots:o}=e;let i=!0,s=k;if(32&r.shapeFlag){const e=t._;e?n&&1===e?i=!1:(A(o,t),n||1!==e||delete o._):(i=!t.$stable,_o(t,o)),s=t}else t&&(To(e,t),s={default:1});if(i)for(const e in o)xo(e)||e in s||delete o[e]})(e,t.children,n),Le(),bn(),Ae()},H=(e,t,n,r,o,i,s,a,l=!1)=>{const c=e&&e.children,d=e?e.shapeFlag:0,h=t.children,{patchFlag:p,shapeFlag:f}=t;if(p>0){if(128&p)return void W(c,h,n,r,o,i,s,a,l);if(256&p)return void N(c,h,n,r,o,i,s,a,l)}8&f?(16&d&&$(c,o,i),h!==c&&u(n,h)):16&d?16&f?W(c,h,n,r,o,i,s,a,l):$(c,o,i,!0):(8&d&&u(n,""),16&f&&C(h,n,r,o,i,s,a,l))},N=(e,t,n,r,o,i,s,a,l)=>{t=t||x;const c=(e=e||x).length,u=t.length,d=Math.min(c,u);let h;for(h=0;h<d;h++){const r=t[h]=l?ki(t[h]):Si(t[h]);m(e[h],r,n,null,o,i,s,a,l)}c>u?$(e,o,i,!0,!1,d):C(t,n,r,o,i,s,a,l,d)},W=(e,t,n,r,o,i,s,a,l)=>{let c=0;const u=t.length;let d=e.length-1,h=u-1;for(;c<=d&&c<=h;){const r=e[c],u=t[c]=l?ki(t[c]):Si(t[c]);if(!ci(r,u))break;m(r,u,n,null,o,i,s,a,l),c++}for(;c<=d&&c<=h;){const r=e[d],c=t[h]=l?ki(t[h]):Si(t[h]);if(!ci(r,c))break;m(r,c,n,null,o,i,s,a,l),d--,h--}if(c>d){if(c<=h){const e=h+1,d=e<u?t[e].el:r;for(;c<=h;)m(null,t[c]=l?ki(t[c]):Si(t[c]),n,d,o,i,s,a,l),c++}}else if(c>h)for(;c<=d;)V(e[c],o,i,!0),c++;else{const p=c,f=c,v=new Map;for(c=f;c<=h;c++){const e=t[c]=l?ki(t[c]):Si(t[c]);null!=e.key&&v.set(e.key,c)}let g,b=0;const y=h-f+1;let w=!1,S=0;const k=new Array(y);for(c=0;c<y;c++)k[c]=0;for(c=p;c<=d;c++){const r=e[c];if(b>=y){V(r,o,i,!0);continue}let u;if(null!=r.key)u=v.get(r.key);else for(g=f;g<=h;g++)if(0===k[g-f]&&ci(r,t[g])){u=g;break}void 0===u?V(r,o,i,!0):(k[u-f]=c+1,u>=S?S=u:w=!0,m(r,t[u],n,null,o,i,s,a,l),b++)}const E=w?function(e){const t=e.slice(),n=[0];let r,o,i,s,a;const l=e.length;for(r=0;r<l;r++){const l=e[r];if(0!==l){if(o=n[n.length-1],e[o]<l){t[r]=o,n.push(r);continue}for(i=0,s=n.length-1;i<s;)a=i+s>>1,e[n[a]]<l?i=a+1:s=a;l<e[n[i]]&&(i>0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,s=n[i-1];i-- >0;)n[i]=s,s=t[s];return n}(k):x;for(g=E.length-1,c=y-1;c>=0;c--){const e=f+c,d=t[e],h=e+1<u?t[e+1].el:r;0===k[c]?m(null,d,n,h,o,i,s,a,l):w&&(g<0||c!==E[g]?B(d,n,h,2):g--)}}},B=(e,t,n,o,i=null)=>{const{el:s,type:a,transition:l,children:c,shapeFlag:u}=e;if(6&u)B(e.component.subTree,t,n,o);else if(128&u)e.suspense.move(t,n,o);else if(64&u)a.move(e,t,n,Y);else if(a!==Ko)if(a!==Xo)if(2!==o&&1&u&&l)if(0===o)l.beforeEnter(s),r(s,t,n),Po((()=>l.enter(s)),i);else{const{leave:e,delayLeave:o,afterLeave:i}=l,a=()=>r(s,t,n),c=()=>{e(s,(()=>{a(),i&&i()}))};o?o(s,a,c):c()}else r(s,t,n);else(({el:e,anchor:t},n,o)=>{let i;for(;e&&e!==t;)i=h(e),r(e,n,o),e=i;r(t,n,o)})(e,t,n);else{r(s,t,n);for(let e=0;e<c.length;e++)B(c[e],t,n,o);r(e.anchor,t,n)}},V=(e,t,n,r=!1,o=!1)=>{const{type:i,props:s,ref:a,children:l,dynamicChildren:c,shapeFlag:u,patchFlag:d,dirs:h}=e;if(null!=a&&Oo(a,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const p=1&u&&h,f=!vr(e);let m;if(f&&(m=s&&s.onVnodeBeforeUnmount)&&Ci(m,t,e),6&u)q(e.component,n,r);else{if(128&u)return void e.suspense.unmount(n,r);p&&Vr(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,o,Y,r):c&&(i!==Ko||d>0&&64&d)?$(c,t,n,!1,!0):(i===Ko&&384&d||!o&&16&u)&&$(l,t,n),r&&j(e)}(f&&(m=s&&s.onVnodeUnmounted)||p)&&Po((()=>{m&&Ci(m,t,e),p&&Vr(e,null,t,"unmounted")}),n)},j=e=>{const{type:t,el:n,anchor:r,transition:i}=e;if(t===Ko)return void z(n,r);if(t===Xo)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),o(e),e=n;o(t)})(e);const s=()=>{o(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){const{leave:t,delayLeave:r}=i,o=()=>t(n,s);r?r(e.el,s,o):o()}else s()},z=(e,t)=>{let n;for(;e!==t;)n=h(e),o(e),e=n;o(t)},q=(e,t,n)=>{const{bum:r,scope:o,update:i,subTree:s,um:a}=e;r&&ne(r),o.stop(),i&&(i.active=!1,V(s,e,t,n)),a&&Po(a,t),Po((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},$=(e,t,n,r=!1,o=!1,i=0)=>{for(let s=i;s<e.length;s++)V(e[s],t,n,r,o)},U=e=>6&e.shapeFlag?U(e.component.subTree):128&e.shapeFlag?e.suspense.next():h(e.anchor||e.el),K=(e,t,n)=>{null==e?t._vnode&&V(t._vnode,null,null,!0):m(t._vnode||null,e,t,null,null,null,n),bn(),yn(),t._vnode=e},Y={p:m,um:V,m:B,r:j,mt:M,mc:C,pc:H,pbc:T,n:U,o:e};let X,Q;return t&&([X,Q]=t(Y)),{render:K,hydrate:X,createApp:Do(K,X)}}function Bo({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Vo(e,t,n=!1){const r=e.children,o=t.children;if(M(r)&&M(o))for(let e=0;e<r.length;e++){const t=r[e];let i=o[e];1&i.shapeFlag&&!i.dynamicChildren&&((i.patchFlag<=0||32===i.patchFlag)&&(i=o[e]=ki(o[e]),i.el=t.el),n||Vo(t,i)),i.type===Yo&&(i.el=t.el)}}const jo=e=>e&&(e.disabled||""===e.disabled),zo=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,qo=(e,t)=>{const n=e&&e.to;if(N(n)){if(t){return t(n)}return null}return n};function $o(e,t,n,{o:{insert:r},m:o},i=2){0===i&&r(e.targetAnchor,t,n);const{el:s,anchor:a,shapeFlag:l,children:c,props:u}=e,d=2===i;if(d&&r(s,t,n),(!d||jo(u))&&16&l)for(let e=0;e<c.length;e++)o(c[e],t,n,2);d&&r(a,t,n)}const Zo={__isTeleport:!0,process(e,t,n,r,o,i,s,a,l,c){const{mc:u,pc:d,pbc:h,o:{insert:p,querySelector:f,createText:m,createComment:v}}=c,g=jo(t.props);let{shapeFlag:b,children:y,dynamicChildren:w}=t;if(null==e){const e=t.el=m(""),c=t.anchor=m("");p(e,n,r),p(c,n,r);const d=t.target=qo(t.props,f),h=t.targetAnchor=m("");d&&(p(h,d),s=s||zo(d));const v=(e,t)=>{16&b&&u(y,e,t,o,i,s,a,l)};g?v(n,c):d&&v(d,h)}else{t.el=e.el;const r=t.anchor=e.anchor,u=t.target=e.target,p=t.targetAnchor=e.targetAnchor,m=jo(e.props),v=m?n:u,b=m?r:p;if(s=s||zo(u),w?(h(e.dynamicChildren,w,v,o,i,s,a),Vo(e,t,!0)):l||d(e,t,v,b,o,i,s,a,!1),g)m||$o(t,n,r,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=qo(t.props,f);e&&$o(t,e,null,c,0)}else m&&$o(t,u,p,c,1)}Uo(t)},remove(e,t,n,r,{um:o,o:{remove:i}},s){const{shapeFlag:a,children:l,anchor:c,targetAnchor:u,target:d,props:h}=e;if(d&&i(u),(s||!jo(h))&&(i(c),16&a))for(let e=0;e<l.length;e++){const r=l[e];o(r,t,n,!0,!!r.dynamicChildren)}},move:$o,hydrate:function(e,t,n,r,o,i,{o:{nextSibling:s,parentNode:a,querySelector:l}},c){const u=t.target=qo(t.props,l);if(u){const l=u._lpa||u.firstChild;if(16&t.shapeFlag)if(jo(t.props))t.anchor=c(s(e),t,a(e),n,r,o,i),t.targetAnchor=l;else{t.anchor=s(e);let a=l;for(;a;)if(a=s(a),a&&8===a.nodeType&&"teleport anchor"===a.data){t.targetAnchor=a,u._lpa=t.targetAnchor&&s(t.targetAnchor);break}c(l,t,u,n,r,o,i)}Uo(t)}return t.anchor&&s(t.anchor)}};function Uo(e){const t=e.ctx;if(t&&t.ut){let n=e.children[0].el;for(;n!==e.targetAnchor;)1===n.nodeType&&n.setAttribute("data-v-owner",t.uid),n=n.nextSibling;t.ut()}}const Ko=Symbol(void 0),Yo=Symbol(void 0),Go=Symbol(void 0),Xo=Symbol(void 0),Jo=[];let Qo=null;function ei(e=!1){Jo.push(Qo=e?null:[])}function ti(){Jo.pop(),Qo=Jo[Jo.length-1]||null}let ni,ri=1;function oi(e){ri+=e}function ii(e){return e.dynamicChildren=ri>0?Qo||x:null,ti(),ri>0&&Qo&&Qo.push(e),e}function si(e,t,n,r,o,i){return ii(fi(e,t,n,r,o,i,!0))}function ai(e,t,n,r,o){return ii(mi(e,t,n,r,o,!0))}function li(e){return!!e&&!0===e.__v_isVNode}function ci(e,t){return e.type===t.type&&e.key===t.key}function ui(e){ni=e}const di="__vInternal",hi=({key:e})=>null!=e?e:null,pi=({ref:e,ref_key:t,ref_for:n})=>null!=e?N(e)||Ht(e)||H(e)?{i:Dn,r:e,k:t,f:!!n}:e:null;function fi(e,t=null,n=null,r=0,o=null,i=(e===Ko?0:1),s=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&hi(t),ref:t&&pi(t),scopeId:On,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Dn};return a?(xi(l,n),128&i&&e.normalize(l)):n&&(l.shapeFlag|=N(n)?8:16),ri>0&&!s&&Qo&&(l.patchFlag>0||6&i)&&32!==l.patchFlag&&Qo.push(l),l}const mi=function(e,t=null,n=null,r=0,o=null,i=!1){if(e&&e!==qr||(e=Go),li(e)){const r=gi(e,t,!0);return n&&xi(r,n),ri>0&&!i&&Qo&&(6&r.shapeFlag?Qo[Qo.indexOf(e)]=r:Qo.push(r)),r.patchFlag|=-2,r}if(a=e,H(a)&&"__vccOpts"in a&&(e=e.__vccOpts),t){t=vi(t);let{class:e,style:n}=t;e&&!N(e)&&(t.class=d(e)),B(n)&&(Dt(n)&&!M(n)&&(n=A({},n)),t.style=s(n))}var a;return fi(e,t,n,r,o,N(e)?1:jn(e)?128:(e=>e.__isTeleport)(e)?64:B(e)?4:H(e)?2:0,i,!0)};function vi(e){return e?Dt(e)||di in e?A({},e):e:null}function gi(e,t,n=!1){const{props:r,ref:o,patchFlag:i,children:s}=e,a=t?Ei(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&hi(a),ref:t&&t.ref?n&&o?M(o)?o.concat(pi(t)):[o,pi(t)]:pi(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ko?-1===i?16:16|i:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&gi(e.ssContent),ssFallback:e.ssFallback&&gi(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function bi(e=" ",t=0){return mi(Yo,null,e,t)}function yi(e,t){const n=mi(Xo,null,e);return n.staticCount=t,n}function wi(e="",t=!1){return t?(ei(),ai(Go,null,e)):mi(Go,null,e)}function Si(e){return null==e||"boolean"==typeof e?mi(Go):M(e)?mi(Ko,null,e.slice()):"object"==typeof e?ki(e):mi(Yo,null,String(e))}function ki(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:gi(e)}function xi(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if(M(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),xi(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||di in t?3===r&&Dn&&(1===Dn.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=Dn}}else H(t)?(t={default:t,_ctx:Dn},n=32):(t=String(t),64&r?(n=16,t=[bi(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ei(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const e in r)if("class"===e)t.class!==r.class&&(t.class=d([t.class,r.class]));else if("style"===e)t.style=s([t.style,r.style]);else if(T(e)){const n=t[e],o=r[e];!o||n===o||M(n)&&n.includes(o)||(t[e]=n?[].concat(n,o):o)}else""!==e&&(t[e]=r[e])}return t}function Ci(e,t,n,r=null){nn(e,t,7,[n,r])}const _i=Lo();let Ti=0;function Li(e,t,n){const r=e.type,o=(t?t.appContext:e.appContext)||_i,i={uid:Ti++,vnode:e,type:r,parent:t,appContext:o,root:null,next:null,subTree:null,effect:null,update:null,scope:new le(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(o.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:bo(r,o),emitsOptions:Ln(r,o),emit:null,emitted:null,propsDefaults:k,inheritAttrs:r.inheritAttrs,ctx:k,data:k,props:k,attrs:k,slots:k,refs:k,setupState:k,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=Tn.bind(null,i),e.ce&&e.ce(i),i}let Ai=null;const Di=()=>Ai||Dn,Oi=e=>{Ai=e,e.scope.on()},Ri=()=>{Ai&&Ai.scope.off(),Ai=null};function Mi(e){return 4&e.vnode.shapeFlag}let Ii,Fi,Pi=!1;function Hi(e,t=!1){Pi=t;const{props:n,children:r}=e.vnode,o=Mi(e);!function(e,t,n,r=!1){const o={},i={};re(i,di,1),e.propsDefaults=Object.create(null),vo(e,t,o,i);for(const t in e.propsOptions[0])t in o||(o[t]=void 0);n?e.props=r?o:xt(o):e.type.props?e.props=o:e.props=i,e.attrs=i}(e,n,o,t),((e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=Ot(t),re(t,"_",n)):_o(t,e.slots={})}else e.slots={},t&&To(e,t);re(e.slots,di,1)})(e,r);const i=o?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Rt(new Proxy(e.ctx,ro));const{setup:r}=n;if(r){const n=e.setupContext=r.length>1?ji(e):null;Oi(e),Le();const o=tn(r,e,0,[e.props,n]);if(Ae(),Ri(),V(o)){if(o.then(Ri,Ri),t)return o.then((n=>{Ni(e,n,t)})).catch((t=>{rn(t,e,0)}));e.asyncDep=o}else Ni(e,o,t)}else Vi(e,t)}(e,t):void 0;return Pi=!1,i}function Ni(e,t,n){H(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:B(t)&&(e.setupState=$t(t)),Vi(e,n)}function Wi(e){Ii=e,Fi=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,oo))}}const Bi=()=>!Ii;function Vi(e,t,n){const r=e.type;if(!e.render){if(!t&&Ii&&!r.render){const t=r.template||lo(e).template;if(t){const{isCustomElement:n,compilerOptions:o}=e.appContext.config,{delimiters:i,compilerOptions:s}=r,a=A(A({isCustomElement:n,delimiters:i},o),s);r.render=Ii(t,a)}}e.render=r.render||E,Fi&&Fi(e)}Oi(e),Le(),function(e){const t=lo(e),n=e.proxy,r=e.ctx;io=!1,t.beforeCreate&&so(t.beforeCreate,e,"bc");const{data:o,computed:i,methods:s,watch:a,provide:l,inject:c,created:u,beforeMount:d,mounted:h,beforeUpdate:p,updated:f,activated:m,deactivated:v,beforeDestroy:g,beforeUnmount:b,destroyed:y,unmounted:w,render:S,renderTracked:k,renderTriggered:x,errorCaptured:C,serverPrefetch:_,expose:T,inheritAttrs:L,components:A,directives:D,filters:O}=t;if(c&&function(e,t,n=E,r=!1){M(e)&&(e=po(e));for(const n in e){const o=e[n];let i;i=B(o)?"default"in o?Gn(o.from||n,o.default,!0):Gn(o.from||n):Gn(o),Ht(i)&&r?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}(c,r,null,e.appContext.config.unwrapInjectedRef),s)for(const e in s){const t=s[e];H(t)&&(r[e]=t.bind(n))}if(o){const t=o.call(n,n);B(t)&&(e.data=kt(t))}if(io=!0,i)for(const e in i){const t=i[e],o=H(t)?t.bind(n,n):H(t.get)?t.get.bind(n,n):E,s=!H(t)&&H(t.set)?t.set.bind(n):E,a=$i({get:o,set:s});Object.defineProperty(r,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(a)for(const e in a)ao(a[e],r,n,e);if(l){const e=H(l)?l.call(n):l;Reflect.ownKeys(e).forEach((t=>{Yn(t,e[t])}))}function R(e,t){M(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(u&&so(u,e,"c"),R(Dr,d),R(Or,h),R(Rr,p),R(Mr,f),R(kr,m),R(xr,v),R(Wr,C),R(Nr,k),R(Hr,x),R(Ir,b),R(Fr,w),R(Pr,_),M(T))if(T.length){const t=e.exposed||(e.exposed={});T.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});S&&e.render===E&&(e.render=S),null!=L&&(e.inheritAttrs=L),A&&(e.components=A),D&&(e.directives=D)}(e),Ae(),Ri()}function ji(e){let t;return{get attrs(){return t||(t=function(e){return new Proxy(e.attrs,{get:(t,n)=>(De(e,0,"$attrs"),t[n])})}(e))},slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function zi(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy($t(Rt(e.exposed)),{get:(t,n)=>n in t?t[n]:n in to?to[n](e):void 0,has:(e,t)=>t in e||t in to}))}function qi(e,t=!0){return H(e)?e.displayName||e.name:e.name||t&&e.__name}const $i=(e,t)=>function(e,t,n=!1){let r,o;const i=H(e);return i?(r=e,o=E):(r=e.get,o=e.set),new Jt(r,o,i||!o,n)}(e,0,Pi);function Zi(){return null}function Ui(){return null}function Ki(e){}function Yi(e,t){return null}function Gi(){return Ji().slots}function Xi(){return Ji().attrs}function Ji(){const e=Di();return e.setupContext||(e.setupContext=ji(e))}function Qi(e,t){const n=M(e)?e.reduce(((e,t)=>(e[t]={},e)),{}):e;for(const e in t){const r=n[e];r?M(r)||H(r)?n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(n[e]={default:t[e]})}return n}function es(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function ts(e){const t=Di();let n=e();return Ri(),V(n)&&(n=n.catch((e=>{throw Oi(t),e}))),[n,()=>Oi(t)]}function ns(e,t,n){const r=arguments.length;return 2===r?B(t)&&!M(t)?li(t)?mi(e,null,[t]):mi(e,t):mi(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&li(n)&&(n=[n]),mi(e,t,n))}const rs=Symbol(""),os=()=>Gn(rs);function is(){}function ss(e,t,n,r){const o=n[r];if(o&&as(o,e))return o;const i=t();return i.memo=e.slice(),n[r]=i}function as(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(te(n[e],t[e]))return!1;return ri>0&&Qo&&Qo.push(e),!0}const ls="3.2.47",cs={createComponentInstance:Li,setupComponent:Hi,renderComponentRoot:Hn,setCurrentRenderingInstance:Rn,isVNode:li,normalizeVNode:Si},us=null,ds=null,hs="undefined"!=typeof document?document:null,ps=hs&&hs.createElement("template"),fs={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?hs.createElementNS("http://www.w3.org/2000/svg",e):hs.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>hs.createTextNode(e),createComment:e=>hs.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>hs.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==i&&(o=o.nextSibling););else{ps.innerHTML=r?`<svg>${e}</svg>`:e;const o=ps.content;if(r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ms=/\s*!important$/;function vs(e,t,n){if(M(n))n.forEach((n=>vs(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=bs[t];if(n)return n;let r=G(t);if("filter"!==r&&r in e)return bs[t]=r;r=Q(r);for(let n=0;n<gs.length;n++){const o=gs[n]+r;if(o in e)return bs[t]=o}return t}(e,t);ms.test(n)?e.setProperty(J(r),n.replace(ms,""),"important"):e[r]=n}}const gs=["Webkit","Moz","ms"],bs={},ys="http://www.w3.org/1999/xlink";function ws(e,t,n,r){e.addEventListener(t,n,r)}const Ss=/(?:Once|Passive|Capture)$/;let ks=0;const xs=Promise.resolve(),Es=/^on[a-z]/;function Cs(e,t){const n=mr(e);class r extends Ls{constructor(e){super(n,e,t)}}return r.def=n,r}const _s=e=>Cs(e,Da),Ts="undefined"!=typeof HTMLElement?HTMLElement:class{};class Ls extends Ts{constructor(e,t={},n){super(),this._def=e,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:"open"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,fn((()=>{this._connected||(Aa(null,this.shadowRoot),this._instance=null)}))}_resolveDef(){this._resolved=!0;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);new MutationObserver((e=>{for(const t of e)this._setAttr(t.attributeName)})).observe(this,{attributes:!0});const e=(e,t=!1)=>{const{props:n,styles:r}=e;let o;if(n&&!M(n))for(const e in n){const t=n[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=ie(this._props[e])),(o||(o=Object.create(null)))[G(e)]=!0)}this._numberProps=o,t&&this._resolveProps(e),this._applyStyles(r),this._update()},t=this._def.__asyncLoader;t?t().then((t=>e(t,!0))):e(this._def)}_resolveProps(e){const{props:t}=e,n=M(t)?t:Object.keys(t||{});for(const e of Object.keys(this))"_"!==e[0]&&n.includes(e)&&this._setProp(e,this[e],!0,!1);for(const e of n.map(G))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t)}})}_setAttr(e){let t=this.getAttribute(e);const n=G(e);this._numberProps&&this._numberProps[n]&&(t=ie(t)),this._setProp(n,t,!1)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!0){t!==this._props[e]&&(this._props[e]=t,r&&this._instance&&this._update(),n&&(!0===t?this.setAttribute(J(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute(J(e),t+""):t||this.removeAttribute(J(e))))}_update(){Aa(this._createVNode(),this.shadowRoot)}_createVNode(){const e=mi(this._def,A({},this._props));return this._instance||(e.ce=e=>{this._instance=e,e.isCE=!0;const t=(e,t)=>{this.dispatchEvent(new CustomEvent(e,{detail:t}))};e.emit=(e,...n)=>{t(e,n),J(e)!==e&&t(J(e),n)};let n=this;for(;n=n&&(n.parentNode||n.host);)if(n instanceof Ls){e.parent=n._instance,e.provides=n._instance.provides;break}}),e}_applyStyles(e){e&&e.forEach((e=>{const t=document.createElement("style");t.textContent=e,this.shadowRoot.appendChild(t)}))}}function As(e="$style"){{const t=Di();if(!t)return k;const n=t.type.__cssModules;if(!n)return k;return n[e]||k}}function Ds(e){const t=Di();if(!t)return;const n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach((e=>Rs(e,n)))},r=()=>{const r=e(t.proxy);Os(t.subTree,r),n(r)};Jn(r),Or((()=>{const e=new MutationObserver(r);e.observe(t.subTree.el.parentNode,{childList:!0}),Fr((()=>e.disconnect()))}))}function Os(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{Os(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el)Rs(e.el,t);else if(e.type===Ko)e.children.forEach((e=>Os(e,t)));else if(e.type===Xo){let{el:n,anchor:r}=e;for(;n&&(Rs(n,t),n!==r);)n=n.nextSibling}}function Rs(e,t){if(1===e.nodeType){const n=e.style;for(const e in t)n.setProperty(`--${e}`,t[e])}}const Ms="transition",Is="animation",Fs=(e,{slots:t})=>ns(lr,Bs(e),t);Fs.displayName="Transition";const Ps={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Hs=Fs.props=A({},lr.props,Ps),Ns=(e,t=[])=>{M(e)?e.forEach((e=>e(...t))):e&&e(...t)},Ws=e=>!!e&&(M(e)?e.some((e=>e.length>1)):e.length>1);function Bs(e){const t={};for(const n in e)n in Ps||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=i,appearActiveClass:c=s,appearToClass:u=a,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,f=function(e){if(null==e)return null;if(B(e))return[Vs(e.enter),Vs(e.leave)];{const t=Vs(e);return[t,t]}}(o),m=f&&f[0],v=f&&f[1],{onBeforeEnter:g,onEnter:b,onEnterCancelled:y,onLeave:w,onLeaveCancelled:S,onBeforeAppear:k=g,onAppear:x=b,onAppearCancelled:E=y}=t,C=(e,t,n)=>{zs(e,t?u:a),zs(e,t?c:s),n&&n()},_=(e,t)=>{e._isLeaving=!1,zs(e,d),zs(e,p),zs(e,h),t&&t()},T=e=>(t,n)=>{const o=e?x:b,s=()=>C(t,e,n);Ns(o,[t,s]),qs((()=>{zs(t,e?l:i),js(t,e?u:a),Ws(o)||Zs(t,r,m,s)}))};return A(t,{onBeforeEnter(e){Ns(g,[e]),js(e,i),js(e,s)},onBeforeAppear(e){Ns(k,[e]),js(e,l),js(e,c)},onEnter:T(!1),onAppear:T(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>_(e,t);js(e,d),Gs(),js(e,h),qs((()=>{e._isLeaving&&(zs(e,d),js(e,p),Ws(w)||Zs(e,r,v,n))})),Ns(w,[e,n])},onEnterCancelled(e){C(e,!1),Ns(y,[e])},onAppearCancelled(e){C(e,!0),Ns(E,[e])},onLeaveCancelled(e){_(e),Ns(S,[e])}})}function Vs(e){return ie(e)}function js(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e._vtc||(e._vtc=new Set)).add(t)}function zs(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function qs(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let $s=0;function Zs(e,t,n,r){const o=e._endId=++$s,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:s,timeout:a,propCount:l}=Us(e,t);if(!s)return r();const c=s+"end";let u=0;const d=()=>{e.removeEventListener(c,h),i()},h=t=>{t.target===e&&++u>=l&&d()};setTimeout((()=>{u<l&&d()}),a+1),e.addEventListener(c,h)}function Us(e,t){const n=window.getComputedStyle(e),r=e=>(n[e]||"").split(", "),o=r("transitionDelay"),i=r("transitionDuration"),s=Ks(o,i),a=r("animationDelay"),l=r("animationDuration"),c=Ks(a,l);let u=null,d=0,h=0;return t===Ms?s>0&&(u=Ms,d=s,h=i.length):t===Is?c>0&&(u=Is,d=c,h=l.length):(d=Math.max(s,c),u=d>0?s>c?Ms:Is:null,h=u?u===Ms?i.length:l.length:0),{type:u,timeout:d,propCount:h,hasTransform:u===Ms&&/\b(transform|all)(,|$)/.test(r("transitionProperty").toString())}}function Ks(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map(((t,n)=>Ys(t)+Ys(e[n]))))}function Ys(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function Gs(){return document.body.offsetHeight}const Xs=new WeakMap,Js=new WeakMap,Qs={name:"TransitionGroup",props:A({},Hs,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Di(),r=sr();let o,i;return Mr((()=>{if(!o.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach((e=>{e.split(/\s+/).forEach((e=>e&&r.classList.remove(e)))})),n.split(/\s+/).forEach((e=>e&&r.classList.add(e))),r.style.display="none";const o=1===t.nodeType?t:t.parentNode;o.appendChild(r);const{hasTransform:i}=Us(r);return o.removeChild(r),i}(o[0].el,n.vnode.el,t))return;o.forEach(ea),o.forEach(ta);const r=o.filter(na);Gs(),r.forEach((e=>{const n=e.el,r=n.style;js(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n._moveCb=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n._moveCb=null,zs(n,t))};n.addEventListener("transitionend",o)}))})),()=>{const s=Ot(e),a=Bs(s);let l=s.tag||Ko;o=i,i=t.default?fr(t.default()):[];for(let e=0;e<i.length;e++){const t=i[e];null!=t.key&&pr(t,ur(t,a,r,n))}if(o)for(let e=0;e<o.length;e++){const t=o[e];pr(t,ur(t,a,r,n)),Xs.set(t,t.el.getBoundingClientRect())}return mi(l,null,i)}}};function ea(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function ta(e){Js.set(e,e.el.getBoundingClientRect())}function na(e){const t=Xs.get(e),n=Js.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const t=e.el.style;return t.transform=t.webkitTransform=`translate(${r}px,${o}px)`,t.transitionDuration="0s",e}}const ra=e=>{const t=e.props["onUpdate:modelValue"]||!1;return M(t)?e=>ne(t,e):t};function oa(e){e.target.composing=!0}function ia(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const sa={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e._assign=ra(o);const i=r||o.props&&"number"===o.props.type;ws(e,t?"change":"input",(t=>{if(t.target.composing)return;let r=e.value;n&&(r=r.trim()),i&&(r=oe(r)),e._assign(r)})),n&&ws(e,"change",(()=>{e.value=e.value.trim()})),t||(ws(e,"compositionstart",oa),ws(e,"compositionend",ia),ws(e,"change",ia))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},i){if(e._assign=ra(i),e.composing)return;if(document.activeElement===e&&"range"!==e.type){if(n)return;if(r&&e.value.trim()===t)return;if((o||"number"===e.type)&&oe(e.value)===t)return}const s=null==t?"":t;e.value!==s&&(e.value=s)}},aa={deep:!0,created(e,t,n){e._assign=ra(n),ws(e,"change",(()=>{const t=e._modelValue,n=ha(e),r=e.checked,o=e._assign;if(M(t)){const e=y(t,n),i=-1!==e;if(r&&!i)o(t.concat(n));else if(!r&&i){const n=[...t];n.splice(e,1),o(n)}}else if(F(t)){const e=new Set(t);r?e.add(n):e.delete(n),o(e)}else o(pa(e,r))}))},mounted:la,beforeUpdate(e,t,n){e._assign=ra(n),la(e,t,n)}};function la(e,{value:t,oldValue:n},r){e._modelValue=t,M(t)?e.checked=y(t,r.props.value)>-1:F(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=b(t,pa(e,!0)))}const ca={created(e,{value:t},n){e.checked=b(t,n.props.value),e._assign=ra(n),ws(e,"change",(()=>{e._assign(ha(e))}))},beforeUpdate(e,{value:t,oldValue:n},r){e._assign=ra(r),t!==n&&(e.checked=b(t,r.props.value))}},ua={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=F(t);ws(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?oe(ha(e)):ha(e)));e._assign(e.multiple?o?new Set(t):t:t[0])})),e._assign=ra(r)},mounted(e,{value:t}){da(e,t)},beforeUpdate(e,t,n){e._assign=ra(n)},updated(e,{value:t}){da(e,t)}};function da(e,t){const n=e.multiple;if(!n||M(t)||F(t)){for(let r=0,o=e.options.length;r<o;r++){const o=e.options[r],i=ha(o);if(n)M(t)?o.selected=y(t,i)>-1:o.selected=t.has(i);else if(b(ha(o),t))return void(e.selectedIndex!==r&&(e.selectedIndex=r))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function ha(e){return"_value"in e?e._value:e.value}function pa(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const fa={created(e,t,n){va(e,t,n,null,"created")},mounted(e,t,n){va(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){va(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){va(e,t,n,r,"updated")}};function ma(e,t){switch(e){case"SELECT":return ua;case"TEXTAREA":return sa;default:switch(t){case"checkbox":return aa;case"radio":return ca;default:return sa}}}function va(e,t,n,r,o){const i=ma(e.tagName,n.props&&n.props.type)[o];i&&i(e,t,n,r)}const ga=["ctrl","shift","alt","meta"],ba={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>ga.some((n=>e[`${n}Key`]&&!t.includes(n)))},ya=(e,t)=>(n,...r)=>{for(let e=0;e<t.length;e++){const r=ba[t[e]];if(r&&r(n,t))return}return e(n,...r)},wa={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Sa=(e,t)=>n=>{if(!("key"in n))return;const r=J(n.key);return t.some((e=>e===r||wa[e]===r))?e(n):void 0},ka={beforeMount(e,{value:t},{transition:n}){e._vod="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):xa(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),xa(e,!0),r.enter(e)):r.leave(e,(()=>{xa(e,!1)})):xa(e,t))},beforeUnmount(e,{value:t}){xa(e,t)}};function xa(e,t){e.style.display=t?e._vod:"none"}const Ea=A({patchProp:(e,t,n,r,o=!1,i,s,a,l)=>{"class"===t?function(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,o):"style"===t?function(e,t,n){const r=e.style,o=N(n);if(n&&!o){if(t&&!N(t))for(const e in t)null==n[e]&&vs(r,e,"");for(const e in n)vs(r,e,n[e])}else{const i=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=i)}}(e,n,r):T(t)?L(t)||function(e,t,n,r,o=null){const i=e._vei||(e._vei={}),s=i[t];if(r&&s)s.value=r;else{const[n,a]=function(e){let t;if(Ss.test(e)){let n;for(t={};n=e.match(Ss);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[":"===e[2]?e.slice(3):J(e.slice(2)),t]}(t);if(r){const s=i[t]=function(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();nn(function(e,t){if(M(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=ks||(xs.then((()=>ks=0)),ks=Date.now()),n}(r,o);ws(e,n,s,a)}else s&&(function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,s,a),i[t]=void 0)}}(e,t,0,r,s):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){return r?"innerHTML"===t||"textContent"===t||!!(t in e&&Es.test(t)&&H(n)):"spellcheck"!==t&&"draggable"!==t&&"translate"!==t&&("form"!==t&&(("list"!==t||"INPUT"!==e.tagName)&&(("type"!==t||"TEXTAREA"!==e.tagName)&&((!Es.test(t)||!N(n))&&t in e))))}(e,t,r,o))?function(e,t,n,r,o,i,s){if("innerHTML"===t||"textContent"===t)return r&&s(r,o,i),void(e[t]=null==n?"":n);if("value"===t&&"PROGRESS"!==e.tagName&&!e.tagName.includes("-")){e._value=n;const r=null==n?"":n;return e.value===r&&"OPTION"!==e.tagName||(e.value=r),void(null==n&&e.removeAttribute(t))}let a=!1;if(""===n||null==n){const r=typeof e[t];"boolean"===r?n=g(n):null==n&&"string"===r?(n="",a=!0):"number"===r&&(n=0,a=!0)}try{e[t]=n}catch(e){}a&&e.removeAttribute(t)}(e,t,r,i,s,a,l):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r,o){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(ys,t.slice(6,t.length)):e.setAttributeNS(ys,t,n);else{const r=v(t);null==n||r&&!g(n)?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,o))}},fs);let Ca,_a=!1;function Ta(){return Ca||(Ca=Ho(Ea))}function La(){return Ca=_a?Ca:No(Ea),_a=!0,Ca}const Aa=(...e)=>{Ta().render(...e)},Da=(...e)=>{La().hydrate(...e)},Oa=(...e)=>{const t=Ta().createApp(...e),{mount:n}=t;return t.mount=e=>{const r=Ma(e);if(!r)return;const o=t._component;H(o)||o.render||o.template||(o.template=r.innerHTML),r.innerHTML="";const i=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},t},Ra=(...e)=>{const t=La().createApp(...e),{mount:n}=t;return t.mount=e=>{const t=Ma(e);if(t)return n(t,!0,t instanceof SVGElement)},t};function Ma(e){return N(e)?document.querySelector(e):e}let Ia=!1;const Fa=()=>{Ia||(Ia=!0,sa.getSSRProps=({value:e})=>({value:e}),ca.getSSRProps=({value:e},t)=>{if(t.props&&b(t.props.value,e))return{checked:!0}},aa.getSSRProps=({value:e},t)=>{if(M(e)){if(t.props&&y(e,t.props.value)>-1)return{checked:!0}}else if(F(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},fa.getSSRProps=(e,t)=>{if("string"!=typeof t.type)return;const n=ma(t.type.toUpperCase(),t.props&&t.props.type);return n.getSSRProps?n.getSSRProps(e,t):void 0},ka.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})};function Pa(e){throw e}function Ha(e){}function Na(e,t,n,r){const o=new SyntaxError(String(e));return o.code=e,o.loc=t,o}const Wa=Symbol(""),Ba=Symbol(""),Va=Symbol(""),ja=Symbol(""),za=Symbol(""),qa=Symbol(""),$a=Symbol(""),Za=Symbol(""),Ua=Symbol(""),Ka=Symbol(""),Ya=Symbol(""),Ga=Symbol(""),Xa=Symbol(""),Ja=Symbol(""),Qa=Symbol(""),el=Symbol(""),tl=Symbol(""),nl=Symbol(""),rl=Symbol(""),ol=Symbol(""),il=Symbol(""),sl=Symbol(""),al=Symbol(""),ll=Symbol(""),cl=Symbol(""),ul=Symbol(""),dl=Symbol(""),hl=Symbol(""),pl=Symbol(""),fl=Symbol(""),ml=Symbol(""),vl=Symbol(""),gl=Symbol(""),bl=Symbol(""),yl=Symbol(""),wl=Symbol(""),Sl=Symbol(""),kl=Symbol(""),xl=Symbol(""),El={[Wa]:"Fragment",[Ba]:"Teleport",[Va]:"Suspense",[ja]:"KeepAlive",[za]:"BaseTransition",[qa]:"openBlock",[$a]:"createBlock",[Za]:"createElementBlock",[Ua]:"createVNode",[Ka]:"createElementVNode",[Ya]:"createCommentVNode",[Ga]:"createTextVNode",[Xa]:"createStaticVNode",[Ja]:"resolveComponent",[Qa]:"resolveDynamicComponent",[el]:"resolveDirective",[tl]:"resolveFilter",[nl]:"withDirectives",[rl]:"renderList",[ol]:"renderSlot",[il]:"createSlots",[sl]:"toDisplayString",[al]:"mergeProps",[ll]:"normalizeClass",[cl]:"normalizeStyle",[ul]:"normalizeProps",[dl]:"guardReactiveProps",[hl]:"toHandlers",[pl]:"camelize",[fl]:"capitalize",[ml]:"toHandlerKey",[vl]:"setBlockTracking",[gl]:"pushScopeId",[bl]:"popScopeId",[yl]:"withCtx",[wl]:"unref",[Sl]:"isRef",[kl]:"withMemo",[xl]:"isMemoSame"},Cl={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function _l(e,t,n,r,o,i,s,a=!1,l=!1,c=!1,u=Cl){return e&&(a?(e.helper(qa),e.helper(tc(e.inSSR,c))):e.helper(ec(e.inSSR,c)),s&&e.helper(nl)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:i,directives:s,isBlock:a,disableTracking:l,isComponent:c,loc:u}}function Tl(e,t=Cl){return{type:17,loc:t,elements:e}}function Ll(e,t=Cl){return{type:15,loc:t,properties:e}}function Al(e,t){return{type:16,loc:Cl,key:N(e)?Dl(e,!0):e,value:t}}function Dl(e,t=!1,n=Cl,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Ol(e,t=Cl){return{type:8,loc:t,children:e}}function Rl(e,t=[],n=Cl){return{type:14,loc:n,callee:e,arguments:t}}function Ml(e,t,n=!1,r=!1,o=Cl){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function Il(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:Cl}}const Fl=e=>4===e.type&&e.isStatic,Pl=(e,t)=>e===t||e===J(t);function Hl(e){return Pl(e,"Teleport")?Ba:Pl(e,"Suspense")?Va:Pl(e,"KeepAlive")?ja:Pl(e,"BaseTransition")?za:void 0}const Nl=/^\d|[^\$\w]/,Wl=e=>!Nl.test(e),Bl=/[A-Za-z_$\xA0-\uFFFF]/,Vl=/[\.\?\w$\xA0-\uFFFF]/,jl=/\s+[.[]\s*|\s*[.[]\s+/g,zl=e=>{e=e.trim().replace(jl,(e=>e.trim()));let t=0,n=[],r=0,o=0,i=null;for(let s=0;s<e.length;s++){const a=e.charAt(s);switch(t){case 0:if("["===a)n.push(t),t=1,r++;else if("("===a)n.push(t),t=2,o++;else if(!(0===s?Bl:Vl).test(a))return!1;break;case 1:"'"===a||'"'===a||"`"===a?(n.push(t),t=3,i=a):"["===a?r++:"]"===a&&(--r||(t=n.pop()));break;case 2:if("'"===a||'"'===a||"`"===a)n.push(t),t=3,i=a;else if("("===a)o++;else if(")"===a){if(s===e.length-1)return!1;--o||(t=n.pop())}break;case 3:a===i&&(t=n.pop(),i=null)}}return!r&&!o};function ql(e,t,n){const r={source:e.source.slice(t,t+n),start:$l(e.start,e.source,t),end:e.end};return null!=n&&(r.end=$l(e.start,e.source,t+n)),r}function $l(e,t,n=t.length){return Zl(A({},e),t,n)}function Zl(e,t,n=t.length){let r=0,o=-1;for(let e=0;e<n;e++)10===t.charCodeAt(e)&&(r++,o=e);return e.offset+=n,e.line+=r,e.column=-1===o?e.column+n:n-o,e}function Ul(e,t,n=!1){for(let r=0;r<e.props.length;r++){const o=e.props[r];if(7===o.type&&(n||o.exp)&&(N(t)?o.name===t:t.test(o.name)))return o}}function Kl(e,t,n=!1,r=!1){for(let o=0;o<e.props.length;o++){const i=e.props[o];if(6===i.type){if(n)continue;if(i.name===t&&(i.value||r))return i}else if("bind"===i.name&&(i.exp||r)&&Yl(i.arg,t))return i}}function Yl(e,t){return!(!e||!Fl(e)||e.content!==t)}function Gl(e){return 5===e.type||2===e.type}function Xl(e){return 7===e.type&&"slot"===e.name}function Jl(e){return 1===e.type&&3===e.tagType}function Ql(e){return 1===e.type&&2===e.tagType}function ec(e,t){return e||t?Ua:Ka}function tc(e,t){return e||t?$a:Za}const nc=new Set([ul,dl]);function rc(e,t=[]){if(e&&!N(e)&&14===e.type){const n=e.callee;if(!N(n)&&nc.has(n))return rc(e.arguments[0],t.concat(e))}return[e,t]}function oc(e,t,n){let r,o,i=13===e.type?e.props:e.arguments[2],s=[];if(i&&!N(i)&&14===i.type){const e=rc(i);i=e[0],s=e[1],o=s[s.length-1]}if(null==i||N(i))r=Ll([t]);else if(14===i.type){const e=i.arguments[0];N(e)||15!==e.type?i.callee===hl?r=Rl(n.helper(al),[Ll([t]),i]):i.arguments.unshift(Ll([t])):ic(t,e)||e.properties.unshift(t),!r&&(r=i)}else 15===i.type?(ic(t,i)||i.properties.unshift(t),r=i):(r=Rl(n.helper(al),[Ll([t]),i]),o&&o.callee===dl&&(o=s[s.length-2]));13===e.type?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function ic(e,t){let n=!1;if(4===e.key.type){const r=e.key.content;n=t.properties.some((e=>4===e.key.type&&e.key.content===r))}return n}function sc(e,t){return`_${t}_${e.replace(/[^\w]/g,((t,n)=>"-"===t?"_":e.charCodeAt(n).toString()))}`}function ac(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(ec(r,e.isComponent)),t(qa),t(tc(r,e.isComponent)))}function lc(e,t){const n=t.options?t.options.compatConfig:t.compatConfig,r=n&&n[e];return"MODE"===e?r||3:r}function cc(e,t){const n=lc("MODE",t),r=lc(e,t);return 3===n?!0===r:!1!==r}function uc(e,t,n,...r){return cc(e,t)}const dc=/&(gt|lt|amp|apos|quot);/g,hc={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},pc={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:C,isPreTag:C,isCustomElement:C,decodeEntities:e=>e.replace(dc,((e,t)=>hc[t])),onError:Pa,onWarn:Ha,comments:!1};function fc(e,t,n){const r=Ac(n),o=r?r.ns:0,i=[];for(;!Fc(e,t,n);){const s=e.source;let a;if(0===t||1===t)if(!e.inVPre&&Dc(s,e.options.delimiters[0]))a=Ec(e,t);else if(0===t&&"<"===s[0])if(1===s.length)Ic(e,5,1);else if("!"===s[1])Dc(s,"\x3c!--")?a=gc(e):Dc(s,"<!DOCTYPE")?a=bc(e):Dc(s,"<![CDATA[")?0!==o?a=vc(e,n):(Ic(e,1),a=bc(e)):(Ic(e,11),a=bc(e));else if("/"===s[1])if(2===s.length)Ic(e,5,2);else{if(">"===s[2]){Ic(e,14,2),Oc(e,3);continue}if(/[a-z]/i.test(s[2])){Ic(e,23),Sc(e,1,r);continue}Ic(e,12,2),a=bc(e)}else/[a-z]/i.test(s[1])?(a=yc(e,n),cc("COMPILER_NATIVE_TEMPLATE",e)&&a&&"template"===a.tag&&!a.props.some((e=>7===e.type&&wc(e.name)))&&(a=a.children)):"?"===s[1]?(Ic(e,21,1),a=bc(e)):Ic(e,12,1);if(a||(a=Cc(e,t)),M(a))for(let e=0;e<a.length;e++)mc(i,a[e]);else mc(i,a)}let s=!1;if(2!==t&&1!==t){const t="preserve"!==e.options.whitespace;for(let n=0;n<i.length;n++){const r=i[n];if(2===r.type)if(e.inPre)r.content=r.content.replace(/\r\n/g,"\n");else if(/[^\t\r\n\f ]/.test(r.content))t&&(r.content=r.content.replace(/[\t\r\n\f ]+/g," "));else{const e=i[n-1],o=i[n+1];!e||!o||t&&(3===e.type&&3===o.type||3===e.type&&1===o.type||1===e.type&&3===o.type||1===e.type&&1===o.type&&/[\r\n]/.test(r.content))?(s=!0,i[n]=null):r.content=" "}else 3!==r.type||e.options.comments||(s=!0,i[n]=null)}if(e.inPre&&r&&e.options.isPreTag(r.tag)){const e=i[0];e&&2===e.type&&(e.content=e.content.replace(/^\r?\n/,""))}}return s?i.filter(Boolean):i}function mc(e,t){if(2===t.type){const n=Ac(e);if(n&&2===n.type&&n.loc.end.offset===t.loc.start.offset)return n.content+=t.content,n.loc.end=t.loc.end,void(n.loc.source+=t.loc.source)}e.push(t)}function vc(e,t){Oc(e,9);const n=fc(e,3,t);return 0===e.source.length?Ic(e,6):Oc(e,3),n}function gc(e){const t=Tc(e);let n;const r=/--(\!)?>/.exec(e.source);if(r){r.index<=3&&Ic(e,0),r[1]&&Ic(e,10),n=e.source.slice(4,r.index);const t=e.source.slice(0,r.index);let o=1,i=0;for(;-1!==(i=t.indexOf("\x3c!--",o));)Oc(e,i-o+1),i+4<t.length&&Ic(e,16),o=i+1;Oc(e,r.index+r[0].length-o+1)}else n=e.source.slice(4),Oc(e,e.source.length),Ic(e,7);return{type:3,content:n,loc:Lc(e,t)}}function bc(e){const t=Tc(e),n="?"===e.source[1]?1:2;let r;const o=e.source.indexOf(">");return-1===o?(r=e.source.slice(n),Oc(e,e.source.length)):(r=e.source.slice(n,o),Oc(e,o+1)),{type:3,content:r,loc:Lc(e,t)}}function yc(e,t){const n=e.inPre,r=e.inVPre,o=Ac(t),i=Sc(e,0,o),s=e.inPre&&!n,a=e.inVPre&&!r;if(i.isSelfClosing||e.options.isVoidTag(i.tag))return s&&(e.inPre=!1),a&&(e.inVPre=!1),i;t.push(i);const l=e.options.getTextMode(i,o),c=fc(e,l,t);t.pop();{const t=i.props.find((e=>6===e.type&&"inline-template"===e.name));if(t&&uc("COMPILER_INLINE_TEMPLATE",e,t.loc)){const n=Lc(e,i.loc.end);t.value={type:2,content:n.source,loc:n}}}if(i.children=c,Pc(e.source,i.tag))Sc(e,1,o);else if(Ic(e,24,0,i.loc.start),0===e.source.length&&"script"===i.tag.toLowerCase()){const t=c[0];t&&Dc(t.loc.source,"\x3c!--")&&Ic(e,8)}return i.loc=Lc(e,i.loc.start),s&&(e.inPre=!1),a&&(e.inVPre=!1),i}const wc=o("if,else,else-if,for,slot");function Sc(e,t,n){const r=Tc(e),o=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(e.source),i=o[1],s=e.options.getNamespace(i,n);Oc(e,o[0].length),Rc(e);const a=Tc(e),l=e.source;e.options.isPreTag(i)&&(e.inPre=!0);let c=kc(e,t);0===t&&!e.inVPre&&c.some((e=>7===e.type&&"pre"===e.name))&&(e.inVPre=!0,A(e,a),e.source=l,c=kc(e,t).filter((e=>"v-pre"!==e.name)));let u=!1;if(0===e.source.length?Ic(e,9):(u=Dc(e.source,"/>"),1===t&&u&&Ic(e,4),Oc(e,u?2:1)),1===t)return;let d=0;return e.inVPre||("slot"===i?d=2:"template"===i?c.some((e=>7===e.type&&wc(e.name)))&&(d=3):function(e,t,n){const r=n.options;if(r.isCustomElement(e))return!1;if("component"===e||/^[A-Z]/.test(e)||Hl(e)||r.isBuiltInComponent&&r.isBuiltInComponent(e)||r.isNativeTag&&!r.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){const r=t[e];if(6===r.type){if("is"===r.name&&r.value){if(r.value.content.startsWith("vue:"))return!0;if(uc("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}else{if("is"===r.name)return!0;if("bind"===r.name&&Yl(r.arg,"is")&&uc("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}}(i,c,e)&&(d=1)),{type:1,ns:s,tag:i,tagType:d,props:c,isSelfClosing:u,children:[],loc:Lc(e,r),codegenNode:void 0}}function kc(e,t){const n=[],r=new Set;for(;e.source.length>0&&!Dc(e.source,">")&&!Dc(e.source,"/>");){if(Dc(e.source,"/")){Ic(e,22),Oc(e,1),Rc(e);continue}1===t&&Ic(e,3);const o=xc(e,r);6===o.type&&o.value&&"class"===o.name&&(o.value.content=o.value.content.replace(/\s+/g," ").trim()),0===t&&n.push(o),/^[^\t\r\n\f />]/.test(e.source)&&Ic(e,15),Rc(e)}return n}function xc(e,t){const n=Tc(e),r=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(e.source)[0];t.has(r)&&Ic(e,2),t.add(r),"="===r[0]&&Ic(e,19);{const t=/["'<]/g;let n;for(;n=t.exec(r);)Ic(e,17,n.index)}let o;Oc(e,r.length),/^[\t\r\n\f ]*=/.test(e.source)&&(Rc(e),Oc(e,1),Rc(e),o=function(e){const t=Tc(e);let n;const r=e.source[0],o='"'===r||"'"===r;if(o){Oc(e,1);const t=e.source.indexOf(r);-1===t?n=_c(e,e.source.length,4):(n=_c(e,t,4),Oc(e,1))}else{const t=/^[^\t\r\n\f >]+/.exec(e.source);if(!t)return;const r=/["'<=`]/g;let o;for(;o=r.exec(t[0]);)Ic(e,18,o.index);n=_c(e,t[0].length,4)}return{content:n,isQuoted:o,loc:Lc(e,t)}}(e),o||Ic(e,13));const i=Lc(e,n);if(!e.inVPre&&/^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(r)){const t=/(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(r);let s,a=Dc(r,"."),l=t[1]||(a||Dc(r,":")?"bind":Dc(r,"@")?"on":"slot");if(t[2]){const o="slot"===l,i=r.lastIndexOf(t[2]),a=Lc(e,Mc(e,n,i),Mc(e,n,i+t[2].length+(o&&t[3]||"").length));let c=t[2],u=!0;c.startsWith("[")?(u=!1,c.endsWith("]")?c=c.slice(1,c.length-1):(Ic(e,27),c=c.slice(1))):o&&(c+=t[3]||""),s={type:4,content:c,isStatic:u,constType:u?3:0,loc:a}}if(o&&o.isQuoted){const e=o.loc;e.start.offset++,e.start.column++,e.end=$l(e.start,o.content),e.source=e.source.slice(1,-1)}const c=t[3]?t[3].slice(1).split("."):[];return a&&c.push("prop"),"bind"===l&&s&&c.includes("sync")&&uc("COMPILER_V_BIND_SYNC",e,0,s.loc.source)&&(l="model",c.splice(c.indexOf("sync"),1)),{type:7,name:l,exp:o&&{type:4,content:o.content,isStatic:!1,constType:0,loc:o.loc},arg:s,modifiers:c,loc:i}}return!e.inVPre&&Dc(r,"v-")&&Ic(e,26),{type:6,name:r,value:o&&{type:2,content:o.content,loc:o.loc},loc:i}}function Ec(e,t){const[n,r]=e.options.delimiters,o=e.source.indexOf(r,n.length);if(-1===o)return void Ic(e,25);const i=Tc(e);Oc(e,n.length);const s=Tc(e),a=Tc(e),l=o-n.length,c=e.source.slice(0,l),u=_c(e,l,t),d=u.trim(),h=u.indexOf(d);return h>0&&Zl(s,c,h),Zl(a,c,l-(u.length-d.length-h)),Oc(e,r.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:d,loc:Lc(e,s,a)},loc:Lc(e,i)}}function Cc(e,t){const n=3===t?["]]>"]:["<",e.options.delimiters[0]];let r=e.source.length;for(let t=0;t<n.length;t++){const o=e.source.indexOf(n[t],1);-1!==o&&r>o&&(r=o)}const o=Tc(e);return{type:2,content:_c(e,r,t),loc:Lc(e,o)}}function _c(e,t,n){const r=e.source.slice(0,t);return Oc(e,t),2!==n&&3!==n&&r.includes("&")?e.options.decodeEntities(r,4===n):r}function Tc(e){const{column:t,line:n,offset:r}=e;return{column:t,line:n,offset:r}}function Lc(e,t,n){return{start:t,end:n=n||Tc(e),source:e.originalSource.slice(t.offset,n.offset)}}function Ac(e){return e[e.length-1]}function Dc(e,t){return e.startsWith(t)}function Oc(e,t){const{source:n}=e;Zl(e,n,t),e.source=n.slice(t)}function Rc(e){const t=/^[\t\r\n\f ]+/.exec(e.source);t&&Oc(e,t[0].length)}function Mc(e,t,n){return $l(t,e.originalSource.slice(t.offset,n),n)}function Ic(e,t,n,r=Tc(e)){n&&(r.offset+=n,r.column+=n),e.options.onError(Na(t,{start:r,end:r,source:""}))}function Fc(e,t,n){const r=e.source;switch(t){case 0:if(Dc(r,"</"))for(let e=n.length-1;e>=0;--e)if(Pc(r,n[e].tag))return!0;break;case 1:case 2:{const e=Ac(n);if(e&&Pc(r,e.tag))return!0;break}case 3:if(Dc(r,"]]>"))return!0}return!r}function Pc(e,t){return Dc(e,"</")&&e.slice(2,2+t.length).toLowerCase()===t.toLowerCase()&&/[\t\r\n\f />]/.test(e[2+t.length]||">")}function Hc(e,t){Wc(e,t,Nc(e,e.children[0]))}function Nc(e,t){const{children:n}=e;return 1===n.length&&1===t.type&&!Ql(t)}function Wc(e,t,n=!1){const{children:r}=e,o=r.length;let i=0;for(let e=0;e<r.length;e++){const o=r[e];if(1===o.type&&0===o.tagType){const e=n?0:Bc(o,t);if(e>0){if(e>=2){o.codegenNode.patchFlag="-1",o.codegenNode=t.hoist(o.codegenNode),i++;continue}}else{const e=o.codegenNode;if(13===e.type){const n=$c(e);if((!n||512===n||1===n)&&zc(o,t)>=2){const n=qc(o);n&&(e.props=t.hoist(n))}e.dynamicProps&&(e.dynamicProps=t.hoist(e.dynamicProps))}}}if(1===o.type){const e=1===o.tagType;e&&t.scopes.vSlot++,Wc(o,t),e&&t.scopes.vSlot--}else if(11===o.type)Wc(o,t,1===o.children.length);else if(9===o.type)for(let e=0;e<o.branches.length;e++)Wc(o.branches[e],t,1===o.branches[e].children.length)}i&&t.transformHoist&&t.transformHoist(r,t,e),i&&i===o&&1===e.type&&0===e.tagType&&e.codegenNode&&13===e.codegenNode.type&&M(e.codegenNode.children)&&(e.codegenNode.children=t.hoist(Tl(e.codegenNode.children)))}function Bc(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;const r=n.get(e);if(void 0!==r)return r;const o=e.codegenNode;if(13!==o.type)return 0;if(o.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag)return 0;if($c(o))return n.set(e,0),0;{let r=3;const i=zc(e,t);if(0===i)return n.set(e,0),0;i<r&&(r=i);for(let o=0;o<e.children.length;o++){const i=Bc(e.children[o],t);if(0===i)return n.set(e,0),0;i<r&&(r=i)}if(r>1)for(let o=0;o<e.props.length;o++){const i=e.props[o];if(7===i.type&&"bind"===i.name&&i.exp){const o=Bc(i.exp,t);if(0===o)return n.set(e,0),0;o<r&&(r=o)}}if(o.isBlock){for(let t=0;t<e.props.length;t++)if(7===e.props[t].type)return n.set(e,0),0;t.removeHelper(qa),t.removeHelper(tc(t.inSSR,o.isComponent)),o.isBlock=!1,t.helper(ec(t.inSSR,o.isComponent))}return n.set(e,r),r}case 2:case 3:return 3;case 9:case 11:case 10:default:return 0;case 5:case 12:return Bc(e.content,t);case 4:return e.constType;case 8:let i=3;for(let n=0;n<e.children.length;n++){const r=e.children[n];if(N(r)||W(r))continue;const o=Bc(r,t);if(0===o)return 0;o<i&&(i=o)}return i}}const Vc=new Set([ll,cl,ul,dl]);function jc(e,t){if(14===e.type&&!N(e.callee)&&Vc.has(e.callee)){const n=e.arguments[0];if(4===n.type)return Bc(n,t);if(14===n.type)return jc(n,t)}return 0}function zc(e,t){let n=3;const r=qc(e);if(r&&15===r.type){const{properties:e}=r;for(let r=0;r<e.length;r++){const{key:o,value:i}=e[r],s=Bc(o,t);if(0===s)return s;let a;if(s<n&&(n=s),a=4===i.type?Bc(i,t):14===i.type?jc(i,t):0,0===a)return a;a<n&&(n=a)}}return n}function qc(e){const t=e.codegenNode;if(13===t.type)return t.props}function $c(e){const t=e.patchFlag;return t?parseInt(t,10):void 0}function Zc(e,t){const n=function(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:r=!1,cacheHandlers:o=!1,nodeTransforms:i=[],directiveTransforms:s={},transformHoist:a=null,isBuiltInComponent:l=E,isCustomElement:c=E,expressionPlugins:u=[],scopeId:d=null,slotted:h=!0,ssr:p=!1,inSSR:f=!1,ssrCssVars:m="",bindingMetadata:v=k,inline:g=!1,isTS:b=!1,onError:y=Pa,onWarn:w=Ha,compatConfig:S}){const x=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),C={selfName:x&&Q(G(x[1])),prefixIdentifiers:n,hoistStatic:r,cacheHandlers:o,nodeTransforms:i,directiveTransforms:s,transformHoist:a,isBuiltInComponent:l,isCustomElement:c,expressionPlugins:u,scopeId:d,slotted:h,ssr:p,inSSR:f,ssrCssVars:m,bindingMetadata:v,inline:g,isTS:b,onError:y,onWarn:w,compatConfig:S,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new Map,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){const t=C.helpers.get(e)||0;return C.helpers.set(e,t+1),e},removeHelper(e){const t=C.helpers.get(e);if(t){const n=t-1;n?C.helpers.set(e,n):C.helpers.delete(e)}},helperString:e=>`_${El[C.helper(e)]}`,replaceNode(e){C.parent.children[C.childIndex]=C.currentNode=e},removeNode(e){const t=C.parent.children,n=e?t.indexOf(e):C.currentNode?C.childIndex:-1;e&&e!==C.currentNode?C.childIndex>n&&(C.childIndex--,C.onNodeRemoved()):(C.currentNode=null,C.onNodeRemoved()),C.parent.children.splice(n,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){N(e)&&(e=Dl(e)),C.hoists.push(e);const t=Dl(`_hoisted_${C.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:Cl}}(C.cached++,e,t)};return C.filters=new Set,C}(e,t);Uc(e,n),t.hoistStatic&&Hc(e,n),t.ssr||function(e,t){const{helper:n}=t,{children:r}=e;if(1===r.length){const n=r[0];if(Nc(e,n)&&n.codegenNode){const r=n.codegenNode;13===r.type&&ac(r,t),e.codegenNode=r}else e.codegenNode=n}else if(r.length>1){let r=64;e.codegenNode=_l(t,n(Wa),void 0,e.children,r+"",void 0,void 0,!0,void 0,!1)}}(e,n),e.helpers=new Set([...n.helpers.keys()]),e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.filters=[...n.filters]}function Uc(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let o=0;o<n.length;o++){const i=n[o](e,t);if(i&&(M(i)?r.push(...i):r.push(i)),!t.currentNode)return;e=t.currentNode}switch(e.type){case 3:t.ssr||t.helper(Ya);break;case 5:t.ssr||t.helper(sl);break;case 9:for(let n=0;n<e.branches.length;n++)Uc(e.branches[n],t);break;case 10:case 11:case 1:case 0:!function(e,t){let n=0;const r=()=>{n--};for(;n<e.children.length;n++){const o=e.children[n];N(o)||(t.parent=e,t.childIndex=n,t.onNodeRemoved=r,Uc(o,t))}}(e,t)}t.currentNode=e;let o=r.length;for(;o--;)r[o]()}function Kc(e,t){const n=N(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(1===e.type){const{props:o}=e;if(3===e.tagType&&o.some(Xl))return;const i=[];for(let s=0;s<o.length;s++){const a=o[s];if(7===a.type&&n(a.name)){o.splice(s,1),s--;const n=t(e,a,r);n&&i.push(n)}}return i}}}const Yc="/*#__PURE__*/",Gc=e=>`${El[e]}: _${El[e]}`;function Xc(e,t={}){const n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:i=null,optimizeImports:s=!1,runtimeGlobalName:a="Vue",runtimeModuleName:l="vue",ssrRuntimeModuleName:c="vue/server-renderer",ssr:u=!1,isTS:d=!1,inSSR:h=!1}){const p={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:i,optimizeImports:s,runtimeGlobalName:a,runtimeModuleName:l,ssrRuntimeModuleName:c,ssr:u,isTS:d,inSSR:h,source:e.loc.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${El[e]}`,push(e,t){p.code+=e},indent(){f(++p.indentLevel)},deindent(e=!1){e?--p.indentLevel:f(--p.indentLevel)},newline(){f(p.indentLevel)}};function f(e){p.push("\n"+"  ".repeat(e))}return p}(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:o,prefixIdentifiers:i,indent:s,deindent:a,newline:l,scopeId:c,ssr:u}=n,d=Array.from(e.helpers),h=d.length>0,p=!i&&"module"!==r;if(function(e,t){const{ssr:n,prefixIdentifiers:r,push:o,newline:i,runtimeModuleName:s,runtimeGlobalName:a,ssrRuntimeModuleName:l}=t,c=a,u=Array.from(e.helpers);u.length>0&&(o(`const _Vue = ${c}\n`),e.hoists.length)&&o(`const { ${[Ua,Ka,Ya,Ga,Xa].filter((e=>u.includes(e))).map(Gc).join(", ")} } = _Vue\n`),function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r,helper:o,scopeId:i,mode:s}=t;r();for(let o=0;o<e.length;o++){const i=e[o];i&&(n(`const _hoisted_${o+1} = `),tu(i,t),r())}t.pure=!1}(e.hoists,t),i(),o("return ")}(e,n),o(`function ${u?"ssrRender":"render"}(${(u?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ")}) {`),s(),p&&(o("with (_ctx) {"),s(),h&&(o(`const { ${d.map(Gc).join(", ")} } = _Vue`),o("\n"),l())),e.components.length&&(Jc(e.components,"component",n),(e.directives.length||e.temps>0)&&l()),e.directives.length&&(Jc(e.directives,"directive",n),e.temps>0&&l()),e.filters&&e.filters.length&&(l(),Jc(e.filters,"filter",n),l()),e.temps>0){o("let ");for(let t=0;t<e.temps;t++)o(`${t>0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(o("\n"),l()),u||o("return "),e.codegenNode?tu(e.codegenNode,n):o("null"),p&&(a(),o("}")),a(),o("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}function Jc(e,t,{helper:n,push:r,newline:o,isTS:i}){const s=n("filter"===t?tl:"component"===t?Ja:el);for(let n=0;n<e.length;n++){let a=e[n];const l=a.endsWith("__self");l&&(a=a.slice(0,-6)),r(`const ${sc(a,t)} = ${s}(${JSON.stringify(a)}${l?", true":""})${i?"!":""}`),n<e.length-1&&o()}}function Qc(e,t){const n=e.length>3||!1;t.push("["),n&&t.indent(),eu(e,t,n),n&&t.deindent(),t.push("]")}function eu(e,t,n=!1,r=!0){const{push:o,newline:i}=t;for(let s=0;s<e.length;s++){const a=e[s];N(a)?o(a):M(a)?Qc(a,t):tu(a,t),s<e.length-1&&(n?(r&&o(","),i()):r&&o(", "))}}function tu(e,t){if(N(e))t.push(e);else if(W(e))t.push(t.helper(e));else switch(e.type){case 1:case 9:case 11:case 12:tu(e.codegenNode,t);break;case 2:!function(e,t){t.push(JSON.stringify(e.content),e)}(e,t);break;case 4:nu(e,t);break;case 5:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Yc),n(`${r(sl)}(`),tu(e.content,t),n(")")}(e,t);break;case 8:ru(e,t);break;case 3:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Yc),n(`${r(Ya)}(${JSON.stringify(e.content)})`,e)}(e,t);break;case 13:!function(e,t){const{push:n,helper:r,pure:o}=t,{tag:i,props:s,children:a,patchFlag:l,dynamicProps:c,directives:u,isBlock:d,disableTracking:h,isComponent:p}=e;u&&n(r(nl)+"("),d&&n(`(${r(qa)}(${h?"true":""}), `),o&&n(Yc);n(r(d?tc(t.inSSR,p):ec(t.inSSR,p))+"(",e),eu(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map((e=>e||"null"))}([i,s,a,l,c]),t),n(")"),d&&n(")"),u&&(n(", "),tu(u,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:r,pure:o}=t,i=N(e.callee)?e.callee:r(e.callee);o&&n(Yc),n(i+"(",e),eu(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:r,deindent:o,newline:i}=t,{properties:s}=e;if(!s.length)return void n("{}",e);const a=s.length>1||!1;n(a?"{":"{ "),a&&r();for(let e=0;e<s.length;e++){const{key:r,value:o}=s[e];ou(r,t),n(": "),tu(o,t),e<s.length-1&&(n(","),i())}a&&o(),n(a?"}":" }")}(e,t);break;case 17:!function(e,t){Qc(e.elements,t)}(e,t);break;case 18:!function(e,t){const{push:n,indent:r,deindent:o}=t,{params:i,returns:s,body:a,newline:l,isSlot:c}=e;c&&n(`_${El[yl]}(`),n("(",e),M(i)?eu(i,t):i&&tu(i,t),n(") => "),(l||a)&&(n("{"),r()),s?(l&&n("return "),M(s)?Qc(s,t):tu(s,t)):a&&tu(a,t),(l||a)&&(o(),n("}")),c&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}(e,t);break;case 19:!function(e,t){const{test:n,consequent:r,alternate:o,newline:i}=e,{push:s,indent:a,deindent:l,newline:c}=t;if(4===n.type){const e=!Wl(n.content);e&&s("("),nu(n,t),e&&s(")")}else s("("),tu(n,t),s(")");i&&a(),t.indentLevel++,i||s(" "),s("? "),tu(r,t),t.indentLevel--,i&&c(),i||s(" "),s(": ");const u=19===o.type;u||t.indentLevel++,tu(o,t),u||t.indentLevel--,i&&l(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:r,indent:o,deindent:i,newline:s}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(o(),n(`${r(vl)}(-1),`),s()),n(`_cache[${e.index}] = `),tu(e.value,t),e.isVNode&&(n(","),s(),n(`${r(vl)}(1),`),s(),n(`_cache[${e.index}]`),i()),n(")")}(e,t);break;case 21:eu(e.body,t,!0,!1)}}function nu(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,e)}function ru(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];N(r)?t.push(r):tu(r,t)}}function ou(e,t){const{push:n}=t;8===e.type?(n("["),ru(e,t),n("]")):e.isStatic?n(Wl(e.content)?e.content:JSON.stringify(e.content),e):n(`[${e.content}]`,e)}new RegExp("\\b"+"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b")+"\\b");const iu=Kc(/^(if|else|else-if)$/,((e,t,n)=>function(e,t,n,r){if(!("else"===t.name||t.exp&&t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(Na(28,t.loc)),t.exp=Dl("true",!1,r)}if("if"===t.name){const o=su(e,t),i={type:9,loc:e.loc,branches:[o]};if(n.replaceNode(i),r)return r(i,o,!0)}else{const o=n.parent.children;let i=o.indexOf(e);for(;i-- >=-1;){const s=o[i];if(s&&3===s.type)n.removeNode(s);else{if(!s||2!==s.type||s.content.trim().length){if(s&&9===s.type){"else-if"===t.name&&void 0===s.branches[s.branches.length-1].condition&&n.onError(Na(30,e.loc)),n.removeNode();const o=su(e,t);s.branches.push(o);const i=r&&r(s,o,!1);Uc(o,n),i&&i(),n.currentNode=null}else n.onError(Na(30,e.loc));break}n.removeNode(s)}}}}(e,t,n,((e,t,r)=>{const o=n.parent.children;let i=o.indexOf(e),s=0;for(;i-- >=0;){const e=o[i];e&&9===e.type&&(s+=e.branches.length)}return()=>{if(r)e.codegenNode=au(t,s,n);else{const r=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode);r.alternate=au(t,s+e.branches.length-1,n)}}}))));function su(e,t){const n=3===e.tagType;return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:n&&!Ul(e,"for")?e.children:[e],userKey:Kl(e,"key"),isTemplateIf:n}}function au(e,t,n){return e.condition?Il(e.condition,lu(e,t,n),Rl(n.helper(Ya),['""',"true"])):lu(e,t,n)}function lu(e,t,n){const{helper:r}=n,o=Al("key",Dl(`${t}`,!1,Cl,2)),{children:i}=e,s=i[0];if(1!==i.length||1!==s.type){if(1===i.length&&11===s.type){const e=s.codegenNode;return oc(e,o,n),e}{let t=64;return _l(n,r(Wa),Ll([o]),i,t+"",void 0,void 0,!0,!1,!1,e.loc)}}{const e=s.codegenNode,t=14===(a=e).type&&a.callee===kl?a.arguments[1].returns:a;return 13===t.type&&ac(t,n),oc(t,o,n),e}var a}const cu=Kc("for",((e,t,n)=>{const{helper:r,removeHelper:o}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(Na(31,t.loc));const o=pu(t.exp);if(!o)return void n.onError(Na(32,t.loc));const{addIdentifiers:i,removeIdentifiers:s,scopes:a}=n,{source:l,value:c,key:u,index:d}=o,h={type:11,loc:t.loc,source:l,valueAlias:c,keyAlias:u,objectIndexAlias:d,parseResult:o,children:Jl(e)?e.children:[e]};n.replaceNode(h),a.vFor++;const p=r&&r(h);return()=>{a.vFor--,p&&p()}}(e,t,n,(t=>{const i=Rl(r(rl),[t.source]),s=Jl(e),a=Ul(e,"memo"),l=Kl(e,"key"),c=l&&(6===l.type?Dl(l.value.content,!0):l.exp),u=l?Al("key",c):null,d=4===t.source.type&&t.source.constType>0,h=d?64:l?128:256;return t.codegenNode=_l(n,r(Wa),void 0,i,h+"",void 0,void 0,!0,!d,!1,e.loc),()=>{let l;const{children:h}=t,p=1!==h.length||1!==h[0].type,f=Ql(e)?e:s&&1===e.children.length&&Ql(e.children[0])?e.children[0]:null;if(f?(l=f.codegenNode,s&&u&&oc(l,u,n)):p?l=_l(n,r(Wa),u?Ll([u]):void 0,e.children,"64",void 0,void 0,!0,void 0,!1):(l=h[0].codegenNode,s&&u&&oc(l,u,n),l.isBlock!==!d&&(l.isBlock?(o(qa),o(tc(n.inSSR,l.isComponent))):o(ec(n.inSSR,l.isComponent))),l.isBlock=!d,l.isBlock?(r(qa),r(tc(n.inSSR,l.isComponent))):r(ec(n.inSSR,l.isComponent))),a){const e=Ml(mu(t.parseResult,[Dl("_cached")]));e.body={type:21,body:[Ol(["const _memo = (",a.exp,")"]),Ol(["if (_cached",...c?[" && _cached.key === ",c]:[],` && ${n.helperString(xl)}(_cached, _memo)) return _cached`]),Ol(["const _item = ",l]),Dl("_item.memo = _memo"),Dl("return _item")],loc:Cl},i.arguments.push(e,Dl("_cache"),Dl(String(n.cached++)))}else i.arguments.push(Ml(mu(t.parseResult),l,!0))}}))})),uu=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,du=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,hu=/^\(|\)$/g;function pu(e,t){const n=e.loc,r=e.content,o=r.match(uu);if(!o)return;const[,i,s]=o,a={source:fu(n,s.trim(),r.indexOf(s,i.length)),value:void 0,key:void 0,index:void 0};let l=i.trim().replace(hu,"").trim();const c=i.indexOf(l),u=l.match(du);if(u){l=l.replace(du,"").trim();const e=u[1].trim();let t;if(e&&(t=r.indexOf(e,c+l.length),a.key=fu(n,e,t)),u[2]){const o=u[2].trim();o&&(a.index=fu(n,o,r.indexOf(o,a.key?t+e.length:c+l.length)))}}return l&&(a.value=fu(n,l,c)),a}function fu(e,t,n){return Dl(t,!1,ql(e,n,t.length))}function mu({value:e,key:t,index:n},r=[]){return function(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map(((e,t)=>e||Dl("_".repeat(t+1),!1)))}([e,t,n,...r])}const vu=Dl("undefined",!1),gu=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=Ul(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},bu=(e,t,n)=>Ml(e,t,!1,!0,t.length?t[0].loc:n);function yu(e,t,n=bu){t.helper(yl);const{children:r,loc:o}=e,i=[],s=[];let a=t.scopes.vSlot>0||t.scopes.vFor>0;const l=Ul(e,"slot",!0);if(l){const{arg:e,exp:t}=l;e&&!Fl(e)&&(a=!0),i.push(Al(e||Dl("default",!0),n(t,r,o)))}let c=!1,u=!1;const d=[],h=new Set;let p=0;for(let e=0;e<r.length;e++){const o=r[e];let f;if(!Jl(o)||!(f=Ul(o,"slot",!0))){3!==o.type&&d.push(o);continue}if(l){t.onError(Na(37,f.loc));break}c=!0;const{children:m,loc:v}=o,{arg:g=Dl("default",!0),exp:b,loc:y}=f;let w;Fl(g)?w=g?g.content:"default":a=!0;const S=n(b,m,v);let k,x,E;if(k=Ul(o,"if"))a=!0,s.push(Il(k.exp,wu(g,S,p++),vu));else if(x=Ul(o,/^else(-if)?$/,!0)){let n,o=e;for(;o--&&(n=r[o],3===n.type););if(n&&Jl(n)&&Ul(n,"if")){r.splice(e,1),e--;let t=s[s.length-1];for(;19===t.alternate.type;)t=t.alternate;t.alternate=x.exp?Il(x.exp,wu(g,S,p++),vu):wu(g,S,p++)}else t.onError(Na(30,x.loc))}else if(E=Ul(o,"for")){a=!0;const e=E.parseResult||pu(E.exp);e?s.push(Rl(t.helper(rl),[e.source,Ml(mu(e),wu(g,S),!0)])):t.onError(Na(32,E.loc))}else{if(w){if(h.has(w)){t.onError(Na(38,y));continue}h.add(w),"default"===w&&(u=!0)}i.push(Al(g,S))}}if(!l){const e=(e,r)=>{const i=n(e,r,o);return t.compatConfig&&(i.isNonScopedSlot=!0),Al("default",i)};c?d.length&&d.some((e=>ku(e)))&&(u?t.onError(Na(39,d[0].loc)):i.push(e(void 0,d))):i.push(e(void 0,r))}const f=a?2:Su(e.children)?3:1;let m=Ll(i.concat(Al("_",Dl(f+"",!1))),o);return s.length&&(m=Rl(t.helper(il),[m,Tl(s)])),{slots:m,hasDynamicSlots:a}}function wu(e,t,n){const r=[Al("name",e),Al("fn",t)];return null!=n&&r.push(Al("key",Dl(String(n),!0))),Ll(r)}function Su(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.type){case 1:if(2===n.tagType||Su(n.children))return!0;break;case 9:if(Su(n.branches))return!0;break;case 10:case 11:if(Su(n.children))return!0}}return!1}function ku(e){return 2!==e.type&&12!==e.type||(2===e.type?!!e.content.trim():ku(e.content))}const xu=new WeakMap,Eu=(e,t)=>function(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:r}=e,o=1===e.tagType;let i=o?function(e,t,n=!1){let{tag:r}=e;const o=Lu(r),i=Kl(e,"is");if(i)if(o||cc("COMPILER_IS_ON_ELEMENT",t)){const e=6===i.type?i.value&&Dl(i.value.content,!0):i.exp;if(e)return Rl(t.helper(Qa),[e])}else 6===i.type&&i.value.content.startsWith("vue:")&&(r=i.value.content.slice(4));const s=!o&&Ul(e,"is");if(s&&s.exp)return Rl(t.helper(Qa),[s.exp]);const a=Hl(r)||t.isBuiltInComponent(r);return a?(n||t.helper(a),a):(t.helper(Ja),t.components.add(r),sc(r,"component"))}(e,t):`"${n}"`;const s=B(i)&&i.callee===Qa;let a,l,c,u,d,h,p=0,f=s||i===Ba||i===Va||!o&&("svg"===n||"foreignObject"===n);if(r.length>0){const n=Cu(e,t,void 0,o,s);a=n.props,p=n.patchFlag,d=n.dynamicPropNames;const r=n.directives;h=r&&r.length?Tl(r.map((e=>function(e,t){const n=[],r=xu.get(e);r?n.push(t.helperString(r)):(t.helper(el),t.directives.add(e.name),n.push(sc(e.name,"directive")));const{loc:o}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push("void 0"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=Dl("true",!1,o);n.push(Ll(e.modifiers.map((e=>Al(e,t))),o))}return Tl(n,e.loc)}(e,t)))):void 0,n.shouldUseBlock&&(f=!0)}if(e.children.length>0)if(i===ja&&(f=!0,p|=1024),o&&i!==Ba&&i!==ja){const{slots:n,hasDynamicSlots:r}=yu(e,t);l=n,r&&(p|=1024)}else if(1===e.children.length&&i!==Ba){const n=e.children[0],r=n.type,o=5===r||8===r;o&&0===Bc(n,t)&&(p|=1),l=o||2===r?n:e.children}else l=e.children;0!==p&&(c=String(p),d&&d.length&&(u=function(e){let t="[";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=", ");return t+"]"}(d))),e.codegenNode=_l(t,i,a,l,c,u,h,!!f,!1,o,e.loc)};function Cu(e,t,n=e.props,r,o,i=!1){const{tag:s,loc:a,children:l}=e;let c=[];const u=[],d=[],h=l.length>0;let p=!1,f=0,m=!1,v=!1,g=!1,b=!1,y=!1,w=!1;const S=[],k=e=>{c.length&&(u.push(Ll(_u(c),a)),c=[]),e&&u.push(e)},x=({key:e,value:n})=>{if(Fl(e)){const i=e.content,s=T(i);if(!s||r&&!o||"onclick"===i.toLowerCase()||"onUpdate:modelValue"===i||Z(i)||(b=!0),s&&Z(i)&&(w=!0),20===n.type||(4===n.type||8===n.type)&&Bc(n,t)>0)return;"ref"===i?m=!0:"class"===i?v=!0:"style"===i?g=!0:"key"===i||S.includes(i)||S.push(i),!r||"class"!==i&&"style"!==i||S.includes(i)||S.push(i)}else y=!0};for(let o=0;o<n.length;o++){const l=n[o];if(6===l.type){const{loc:e,name:n,value:r}=l;let o=!0;if("ref"===n&&(m=!0,t.scopes.vFor>0&&c.push(Al(Dl("ref_for",!0),Dl("true")))),"is"===n&&(Lu(s)||r&&r.content.startsWith("vue:")||cc("COMPILER_IS_ON_ELEMENT",t)))continue;c.push(Al(Dl(n,!0,ql(e,0,n.length)),Dl(r?r.content:"",o,r?r.loc:e)))}else{const{name:n,arg:o,exp:f,loc:m}=l,v="bind"===n,g="on"===n;if("slot"===n){r||t.onError(Na(40,m));continue}if("once"===n||"memo"===n)continue;if("is"===n||v&&Yl(o,"is")&&(Lu(s)||cc("COMPILER_IS_ON_ELEMENT",t)))continue;if(g&&i)continue;if((v&&Yl(o,"key")||g&&h&&Yl(o,"vue:before-update"))&&(p=!0),v&&Yl(o,"ref")&&t.scopes.vFor>0&&c.push(Al(Dl("ref_for",!0),Dl("true"))),!o&&(v||g)){if(y=!0,f)if(v){if(k(),cc("COMPILER_V_BIND_OBJECT_ORDER",t)){u.unshift(f);continue}u.push(f)}else k({type:14,loc:m,callee:t.helper(hl),arguments:r?[f]:[f,"true"]});else t.onError(Na(v?34:35,m));continue}const b=t.directiveTransforms[n];if(b){const{props:n,needRuntime:r}=b(l,e,t);!i&&n.forEach(x),g&&o&&!Fl(o)?k(Ll(n,a)):c.push(...n),r&&(d.push(l),W(r)&&xu.set(l,r))}else U(n)||(d.push(l),h&&(p=!0))}}let E;if(u.length?(k(),E=u.length>1?Rl(t.helper(al),u,a):u[0]):c.length&&(E=Ll(_u(c),a)),y?f|=16:(v&&!r&&(f|=2),g&&!r&&(f|=4),S.length&&(f|=8),b&&(f|=32)),p||0!==f&&32!==f||!(m||w||d.length>0)||(f|=512),!t.inSSR&&E)switch(E.type){case 15:let e=-1,n=-1,r=!1;for(let t=0;t<E.properties.length;t++){const o=E.properties[t].key;Fl(o)?"class"===o.content?e=t:"style"===o.content&&(n=t):o.isHandlerKey||(r=!0)}const o=E.properties[e],i=E.properties[n];r?E=Rl(t.helper(ul),[E]):(o&&!Fl(o.value)&&(o.value=Rl(t.helper(ll),[o.value])),i&&(g||4===i.value.type&&"["===i.value.content.trim()[0]||17===i.value.type)&&(i.value=Rl(t.helper(cl),[i.value])));break;case 14:break;default:E=Rl(t.helper(ul),[Rl(t.helper(dl),[E])])}return{props:E,directives:d,patchFlag:f,dynamicPropNames:S,shouldUseBlock:p}}function _u(e){const t=new Map,n=[];for(let r=0;r<e.length;r++){const o=e[r];if(8===o.key.type||!o.key.isStatic){n.push(o);continue}const i=o.key.content,s=t.get(i);s?("style"===i||"class"===i||T(i))&&Tu(s,o):(t.set(i,o),n.push(o))}return n}function Tu(e,t){17===e.value.type?e.value.elements.push(t.value):e.value=Tl([e.value,t.value],e.loc)}function Lu(e){return"component"===e||"Component"===e}const Au=/-(\w)/g,Du=(e=>{const t=Object.create(null);return e=>t[e]||(t[e]=(e=>e.replace(Au,((e,t)=>t?t.toUpperCase():"")))(e))})(),Ou=(e,t)=>{if(Ql(e)){const{children:n,loc:r}=e,{slotName:o,slotProps:i}=function(e,t){let n,r='"default"';const o=[];for(let t=0;t<e.props.length;t++){const n=e.props[t];6===n.type?n.value&&("name"===n.name?r=JSON.stringify(n.value.content):(n.name=Du(n.name),o.push(n))):"bind"===n.name&&Yl(n.arg,"name")?n.exp&&(r=n.exp):("bind"===n.name&&n.arg&&Fl(n.arg)&&(n.arg.content=Du(n.arg.content)),o.push(n))}if(o.length>0){const{props:r,directives:i}=Cu(e,t,o,!1,!1);n=r,i.length&&t.onError(Na(36,i[0].loc))}return{slotName:r,slotProps:n}}(e,t),s=[t.prefixIdentifiers?"_ctx.$slots":"$slots",o,"{}","undefined","true"];let a=2;i&&(s[2]=i,a=3),n.length&&(s[3]=Ml([],n,!1,!1,r),a=4),t.scopeId&&!t.slotted&&(a=5),s.splice(a),e.codegenNode=Rl(t.helper(ol),s,r)}},Ru=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*(:[^=]+)?=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,Mu=(e,t,n,r)=>{const{loc:o,modifiers:i,arg:s}=e;let a;if(e.exp||i.length||n.onError(Na(35,o)),4===s.type)if(s.isStatic){let e=s.content;e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`),a=Dl(0!==t.tagType||e.startsWith("vnode")||!/[A-Z]/.test(e)?ee(G(e)):`on:${e}`,!0,s.loc)}else a=Ol([`${n.helperString(ml)}(`,s,")"]);else a=s,a.children.unshift(`${n.helperString(ml)}(`),a.children.push(")");let l=e.exp;l&&!l.content.trim()&&(l=void 0);let c=n.cacheHandlers&&!l&&!n.inVOnce;if(l){const e=zl(l.content),t=!(e||Ru.test(l.content)),n=l.content.includes(";");(t||c&&e)&&(l=Ol([`${t?"$event":"(...args)"} => ${n?"{":"("}`,l,n?"}":")"]))}let u={props:[Al(a,l||Dl("() => {}",!1,o))]};return r&&(u=r(u)),c&&(u.props[0].value=n.cache(u.props[0].value)),u.props.forEach((e=>e.key.isHandlerKey=!0)),u},Iu=(e,t,n)=>{const{exp:r,modifiers:o,loc:i}=e,s=e.arg;return 4!==s.type?(s.children.unshift("("),s.children.push(') || ""')):s.isStatic||(s.content=`${s.content} || ""`),o.includes("camel")&&(4===s.type?s.isStatic?s.content=G(s.content):s.content=`${n.helperString(pl)}(${s.content})`:(s.children.unshift(`${n.helperString(pl)}(`),s.children.push(")"))),n.inSSR||(o.includes("prop")&&Fu(s,"."),o.includes("attr")&&Fu(s,"^")),!r||4===r.type&&!r.content.trim()?(n.onError(Na(34,i)),{props:[Al(s,Dl("",!0,i))]}):{props:[Al(s,r)]}},Fu=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},Pu=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let r,o=!1;for(let e=0;e<n.length;e++){const t=n[e];if(Gl(t)){o=!0;for(let o=e+1;o<n.length;o++){const i=n[o];if(!Gl(i)){r=void 0;break}r||(r=n[e]=Ol([t],t.loc)),r.children.push(" + ",i),n.splice(o,1),o--}}}if(o&&(1!==n.length||0!==e.type&&(1!==e.type||0!==e.tagType||e.props.find((e=>7===e.type&&!t.directiveTransforms[e.name]))||"template"===e.tag)))for(let e=0;e<n.length;e++){const r=n[e];if(Gl(r)||8===r.type){const o=[];2===r.type&&" "===r.content||o.push(r),t.ssr||0!==Bc(r,t)||o.push("1"),n[e]={type:12,content:r,loc:r.loc,codegenNode:Rl(t.helper(Ga),o)}}}}},Hu=new WeakSet,Nu=(e,t)=>{if(1===e.type&&Ul(e,"once",!0)){if(Hu.has(e)||t.inVOnce)return;return Hu.add(e),t.inVOnce=!0,t.helper(vl),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},Wu=(e,t,n)=>{const{exp:r,arg:o}=e;if(!r)return n.onError(Na(41,e.loc)),Bu();const i=r.loc.source,s=4===r.type?r.content:i,a=n.bindingMetadata[i];if("props"===a||"props-aliased"===a)return n.onError(Na(44,r.loc)),Bu();if(!s.trim()||!zl(s))return n.onError(Na(42,r.loc)),Bu();const l=o||Dl("modelValue",!0),c=o?Fl(o)?`onUpdate:${G(o.content)}`:Ol(['"onUpdate:" + ',o]):"onUpdate:modelValue";let u;u=Ol([(n.isTS?"($event: any)":"$event")+" => ((",r,") = $event)"]);const d=[Al(l,e.exp),Al(c,u)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(Wl(e)?e:JSON.stringify(e))+": true")).join(", "),n=o?Fl(o)?`${o.content}Modifiers`:Ol([o,' + "Modifiers"']):"modelModifiers";d.push(Al(n,Dl(`{ ${t} }`,!1,e.loc,2)))}return Bu(d)};function Bu(e=[]){return{props:e}}const Vu=/[\w).+\-_$\]]/,ju=(e,t)=>{cc("COMPILER_FILTER",t)&&(5===e.type&&zu(e.content,t),1===e.type&&e.props.forEach((e=>{7===e.type&&"for"!==e.name&&e.exp&&zu(e.exp,t)})))};function zu(e,t){if(4===e.type)qu(e,t);else for(let n=0;n<e.children.length;n++){const r=e.children[n];"object"==typeof r&&(4===r.type?qu(r,t):8===r.type?zu(e,t):5===r.type&&zu(r.content,t))}}function qu(e,t){const n=e.content;let r,o,i,s,a=!1,l=!1,c=!1,u=!1,d=0,h=0,p=0,f=0,m=[];for(i=0;i<n.length;i++)if(o=r,r=n.charCodeAt(i),a)39===r&&92!==o&&(a=!1);else if(l)34===r&&92!==o&&(l=!1);else if(c)96===r&&92!==o&&(c=!1);else if(u)47===r&&92!==o&&(u=!1);else if(124!==r||124===n.charCodeAt(i+1)||124===n.charCodeAt(i-1)||d||h||p){switch(r){case 34:l=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:p++;break;case 41:p--;break;case 91:h++;break;case 93:h--;break;case 123:d++;break;case 125:d--}if(47===r){let e,t=i-1;for(;t>=0&&(e=n.charAt(t)," "===e);t--);e&&Vu.test(e)||(u=!0)}}else void 0===s?(f=i+1,s=n.slice(0,i).trim()):v();function v(){m.push(n.slice(f,i).trim()),f=i+1}if(void 0===s?s=n.slice(0,i).trim():0!==f&&v(),m.length){for(i=0;i<m.length;i++)s=$u(s,m[i],t);e.content=s}}function $u(e,t,n){n.helper(tl);const r=t.indexOf("(");if(r<0)return n.filters.add(t),`${sc(t,"filter")}(${e})`;{const o=t.slice(0,r),i=t.slice(r+1);return n.filters.add(o),`${sc(o,"filter")}(${e}${")"!==i?","+i:i}`}}const Zu=new WeakSet,Uu=(e,t)=>{if(1===e.type){const n=Ul(e,"memo");if(!n||Zu.has(e))return;return Zu.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&ac(r,t),e.codegenNode=Rl(t.helper(kl),[n.exp,Ml(void 0,r),"_cache",String(t.cached++)]))}}};function Ku(e,t={}){const n=t.onError||Pa,r="module"===t.mode;!0===t.prefixIdentifiers?n(Na(47)):r&&n(Na(48)),t.cacheHandlers&&n(Na(49)),t.scopeId&&!r&&n(Na(50));const o=N(e)?function(e,t={}){const n=function(e,t){const n=A({},pc);let r;for(r in t)n[r]=void 0===t[r]?pc[r]:t[r];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1,onWarn:n.onWarn}}(e,t),r=Tc(n);return function(e,t=Cl){return{type:0,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}(fc(n,0,[]),Lc(n,r))}(e,t):e,[i,s]=[[Nu,iu,Uu,cu,ju,Ou,Eu,gu,Pu],{on:Mu,bind:Iu,model:Wu}];return Zc(o,A({},t,{prefixIdentifiers:!1,nodeTransforms:[...i,...t.nodeTransforms||[]],directiveTransforms:A({},s,t.directiveTransforms||{})})),Xc(o,A({},t,{prefixIdentifiers:!1}))}const Yu=Symbol(""),Gu=Symbol(""),Xu=Symbol(""),Ju=Symbol(""),Qu=Symbol(""),ed=Symbol(""),td=Symbol(""),nd=Symbol(""),rd=Symbol(""),od=Symbol("");var id;let sd;id={[Yu]:"vModelRadio",[Gu]:"vModelCheckbox",[Xu]:"vModelText",[Ju]:"vModelSelect",[Qu]:"vModelDynamic",[ed]:"withModifiers",[td]:"withKeys",[nd]:"vShow",[rd]:"Transition",[od]:"TransitionGroup"},Object.getOwnPropertySymbols(id).forEach((e=>{El[e]=id[e]}));const ad=o("style,iframe,script,noscript",!0),ld={isVoidTag:m,isNativeTag:e=>p(e)||f(e),isPreTag:e=>"pre"===e,decodeEntities:function(e,t=!1){return sd||(sd=document.createElement("div")),t?(sd.innerHTML=`<div foo="${e.replace(/"/g,"&quot;")}">`,sd.children[0].getAttribute("foo")):(sd.innerHTML=e,sd.textContent)},isBuiltInComponent:e=>Pl(e,"Transition")?rd:Pl(e,"TransitionGroup")?od:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else t&&1===n&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0));if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(ad(e))return 2}return 0}},cd=(e,t)=>{const n=u(e);return Dl(JSON.stringify(n),!1,t,3)};function ud(e,t){return Na(e,t)}const dd=o("passive,once,capture"),hd=o("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),pd=o("left,right"),fd=o("onkeyup,onkeydown,onkeypress",!0),md=(e,t)=>Fl(e)&&"onclick"===e.content.toLowerCase()?Dl(t,!0):4!==e.type?Ol(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,vd=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||(t.onError(ud(61,e.loc)),t.removeNode())},gd=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Dl("style",!0,t.loc),exp:cd(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],bd={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(ud(51,o)),t.children.length&&(n.onError(ud(52,o)),t.children.length=0),{props:[Al(Dl("innerHTML",!0,o),r||Dl("",!0))]}},text:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(ud(53,o)),t.children.length&&(n.onError(ud(54,o)),t.children.length=0),{props:[Al(Dl("textContent",!0),r?Bc(r,n)>0?r:Rl(n.helperString(sl),[r],o):Dl("",!0))]}},model:(e,t,n)=>{const r=Wu(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(ud(56,e.arg.loc));const{tag:o}=t,i=n.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||i){let s=Xu,a=!1;if("input"===o||i){const r=Kl(t,"type");if(r){if(7===r.type)s=Qu;else if(r.value)switch(r.value.content){case"radio":s=Yu;break;case"checkbox":s=Gu;break;case"file":a=!0,n.onError(ud(57,e.loc))}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(s=Qu)}else"select"===o&&(s=Ju);a||(r.needRuntime=n.helper(s))}else n.onError(ud(55,e.loc));return r.props=r.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),r},on:(e,t,n)=>Mu(e,t,n,(t=>{const{modifiers:r}=e;if(!r.length)return t;let{key:o,value:i}=t.props[0];const{keyModifiers:s,nonKeyModifiers:a,eventOptionModifiers:l}=((e,t,n,r)=>{const o=[],i=[],s=[];for(let r=0;r<t.length;r++){const a=t[r];"native"===a&&uc("COMPILER_V_ON_NATIVE",n)||dd(a)?s.push(a):pd(a)?Fl(e)?fd(e.content)?o.push(a):i.push(a):(o.push(a),i.push(a)):hd(a)?i.push(a):o.push(a)}return{keyModifiers:o,nonKeyModifiers:i,eventOptionModifiers:s}})(o,r,n,e.loc);if(a.includes("right")&&(o=md(o,"onContextmenu")),a.includes("middle")&&(o=md(o,"onMouseup")),a.length&&(i=Rl(n.helper(ed),[i,JSON.stringify(a)])),!s.length||Fl(o)&&!fd(o.content)||(i=Rl(n.helper(td),[i,JSON.stringify(s)])),l.length){const e=l.map(Q).join("");o=Fl(o)?Dl(`${o.content}${e}`,!0):Ol(["(",o,`) + "${e}"`])}return{props:[Al(o,i)]}})),show:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(ud(59,o)),{props:[],needRuntime:n.helper(nd)}}},yd=Object.create(null);Wi((function(e,t){if(!N(e)){if(!e.nodeType)return E;e=e.innerHTML}const n=e,o=yd[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);e=t?t.innerHTML:""}const i=A({hoistStatic:!0,onError:void 0,onWarn:E},t);i.isCustomElement||"undefined"==typeof customElements||(i.isCustomElement=e=>!!customElements.get(e));const{code:s}=function(e,t={}){return Ku(e,A({},ld,t,{nodeTransforms:[vd,...gd,...t.nodeTransforms||[]],directiveTransforms:A({},bd,t.directiveTransforms||{}),transformHoist:null}))}(e,i),a=new Function("Vue",s)(r);return a._rc=!0,yd[n]=a}))},515:(e,t,n)=>{var r={"./index.ts":269};function o(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=i,e.exports=o,o.id=515},884:e=>{"use strict";e.exports=()=>window.__DOCS__},984:e=>{"use strict";e.exports=__DOCS_CONFIG__},678:(e,t,n)=>{"use strict";function r(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function o(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const o=r(n);return(e,n)=>o.then((r=>n(r.transaction(t,e).objectStore(t))))}let i;function s(){return i||(i=o("keyval-store","keyval")),i}function a(e,t=s()){return t("readonly",(t=>r(t.get(e))))}function l(e,t,n=s()){return n("readwrite",(n=>(n.put(t,e),r(n.transaction))))}function c(e,t=s()){return t("readwrite",(t=>(t.delete(e),r(t.transaction))))}n.d(t,{IV:()=>c,MT:()=>o,U2:()=>a,t8:()=>l})},430:(e,t,n)=>{"use strict";n.d(t,{Z:()=>G});var r=n(807);const o=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)},i="object"==typeof global&&global&&global.Object===Object&&global;var s="object"==typeof self&&self&&self.Object===Object&&self;const a=i||s||Function("return this")(),l=function(){return a.Date.now()};var c=/\s/;var u=/^\s+/;const d=function(e){return e?e.slice(0,function(e){for(var t=e.length;t--&&c.test(e.charAt(t)););return t}(e)+1).replace(u,""):e},h=a.Symbol;var p=Object.prototype,f=p.hasOwnProperty,m=p.toString,v=h?h.toStringTag:void 0;var g=Object.prototype.toString;var b=h?h.toStringTag:void 0;const y=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":b&&b in Object(e)?function(e){var t=f.call(e,v),n=e[v];try{e[v]=void 0;var r=!0}catch(e){}var o=m.call(e);return r&&(t?e[v]=n:delete e[v]),o}(e):function(e){return g.call(e)}(e)};var w=/^[-+]0x[0-9a-f]+$/i,S=/^0b[01]+$/i,k=/^0o[0-7]+$/i,x=parseInt;const E=function(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return null!=e&&"object"==typeof e}(e)&&"[object Symbol]"==y(e)}(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=d(e);var n=S.test(e);return n||k.test(e)?x(e.slice(2),n?2:8):w.test(e)?NaN:+e};var C=Math.max,_=Math.min;const T=function(e,t,n){var r,i,s,a,c,u,d=0,h=!1,p=!1,f=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function m(t){var n=r,o=i;return r=i=void 0,d=t,a=e.apply(o,n)}function v(e){return d=e,c=setTimeout(b,t),h?m(e):a}function g(e){var n=e-u;return void 0===u||n>=t||n<0||p&&e-d>=s}function b(){var e=l();if(g(e))return y(e);c=setTimeout(b,function(e){var n=t-(e-u);return p?_(n,s-(e-d)):n}(e))}function y(e){return c=void 0,f&&r?m(e):(r=i=void 0,a)}function w(){var e=l(),n=g(e);if(r=arguments,i=this,u=e,n){if(void 0===c)return v(u);if(p)return clearTimeout(c),c=setTimeout(b,t),m(u)}return void 0===c&&(c=setTimeout(b,t)),a}return t=E(t)||0,o(n)&&(h=!!n.leading,s=(p="maxWait"in n)?C(E(n.maxWait)||0,t):s,f="trailing"in n?!!n.trailing:f),w.cancel=function(){void 0!==c&&clearTimeout(c),d=0,r=u=i=c=void 0},w.flush=function(){return void 0===c?a:y(l())},w};var L=function(){return L=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},L.apply(this,arguments)},A=null,D=null;function O(){if(null===A){if("undefined"==typeof document)return A=0;var e=document.body,t=document.createElement("div");t.classList.add("simplebar-hide-scrollbar"),e.appendChild(t);var n=t.getBoundingClientRect().right;e.removeChild(t),A=n}return A}function R(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView?e.ownerDocument.defaultView:window}function M(e){return e&&e.ownerDocument?e.ownerDocument:document}r&&window.addEventListener("resize",(function(){D!==window.devicePixelRatio&&(D=window.devicePixelRatio,A=null)}));var I=function(e){return Array.prototype.reduce.call(e,(function(e,t){var n=t.name.match(/data-simplebar-(.+)/);if(n){var r=n[1].replace(/\W+(.)/g,(function(e,t){return t.toUpperCase()}));switch(t.value){case"true":e[r]=!0;break;case"false":e[r]=!1;break;case void 0:e[r]=!0;break;default:e[r]=t.value}}return e}),{})};function F(e,t){var n;e&&(n=e.classList).add.apply(n,t.split(" "))}function P(e,t){e&&t.split(" ").forEach((function(t){e.classList.remove(t)}))}function H(e){return".".concat(e.split(" ").join("."))}var N=Object.freeze({__proto__:null,addClasses:F,classNamesToQuery:H,getElementDocument:M,getElementWindow:R,getOptions:I,removeClasses:P}),W=R,B=M,V=I,j=F,z=P,q=H,$=function(){function e(t,n){void 0===n&&(n={});var r=this;if(this.removePreventClickId=null,this.minScrollbarWidth=20,this.stopScrollDelay=175,this.isScrolling=!1,this.isMouseEntering=!1,this.scrollXTicking=!1,this.scrollYTicking=!1,this.wrapperEl=null,this.contentWrapperEl=null,this.contentEl=null,this.offsetEl=null,this.maskEl=null,this.placeholderEl=null,this.heightAutoObserverWrapperEl=null,this.heightAutoObserverEl=null,this.rtlHelpers=null,this.scrollbarWidth=0,this.resizeObserver=null,this.mutationObserver=null,this.elStyles=null,this.isRtl=null,this.mouseX=0,this.mouseY=0,this.onMouseMove=function(){},this.onWindowResize=function(){},this.onStopScrolling=function(){},this.onMouseEntered=function(){},this.onScroll=function(){var e=W(r.el);r.scrollXTicking||(e.requestAnimationFrame(r.scrollX),r.scrollXTicking=!0),r.scrollYTicking||(e.requestAnimationFrame(r.scrollY),r.scrollYTicking=!0),r.isScrolling||(r.isScrolling=!0,j(r.el,r.classNames.scrolling)),r.showScrollbar("x"),r.showScrollbar("y"),r.onStopScrolling()},this.scrollX=function(){r.axis.x.isOverflowing&&r.positionScrollbar("x"),r.scrollXTicking=!1},this.scrollY=function(){r.axis.y.isOverflowing&&r.positionScrollbar("y"),r.scrollYTicking=!1},this._onStopScrolling=function(){z(r.el,r.classNames.scrolling),r.options.autoHide&&(r.hideScrollbar("x"),r.hideScrollbar("y")),r.isScrolling=!1},this.onMouseEnter=function(){r.isMouseEntering||(j(r.el,r.classNames.mouseEntered),r.showScrollbar("x"),r.showScrollbar("y"),r.isMouseEntering=!0),r.onMouseEntered()},this._onMouseEntered=function(){z(r.el,r.classNames.mouseEntered),r.options.autoHide&&(r.hideScrollbar("x"),r.hideScrollbar("y")),r.isMouseEntering=!1},this._onMouseMove=function(e){r.mouseX=e.clientX,r.mouseY=e.clientY,(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseMoveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseMoveForAxis("y")},this.onMouseLeave=function(){r.onMouseMove.cancel(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseLeaveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseLeaveForAxis("y"),r.mouseX=-1,r.mouseY=-1},this._onWindowResize=function(){r.scrollbarWidth=r.getScrollbarWidth(),r.hideNativeScrollbar()},this.onPointerEvent=function(e){var t,n;r.axis.x.track.el&&r.axis.y.track.el&&r.axis.x.scrollbar.el&&r.axis.y.scrollbar.el&&(r.axis.x.track.rect=r.axis.x.track.el.getBoundingClientRect(),r.axis.y.track.rect=r.axis.y.track.el.getBoundingClientRect(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&(t=r.isWithinBounds(r.axis.x.track.rect)),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&(n=r.isWithinBounds(r.axis.y.track.rect)),(t||n)&&(e.stopPropagation(),"pointerdown"===e.type&&"touch"!==e.pointerType&&(t&&(r.axis.x.scrollbar.rect=r.axis.x.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.x.scrollbar.rect)?r.onDragStart(e,"x"):r.onTrackClick(e,"x")),n&&(r.axis.y.scrollbar.rect=r.axis.y.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.y.scrollbar.rect)?r.onDragStart(e,"y"):r.onTrackClick(e,"y")))))},this.drag=function(t){var n,o,i,s,a,l,c,u,d,h,p;if(r.draggedAxis&&r.contentWrapperEl){var f=r.axis[r.draggedAxis].track,m=null!==(o=null===(n=f.rect)||void 0===n?void 0:n[r.axis[r.draggedAxis].sizeAttr])&&void 0!==o?o:0,v=r.axis[r.draggedAxis].scrollbar,g=null!==(s=null===(i=r.contentWrapperEl)||void 0===i?void 0:i[r.axis[r.draggedAxis].scrollSizeAttr])&&void 0!==s?s:0,b=parseInt(null!==(l=null===(a=r.elStyles)||void 0===a?void 0:a[r.axis[r.draggedAxis].sizeAttr])&&void 0!==l?l:"0px",10);t.preventDefault(),t.stopPropagation();var y=("y"===r.draggedAxis?t.pageY:t.pageX)-(null!==(u=null===(c=f.rect)||void 0===c?void 0:c[r.axis[r.draggedAxis].offsetAttr])&&void 0!==u?u:0)-r.axis[r.draggedAxis].dragOffset,w=(y=r.isRtl?(null!==(h=null===(d=f.rect)||void 0===d?void 0:d[r.axis[r.draggedAxis].sizeAttr])&&void 0!==h?h:0)-v.size-y:y)/(m-v.size)*(g-b);"x"===r.draggedAxis&&r.isRtl&&(w=(null===(p=e.getRtlHelpers())||void 0===p?void 0:p.isScrollingToNegative)?-w:w),r.contentWrapperEl[r.axis[r.draggedAxis].scrollOffsetAttr]=w}},this.onEndDrag=function(e){var t=B(r.el),n=W(r.el);e.preventDefault(),e.stopPropagation(),z(r.el,r.classNames.dragging),t.removeEventListener("mousemove",r.drag,!0),t.removeEventListener("mouseup",r.onEndDrag,!0),r.removePreventClickId=n.setTimeout((function(){t.removeEventListener("click",r.preventClick,!0),t.removeEventListener("dblclick",r.preventClick,!0),r.removePreventClickId=null}))},this.preventClick=function(e){e.preventDefault(),e.stopPropagation()},this.el=t,this.options=L(L({},e.defaultOptions),n),this.classNames=L(L({},e.defaultOptions.classNames),n.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,forceVisible:!1,track:{size:null,el:null,rect:null,isVisible:!1},scrollbar:{size:null,el:null,rect:null,isVisible:!1}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,forceVisible:!1,track:{size:null,el:null,rect:null,isVisible:!1},scrollbar:{size:null,el:null,rect:null,isVisible:!1}}},"object"!=typeof this.el||!this.el.nodeName)throw new Error("Argument passed to SimpleBar must be an HTML element instead of ".concat(this.el));this.onMouseMove=function(e,t,n){var r=!0,i=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return o(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),T(e,t,{leading:r,maxWait:t,trailing:i})}(this._onMouseMove,64),this.onWindowResize=T(this._onWindowResize,64,{leading:!0}),this.onStopScrolling=T(this._onStopScrolling,this.stopScrollDelay),this.onMouseEntered=T(this._onMouseEntered,this.stopScrollDelay),this.init()}return e.getRtlHelpers=function(){if(e.rtlHelpers)return e.rtlHelpers;var t=document.createElement("div");t.innerHTML='<div class="simplebar-dummy-scrollbar-size"><div></div></div>';var n=t.firstElementChild,r=null==n?void 0:n.firstElementChild;if(!r)return null;document.body.appendChild(n),n.scrollLeft=0;var o=e.getOffset(n),i=e.getOffset(r);n.scrollLeft=-999;var s=e.getOffset(r);return document.body.removeChild(n),e.rtlHelpers={isScrollOriginAtZero:o.left!==i.left,isScrollingToNegative:i.left!==s.left},e.rtlHelpers},e.prototype.getScrollbarWidth=function(){try{return this.contentWrapperEl&&"none"===getComputedStyle(this.contentWrapperEl,"::-webkit-scrollbar").display||"scrollbarWidth"in document.documentElement.style||"-ms-overflow-style"in document.documentElement.style?0:O()}catch(e){return O()}},e.getOffset=function(e){var t=e.getBoundingClientRect(),n=B(e),r=W(e);return{top:t.top+(r.pageYOffset||n.documentElement.scrollTop),left:t.left+(r.pageXOffset||n.documentElement.scrollLeft)}},e.prototype.init=function(){r&&(this.initDOM(),this.rtlHelpers=e.getRtlHelpers(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},e.prototype.initDOM=function(){var e,t;this.wrapperEl=this.el.querySelector(q(this.classNames.wrapper)),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector(q(this.classNames.contentWrapper)),this.contentEl=this.options.contentNode||this.el.querySelector(q(this.classNames.contentEl)),this.offsetEl=this.el.querySelector(q(this.classNames.offset)),this.maskEl=this.el.querySelector(q(this.classNames.mask)),this.placeholderEl=this.findChild(this.wrapperEl,q(this.classNames.placeholder)),this.heightAutoObserverWrapperEl=this.el.querySelector(q(this.classNames.heightAutoObserverWrapperEl)),this.heightAutoObserverEl=this.el.querySelector(q(this.classNames.heightAutoObserverEl)),this.axis.x.track.el=this.findChild(this.el,"".concat(q(this.classNames.track)).concat(q(this.classNames.horizontal))),this.axis.y.track.el=this.findChild(this.el,"".concat(q(this.classNames.track)).concat(q(this.classNames.vertical))),this.axis.x.scrollbar.el=(null===(e=this.axis.x.track.el)||void 0===e?void 0:e.querySelector(q(this.classNames.scrollbar)))||null,this.axis.y.scrollbar.el=(null===(t=this.axis.y.track.el)||void 0===t?void 0:t.querySelector(q(this.classNames.scrollbar)))||null,this.options.autoHide||(j(this.axis.x.scrollbar.el,this.classNames.visible),j(this.axis.y.scrollbar.el,this.classNames.visible))},e.prototype.initListeners=function(){var e,t=this,n=W(this.el);if(this.el.addEventListener("mouseenter",this.onMouseEnter),this.el.addEventListener("pointerdown",this.onPointerEvent,!0),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),null===(e=this.contentWrapperEl)||void 0===e||e.addEventListener("scroll",this.onScroll),n.addEventListener("resize",this.onWindowResize),this.contentEl){if(window.ResizeObserver){var r=!1,o=n.ResizeObserver||ResizeObserver;this.resizeObserver=new o((function(){r&&n.requestAnimationFrame((function(){t.recalculate()}))})),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),n.requestAnimationFrame((function(){r=!0}))}this.mutationObserver=new n.MutationObserver((function(){n.requestAnimationFrame((function(){t.recalculate()}))})),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})}},e.prototype.recalculate=function(){if(this.heightAutoObserverEl&&this.contentEl&&this.contentWrapperEl&&this.wrapperEl&&this.placeholderEl){var e=W(this.el);this.elStyles=e.getComputedStyle(this.el),this.isRtl="rtl"===this.elStyles.direction;var t=this.contentEl.offsetWidth,n=this.heightAutoObserverEl.offsetHeight<=1,r=this.heightAutoObserverEl.offsetWidth<=1||t>0,o=this.contentWrapperEl.offsetWidth,i=this.elStyles.overflowX,s=this.elStyles.overflowY;this.contentEl.style.padding="".concat(this.elStyles.paddingTop," ").concat(this.elStyles.paddingRight," ").concat(this.elStyles.paddingBottom," ").concat(this.elStyles.paddingLeft),this.wrapperEl.style.margin="-".concat(this.elStyles.paddingTop," -").concat(this.elStyles.paddingRight," -").concat(this.elStyles.paddingBottom," -").concat(this.elStyles.paddingLeft);var a=this.contentEl.scrollHeight,l=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=n?"auto":"100%",this.placeholderEl.style.width=r?"".concat(t||l,"px"):"auto",this.placeholderEl.style.height="".concat(a,"px");var c=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=0!==t&&l>t,this.axis.y.isOverflowing=a>c,this.axis.x.isOverflowing="hidden"!==i&&this.axis.x.isOverflowing,this.axis.y.isOverflowing="hidden"!==s&&this.axis.y.isOverflowing,this.axis.x.forceVisible="x"===this.options.forceVisible||!0===this.options.forceVisible,this.axis.y.forceVisible="y"===this.options.forceVisible||!0===this.options.forceVisible,this.hideNativeScrollbar();var u=this.axis.x.isOverflowing?this.scrollbarWidth:0,d=this.axis.y.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&l>o-d,this.axis.y.isOverflowing=this.axis.y.isOverflowing&&a>c-u,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el&&(this.axis.x.scrollbar.el.style.width="".concat(this.axis.x.scrollbar.size,"px")),this.axis.y.scrollbar.el&&(this.axis.y.scrollbar.el.style.height="".concat(this.axis.y.scrollbar.size,"px")),this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")}},e.prototype.getScrollbarSize=function(e){var t,n;if(void 0===e&&(e="y"),!this.axis[e].isOverflowing||!this.contentEl)return 0;var r,o=this.contentEl[this.axis[e].scrollSizeAttr],i=null!==(n=null===(t=this.axis[e].track.el)||void 0===t?void 0:t[this.axis[e].offsetSizeAttr])&&void 0!==n?n:0,s=i/o;return r=Math.max(~~(s*i),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(r=Math.min(r,this.options.scrollbarMaxSize)),r},e.prototype.positionScrollbar=function(t){var n,r,o;void 0===t&&(t="y");var i=this.axis[t].scrollbar;if(this.axis[t].isOverflowing&&this.contentWrapperEl&&i.el&&this.elStyles){var s=this.contentWrapperEl[this.axis[t].scrollSizeAttr],a=(null===(n=this.axis[t].track.el)||void 0===n?void 0:n[this.axis[t].offsetSizeAttr])||0,l=parseInt(this.elStyles[this.axis[t].sizeAttr],10),c=this.contentWrapperEl[this.axis[t].scrollOffsetAttr];c="x"===t&&this.isRtl&&(null===(r=e.getRtlHelpers())||void 0===r?void 0:r.isScrollOriginAtZero)?-c:c,"x"===t&&this.isRtl&&(c=(null===(o=e.getRtlHelpers())||void 0===o?void 0:o.isScrollingToNegative)?c:-c);var u=c/(s-l),d=~~((a-i.size)*u);d="x"===t&&this.isRtl?-d+(a-i.size):d,i.el.style.transform="x"===t?"translate3d(".concat(d,"px, 0, 0)"):"translate3d(0, ".concat(d,"px, 0)")}},e.prototype.toggleTrackVisibility=function(e){void 0===e&&(e="y");var t=this.axis[e].track.el,n=this.axis[e].scrollbar.el;t&&n&&this.contentWrapperEl&&(this.axis[e].isOverflowing||this.axis[e].forceVisible?(t.style.visibility="visible",this.contentWrapperEl.style[this.axis[e].overflowAttr]="scroll",this.el.classList.add("".concat(this.classNames.scrollable,"-").concat(e))):(t.style.visibility="hidden",this.contentWrapperEl.style[this.axis[e].overflowAttr]="hidden",this.el.classList.remove("".concat(this.classNames.scrollable,"-").concat(e))),this.axis[e].isOverflowing?n.style.display="block":n.style.display="none")},e.prototype.showScrollbar=function(e){void 0===e&&(e="y"),this.axis[e].isOverflowing&&!this.axis[e].scrollbar.isVisible&&(j(this.axis[e].scrollbar.el,this.classNames.visible),this.axis[e].scrollbar.isVisible=!0)},e.prototype.hideScrollbar=function(e){void 0===e&&(e="y"),this.axis[e].isOverflowing&&this.axis[e].scrollbar.isVisible&&(z(this.axis[e].scrollbar.el,this.classNames.visible),this.axis[e].scrollbar.isVisible=!1)},e.prototype.hideNativeScrollbar=function(){this.offsetEl&&(this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-".concat(this.scrollbarWidth,"px"):"0px",this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-".concat(this.scrollbarWidth,"px"):"0px")},e.prototype.onMouseMoveForAxis=function(e){void 0===e&&(e="y");var t=this.axis[e];t.track.el&&t.scrollbar.el&&(t.track.rect=t.track.el.getBoundingClientRect(),t.scrollbar.rect=t.scrollbar.el.getBoundingClientRect(),this.isWithinBounds(t.track.rect)?(this.showScrollbar(e),j(t.track.el,this.classNames.hover),this.isWithinBounds(t.scrollbar.rect)?j(t.scrollbar.el,this.classNames.hover):z(t.scrollbar.el,this.classNames.hover)):(z(t.track.el,this.classNames.hover),this.options.autoHide&&this.hideScrollbar(e)))},e.prototype.onMouseLeaveForAxis=function(e){void 0===e&&(e="y"),z(this.axis[e].track.el,this.classNames.hover),z(this.axis[e].scrollbar.el,this.classNames.hover),this.options.autoHide&&this.hideScrollbar(e)},e.prototype.onDragStart=function(e,t){var n;void 0===t&&(t="y");var r=B(this.el),o=W(this.el),i=this.axis[t].scrollbar,s="y"===t?e.pageY:e.pageX;this.axis[t].dragOffset=s-((null===(n=i.rect)||void 0===n?void 0:n[this.axis[t].offsetAttr])||0),this.draggedAxis=t,j(this.el,this.classNames.dragging),r.addEventListener("mousemove",this.drag,!0),r.addEventListener("mouseup",this.onEndDrag,!0),null===this.removePreventClickId?(r.addEventListener("click",this.preventClick,!0),r.addEventListener("dblclick",this.preventClick,!0)):(o.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},e.prototype.onTrackClick=function(e,t){var n,r,o,i,s=this;void 0===t&&(t="y");var a=this.axis[t];if(this.options.clickOnTrack&&a.scrollbar.el&&this.contentWrapperEl){e.preventDefault();var l=W(this.el);this.axis[t].scrollbar.rect=a.scrollbar.el.getBoundingClientRect();var c=null!==(r=null===(n=this.axis[t].scrollbar.rect)||void 0===n?void 0:n[this.axis[t].offsetAttr])&&void 0!==r?r:0,u=parseInt(null!==(i=null===(o=this.elStyles)||void 0===o?void 0:o[this.axis[t].sizeAttr])&&void 0!==i?i:"0px",10),d=this.contentWrapperEl[this.axis[t].scrollOffsetAttr],h=("y"===t?this.mouseY-c:this.mouseX-c)<0?-1:1,p=-1===h?d-u:d+u,f=function(){s.contentWrapperEl&&(-1===h?d>p&&(d-=40,s.contentWrapperEl[s.axis[t].scrollOffsetAttr]=d,l.requestAnimationFrame(f)):d<p&&(d+=40,s.contentWrapperEl[s.axis[t].scrollOffsetAttr]=d,l.requestAnimationFrame(f)))};f()}},e.prototype.getContentElement=function(){return this.contentEl},e.prototype.getScrollElement=function(){return this.contentWrapperEl},e.prototype.removeListeners=function(){var e=W(this.el);this.el.removeEventListener("mouseenter",this.onMouseEnter),this.el.removeEventListener("pointerdown",this.onPointerEvent,!0),this.el.removeEventListener("mousemove",this.onMouseMove),this.el.removeEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl&&this.contentWrapperEl.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onWindowResize),this.mutationObserver&&this.mutationObserver.disconnect(),this.resizeObserver&&this.resizeObserver.disconnect(),this.onMouseMove.cancel(),this.onWindowResize.cancel(),this.onStopScrolling.cancel(),this.onMouseEntered.cancel()},e.prototype.unMount=function(){this.removeListeners()},e.prototype.isWithinBounds=function(e){return this.mouseX>=e.left&&this.mouseX<=e.left+e.width&&this.mouseY>=e.top&&this.mouseY<=e.top+e.height},e.prototype.findChild=function(e,t){var n=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector;return Array.prototype.filter.call(e.children,(function(e){return n.call(e,t)}))[0]},e.rtlHelpers=null,e.defaultOptions={forceVisible:!1,clickOnTrack:!0,scrollbarMinSize:25,scrollbarMaxSize:0,ariaLabel:"scrollable content",classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging",scrolling:"simplebar-scrolling",scrollable:"simplebar-scrollable",mouseEntered:"simplebar-mouse-entered"},scrollableNode:null,contentNode:null,autoHide:!0},e.getOptions=V,e.helpers=N,e}(),Z=function(e,t){return Z=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Z(e,t)},U=$.helpers,K=U.getOptions,Y=U.addClasses,G=function(e){function t(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];var o=e.apply(this,n)||this;return t.instances.set(n[0],o),o}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Z(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(t,e),t.initDOMLoadedElements=function(){document.removeEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.removeEventListener("load",this.initDOMLoadedElements),Array.prototype.forEach.call(document.querySelectorAll("[data-simplebar]"),(function(e){"init"===e.getAttribute("data-simplebar")||t.instances.has(e)||new t(e,K(e.attributes))}))},t.removeObserver=function(){var e;null===(e=t.globalObserver)||void 0===e||e.disconnect()},t.prototype.initDOM=function(){var e,t,n,r=this;if(!Array.prototype.filter.call(this.el.children,(function(e){return e.classList.contains(r.classNames.wrapper)})).length){for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),Y(this.wrapperEl,this.classNames.wrapper),Y(this.contentWrapperEl,this.classNames.contentWrapper),Y(this.offsetEl,this.classNames.offset),Y(this.maskEl,this.classNames.mask),Y(this.contentEl,this.classNames.contentEl),Y(this.placeholderEl,this.classNames.placeholder),Y(this.heightAutoObserverWrapperEl,this.classNames.heightAutoObserverWrapperEl),Y(this.heightAutoObserverEl,this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl),null===(e=this.contentWrapperEl)||void 0===e||e.setAttribute("tabindex","0"),null===(t=this.contentWrapperEl)||void 0===t||t.setAttribute("role","region"),null===(n=this.contentWrapperEl)||void 0===n||n.setAttribute("aria-label",this.options.ariaLabel)}if(!this.axis.x.track.el||!this.axis.y.track.el){var o=document.createElement("div"),i=document.createElement("div");Y(o,this.classNames.track),Y(i,this.classNames.scrollbar),o.appendChild(i),this.axis.x.track.el=o.cloneNode(!0),Y(this.axis.x.track.el,this.classNames.horizontal),this.axis.y.track.el=o.cloneNode(!0),Y(this.axis.y.track.el,this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}$.prototype.initDOM.call(this),this.el.setAttribute("data-simplebar","init")},t.prototype.unMount=function(){$.prototype.unMount.call(this),t.instances.delete(this.el)},t.initHtmlApi=function(){this.initDOMLoadedElements=this.initDOMLoadedElements.bind(this),"undefined"!=typeof MutationObserver&&(this.globalObserver=new MutationObserver(t.handleMutations),this.globalObserver.observe(document,{childList:!0,subtree:!0})),"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?window.setTimeout(this.initDOMLoadedElements):(document.addEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.addEventListener("load",this.initDOMLoadedElements))},t.handleMutations=function(e){e.forEach((function(e){e.addedNodes.forEach((function(e){1===e.nodeType&&(e.hasAttribute("data-simplebar")?!t.instances.has(e)&&document.documentElement.contains(e)&&new t(e,K(e.attributes)):e.querySelectorAll("[data-simplebar]").forEach((function(e){"init"!==e.getAttribute("data-simplebar")&&!t.instances.has(e)&&document.documentElement.contains(e)&&new t(e,K(e.attributes))})))})),e.removedNodes.forEach((function(e){1===e.nodeType&&("init"===e.getAttribute("data-simplebar")?t.instances.has(e)&&!document.documentElement.contains(e)&&t.instances.get(e).unMount():Array.prototype.forEach.call(e.querySelectorAll('[data-simplebar="init"]'),(function(e){t.instances.has(e)&&!document.documentElement.contains(e)&&t.instances.get(e).unMount()})))}))}))},t.instances=new WeakMap,t}($);r&&G.initHtmlApi()}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e=n(166),t=n(208),r=n(872),o=n(701),i=n(984),s=n.n(i),a=n(110);function l(e){setTimeout((function(){e(function(){var e;if("number"==typeof s().flags)e=s().flags;else{if(!c())return!1;if("number"!=typeof s().flags)return!1;e=s().flags}var n=p(h("73696465626172"),h("444F432D53494445424152"),h("646F63732D706F77657265642D6279"),document.children),r=0===n.length&&t.h.state.unloading;if(n.length>0)for(var o=0;o<n.length;++o){var i=n[o],a=null==i?void 0:i.firstChild,l=null==i?void 0:i.querySelector("svg");if(!(i&&a&&l&&i.getAttribute(h("68726566"))===h("68747470733A2F2F7265747970652E636F6D2F")&&a.innerHTML===h("506F7765726564206279")&&l.getAttribute(h("7769647468"))===h("3936")&&l.getAttribute(h("686569676874"))===h("3230")&&1045===l.innerHTML.replace(/\s+/g,"").split("").map((function(e){return e.charCodeAt(0)})).reduce((function(e,t){return e^23*t}),0)))return!1;r||i&&(i.offsetWidth||i.offsetHeight||i.getClientRects().length)&&(r=!0)}return r||(1&e)*(2&e)>0}())}),10)}function c(){var e,t=d();if(!t)return!1;for(var n=parseInt(t.checksum.slice(0,-5)||"0"),r=[s().id,t.fingerprint,".",t.signature,s().base,s().host,n.toString()],o=0,i=s().sidebar;o<i.length;o++){var a=i[o];r.push(null!==(e=a.l)&&void 0!==e?e:a.n)}for(var l=0,c=0,u=r;c<u.length;c++)for(var h=u[c],p=0;p<h.length;++p)l^=h.charCodeAt(p);return l===parseInt(t.checksum.slice(-5))&&(s().flags=n,!0)}function u(t,n,r){if(!n){var o="5B464154414C5D3A20436F".concat(727275,"7074656420776"),i=function(){t&&t.unmount();var e="56273697".concat(4652063,"6F6E66696775726174696F6E"),n=document.getElementById(h("646F63732D617070"));n&&(n.innerHTML="",window[h("636F6E736F6C65")][h("6572726F72")](h(o+e)))};r?(0,e.Y3)((function(){return i()})):i()}}function d(){var e=null===s()||void 0===s()?void 0:s().key;if(!e||"string"!=typeof e)return null;var t=e.indexOf(".");if(t<=0)return null;var n=e.lastIndexOf(".");if(n<=t)return null;for(var r={fingerprint:e.slice(0,t),signature:e.slice(t+1,n),checksum:e.slice(n+1)},o=r.signature.length%4;o>0;--o)r.signature+="=";return r}function h(e){for(var t="",n=0;n<e.length;n+=2)t+=String.fromCharCode(parseInt(e.substr(n,2),16));return t}function p(e,t,n,r,o,i){null!=i||(i=[]);for(var s=0;s<r.length;++s){var a=r[s];if("A"===a.nodeName&&a.classList.contains(n)&&a instanceof HTMLElement)i.push(a);else{var l=a.children.length?a.children:"TEMPLATE"===a.nodeName&&a instanceof HTMLTemplateElement&&a.content.children?a.content.children:null;(null==l?void 0:l.length)&&p(e,t,n,l,o,i)}}return i}var f=n(884),m=n.n(f);const v=()=>window.__DOCS_MERMAID__;var g=n.n(v);const b=()=>window.__DOCS_PRISM__;var y=n.n(b);const w=()=>window.__DOCS_KATEX__;var S,k=n.n(w),x=n(184),E=n(23),C=n(65),_=n(543),T=n(816),L=n(755),A=n(430),D=n(826),O=n.n(D),R=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},M=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,a[0]&&(s=0)),s;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,r=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){s.label=a[1];break}if(6===a[0]&&s.label<o[1]){s.label=o[1],o=a;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(a);break}o[2]&&s.ops.pop(),s.trys.pop();continue}a=t.call(e,s)}catch(e){a=[6,e],r=0}finally{n=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,l])}}},I=(S={},function(){return S});function F(e,t,n){return R(this,void 0,void 0,(function(){var r,o,i,s,a;return M(this,(function(l){switch(l.label){case 0:if(r=!1,o="/",i=I(),s=function(e,t){var n,r=e[t];if(r){var o=atob(r);return new Uint8Array((null!==(n=o.match(/[\s\S]/g))&&void 0!==n?n:[]).map((function(e){return e.charCodeAt(0)})))}return null}(i,o),s&&(r=H(e,s)),r)return[3,5];a=null,t(),l.label=1;case 1:return[4,P()];case 2:if(!(a=l.sent()))return[3,4];(r=H(e,a,n))||(c=document.getElementById("protected-content-error"))&&(c.classList.remove("opacity-0"),setTimeout((function(){c.classList.add("opacity-0")}),1e3)),l.label=3;case 3:if(!r)return[3,1];l.label=4;case 4:r&&a&&function(e,t,n){var r=btoa(String.fromCharCode.apply(null,[].slice.call(new Uint8Array(t))));e[n]=r}(i,a,o),l.label=5;case 5:return r||(e.innerHTML="<h4>Access denied</h4>"),t(),[2]}var c}))}))}function P(){var e=this;return new Promise((function(t){document.getElementById("protected-content-password").focus(),document.getElementById("protected-content-ok").addEventListener("click",(function(){return R(e,void 0,void 0,(function(){var e,n,r,o;return M(this,(function(i){switch(i.label){case 0:return e=null===(o=document.getElementById("protected-content-password"))||void 0===o?void 0:o.value,n=(new TextEncoder).encode(e),[4,crypto.subtle.digest("SHA-256",n)];case 1:return r=i.sent(),t(r),[2]}}))}))}),{once:!0})}))}function H(e,t,n){var r,o,i;try{var s=(null!==(r=e.getAttribute("data"))&&void 0!==r?r:"").split("."),a=parseInt(s[0]),l=s[1],c=atob(l),u=new Uint8Array((null!==(o=c.match(/[\s\S]/g))&&void 0!==o?o:[]).map((function(e){return e.charCodeAt(0)}))),d=s[2],h=atob(d),p=new Uint8Array((null!==(i=h.match(/[\s\S]/g))&&void 0!==i?i:[]).map((function(e){return e.charCodeAt(0)}))),f=new Uint8Array(t),m=new(O().ModeOfOperation.cbc)(f,u).decrypt(p),v=(new TextDecoder).decode(m);if(!v.trimStart().startsWith("<"))throw new Error("Invalid password.");if(n){n();var g=document.getElementById(e.id);g&&(e=g)}return e.outerHTML=v.slice(0,a),!0}catch(e){return!1}}var N,W,B,V,j,z;function q(){V=(0,e.ri)((0,e.aZ)({name:"DocApp",compilerOptions:{delimiters:["\0\0","\0\0"]},setup:function(){var n=(0,t.oR)().store;(0,r.g)(n),n.actions.resetMemberData();var o=function(){var t=(0,e.iH)(!1),n=null;return(0,E.zX)(window,"scroll",(function(){t.value=!0,null!==n&&clearTimeout(n),n=setTimeout((function(){t.value=!1}),100)})),{isScrolling:t}}().isScrolling;(0,e.YP)(o,(function(e){n.state.isWindowScrolling=e}),{immediate:!0}),(0,e.bv)((function(){(0,e.Y3)((function(){n.state.initialPageLoad=!1}))})),function(){var e=(0,t.oR)().store,n=(0,C.B)().scrollTo;(0,E.zX)(window,"popstate",(function(){var t;if(window.location.hash){var r=decodeURIComponent(window.location.hash);(null!==(t=document.getElementById(r.slice(1)))&&void 0!==t?t:document.querySelector(r))&&n(r,{offset:_.vE,onStart:function(){e.actions.updateScrolledElementId(r.substr(1))}})}}))}()}})),V.provide(t.$Q,t.h),V.provide(o.Mu,o.Ke);var i=n(515);i.keys().forEach((function(e){var t=i(e);Object.keys(t).forEach((function(e){V.component(e,t[e])}))}));var s=document.getElementById("docs-app");if(s&&s.parentElement){var a=s.parentElement;s.querySelectorAll("script, style").forEach((function(e){e.remove(),a.appendChild(e)}))}V.mount("#docs-app")}(0,x.BL)(),"file:"===location.protocol.toLowerCase()&&(x.nP.drive=!1,x.nP.navigator.proposeVisit=function(e){window.location.href=e.toString()});var $="reloadPosition=";null!==(N=window.retype)&&void 0!==N||(window.retype={}),null!==(W=(B=window.retype).reload)&&void 0!==W||(B.reload=function(e,t){if(e){var n=location.pathname.endsWith("/")||/[.]html?$/i.test(location.pathname)?location.pathname:location.pathname+"/",r=Math.round(window.scrollX),o=Math.round(window.scrollY);document.cookie="".concat($).concat(r,",").concat(o,";path=").concat(n,";max-age=5"),window.location.reload()}else{j=[window.scrollX,window.scrollY],z=window.location.hash;var i=window.location.href,s=z?window.location.pathname+window.location.search:i;(0,x.Vn)(s,{action:"replace"}),t&&(0,T.v2)()}}),document.addEventListener("turbo:load",(function(){return e=void 0,n=void 0,o=function(){var e,n,r,o,i,h,p,f,v,b;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,a[0]&&(s=0)),s;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,r=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){s.label=a[1];break}if(6===a[0]&&s.label<o[1]){s.label=o[1],o=a;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(a);break}o[2]&&s.ops.pop(),s.trys.pop();continue}a=t.call(e,s)}catch(e){a=[6,e],r=0}finally{n=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,l])}}}(this,(function(w){switch(w.label){case 0:if(t.h.state.initialPageLoad){if(!c())return u(V,!1),[2];(function(){var e,t,n,r,o;return t=this,n=void 0,o=function(){var t,n,r,o,i,l,c,u,h,p,f,m,v,g,b;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,a[0]&&(s=0)),s;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return s.label++,{value:a[1],done:!1};case 5:s.label++,r=a[1],a=[0];continue;case 7:a=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){s=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){s.label=a[1];break}if(6===a[0]&&s.label<o[1]){s.label=o[1],o=a;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(a);break}o[2]&&s.ops.pop(),s.trys.pop();continue}a=t.call(e,s)}catch(e){a=[6,e],r=0}finally{n=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,l])}}}(this,(function(y){switch(y.label){case 0:if(!(t=d()))return[2,!1];for(n=parseInt(t.checksum.slice(0,-5)||"0"),r=atob(t.signature),o=[],g=0;g<r.length;++g)o.push(r.charCodeAt(g));for(i=[s().id,s().base,s().host,n.toString()],l=0,c=s().sidebar;l<c.length;l++)u=c[l],i.push(null!==(e=u.l)&&void 0!==e?e:u.n);return i.push(t.fingerprint),h=i.join(""),p=new TextEncoder,f=new TextDecoder,[4,crypto.subtle.digest("SHA-256",p.encode(h))];case 1:for(m=y.sent(),v=[48,71,48,115,103,125,49,133,75,132,137,14,25,65,99,18,116,124,42,116,85,72,11,45,125,183,150,91,96,33,111,30,32,103,88,212,96,188,182,160,83,67,148,88,185,171,117,178,221,234,50,86,254,60,165,240,3,106,69,30,235,147,143,222,64,97,80,223,163,20,180,16,45,166,117,156,157,202,217,232,216,165,93,4,176,78,44,97,133,2,3,1,0,1],g=a.u.length+a.bT.length;g>0;--g)v[g%v.length]^=a.u[g%a.u.length]^a.bT[g%a.bT.length];return[4,crypto.subtle.importKey("spki",new Uint8Array(v),{name:f.decode(a.u),hash:f.decode(a.bT)},!1,["verify"])];case 2:return b=y.sent(),[4,crypto.subtle.verify(b.algorithm,b,new Uint8Array(o),m)];case 3:return[2,y.sent()]}}))},new((r=void 0)||(r=Promise))((function(e,i){function s(e){try{l(o.next(e))}catch(e){i(e)}}function a(e){try{l(o.throw(e))}catch(e){i(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}l((o=o.apply(t,n||[])).next())}))})().then((function(e){return u(V,e,!0)}))}else V.unmount();return(e=document.getElementById("protected-content"))?(n=document.getElementById("docs-app"))?(r=n.outerHTML,[4,F(e,(function(){q()}),(function(){V.unmount(),n.outerHTML=r}))]):[3,2]:[3,3];case 1:w.sent(),w.label=2;case 2:return[3,4];case 3:q(),w.label=4;case 4:return l((function(e){return u(V,e)})),(null===(v=null===(f=window.retype)||void 0===f?void 0:f.editor)||void 0===v?void 0:v.initView)&&window.retype.editor.initView(),(null==(o=m()())?void 0:o.hasPrism)&&(0,L.b)("prism-js",y(),(function(e){return null==e?void 0:e.initPrism()})),(null==o?void 0:o.hasMermaid)&&(0,L.b)("mermaid-js",g(),(function(e){return null==e?void 0:e.initMermaid()})),(null==o?void 0:o.hasMath)&&(0,L.b)("katex-js",k(),(function(e){return null==e?void 0:e.initKatex()})),document.querySelectorAll(".scrollbar").forEach((function(e){e.classList.remove("overflow-hidden"),new A.Z(e)})),z&&(history.replaceState(history.state,document.title,window.location.pathname+z+window.location.search),z=null),i=!1,j?(window.scrollTo.apply(window,j),j=null,i=!0):t.h.state.initialPageLoad&&(h=null===(b=document.cookie.split(";").find((function(e){return e.trim().startsWith($)})))||void 0===b?void 0:b.trim())&&(p=h.slice($.length).split(","))&&2==p.length&&/^\d+$/.test(p[0])&&/^\d+$/.test(p[1])&&(t.h.state.isScrollPositionRestored=!0,setTimeout((function(){t.h.state.isScrollPositionRestored=!1}),3e3),window.scrollTo(Number.parseInt(p[0]),Number.parseInt(p[1])),i=!0),i&&x.ry.currentVisit&&(x.ry.currentVisit.scrolled=!0),t.h.actions.updateMemberFilter(""),t.h.actions.updateSearchQuery(""),[2]}}))},new((r=void 0)||(r=Promise))((function(t,i){function s(e){try{l(o.next(e))}catch(e){i(e)}}function a(e){try{l(o.throw(e))}catch(e){i(e)}}function l(e){var n;e.done?t(e.value):(n=e.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}l((o=o.apply(e,n||[])).next())}));var e,n,r,o})),window.addEventListener("beforeunload",(function(){t.h.state.unloading=!0}))})()})();
\ No newline at end of file
diff --git a/resources/js/search.json b/resources/js/search.json
index e3907a8..001ade9 100644
--- a/resources/js/search.json
+++ b/resources/js/search.json
@@ -1 +1 @@
-[[{"l":"Welcome to BlissRoms","p":["BlissRoms is an open-source operating system based on Android with customizations, options and added security features. Our prime aim is to provide a blissful experience to our users."]},{"l":"BlissRoms Important Links","p":["Website","Downloads","Documentation","Twitter","Instagram","Telegram","Reddit","Source","Device Source","Gerrit Code Review","Help us to Translate"]}],[{"l":"Build BlissRom"},{"l":"Introduction","p":["This is the official guide to build BlissRom for your device. In this guide, We will only cover official devices with actual maintainers. We will not deeply dive into porting devices.","The golden rule for building a ROM is utmost patience. If something breaks, wait for your maintainer to fix it, send a polite message to your maintainer, or better yet, try and fix it yourself. Then you can make a merge request and contribute!","So, Let’s get started."]},{"l":"Preparation","p":["To get started, you need a computer with Ubuntu 18.04 or newer (LTS), at least 200GB space of HDD/SSD, and at least 8GB RAM. A decent CPU (or CPUs if you have a server motherboard) is recommended. Other distros can work but is not officially supported in this guide.","Underpowered machines may crash during compilation. If that happens, you may try and restart the build as most crashes are caused by lack of memory. If your storage space has run out, then you will need to build on a different hard drive."]},{"l":"Install the JDK","p":["Install OpenJDK:"]},{"l":"Install build tools","p":["To install the required build tools, run the following command:"]},{"l":"Install source code tools","p":["Now we need to get the source code via a program named repo. The primary function of repo is to read a manifest file located in BlissRoms GitHub organization, and find what repositories you need to actually build Android.","Create a ~/bin directory for repo:","The -p flag instructs mkdir to only create the directory if it does not exist in the first place. Now download the repo tool into ~/bin:","Make repo executable:","And add it to PATH:","Scroll to the end of the file and type these lines:","Ctrl-O and enter to save, then Ctrl-X to exit nano. Now either logout and login again (or reboot), or source the file:","Which can be shortened to:"]},{"i":"what-is-source","l":"What is source?","p":["source is a bash command to read aliases, functions, and commands from the specified file. Typically, you'll supply bash with a configuration file such as .bashrc or .bash_profile, or an initialization file such as envsetup.sh. The difference is that while the configuration file lists configuration and user-defined aliases and functions, initialization files typically hold build commands such as breakfast, brunch, and lunch. Without those commands building would be significantly harder as you would have to memorize the long command to invoke a build manually!","But why do you need to run it after modifying a file? Well, bash cannot automatically detect changes in our files. To solve this, we either source it or log out and log back in, forcing bash to reload configuration files. Keep this in mind, because unlike configuration files, if you forget to source initialization files, build commands will not function!"]},{"l":"Download","p":["Create a directory for the source:","Before we download, we need to tell repo and git who we are. Run the following commands, substituting your information:","Now, we’re ready to initialize. We need to tell repo which manifest to read:","-b is for the branch, and we’re on typhoon, Android 13. It’ll take a couple of seconds. You may need to type y for the color prompt.","Then sync the source:","Note: For more information about the repo tool, visit the Build Tips guide to learn more about the repo flags.","repo will start downloading all the code. That’s going to be slow, even on a fiber network. Expect downloads to take more than a couple hours."]},{"l":"Build","p":["Set up the build environment:","This is the initialization file we talked about earlier up top. This \"initializes\" the environment, and imports a bunch of useful build commands required to build your device. Again, you need to remember to source this file every time you log out and log back in, or launch a new bash/Terminal instance.","Define what device you’re going to build. For example, the Pixel 4A, has a codename of sunfish. You can check your specific device's codename on GitHub or on Google. Execute:","What does this do? breakfast searches repositories for your device \"tree\", which contains all the details needed to make the build suitable for your device. CPU, kernel info, device screen size, whether the board has Bluetooth, NFC, what frequencies the build needs for Wi-Fi, and a bunch of other things. breakfast will automatically search in the BlissRoms-Devices GitHub repository, and grab your device tree for you.","Okay, so we have the device tree set up. Feel free to browse around the source code to see what changed. You should see folders added to device/, kernel/ and vendor/. A shortcut:","will dump you back in the root of the source code tree. So if you’ve been going through folders and don’t have any idea where you are, you can use the above command. This command, however, requires you to have source d build/envsetup.sh earlier.","We're ready to build, but before we teach you the easy command to execute a build, we will first try the manual method. To set up the current terminal environment for building your particular device, execute:","Let's break down the command. lunch initializes the proper environmental variables required for the build tools to build your specific device. Things like BLISS_DEVICE and other variables are set in this stage, and the changed variables will be shown as output. bliss_ is the ROM that we are building. As convention, all devices will have this prefix. sunfish is the specific device we are building - in this case, the Pixel 4A. Finally, userdebug means that we will build a user-debuggable variant. This is usually what most ROMs use for publishing their builds. Manufacturers typically use user which disables most of the useful Android Logcats."]},{"i":"my-device-isnt-booting-and-userdebug-wont-print-any-adb-logcats-what-gives","l":"My device isn't booting, and userdebug won't print any adb logcats. What gives?","p":["There is a third build variant called eng, short for engineering builds. These builds will activate adb logcat during boot, and will show you exactly what is going wrong, where, and why. However, these builds are NOT recommended for normal usage as they are not securely hardened, have log spam that will slow down your device, and other unexpected problems like userspace utilities crashing during runtime. If you want to submit your device for mainline, do NOT submit an eng build!","All set? Let's start the building process. Run:","mka blissify","And the build should start. The build process will take a long time. Prepare to wait a few hours, even on a decent machine."]},{"i":"why-mka-and-not-make","l":"Why mka and not make?","p":["make only runs with 1 thread. mka is properly aliased to use all of your threads by checking nproc.","If you want to customize your thread count (maybe you're building with a fan-screaming laptop in a quiet coffee shop), use make blissify -j#, replacing the hash with the number of threads (example of make blissify -j4)."]},{"i":"i-get-an-error-about-no-blissify-targets-to-build-against-whats-wrong","l":"I get an error about no blissify targets to build against, what's wrong?","p":["If you are building other ROMs, it is usually make bacon. For BlissRoms, we chose the build target of blissify. If that doesn't work, sometimes there is a bug, or the ROM developers do not implement a bacon target to build against. In this case, you will need to find what name they use to initialize a full build of the ROM. Conventionally, it is supposed to be bacon, but some ROM developers change this name inadvertently, or actually have a bug that causes the build target to never be found. If you cannot locate the build target, ask the developers of the ROM. Alternatively, you can try poking around in build/make/core/Makefile to see what the build target name is. But this is out of the scope of this article as you're not supposed to be building other ROMs (that's not what this tutorial is for, sorry!)","All right, but that's annoying. You had to type three commands to build it all. What about running one command?","Options:","Examples:","To build with gapps","To build with FOSS","To build with gapps and deviceclean","To build an userdebug build with gapps","To build an eng build with gapps","To build an user build with gapps","This method is also backwards compatible with the legacy blissify command also Default build type = userdebug Default build variant = vanilla","But what is blissify? It is a compact form of these commands:","Sounds great, right? Once you have run the command, jump over to the next section."]},{"l":"After building","p":["There are two outcomes to a build - either it fails and you get a red error message from make, or it succeeds and you see the Bliss logo in ASCII. If you encounter the former, you need to go back and fix whatever it's complaining about. Typically, 90% of the time the problem will be in your device tree. For the other 10%, submit a bug report to the ROM developers. Be sure to include the full log of your build to help diagnose the problem, and your device tree.","If you face the latter, congratulations! You've successfully built BlissRoms for your device. Grab the artifacts for your device:","In here, you’ll find a .zip file that goes along the format of Bliss-vxx.xx-sunfish-UNOFFICIAL-vanilla-202xxxxx.zip. Install custom recovery of your choice, then flash the build to your device. Bliss 14.xx versions indicate that you have succesfully built BlissROMs for your device based on Android 11. Bliss 15.xx versions indicate that you have succesfully built BlissROMs for your device based on Android 12/12.1. Bliss 16.xx versions indicate that you have succesfully built BlissROMs for your device based on Android 13.","There you go, you have succesfully built BlissROMs. Happy Flashing and Enjoy!"]}],[{"l":"Conclusion"},{"l":"Conclusion","p":["Building a ROM is very hard and tedious and the results are very rewarding! If you managed to follow along, congratulations!","After you finish building, you can try out the Git Started guide. Make changes, commit, and send them off to our Gerrit for review! Or better yet, download experimental commits not ready for the mainline repositories and review them! Again, ROM building is a fun project you can work with. I hope this guide was a lot of fun to run through!"]}],[{"l":"Troubleshoot"},{"l":"Troubleshooting","p":["If your build failed, there are a couple things you can try.","Try a fresh repo sync to make your repository up to date. Sometimes, the Internet connection between you and GitHub can be flaky. In rare cases a commit merge might be ongoing, and you might've grabbed an incomplete merge. Mostly, this should fix the issue 70% of the time.","Make sure your dependencies are installed correctly. Error messages help out a lot here! Often it will say shared/linked library not found or something along those lines.","Make sure you sourced build/envsetup.sh. This is especially common and worth suspecting if none of the build commands like breakfast and lunch work. If you have repo sync ed do this again.","Make sure you’re at the root of the build tree. Again, to quickly jump there, use croot.","Make sure you ran breakfast correctly and it did not error out. Missing device files will prevent successful builds.","Make sure your computer meets minimum requirements to compile AOSP. Chances are, you need more memory/CPU power to complete a build.","Make sure your computer isn't faulty. This is unlikely, but to check, use a stress-test program like Prime95.","If something goes wrong and you've tried everything above, first use Google to look up your error! Most of the errors you encounter is due to misconfiguration and wrong commands entered. More often than not, Google will have the answer you are looking for. If you're still stuck and nothing fixes the problem, then ask us via our Telegram Build Support chat.(Please only ask issues about BlissRoms, not other custom ROMs as we are unable to assist with those!)"]}],[{"l":"Overlays"},{"l":"General Overlays"},{"i":"-refresh-rate-overlays","l":"• Refresh Rate Overlays","p":["This overlay is required to Enable Refresh Rate Controls."]},{"i":"-charging-support-overlay","l":"• Charging Support Overlay","p":["- VOOC Charging ( If your device supports )","This overlay is required to Enable VOOC charging support.","- WARP Charging ( If your device supports )","This overlay is required to Enable Warp charging support.","- Dash Charging ( If your device supports )","This overlay is required to Enable Dash charging support."]},{"i":"-multi-usb-controller-overlay-only-for-asus-rog-devices","l":"• Multi usb controller overlay (ONLY FOR ASUS ROG DEVICES)","p":["Since all ROG devices have 2 usb ports. We can use both for mtp, not just as charger.","This overlay is required to add support for Multi USB Controller."]},{"i":"-multi-colour-led","l":"• Multi-colour LED","p":["This overlay is required to Enable Multi-coloured LED lights for supported devices.","For most of the Xiaomi devices, this must be set to 'false' as they have white-only LEDs."]},{"i":"-call-recording","l":"• Call Recording","p":["This feature only works on AOSP Dialer and not on Google Dialer.","This overlay is required to Enable Call recording on AOSP Dialer's.","Call recording is illegal in some countries. Kindly refer to local laws before enabling this feature!!"]},{"l":"UDFPS Specific Overlays"},{"i":"-udfps-support","l":"• UDFPS Support","p":["This overlay is required to Enable UDFPS Support. The overlay is used to determine HBM Type for UDFPS. Required inorder for UDFPS to work."]},{"i":"-udfps-vendor-code","l":"• UDFPS Vendor code","p":["This overlay is used to define vendor code. Required inorder for UDFPS to work."]},{"i":"-udfps-animations","l":"• UDFPS Animations","p":["For UDFPS Animation to work you need 2 things in your device tree source.","A Flag in bliss_codename.mk makefile in your respective device tree","An overlay to set Default FOD Pressed Color","Flag Required to build UDFPS Animation resources","To set Default UDFPS Pressed color","This overlay is required to set Default UDFPS Pressed Color.","To set UDFPS Animation Offset","This overlay is required to set UDFPS Animation offset for respective devices.","Adjust this value as per your device.","To set UDFPS Animation Size","This overlay is required to set UDFPS Animation size for respective devices.","To set Color of the UDFPS Pressed view","This overlay is required to set Color of the UDFPS Pressed view for respective devices."]},{"i":"-screen-off-fod","l":"• Screen-Off FOD","p":["This overlay is required to Enable Screen OFF FOD."]}],[{"l":"Code of Conduct","p":["About Sepolicy Rules, the maintainers MUST NOT:","All theirs device sources on BlissRoms-Devices organization. It goes without saying that these should be fully buildable. Using external repos for build releases aren't allowed, unless they're from LineageOS/TheMuppets organization(s). Exceptions may be open if only it's absolutely necessary.","Allow write access to generic directory/file/prop labels (With some exceptions).","Any Apps that are not shipped with BlissRoms. This includes Browsers and other apps.","Any stock firmware apps. Only Google Camera and camera app from stock firmware is allowed only if its fully functional.","If any of these rules are broken, the administration will take direct action against the maintainer without prior warning.","Ignore Sepolicy Neverallows.","In the event of any disagreements between maintainers, sort them out via direct messages on Telegram or XDA. Do not take your fights to our chats, approach the administration if you want something sorted out quickly. The same is valid for our public chat.","MUST maintain authorship of git commits that are pushed, this is a mandatory requirement for ALL repositories. Force-pushes are acceptable, but try to keep them to a minimum.","MUST NOT add:","MUST NOT get involved in arguments or resort to insults, or use hateful words, personal attacks or any other verbal or nonverbal action that is considered detrimental towards the creation of a positive environment for the team.","MUST ship the BlissRoms Updates atleast once a month or as notified by BlissRoms Administration. If this is not possible, the reason(s) must be sent to the BlissRoms Administration within 48hrs. In the absence of any explanation, a maintainer will be contacted thrice. If there is no satisfactory answer or the administration does not receive a reply, the maintainer will be kicked without any prior warning.","MUST test every build before sending an OTA update to users. Each build must be thoroughly vetted by the maintainer before it is released, and all hardware and software functionalities MUST be tested before a build is released. Releasing untested builds can (and will) lead to your maintainership being revoked.","MUST upload:","The key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in RFC 2119.","The Maintainers:"]}],[{"l":"Requirements","p":["Before you apply for maintainership to add your device to our official devices list, please read the following requirements carefully.","Warning: Any violations found or any attempts to circumvent the requirements below may lead to your application being rejected and you being blacklisted from the maintainer program.","You must physically own the device you are applying official status for. We do not allow blind builds.","We may allow exceptions if a trusted friend owns the device and is willing to help test your builds. However, this will only be approved on a case-by-case basis.","Asking users to test blind builds is not allowed.","You must have a working knowledge of Git and Gerrit.","You must maintain said device unofficially for at least 1 month with constant updates. Make sure builds are stable for usage. Users should not report any significant problems with your build.","You must release your device sources publicly with proper authorship on every commit. We do not allow hiding sources to \"compete\" with other ROM teams, as we believe that goes against the open source spirit.","Once applied, please do not spam team members with updates regarding your application. We will respond within a week with your application decision."]}]]
\ No newline at end of file
+[[{"l":"Welcome to BlissRoms"},{"i":"blissroms-an-enchanting-open-source-operating-system-built-upon-the-aosp-offers-a-harmonious-blend-of-boundless-customization-unparalleled-options-and-fortified-security-features-with-an-unwavering-commitment-to-delivering-pure-bliss-to-its-users-it-unveils-a-captivating-world-of-limitless-possibilities","l":"BlissRoms, an enchanting open-source operating system built upon the AOSP, offers a harmonious blend of boundless customization, unparalleled options, and fortified security features. With an unwavering commitment to delivering pure bliss to its users, it unveils a captivating world of limitless possibilities."},{"l":"BlissRoms Important Links","p":["Website","Downloads","Documentation","Twitter","Instagram","Telegram","Reddit","Source","Device Source","Gerrit Code Review","Help us to Translate"]}],[{"l":"Build BlissRom"},{"l":"Introduction","p":["This is the official guide to build BlissRom for your device. In this guide, We will only cover official devices with actual maintainers. We will not deeply dive into porting devices.","The golden rule for building a ROM is utmost patience. If something breaks, wait for your maintainer to fix it, send a polite message to your maintainer, or better yet, try and fix it yourself. Then you can make a merge request and contribute!","So, Let’s get started."]},{"l":"Preparation","p":["To get started, you need a computer with Ubuntu 18.04 or newer (LTS), at least 200GB space of HDD/SSD, and at least 8GB RAM. A decent CPU (or CPUs if you have a server motherboard) is recommended. Other distros can work but is not officially supported in this guide.","Underpowered machines may crash during compilation. If that happens, you may try and restart the build as most crashes are caused by lack of memory. If your storage space has run out, then you will need to build on a different hard drive."]},{"l":"Install the JDK","p":["Install OpenJDK:"]},{"l":"Install build tools","p":["To install the required build tools, run the following command:"]},{"l":"Install source code tools","p":["Now we need to get the source code via a program named repo. The primary function of repo is to read a manifest file located in BlissRoms GitHub organization, and find what repositories you need to actually build Android.","Create a ~/bin directory for repo:","The -p flag instructs mkdir to only create the directory if it does not exist in the first place. Now download the repo tool into ~/bin:","Make repo executable:","And add it to PATH:","Scroll to the end of the file and type these lines:","Ctrl-O and enter to save, then Ctrl-X to exit nano. Now either logout and login again (or reboot), or source the file:","Which can be shortened to:"]},{"i":"what-is-source","l":"What is source?","p":["source is a bash command to read aliases, functions, and commands from the specified file. Typically, you'll supply bash with a configuration file such as .bashrc or .bash_profile, or an initialization file such as envsetup.sh. The difference is that while the configuration file lists configuration and user-defined aliases and functions, initialization files typically hold build commands such as breakfast, brunch, and lunch. Without those commands building would be significantly harder as you would have to memorize the long command to invoke a build manually!","But why do you need to run it after modifying a file? Well, bash cannot automatically detect changes in our files. To solve this, we either source it or log out and log back in, forcing bash to reload configuration files. Keep this in mind, because unlike configuration files, if you forget to source initialization files, build commands will not function!"]},{"l":"Download","p":["Create a directory for the source:","Before we download, we need to tell repo and git who we are. Run the following commands, substituting your information:","Now, we’re ready to initialize. We need to tell repo which manifest to read:","-b is for the branch, and we’re on typhoon, Android 13. It’ll take a couple of seconds. You may need to type y for the color prompt.","Then sync the source:","Note: For more information about the repo tool, visit the Build Tips guide to learn more about the repo flags.","repo will start downloading all the code. That’s going to be slow, even on a fiber network. Expect downloads to take more than a couple hours."]},{"l":"Build","p":["Set up the build environment:","This is the initialization file we talked about earlier up top. This \"initializes\" the environment, and imports a bunch of useful build commands required to build your device. Again, you need to remember to source this file every time you log out and log back in, or launch a new bash/Terminal instance.","Define what device you’re going to build. For example, the Pixel 4A, has a codename of sunfish. You can check your specific device's codename on GitHub or on Google. Execute:","What does this do? breakfast searches repositories for your device \"tree\", which contains all the details needed to make the build suitable for your device. CPU, kernel info, device screen size, whether the board has Bluetooth, NFC, what frequencies the build needs for Wi-Fi, and a bunch of other things. breakfast will automatically search in the BlissRoms-Devices GitHub repository, and grab your device tree for you.","Okay, so we have the device tree set up. Feel free to browse around the source code to see what changed. You should see folders added to device/, kernel/ and vendor/. A shortcut:","will dump you back in the root of the source code tree. So if you’ve been going through folders and don’t have any idea where you are, you can use the above command. This command, however, requires you to have source d build/envsetup.sh earlier.","We're ready to build, but before we teach you the easy command to execute a build, we will first try the manual method. To set up the current terminal environment for building your particular device, execute:","Let's break down the command. lunch initializes the proper environmental variables required for the build tools to build your specific device. Things like BLISS_DEVICE and other variables are set in this stage, and the changed variables will be shown as output. bliss_ is the ROM that we are building. As convention, all devices will have this prefix. sunfish is the specific device we are building - in this case, the Pixel 4A. Finally, userdebug means that we will build a user-debuggable variant. This is usually what most ROMs use for publishing their builds. Manufacturers typically use user which disables most of the useful Android Logcats."]},{"i":"my-device-isnt-booting-and-userdebug-wont-print-any-adb-logcats-what-gives","l":"My device isn't booting, and userdebug won't print any adb logcats. What gives?","p":["There is a third build variant called eng, short for engineering builds. These builds will activate adb logcat during boot, and will show you exactly what is going wrong, where, and why. However, these builds are NOT recommended for normal usage as they are not securely hardened, have log spam that will slow down your device, and other unexpected problems like userspace utilities crashing during runtime. If you want to submit your device for mainline, do NOT submit an eng build!","All set? Let's start the building process. Run:","mka blissify","And the build should start. The build process will take a long time. Prepare to wait a few hours, even on a decent machine."]},{"i":"why-mka-and-not-make","l":"Why mka and not make?","p":["make only runs with 1 thread. mka is properly aliased to use all of your threads by checking nproc.","If you want to customize your thread count (maybe you're building with a fan-screaming laptop in a quiet coffee shop), use make blissify -j#, replacing the hash with the number of threads (example of make blissify -j4)."]},{"i":"i-get-an-error-about-no-blissify-targets-to-build-against-whats-wrong","l":"I get an error about no blissify targets to build against, what's wrong?","p":["If you are building other ROMs, it is usually make bacon. For BlissRoms, we chose the build target of blissify. If that doesn't work, sometimes there is a bug, or the ROM developers do not implement a bacon target to build against. In this case, you will need to find what name they use to initialize a full build of the ROM. Conventionally, it is supposed to be bacon, but some ROM developers change this name inadvertently, or actually have a bug that causes the build target to never be found. If you cannot locate the build target, ask the developers of the ROM. Alternatively, you can try poking around in build/make/core/Makefile to see what the build target name is. But this is out of the scope of this article as you're not supposed to be building other ROMs (that's not what this tutorial is for, sorry!)","All right, but that's annoying. You had to type three commands to build it all. What about running one command?","Options:","Examples:","To build with gapps","To build with FOSS","To build with gapps and deviceclean","To build an userdebug build with gapps","To build an eng build with gapps","To build an user build with gapps","This method is also backwards compatible with the legacy blissify command also Default build type = userdebug Default build variant = vanilla","But what is blissify? It is a compact form of these commands:","Sounds great, right? Once you have run the command, jump over to the next section."]},{"l":"After building","p":["There are two outcomes to a build - either it fails and you get a red error message from make, or it succeeds and you see the Bliss logo in ASCII. If you encounter the former, you need to go back and fix whatever it's complaining about. Typically, 90% of the time the problem will be in your device tree. For the other 10%, submit a bug report to the ROM developers. Be sure to include the full log of your build to help diagnose the problem, and your device tree.","If you face the latter, congratulations! You've successfully built BlissRoms for your device. Grab the artifacts for your device:","In here, you’ll find a .zip file that goes along the format of Bliss-vxx.xx-sunfish-UNOFFICIAL-vanilla-202xxxxx.zip. Install custom recovery of your choice, then flash the build to your device. Bliss 14.xx versions indicate that you have succesfully built BlissROMs for your device based on Android 11. Bliss 15.xx versions indicate that you have succesfully built BlissROMs for your device based on Android 12/12.1. Bliss 16.xx versions indicate that you have succesfully built BlissROMs for your device based on Android 13.","There you go, you have succesfully built BlissROMs. Happy Flashing and Enjoy!"]}],[{"l":"Conclusion"},{"l":"Conclusion","p":["Building a ROM is very hard and tedious and the results are very rewarding! If you managed to follow along, congratulations!","After you finish building, you can try out the Git Started guide. Make changes, commit, and send them off to our Gerrit for review! Or better yet, download experimental commits not ready for the mainline repositories and review them! Again, ROM building is a fun project you can work with. I hope this guide was a lot of fun to run through!"]}],[{"l":"Troubleshoot"},{"l":"Troubleshooting","p":["If your build failed, there are a couple things you can try.","Try a fresh repo sync to make your repository up to date. Sometimes, the Internet connection between you and GitHub can be flaky. In rare cases a commit merge might be ongoing, and you might've grabbed an incomplete merge. Mostly, this should fix the issue 70% of the time.","Make sure your dependencies are installed correctly. Error messages help out a lot here! Often it will say shared/linked library not found or something along those lines.","Make sure you sourced build/envsetup.sh. This is especially common and worth suspecting if none of the build commands like breakfast and lunch work. If you have repo sync ed do this again.","Make sure you’re at the root of the build tree. Again, to quickly jump there, use croot.","Make sure you ran breakfast correctly and it did not error out. Missing device files will prevent successful builds.","Make sure your computer meets minimum requirements to compile AOSP. Chances are, you need more memory/CPU power to complete a build.","Make sure your computer isn't faulty. This is unlikely, but to check, use a stress-test program like Prime95.","If something goes wrong and you've tried everything above, first use Google to look up your error! Most of the errors you encounter is due to misconfiguration and wrong commands entered. More often than not, Google will have the answer you are looking for. If you're still stuck and nothing fixes the problem, then ask us via our Telegram Build Support chat.(Please only ask issues about BlissRoms, not other custom ROMs as we are unable to assist with those!)"]}],[{"l":"Overlays"},{"l":"General Overlays"},{"i":"-refresh-rate-overlays","l":"• Refresh Rate Overlays","p":["This overlay is required to Enable Refresh Rate Controls."]},{"i":"-charging-support-overlay","l":"• Charging Support Overlay","p":["- VOOC Charging ( If your device supports )","This overlay is required to Enable VOOC charging support.","- WARP Charging ( If your device supports )","This overlay is required to Enable Warp charging support.","- Dash Charging ( If your device supports )","This overlay is required to Enable Dash charging support."]},{"i":"-multi-usb-controller-overlay-only-for-asus-rog-devices","l":"• Multi usb controller overlay (ONLY FOR ASUS ROG DEVICES)","p":["Since all ROG devices have 2 usb ports. We can use both for mtp, not just as charger.","This overlay is required to add support for Multi USB Controller."]},{"i":"-multi-colour-led","l":"• Multi-colour LED","p":["This overlay is required to Enable Multi-coloured LED lights for supported devices.","For most of the Xiaomi devices, this must be set to 'false' as they have white-only LEDs."]},{"i":"-call-recording","l":"• Call Recording","p":["This feature only works on AOSP Dialer and not on Google Dialer.","This overlay is required to Enable Call recording on AOSP Dialer's.","Call recording is illegal in some countries. Kindly refer to local laws before enabling this feature!!"]},{"l":"UDFPS Specific Overlays"},{"i":"-udfps-support","l":"• UDFPS Support","p":["This overlay is required to Enable UDFPS Support. The overlay is used to determine HBM Type for UDFPS. Required inorder for UDFPS to work."]},{"i":"-udfps-vendor-code","l":"• UDFPS Vendor code","p":["This overlay is used to define vendor code. Required inorder for UDFPS to work."]},{"i":"-udfps-animations","l":"• UDFPS Animations","p":["For UDFPS Animation to work you need 2 things in your device tree source.","A Flag in bliss_codename.mk makefile in your respective device tree","An overlay to set Default FOD Pressed Color","Flag Required to build UDFPS Animation resources","To set Default UDFPS Pressed color","This overlay is required to set Default UDFPS Pressed Color.","To set UDFPS Animation Offset","This overlay is required to set UDFPS Animation offset for respective devices.","Adjust this value as per your device.","To set UDFPS Animation Size","This overlay is required to set UDFPS Animation size for respective devices.","To set Color of the UDFPS Pressed view","This overlay is required to set Color of the UDFPS Pressed view for respective devices."]},{"i":"-screen-off-fod","l":"• Screen-Off FOD","p":["This overlay is required to Enable Screen OFF FOD."]}],[{"l":"Code of Conduct","p":["About Sepolicy Rules, the maintainers MUST NOT:","All theirs device sources on BlissRoms-Devices organization. It goes without saying that these should be fully buildable. Using external repos for build releases aren't allowed, unless they're from LineageOS/TheMuppets organization(s). Exceptions may be open if only it's absolutely necessary.","Allow write access to generic directory/file/prop labels (With some exceptions).","Any Apps that are not shipped with BlissRoms. This includes Browsers and other apps.","Any stock firmware apps. Only Google Camera and camera app from stock firmware is allowed only if its fully functional.","If any of these rules are broken, the administration will take direct action against the maintainer without prior warning.","Ignore Sepolicy Neverallows.","In the event of any disagreements between maintainers, sort them out via direct messages on Telegram or XDA. Do not take your fights to our chats, approach the administration if you want something sorted out quickly. The same is valid for our public chat.","MUST maintain authorship of git commits that are pushed, this is a mandatory requirement for ALL repositories. Force-pushes are acceptable, but try to keep them to a minimum.","MUST NOT add:","MUST NOT get involved in arguments or resort to insults, or use hateful words, personal attacks or any other verbal or nonverbal action that is considered detrimental towards the creation of a positive environment for the team.","MUST ship the BlissRoms Updates atleast once a month or as notified by BlissRoms Administration. If this is not possible, the reason(s) must be sent to the BlissRoms Administration within 48hrs. In the absence of any explanation, a maintainer will be contacted thrice. If there is no satisfactory answer or the administration does not receive a reply, the maintainer will be kicked without any prior warning.","MUST test every build before sending an OTA update to users. Each build must be thoroughly vetted by the maintainer before it is released, and all hardware and software functionalities MUST be tested before a build is released. Releasing untested builds can (and will) lead to your maintainership being revoked.","MUST upload:","The key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be interpreted as described in RFC 2119.","The Maintainers:"]}],[{"l":"Requirements","p":["Before you apply for maintainership to add your device to our official devices list, please read the following requirements carefully.","Warning: Any violations found or any attempts to circumvent the requirements below may lead to your application being rejected and you being blacklisted from the maintainer program.","You must physically own the device you are applying official status for. We do not allow blind builds.","We may allow exceptions if a trusted friend owns the device and is willing to help test your builds. However, this will only be approved on a case-by-case basis.","Asking users to test blind builds is not allowed.","You must have a working knowledge of Git and Gerrit.","You must maintain said device unofficially for at least 1 month with constant updates. Make sure builds are stable for usage. Users should not report any significant problems with your build.","You must release your device sources publicly with proper authorship on every commit. We do not allow hiding sources to \"compete\" with other ROM teams, as we believe that goes against the open source spirit.","Once applied, please do not spam team members with updates regarding your application. We will respond within a week with your application decision."]}]]
\ No newline at end of file
