@reearth/core 0.0.7-alpha.22 → 0.0.7-alpha.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.js +12 -1
- package/dist/core.umd.cjs +2 -2
- package/package.json +1 -1
- package/src/engines/Cesium/Feature/Resource/utils.ts +21 -10
package/dist/core.umd.cjs
CHANGED
|
@@ -6099,7 +6099,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
6099
6099
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var d=!0,h=!1,p;return{s:function(){o=o.call(t)},n:function(){var y=o.next();return d=y.done,y},e:function(y){h=!0,p=y},f:function(){try{!d&&o.return!=null&&o.return()}finally{if(h)throw p}}}}var Xt=Object.prototype.hasOwnProperty;function qt(t,n){return t=t.slice(),t.push(n),t}function Xl(t,n){return n=n.slice(),n.unshift(t),n}var Xh=function(t){sh(n,t);function n(o){var s;return Hc(this,n),s=ch(this,n,['JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)']),s.avoidNew=!0,s.value=o,s.name="NewError",s}return kc(n)}(Zl(Error));function D(t,n,o,s,c){if(!(this instanceof D))try{return new D(t,n,o,s,c)}catch(y){if(!y.avoidNew)throw y;return y.value}typeof t=="string"&&(c=s,s=o,o=n,n=t,t=null);var d=t&&Qt(t)==="object";if(t=t||{},this.json=t.json||o,this.path=t.path||n,this.resultType=t.resultType||"value",this.flatten=t.flatten||!1,this.wrap=Xt.call(t,"wrap")?t.wrap:!0,this.sandbox=t.sandbox||{},this.preventEval=t.preventEval||!1,this.parent=t.parent||null,this.parentProperty=t.parentProperty||null,this.callback=t.callback||s||null,this.otherTypeCallback=t.otherTypeCallback||c||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},t.autostart!==!1){var h={path:d?t.path:n};d?"json"in t&&(h.json=t.json):h.json=o;var p=this.evaluate(h);if(!p||Qt(p)!=="object")throw new Xh(p);return p}}D.prototype.evaluate=function(t,n,o,s){var c=this,d=this.parent,h=this.parentProperty,p=this.flatten,y=this.wrap;if(this.currResultType=this.resultType,this.currPreventEval=this.preventEval,this.currSandbox=this.sandbox,o=o||this.callback,this.currOtherTypeCallback=s||this.otherTypeCallback,n=n||this.json,t=t||this.path,t&&Qt(t)==="object"&&!Array.isArray(t)){if(!t.path&&t.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Xt.call(t,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');var E=t;n=E.json,p=Xt.call(t,"flatten")?t.flatten:p,this.currResultType=Xt.call(t,"resultType")?t.resultType:this.currResultType,this.currSandbox=Xt.call(t,"sandbox")?t.sandbox:this.currSandbox,y=Xt.call(t,"wrap")?t.wrap:y,this.currPreventEval=Xt.call(t,"preventEval")?t.preventEval:this.currPreventEval,o=Xt.call(t,"callback")?t.callback:o,this.currOtherTypeCallback=Xt.call(t,"otherTypeCallback")?t.otherTypeCallback:this.currOtherTypeCallback,d=Xt.call(t,"parent")?t.parent:d,h=Xt.call(t,"parentProperty")?t.parentProperty:h,t=t.path}if(d=d||null,h=h||null,Array.isArray(t)&&(t=D.toPathString(t)),!(!t&&t!==""||!n)){var L=D.toPathArray(t);L[0]==="$"&&L.length>1&&L.shift(),this._hasParentSelector=null;var F=this._trace(L,n,["$"],d,h,o).filter(function(N){return N&&!N.isParentSelector});return F.length?!y&&F.length===1&&!F[0].hasArrExpr?this._getPreferredOutput(F[0]):F.reduce(function(N,z){var oe=c._getPreferredOutput(z);return p&&Array.isArray(oe)?N=N.concat(oe):N.push(oe),N},[]):y?[]:void 0}},D.prototype._getPreferredOutput=function(t){var n=this.currResultType;switch(n){case"all":{var o=Array.isArray(t.path)?t.path:D.toPathArray(t.path);return t.pointer=D.toPointer(o),t.path=typeof t.path=="string"?t.path:D.toPathString(t.path),t}case"value":case"parent":case"parentProperty":return t[n];case"path":return D.toPathString(t[n]);case"pointer":return D.toPointer(t.path);default:throw new TypeError("Unknown result type")}},D.prototype._handleCallback=function(t,n,o){if(n){var s=this._getPreferredOutput(t);t.path=typeof t.path=="string"?t.path:D.toPathString(t.path),n(s,o,t)}},D.prototype._trace=function(t,n,o,s,c,d,h,p){var y=this,E;if(!t.length)return E={path:o,value:n,parent:s,parentProperty:c,hasArrExpr:h},this._handleCallback(E,d,"value"),E;var L=t[0],F=t.slice(1),N=[];function z(Ra){Array.isArray(Ra)?Ra.forEach(function(pi){N.push(pi)}):N.push(Ra)}if((typeof L!="string"||p)&&n&&Xt.call(n,L))z(this._trace(F,n[L],qt(o,L),n,L,d,h));else if(L==="*")this._walk(n,function(Ra){z(y._trace(F,n[Ra],qt(o,Ra),n,Ra,d,!0,!0))});else if(L==="..")z(this._trace(F,n,o,s,c,d,h)),this._walk(n,function(Ra){Qt(n[Ra])==="object"&&z(y._trace(t.slice(),n[Ra],qt(o,Ra),n,Ra,d,!0))});else{if(L==="^")return this._hasParentSelector=!0,{path:o.slice(0,-1),expr:F,isParentSelector:!0};if(L==="~")return E={path:qt(o,L),value:c,parent:s,parentProperty:null},this._handleCallback(E,d,"property"),E;if(L==="$")z(this._trace(F,n,o,null,null,d,h));else if(/^(\x2D?[0-9]*):(\x2D?[0-9]*):?([0-9]*)$/.test(L))z(this._slice(L,F,n,o,s,c,d));else if(L.indexOf("?(")===0){if(this.currPreventEval)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");var oe=L.replace(/^\?\(((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?)\)$/,"$1"),W=/@(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])?((?:[\0->@-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)['\[](\??\((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\))(?!(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])\)\])['\]]/g.exec(oe);W?this._walk(n,function(Ra){var pi=[W[2]],mt=W[1]?n[Ra][W[1]]:n[Ra],fa=y._trace(pi,mt,o,s,c,d,!0);fa.length>0&&z(y._trace(F,n[Ra],qt(o,Ra),n,Ra,d,!0))}):this._walk(n,function(Ra){y._eval(oe,n[Ra],Ra,o,s,c)&&z(y._trace(F,n[Ra],qt(o,Ra),n,Ra,d,!0))})}else if(L[0]==="("){if(this.currPreventEval)throw new Error("Eval [(expr)] prevented in JSONPath expression.");z(this._trace(Xl(this._eval(L,n,o[o.length-1],o.slice(0,-1),s,c),F),n,o,s,c,d,h))}else if(L[0]==="@"){var lt=!1,nt=L.slice(1,-2);switch(nt){case"scalar":(!n||!["object","function"].includes(Qt(n)))&&(lt=!0);break;case"boolean":case"string":case"undefined":case"function":Qt(n)===nt&&(lt=!0);break;case"integer":Number.isFinite(n)&&!(n%1)&&(lt=!0);break;case"number":Number.isFinite(n)&&(lt=!0);break;case"nonFinite":typeof n=="number"&&!Number.isFinite(n)&&(lt=!0);break;case"object":n&&Qt(n)===nt&&(lt=!0);break;case"array":Array.isArray(n)&&(lt=!0);break;case"other":lt=this.currOtherTypeCallback(n,o,s,c);break;case"null":n===null&&(lt=!0);break;default:throw new TypeError("Unknown value type "+nt)}if(lt)return E={path:o,value:n,parent:s,parentProperty:c},this._handleCallback(E,d,"value"),E}else if(L[0]==="`"&&n&&Xt.call(n,L.slice(1))){var Ee=L.slice(1);z(this._trace(F,n[Ee],qt(o,Ee),n,Ee,d,h,!0))}else if(L.includes(",")){var yt=L.split(","),Ai=Vh(yt),zi;try{for(Ai.s();!(zi=Ai.n()).done;){var ha=zi.value;z(this._trace(Xl(ha,F),n,o,s,c,d,!0))}}catch(Ra){Ai.e(Ra)}finally{Ai.f()}}else!p&&n&&Xt.call(n,L)&&z(this._trace(F,n[L],qt(o,L),n,L,d,h,!0))}if(this._hasParentSelector)for(var ba=0;ba<N.length;ba++){var Sa=N[ba];if(Sa&&Sa.isParentSelector){var ya=this._trace(Sa.expr,n,Sa.path,s,c,d,h);if(Array.isArray(ya)){N[ba]=ya[0];for(var ms=ya.length,bs=1;bs<ms;bs++)ba++,N.splice(ba,0,ya[bs])}else N[ba]=ya}}return N},D.prototype._walk=function(t,n){if(Array.isArray(t))for(var o=t.length,s=0;s<o;s++)n(s);else t&&Qt(t)==="object"&&Object.keys(t).forEach(function(c){n(c)})},D.prototype._slice=function(t,n,o,s,c,d,h){if(Array.isArray(o)){var p=o.length,y=t.split(":"),E=y[2]&&Number.parseInt(y[2])||1,L=y[0]&&Number.parseInt(y[0])||0,F=y[1]&&Number.parseInt(y[1])||p;L=L<0?Math.max(0,L+p):Math.min(p,L),F=F<0?Math.max(0,F+p):Math.min(p,F);for(var N=[],z=L;z<F;z+=E){var oe=this._trace(Xl(z,n),o,s,c,d,h,!0);oe.forEach(function(W){N.push(W)})}return N}},D.prototype._eval=function(t,n,o,s,c,d){this.currSandbox._$_parentProperty=d,this.currSandbox._$_parent=c,this.currSandbox._$_property=o,this.currSandbox._$_root=this.json,this.currSandbox._$_v=n;var h=t.includes("@path");h&&(this.currSandbox._$_path=D.toPathString(s.concat([o])));var p="script:"+t;if(!D.cache[p]){var y=t.replace(/@parentProperty/g,"_$_parentProperty").replace(/@parent/g,"_$_parent").replace(/@property/g,"_$_property").replace(/@root/g,"_$_root").replace(/@([\t-\r \)\.\[\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF])/g,"_$_v$1");h&&(y=y.replace(/@path/g,"_$_path")),D.cache[p]=new this.vm.Script(y)}try{return D.cache[p].runInNewContext(this.currSandbox)}catch(E){throw new Error("jsonPath: "+E.message+": "+t)}},D.cache={},D.toPathString=function(t){for(var n=t,o=n.length,s="$",c=1;c<o;c++)/^(~|\^|@(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\(\))$/.test(n[c])||(s+=/^[\*0-9]+$/.test(n[c])?"["+n[c]+"]":"['"+n[c]+"']");return s},D.toPointer=function(t){for(var n=t,o=n.length,s="",c=1;c<o;c++)/^(~|\^|@(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\(\))$/.test(n[c])||(s+="/"+n[c].toString().replace(/~/g,"~0").replace(/\//g,"~1"));return s},D.toPathArray=function(t){var n=D.cache;if(n[t])return n[t].concat();var o=[],s=t.replace(/@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\(\)/g,";$&;").replace(/['\[](\??\((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\))['\]](?!(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])\])/g,function(d,h){return"[#"+(o.push(h)-1)+"]"}).replace(/\[["']((?:[\0-&\(-\\\^-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)["']\]/g,function(d,h){return"['"+h.replace(/\./g,"%@%").replace(/~/g,"%%@@%%")+"']"}).replace(/~/g,";~;").replace(/["']?\.["']?(?!(?:[\0-Z\\-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\])|\[["']?/g,";").replace(/%@%/g,".").replace(/%%@@%%/g,"~").replace(/(?:;)?(\^+)(?:;)?/g,function(d,h){return";"+h.split("").join(";")+";"}).replace(/;;;|;;/g,";..;").replace(/;$|'?\]|'$/g,""),c=s.split(";").map(function(d){var h=d.match(/#([0-9]+)/);return!h||!h[1]?d:o[h[1]]});return n[t]=c,n[t].concat()};var Gh=function(t,n,o){for(var s=t.length,c=0;c<s;c++){var d=t[c];o(d)&&n.push(t.splice(c--,1)[0])}},ph=function(){function t(n){Hc(this,t),this.code=n}return kc(t,[{key:"runInNewContext",value:function(n){var o=this.code,s=Object.keys(n),c=[];Gh(s,c,function(E){return typeof n[E]=="function"});var d=s.map(function(E){return n[E]}),h=c.reduce(function(E,L){var F=n[L].toString();return/function/.test(F)||(F="function "+F),"var "+L+"="+F+";"+E},"");o=h+o,!/(["'])use strict\1/.test(o)&&!s.includes("arguments")&&(o="var arguments = undefined;"+o),o=o.replace(/;[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]*$/,"");var p=o.lastIndexOf(";"),y=p>-1?o.slice(0,p+1)+" return "+o.slice(p+1):" return "+o;return Mc(Function,s.concat([y])).apply(void 0,hh(d))}}]),t}();D.prototype.vm={Script:ph};const yh="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",Rh=t=>Array.from(window.crypto.getRandomValues(new Uint8Array(t))).map(n=>yh[n%t]).join("").toLowerCase(),Qc=t=>{if(typeof t!="object"||t===null)return t;for(const n in t)if(typeof t[n]=="string")try{t[n].startsWith("{")&&t[n].endsWith("}")&&(t[n]=JSON.parse(t[n]))}catch{console.error("Invalid JSON:",t[n])}else typeof t[n]=="object"&&(t[n]=Qc(t[n]));return t},vl="czm_";function Wh(t,n){let o=t,s="";const c=[];let d=o.indexOf("${");const h=typeof n<"u",p={},y=/^\$./;for(;d>=0;)if(fh(o,d)){const E=Sh(o,d);s+=o.slice(0,E+1),o=o.slice(E+1),d=o.indexOf("${")}else{s+=o.slice(0,d);const E=Lh(o,d),L=o.slice(d+2,E);if(y.test(L)){if(!h)return[s,[]];let F=p[L];if(!F)try{F=D({json:n,path:L}),p[L]=F}catch{return[s,[]]}if(F.length!==0){const N=Rh(10);c.push({literalName:N,literalValue:F[0]}),s+=N}else return["false",[]]}else{const F=Fh(L);s+=`${vl}${F}`}o=o.slice(E+1),d=o.indexOf("${")}return s+=o,[s,c]}function fh(t,n){const o=t.indexOf("'"),s=t.indexOf('"');return o>=0&&o<n?t.indexOf("'",o+1)>=n:s>=0&&s<n?t.indexOf('"',s+1)>=n:!1}function Sh(t,n){const o=t.indexOf("'"),s=t.indexOf('"');return o>=0&&o<n?t.indexOf("'",o+1):s>=0&&s<n?t.indexOf('"',s+1):-1}function Lh(t,n){const o=t.indexOf("}",n);if(o<0)throw new Error("replaceVariable: Unmatched {.");return o}const se=t=>`$reearth_${t}_$`,Gl={"[":se("opened_square_bracket"),"]":se("closed_square_bracket"),"{":se("opened_curly_bracket"),"}":se("closed_curly_bracket"),"(":se("opened_parentheses"),")":se("closed_parentheses"),"-":se("hyphen")},Fh=t=>{const n=t.replace(/-/g,Gl["-"]);return/(\]|\)|\})[^[.]+$/.test(n)?Object.entries(Gl).reduce((o,[s,c])=>o.replaceAll(s,c),n):n},Ih=t=>Object.entries(Gl).reduce((n,[o,s])=>n.replaceAll(s,o),t),xh=new Set(E0),kn=new Set(P0);function O(t,n){let o=new Error("failed to parse");const s=n.type;if(s==="Literal")o=Th(n);else if(s==="CallExpression")o=Yh(t,n);else if(s==="Identifier")o=Jh(n);else if(s==="UnaryExpression"){const c=n.operator,d=O(t,n.argument);if(xh.has(c))o=new w(M.UNARY,c,d);else throw new Error(`Unexpected operator "${c}".`)}else if(s==="BinaryExpression"){const c=n.operator,d=O(t,n.left),h=O(t,n.right);if(kn.has(c))o=new w(M.BINARY,c,d,h);else throw new Error(`Unexpected operator "${c}".`)}else if(s==="LogicalExpression"){const c=n.operator,d=O(t,n.left),h=O(t,n.right);kn.has(c)&&(o=new w(M.BINARY,c,d,h))}else if(s==="ConditionalExpression"){const c=O(t,n.test),d=O(t,n.consequent),h=O(t,n.alternate);o=new w(M.CONDITIONAL,"?",d,h,c)}else if(s==="MemberExpression")o=gh(t,n);else if(s==="ArrayExpression"){const c=[];for(let d=0;d<n.elements.length;d++)c[d]=O(t,n.elements[d]);o=new w(M.ARRAY,c)}else throw s==="Compound"?new Error("Provide exactly one expression."):new Error("Cannot parse expression.");return o}function Th(t){const n=typeof t.value;if(t.value===null)return new w(M.LITERAL_NULL,null);if(n==="boolean")return new w(M.LITERAL_BOOLEAN,t.value);if(n==="number")return new w(M.LITERAL_NUMBER,t.value);if(n==="string")return t.value.indexOf("${")>=0?new w(M.VARIABLE_IN_STRING,t.value):new w(M.LITERAL_STRING,Uh(t.value));throw new Error(`${t} is not a function.`)}function Uh(t){return t.replace(B0,"\\")}function Yh(t,n){const o=n.arguments,s=o.length;if(n.callee.type==="MemberExpression"){const d=n.callee.property.name,h=n.callee.object;if(d==="test"||d==="exec"){if(h.callee.name!=="regExp")throw new Error(`${d} is not a function.`);if(s===0)return d==="test"?new w(M.LITERAL_BOOLEAN,!1):new w(M.LITERAL_NULL,null);const p=O(t,h),y=O(t,o[0]);return new w(M.FUNCTION_CALL,d,p,y)}else if(d==="toString"){const p=O(t,h);return new w(M.FUNCTION_CALL,d,p)}throw new Error(`Unexpected function call "${d}".`)}const c=n.callee.name;if(c==="color"){if(s===0)return new w(M.LITERAL_COLOR,c);const d=O(t,o[0]);if(typeof o[1]<"u"){const h=O(t,o[1]);return new w(M.LITERAL_COLOR,c,[d,h])}return new w(M.LITERAL_COLOR,c,[d])}else if(c==="rgb"||c==="hsl"){if(s<3)throw new Error(`${c} requires three arguments.`);const d=[O(t,o[0]),O(t,o[1]),O(t,o[2])];return new w(M.LITERAL_COLOR,c,d)}else if(c==="rgba"||c==="hsla"){if(s<4)throw new Error(`${c} requires four arguments.`);const d=[O(t,o[0]),O(t,o[1]),O(t,o[2]),O(t,o[3])];return new w(M.LITERAL_COLOR,c,d)}else if(c==="isNaN"||c==="isFinite"){if(s===0)return c==="isNaN"?new w(M.LITERAL_BOOLEAN,!0):new w(M.LITERAL_BOOLEAN,!1);const d=O(t,o[0]);return new w(M.UNARY,c,d)}else if(typeof Pl[c]<"u"){if(s!==1)throw new Error(`${c} requires exactly one argument.`);const d=O(t,o[0]);return new w(M.UNARY,c,d)}else if(typeof El[c]<"u"){if(s!==2)throw new Error(`${c} requires exactly two arguments.`);const d=O(t,o[0]),h=O(t,o[1]);return new w(M.BINARY,c,d,h)}else if(c==="Boolean"){if(s===0)return new w(M.LITERAL_BOOLEAN,!1);const d=O(t,o[0]);return new w(M.UNARY,c,d)}else if(c==="Number"){if(s===0)return new w(M.LITERAL_NUMBER,0);const d=O(t,o[0]);return new w(M.UNARY,c,d)}else if(c==="String"){if(s===0)return new w(M.LITERAL_STRING,"");const d=O(t,o[0]);return new w(M.UNARY,c,d)}throw new Error(`Unexpected function call "${c}".`)}function Jh(t){const n=t.name;if(Nh(n)){const o=Mh(n);return o.substring(0,8)==="tiles3d_"?new w(M.BUILTIN_VARIABLE,o):new w(M.VARIABLE,o)}else{if(n==="NaN")return new w(M.LITERAL_NUMBER,NaN);if(n==="Infinity")return new w(M.LITERAL_NUMBER,1/0);if(n==="undefined")return new w(M.LITERAL_UNDEFINED,void 0)}throw new Error(`${n} is not defined.`)}function Ch(t){const n=t.property.name;if(n==="PI")return new w(M.LITERAL_NUMBER,Math.PI);if(n==="E")return new w(M.LITERAL_NUMBER,Math.E);throw new Error(`${n} Math Constant is not supported at the moment`)}function Kh(t){const n=t.property.name;if(n==="POSITIVE_INFINITY")return new w(M.LITERAL_NUMBER,Number.POSITIVE_INFINITY);throw new Error(`${n} Number Constant is not supported at the moment`)}function gh(t,n){if(n.object.name==="Math")return Ch(n);if(n.object.name==="Number")return Kh(n);let o;const s=O(t,n.object);return n.computed?(o=O(t,n.property),new w(M.MEMBER,"brackets",s,o)):(o=new w(M.LITERAL_STRING,n.property.name),new w(M.MEMBER,"dot",s,o))}function Nh(t){return t.substring(0,4)===vl}function Mh(t){return Ih(t).substring(4)}const zn=new Map,Qn=new Map,En=new Map,Pn=new Map;class Ki{constructor(n,o,s){Y(this,"_runtimeAst"),Y(this,"_feature");var c;this._feature=o;let d=[];n=Hh(n,s);const h=Qn.get(n);if(h)[n,d]=h;else{const y=n;[n,d]=Wh(kh(n),(c=this._feature)==null?void 0:c.properties),n.includes(vl)&&Qn.set(y,[n,d])}const p=zn.get(n);if(p)this._runtimeAst=p;else{if(d.length!==0)for(const E of d)le.addLiteral(E.literalName,E.literalValue);le.addBinaryOp("=~",0),le.addBinaryOp("!~",0);let y;try{y=le(n)}catch(E){throw new Error(`failed to generate ast: ${E}`)}this._runtimeAst=O(this,y),zn.set(n,this._runtimeAst)}}evaluate(){return this._runtimeAst.evaluate(this._feature)}}function Hh(t,n){if(typeof n>"u")return t;const o=JSON.stringify(Object.entries(n).sort()),s=t+o,c=Pn.get(s);if(c)return c;let d=En.get(t);d||(d=new RegExp(`\\$\\{(${Object.keys(n).join("|")})\\}`,"g"),En.set(t,d));const h=t.replace(d,(p,y)=>typeof n[y]<"u"?`(${n[y]})`:"");return Pn.set(s,h),h}function kh(t){return t.replace(w0,v0)}class zh{constructor(n,o,s){Y(this,"_conditions"),Y(this,"_runtimeConditions"),Y(this,"_feature"),Y(this,"_memoizedResult"),this._conditions=n.conditions,this._runtimeConditions=[],this._feature=o,this._memoizedResult=void 0,this.setRuntime(s)}setRuntime(n){var o;const s=(o=this._conditions)==null?void 0:o.map(c=>{const d=String(c[0]),h=String(c[1]);return new Qh(new Ki(d,this._feature,n),new Ki(h,this._feature,n))});this._runtimeConditions=s??[],this._memoizedResult=void 0}evaluate(){if(typeof this._memoizedResult<"u")return this._memoizedResult;const n=this._runtimeConditions,o=n.length;for(let c=0;c<o;c++){const d=n[c];if(d.condition.evaluate()){const h=d.expression.evaluate();return this._memoizedResult=h,h}}const s=void 0;return this._memoizedResult=s,s}}class Qh{constructor(n,o){Y(this,"condition"),Y(this,"expression"),this.condition=n,this.expression=o}}const Eh=(t,n,o)=>{const s=Yr(t,Q0),c=jh(t,n);return{...c,...Ph(s,t,c),type:"computedFeature",interval:o}};function Ph(t,n,o){if(!o){if(!n.id)throw new Error("layer id is required");o={type:"feature",id:n.id,properties:n.properties||{}}}return Object.fromEntries(Object.entries(t).map(([s,c])=>c?[s,Ec(c,n,o)]:void 0).filter(s=>!!s))}function Ec(t,n,o){return Object.fromEntries(Object.entries(t).map(([s,c])=>vh$1(c)?[s,Ec(c,n,o)]:[s,Bh(c,n,o)]))}function wh(t){return typeof t=="object"&&t&&"expression"in t}function vh$1(t){return typeof t=="object"&&t&&!("expression"in t)&&!Array.isArray(t)}function Bh(t,n,o){try{if(wh(t)){const s=t.expression,c=Qc(Bu(o));return typeof s>"u"?void 0:typeof s=="object"&&s.conditions?new zh(s,c,n.defines).evaluate():typeof s=="boolean"||typeof s=="number"?new Ki(String(s),c,n.defines).evaluate():typeof s=="string"?new Ki(s,c,n.defines).evaluate():s}return t}catch(s){console.error(s);return}}function jh(t,n){var o;const s=(o=t.data)==null?void 0:o.jsonProperties;if(!n.properties||!s||!s.length)return n;const c={...n,...n!=null&&n.properties?{properties:{...n.properties}}:{}};return s.forEach(d=>{c.properties[d]=(()=>{const h=c.properties[d];try{return JSON.parse(h)}catch{return h}})()}),c}function Ri(t,n){if(t.type==="simple")return Eh(t,n)}const Oh=(t,n,o)=>{if(!o)return;const s=(()=>{switch(re.types[t.type]){case"Polygon":return"polygon";case"LineString":return"polyline";case"Point":return"marker";default:return}})();if(!s)return;const c=t.id?String(t.id):Dh(t.loadGeometry(),n),d=Ri(o,Ah(c,t,n,s)),h=new Cesium$1.ImageryLayerFeatureInfo;return h.data={layerId:o==null?void 0:o.id,featureId:c,feature:d,appearanceType:re.types[t.type].toLowerCase()},h},Dh=(t,n)=>{const o=[n.x,n.y,n.level,...t.flatMap(s=>s.map(c=>[c.x,c.y]))].join(":");return k0(o)},Ah=(t,n,o,s)=>{const c=n.loadGeometry(),[d,h]=(()=>{if(s==="polygon")return["Polygon",c.map(p=>p.map(y=>[y.x,y.y]))];if(s==="polyline")return["LineString",c[0].map(p=>[p.x,p.y])];if(s==="marker")return["Point",[c[0][0].x,c[0][0].y]];throw new Error(`Unexpected appearance ${s}`)})();return{type:"feature",id:t,geometry:{type:d,coordinates:h},properties:n.properties,range:{x:o.x,y:o.y,z:o.level}}},Le=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,Pc=new Set,pl=typeof process=="object"&&process?process:{},wc=(t,n,o,s)=>{typeof pl.emitWarning=="function"?pl.emitWarning(t,n,o,s):console.error(`[${o}] ${n}: ${t}`)};let gi=globalThis.AbortController,wn=globalThis.AbortSignal;var cc;if(typeof gi>"u"){wn=class{constructor(){Y(this,"onabort"),Y(this,"_onabort",[]),Y(this,"reason"),Y(this,"aborted",!1)}addEventListener(o,s){this._onabort.push(s)}},gi=class{constructor(){Y(this,"signal",new wn),n()}abort(o){var s,c;if(!this.signal.aborted){this.signal.reason=o,this.signal.aborted=!0;for(const d of this.signal._onabort)d(o);(c=(s=this.signal).onabort)==null||c.call(s,o)}}};let t=((cc=pl.env)==null?void 0:cc.LRU_CACHE_IGNORE_AC_WARNING)!=="1";const n=()=>{t&&(t=!1,wc("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",n))}}const _h=t=>!Pc.has(t),$t=t=>t&&t===Math.floor(t)&&t>0&&isFinite(t),vc=t=>$t(t)?t<=Math.pow(2,8)?Uint8Array:t<=Math.pow(2,16)?Uint16Array:t<=Math.pow(2,32)?Uint32Array:t<=Number.MAX_SAFE_INTEGER?Wi:null:null;class Wi extends Array{constructor(n){super(n),this.fill(0)}}var Te;const Fe=class{constructor(t,n){if(Y(this,"heap"),Y(this,"length"),!r(Fe,Te))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new n(t),this.length=0}static create(t){const n=vc(t);if(!n)return[];k(Fe,Te,!0);const o=new Fe(t,n);return k(Fe,Te,!1),o}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}};let fi=Fe;Te=new WeakMap,P(fi,Te,!1);var Ut,Rt,Yt,Jt,Ue,ot,Ct,ct,tt,Q,Zt,Wt,bt,at,Kt,ut,gt,Nt,ft,Mt,ie,Vt,ei,Rl,he,vt,ii,St,Hi,Bc,be,Ye,li,kt,te,zt,ee,ni,Wl,km,Je,Si,Ce,Li,_,$,ci,fl,me,je;const ql=class{constructor(t){P(this,ei),P(this,Hi),P(this,kt),P(this,zt),P(this,ni),P(this,Je),P(this,Ce),P(this,_),P(this,ci),P(this,me),P(this,Ut,void 0),P(this,Rt,void 0),P(this,Yt,void 0),P(this,Jt,void 0),P(this,Ue,void 0),Y(this,"ttl"),Y(this,"ttlResolution"),Y(this,"ttlAutopurge"),Y(this,"updateAgeOnGet"),Y(this,"updateAgeOnHas"),Y(this,"allowStale"),Y(this,"noDisposeOnSet"),Y(this,"noUpdateTTL"),Y(this,"maxEntrySize"),Y(this,"sizeCalculation"),Y(this,"noDeleteOnFetchRejection"),Y(this,"noDeleteOnStaleGet"),Y(this,"allowStaleOnFetchAbort"),Y(this,"allowStaleOnFetchRejection"),Y(this,"ignoreFetchAbort"),P(this,ot,void 0),P(this,Ct,void 0),P(this,ct,void 0),P(this,tt,void 0),P(this,Q,void 0),P(this,Zt,void 0),P(this,Wt,void 0),P(this,bt,void 0),P(this,at,void 0),P(this,Kt,void 0),P(this,ut,void 0),P(this,gt,void 0),P(this,Nt,void 0),P(this,ft,void 0),P(this,Mt,void 0),P(this,ie,void 0),P(this,Vt,void 0),P(this,he,()=>{}),P(this,vt,()=>{}),P(this,ii,()=>{}),P(this,St,()=>!1),P(this,be,ha=>{}),P(this,Ye,(ha,ba,Sa)=>{}),P(this,li,(ha,ba,Sa,ya)=>{if(Sa||ya)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0}),Y(this,km,"LRUCache");const{max:n=0,ttl:o,ttlResolution:s=1,ttlAutopurge:c,updateAgeOnGet:d,updateAgeOnHas:h,allowStale:p,dispose:y,disposeAfter:E,noDisposeOnSet:L,noUpdateTTL:F,maxSize:N=0,maxEntrySize:z=0,sizeCalculation:oe,fetchMethod:W,noDeleteOnFetchRejection:lt,noDeleteOnStaleGet:nt,allowStaleOnFetchRejection:Ee,allowStaleOnFetchAbort:yt,ignoreFetchAbort:Ai}=t;if(n!==0&&!$t(n))throw new TypeError("max option must be a nonnegative integer");const zi=n?vc(n):Array;if(!zi)throw new Error("invalid max value: "+n);if(k(this,Ut,n),k(this,Rt,N),this.maxEntrySize=z||r(this,Rt),this.sizeCalculation=oe,this.sizeCalculation){if(!r(this,Rt)&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(W!==void 0&&typeof W!="function")throw new TypeError("fetchMethod must be a function if specified");if(k(this,Ue,W),k(this,ie,!!W),k(this,ct,new Map),k(this,tt,new Array(n).fill(void 0)),k(this,Q,new Array(n).fill(void 0)),k(this,Zt,new zi(n)),k(this,Wt,new zi(n)),k(this,bt,0),k(this,at,0),k(this,Kt,fi.create(n)),k(this,ot,0),k(this,Ct,0),typeof y=="function"&&k(this,Yt,y),typeof E=="function"?(k(this,Jt,E),k(this,ut,[])):(k(this,Jt,void 0),k(this,ut,void 0)),k(this,Mt,!!r(this,Yt)),k(this,Vt,!!r(this,Jt)),this.noDisposeOnSet=!!L,this.noUpdateTTL=!!F,this.noDeleteOnFetchRejection=!!lt,this.allowStaleOnFetchRejection=!!Ee,this.allowStaleOnFetchAbort=!!yt,this.ignoreFetchAbort=!!Ai,this.maxEntrySize!==0){if(r(this,Rt)!==0&&!$t(r(this,Rt)))throw new TypeError("maxSize must be a positive integer if specified");if(!$t(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");K(this,Hi,Bc).call(this)}if(this.allowStale=!!p,this.noDeleteOnStaleGet=!!nt,this.updateAgeOnGet=!!d,this.updateAgeOnHas=!!h,this.ttlResolution=$t(s)||s===0?s:1,this.ttlAutopurge=!!c,this.ttl=o||0,this.ttl){if(!$t(this.ttl))throw new TypeError("ttl must be a positive integer if specified");K(this,ei,Rl).call(this)}if(r(this,Ut)===0&&this.ttl===0&&r(this,Rt)===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!r(this,Ut)&&!r(this,Rt)){const ha="LRU_CACHE_UNBOUNDED";_h(ha)&&(Pc.add(ha),wc("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",ha,ql))}}static unsafeExposeInternals(t){return{starts:r(t,Nt),ttls:r(t,ft),sizes:r(t,gt),keyMap:r(t,ct),keyList:r(t,tt),valList:r(t,Q),next:r(t,Zt),prev:r(t,Wt),get head(){return r(t,bt)},get tail(){return r(t,at)},free:r(t,Kt),isBackgroundFetch:n=>{var o;return K(o=t,_,$).call(o,n)},backgroundFetch:(n,o,s,c)=>{var d;return K(d=t,Ce,Li).call(d,n,o,s,c)},moveToTail:n=>{var o;return K(o=t,me,je).call(o,n)},indexes:n=>{var o;return K(o=t,kt,te).call(o,n)},rindexes:n=>{var o;return K(o=t,zt,ee).call(o,n)},isStale:n=>{var o;return r(o=t,St).call(o,n)}}}get max(){return r(this,Ut)}get maxSize(){return r(this,Rt)}get calculatedSize(){return r(this,Ct)}get size(){return r(this,ot)}get fetchMethod(){return r(this,Ue)}get dispose(){return r(this,Yt)}get disposeAfter(){return r(this,Jt)}getRemainingTTL(t){return r(this,ct).has(t)?1/0:0}*entries(){for(const t of K(this,kt,te).call(this))r(this,Q)[t]!==void 0&&r(this,tt)[t]!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield[r(this,tt)[t],r(this,Q)[t]])}*rentries(){for(const t of K(this,zt,ee).call(this))r(this,Q)[t]!==void 0&&r(this,tt)[t]!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield[r(this,tt)[t],r(this,Q)[t]])}*keys(){for(const t of K(this,kt,te).call(this)){const n=r(this,tt)[t];n!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield n)}}*rkeys(){for(const t of K(this,zt,ee).call(this)){const n=r(this,tt)[t];n!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield n)}}*values(){for(const t of K(this,kt,te).call(this))r(this,Q)[t]!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield r(this,Q)[t])}*rvalues(){for(const t of K(this,zt,ee).call(this))r(this,Q)[t]!==void 0&&!K(this,_,$).call(this,r(this,Q)[t])&&(yield r(this,Q)[t])}[Symbol.iterator](){return this.entries()}find(t,n={}){for(const o of K(this,kt,te).call(this)){const s=r(this,Q)[o],c=K(this,_,$).call(this,s)?s.__staleWhileFetching:s;if(c!==void 0&&t(c,r(this,tt)[o],this))return this.get(r(this,tt)[o],n)}}forEach(t,n=this){for(const o of K(this,kt,te).call(this)){const s=r(this,Q)[o],c=K(this,_,$).call(this,s)?s.__staleWhileFetching:s;c!==void 0&&t.call(n,c,r(this,tt)[o],this)}}rforEach(t,n=this){for(const o of K(this,zt,ee).call(this)){const s=r(this,Q)[o],c=K(this,_,$).call(this,s)?s.__staleWhileFetching:s;c!==void 0&&t.call(n,c,r(this,tt)[o],this)}}purgeStale(){let t=!1;for(const n of K(this,zt,ee).call(this,{allowStale:!0}))r(this,St).call(this,n)&&(this.delete(r(this,tt)[n]),t=!0);return t}info(t){const n=r(this,ct).get(t);if(n===void 0)return;const o=r(this,Q)[n],s=K(this,_,$).call(this,o)?o.__staleWhileFetching:o;if(s===void 0)return;const c={value:s};if(r(this,ft)&&r(this,Nt)){const d=r(this,ft)[n],h=r(this,Nt)[n];if(d&&h){const p=d-(Le.now()-h);c.ttl=p,c.start=Date.now()}}return r(this,gt)&&(c.size=r(this,gt)[n]),c}dump(){const t=[];for(const n of K(this,kt,te).call(this,{allowStale:!0})){const o=r(this,tt)[n],s=r(this,Q)[n],c=K(this,_,$).call(this,s)?s.__staleWhileFetching:s;if(c===void 0||o===void 0)continue;const d={value:c};if(r(this,ft)&&r(this,Nt)){d.ttl=r(this,ft)[n];const h=Le.now()-r(this,Nt)[n];d.start=Math.floor(Date.now()-h)}r(this,gt)&&(d.size=r(this,gt)[n]),t.unshift([o,d])}return t}load(t){this.clear();for(const[n,o]of t){if(o.start){const s=Date.now()-o.start;o.start=Le.now()-s}this.set(n,o.value,o)}}set(t,n,o={}){var s,c,d,h,p;if(n===void 0)return this.delete(t),this;const{ttl:y=this.ttl,start:E,noDisposeOnSet:L=this.noDisposeOnSet,sizeCalculation:F=this.sizeCalculation,status:N}=o;let{noUpdateTTL:z=this.noUpdateTTL}=o;const oe=r(this,li).call(this,t,n,o.size||0,F);if(this.maxEntrySize&&oe>this.maxEntrySize)return N&&(N.set="miss",N.maxEntrySizeExceeded=!0),this.delete(t),this;let W=r(this,ot)===0?void 0:r(this,ct).get(t);if(W===void 0)W=r(this,ot)===0?r(this,at):r(this,Kt).length!==0?r(this,Kt).pop():r(this,ot)===r(this,Ut)?K(this,Je,Si).call(this,!1):r(this,ot),r(this,tt)[W]=t,r(this,Q)[W]=n,r(this,ct).set(t,W),r(this,Zt)[r(this,at)]=W,r(this,Wt)[W]=r(this,at),k(this,at,W),ri(this,ot)._++,r(this,Ye).call(this,W,oe,N),N&&(N.set="add"),z=!1;else{K(this,me,je).call(this,W);const lt=r(this,Q)[W];if(n!==lt){if(r(this,ie)&&K(this,_,$).call(this,lt)){lt.__abortController.abort(new Error("replaced"));const{__staleWhileFetching:nt}=lt;nt!==void 0&&!L&&(r(this,Mt)&&((s=r(this,Yt))==null||s.call(this,nt,t,"set")),r(this,Vt)&&((c=r(this,ut))==null||c.push([nt,t,"set"])))}else L||(r(this,Mt)&&((d=r(this,Yt))==null||d.call(this,lt,t,"set")),r(this,Vt)&&((h=r(this,ut))==null||h.push([lt,t,"set"])));if(r(this,be).call(this,W),r(this,Ye).call(this,W,oe,N),r(this,Q)[W]=n,N){N.set="replace";const nt=lt&&K(this,_,$).call(this,lt)?lt.__staleWhileFetching:lt;nt!==void 0&&(N.oldValue=nt)}}else N&&(N.set="update")}if(y!==0&&!r(this,ft)&&K(this,ei,Rl).call(this),r(this,ft)&&(z||r(this,ii).call(this,W,y,E),N&&r(this,vt).call(this,N,W)),!L&&r(this,Vt)&&r(this,ut)){const lt=r(this,ut);let nt;for(;nt=lt==null?void 0:lt.shift();)(p=r(this,Jt))==null||p.call(this,...nt)}return this}pop(){var t;try{for(;r(this,ot);){const n=r(this,Q)[r(this,bt)];if(K(this,Je,Si).call(this,!0),K(this,_,$).call(this,n)){if(n.__staleWhileFetching)return n.__staleWhileFetching}else if(n!==void 0)return n}}finally{if(r(this,Vt)&&r(this,ut)){const n=r(this,ut);let o;for(;o=n==null?void 0:n.shift();)(t=r(this,Jt))==null||t.call(this,...o)}}}has(t,n={}){const{updateAgeOnHas:o=this.updateAgeOnHas,status:s}=n,c=r(this,ct).get(t);if(c!==void 0){const d=r(this,Q)[c];if(K(this,_,$).call(this,d)&&d.__staleWhileFetching===void 0)return!1;if(r(this,St).call(this,c))s&&(s.has="stale",r(this,vt).call(this,s,c));else return o&&r(this,he).call(this,c),s&&(s.has="hit",r(this,vt).call(this,s,c)),!0}else s&&(s.has="miss");return!1}peek(t,n={}){const{allowStale:o=this.allowStale}=n,s=r(this,ct).get(t);if(s===void 0||!o&&r(this,St).call(this,s))return;const c=r(this,Q)[s];return K(this,_,$).call(this,c)?c.__staleWhileFetching:c}async fetch(t,n={}){const{allowStale:o=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:c=this.noDeleteOnStaleGet,ttl:d=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:p=0,sizeCalculation:y=this.sizeCalculation,noUpdateTTL:E=this.noUpdateTTL,noDeleteOnFetchRejection:L=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:F=this.allowStaleOnFetchRejection,ignoreFetchAbort:N=this.ignoreFetchAbort,allowStaleOnFetchAbort:z=this.allowStaleOnFetchAbort,context:oe,forceRefresh:W=!1,status:lt,signal:nt}=n;if(!r(this,ie))return lt&&(lt.fetch="get"),this.get(t,{allowStale:o,updateAgeOnGet:s,noDeleteOnStaleGet:c,status:lt});const Ee={allowStale:o,updateAgeOnGet:s,noDeleteOnStaleGet:c,ttl:d,noDisposeOnSet:h,size:p,sizeCalculation:y,noUpdateTTL:E,noDeleteOnFetchRejection:L,allowStaleOnFetchRejection:F,allowStaleOnFetchAbort:z,ignoreFetchAbort:N,status:lt,signal:nt};let yt=r(this,ct).get(t);if(yt===void 0){lt&&(lt.fetch="miss");const Ai=K(this,Ce,Li).call(this,t,yt,Ee,oe);return Ai.__returned=Ai}else{const Ai=r(this,Q)[yt];if(K(this,_,$).call(this,Ai)){const Sa=o&&Ai.__staleWhileFetching!==void 0;return lt&&(lt.fetch="inflight",Sa&&(lt.returnedStale=!0)),Sa?Ai.__staleWhileFetching:Ai.__returned=Ai}const zi=r(this,St).call(this,yt);if(!W&&!zi)return lt&&(lt.fetch="hit"),K(this,me,je).call(this,yt),s&&r(this,he).call(this,yt),lt&&r(this,vt).call(this,lt,yt),Ai;const ha=K(this,Ce,Li).call(this,t,yt,Ee,oe),ba=ha.__staleWhileFetching!==void 0&&o;return lt&&(lt.fetch=zi?"stale":"refresh",ba&&zi&&(lt.returnedStale=!0)),ba?ha.__staleWhileFetching:ha.__returned=ha}}get(t,n={}){const{allowStale:o=this.allowStale,updateAgeOnGet:s=this.updateAgeOnGet,noDeleteOnStaleGet:c=this.noDeleteOnStaleGet,status:d}=n,h=r(this,ct).get(t);if(h!==void 0){const p=r(this,Q)[h],y=K(this,_,$).call(this,p);return d&&r(this,vt).call(this,d,h),r(this,St).call(this,h)?(d&&(d.get="stale"),y?(d&&o&&p.__staleWhileFetching!==void 0&&(d.returnedStale=!0),o?p.__staleWhileFetching:void 0):(c||this.delete(t),d&&o&&(d.returnedStale=!0),o?p:void 0)):(d&&(d.get="hit"),y?p.__staleWhileFetching:(K(this,me,je).call(this,h),s&&r(this,he).call(this,h),p))}else d&&(d.get="miss")}delete(t){var n,o,s,c;let d=!1;if(r(this,ot)!==0){const h=r(this,ct).get(t);if(h!==void 0)if(d=!0,r(this,ot)===1)this.clear();else{r(this,be).call(this,h);const p=r(this,Q)[h];if(K(this,_,$).call(this,p)?p.__abortController.abort(new Error("deleted")):(r(this,Mt)||r(this,Vt))&&(r(this,Mt)&&((n=r(this,Yt))==null||n.call(this,p,t,"delete")),r(this,Vt)&&((o=r(this,ut))==null||o.push([p,t,"delete"]))),r(this,ct).delete(t),r(this,tt)[h]=void 0,r(this,Q)[h]=void 0,h===r(this,at))k(this,at,r(this,Wt)[h]);else if(h===r(this,bt))k(this,bt,r(this,Zt)[h]);else{const y=r(this,Wt)[h];r(this,Zt)[y]=r(this,Zt)[h];const E=r(this,Zt)[h];r(this,Wt)[E]=r(this,Wt)[h]}ri(this,ot)._--,r(this,Kt).push(h)}}if(r(this,Vt)&&(s=r(this,ut))!=null&&s.length){const h=r(this,ut);let p;for(;p=h==null?void 0:h.shift();)(c=r(this,Jt))==null||c.call(this,...p)}return d}clear(){var t,n,o;for(const s of K(this,zt,ee).call(this,{allowStale:!0})){const c=r(this,Q)[s];if(K(this,_,$).call(this,c))c.__abortController.abort(new Error("deleted"));else{const d=r(this,tt)[s];r(this,Mt)&&((t=r(this,Yt))==null||t.call(this,c,d,"delete")),r(this,Vt)&&((n=r(this,ut))==null||n.push([c,d,"delete"]))}}if(r(this,ct).clear(),r(this,Q).fill(void 0),r(this,tt).fill(void 0),r(this,ft)&&r(this,Nt)&&(r(this,ft).fill(0),r(this,Nt).fill(0)),r(this,gt)&&r(this,gt).fill(0),k(this,bt,0),k(this,at,0),r(this,Kt).length=0,k(this,Ct,0),k(this,ot,0),r(this,Vt)&&r(this,ut)){const s=r(this,ut);let c;for(;c=s==null?void 0:s.shift();)(o=r(this,Jt))==null||o.call(this,...c)}}};let yl=ql;km=Symbol.toStringTag,Ut=new WeakMap,Rt=new WeakMap,Yt=new WeakMap,Jt=new WeakMap,Ue=new WeakMap,ot=new WeakMap,Ct=new WeakMap,ct=new WeakMap,tt=new WeakMap,Q=new WeakMap,Zt=new WeakMap,Wt=new WeakMap,bt=new WeakMap,at=new WeakMap,Kt=new WeakMap,ut=new WeakMap,gt=new WeakMap,Nt=new WeakMap,ft=new WeakMap,Mt=new WeakMap,ie=new WeakMap,Vt=new WeakMap,ei=new WeakSet,Rl=function(){const t=new Wi(r(this,Ut)),n=new Wi(r(this,Ut));k(this,ft,t),k(this,Nt,n),k(this,ii,(c,d,h=Le.now())=>{if(n[c]=d!==0?h:0,t[c]=d,d!==0&&this.ttlAutopurge){const p=setTimeout(()=>{r(this,St).call(this,c)&&this.delete(r(this,tt)[c])},d+1);p.unref&&p.unref()}}),k(this,he,c=>{n[c]=t[c]!==0?Le.now():0}),k(this,vt,(c,d)=>{if(t[d]){const h=t[d],p=n[d];if(!h||!p)return;c.ttl=h,c.start=p,c.now=o||s();const y=c.now-p;c.remainingTTL=h-y}});let o=0;const s=()=>{const c=Le.now();if(this.ttlResolution>0){o=c;const d=setTimeout(()=>o=0,this.ttlResolution);d.unref&&d.unref()}return c};this.getRemainingTTL=c=>{const d=r(this,ct).get(c);if(d===void 0)return 0;const h=t[d],p=n[d];if(!h||!p)return 1/0;const y=(o||s())-p;return h-y},k(this,St,c=>{const d=n[c],h=t[c];return!!h&&!!d&&(o||s())-d>h})},he=new WeakMap,vt=new WeakMap,ii=new WeakMap,St=new WeakMap,Hi=new WeakSet,Bc=function(){const t=new Wi(r(this,Ut));k(this,Ct,0),k(this,gt,t),k(this,be,n=>{k(this,Ct,r(this,Ct)-t[n]),t[n]=0}),k(this,li,(n,o,s,c)=>{if(K(this,_,$).call(this,o))return 0;if(!$t(s))if(c){if(typeof c!="function")throw new TypeError("sizeCalculation must be a function");if(s=c(o,n),!$t(s))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return s}),k(this,Ye,(n,o,s)=>{if(t[n]=o,r(this,Rt)){const c=r(this,Rt)-t[n];for(;r(this,Ct)>c;)K(this,Je,Si).call(this,!0)}k(this,Ct,r(this,Ct)+t[n]),s&&(s.entrySize=o,s.totalCalculatedSize=r(this,Ct))})},be=new WeakMap,Ye=new WeakMap,li=new WeakMap,kt=new WeakSet,te=function*({allowStale:t=this.allowStale}={}){if(r(this,ot))for(let n=r(this,at);!(!K(this,ni,Wl).call(this,n)||((t||!r(this,St).call(this,n))&&(yield n),n===r(this,bt)));)n=r(this,Wt)[n]},zt=new WeakSet,ee=function*({allowStale:t=this.allowStale}={}){if(r(this,ot))for(let n=r(this,bt);!(!K(this,ni,Wl).call(this,n)||((t||!r(this,St).call(this,n))&&(yield n),n===r(this,at)));)n=r(this,Zt)[n]},ni=new WeakSet,Wl=function(t){return t!==void 0&&r(this,ct).get(r(this,tt)[t])===t},Je=new WeakSet,Si=function(t){var n,o;const s=r(this,bt),c=r(this,tt)[s],d=r(this,Q)[s];return r(this,ie)&&K(this,_,$).call(this,d)?d.__abortController.abort(new Error("evicted")):(r(this,Mt)||r(this,Vt))&&(r(this,Mt)&&((n=r(this,Yt))==null||n.call(this,d,c,"evict")),r(this,Vt)&&((o=r(this,ut))==null||o.push([d,c,"evict"]))),r(this,be).call(this,s),t&&(r(this,tt)[s]=void 0,r(this,Q)[s]=void 0,r(this,Kt).push(s)),r(this,ot)===1?(k(this,bt,k(this,at,0)),r(this,Kt).length=0):k(this,bt,r(this,Zt)[s]),r(this,ct).delete(c),ri(this,ot)._--,s},Ce=new WeakSet,Li=function(t,n,o,s){const c=n===void 0?void 0:r(this,Q)[n];if(K(this,_,$).call(this,c))return c;const d=new gi,{signal:h}=o;h==null||h.addEventListener("abort",()=>d.abort(h.reason),{signal:d.signal});const p={signal:d.signal,options:o,context:s},y=(oe,W=!1)=>{const{aborted:lt}=d.signal,nt=o.ignoreFetchAbort&&oe!==void 0;if(o.status&&(lt&&!W?(o.status.fetchAborted=!0,o.status.fetchError=d.signal.reason,nt&&(o.status.fetchAbortIgnored=!0)):o.status.fetchResolved=!0),lt&&!nt&&!W)return L(d.signal.reason);const Ee=N;return r(this,Q)[n]===N&&(oe===void 0?Ee.__staleWhileFetching?r(this,Q)[n]=Ee.__staleWhileFetching:this.delete(t):(o.status&&(o.status.fetchUpdated=!0),this.set(t,oe,p.options))),oe},E=oe=>(o.status&&(o.status.fetchRejected=!0,o.status.fetchError=oe),L(oe)),L=oe=>{const{aborted:W}=d.signal,lt=W&&o.allowStaleOnFetchAbort,nt=lt||o.allowStaleOnFetchRejection,Ee=nt||o.noDeleteOnFetchRejection,yt=N;if(r(this,Q)[n]===N&&(!Ee||yt.__staleWhileFetching===void 0?this.delete(t):lt||(r(this,Q)[n]=yt.__staleWhileFetching)),nt)return o.status&&yt.__staleWhileFetching!==void 0&&(o.status.returnedStale=!0),yt.__staleWhileFetching;if(yt.__returned===yt)throw oe},F=(oe,W)=>{var lt;const nt=(lt=r(this,Ue))==null?void 0:lt.call(this,t,c,p);nt&&nt instanceof Promise&&nt.then(Ee=>oe(Ee===void 0?void 0:Ee),W),d.signal.addEventListener("abort",()=>{(!o.ignoreFetchAbort||o.allowStaleOnFetchAbort)&&(oe(void 0),o.allowStaleOnFetchAbort&&(oe=Ee=>y(Ee,!0)))})};o.status&&(o.status.fetchDispatched=!0);const N=new Promise(F).then(y,E),z=Object.assign(N,{__abortController:d,__staleWhileFetching:c,__returned:void 0});return n===void 0?(this.set(t,z,{...p.options,status:void 0}),n=r(this,ct).get(t)):r(this,Q)[n]=z,z},_=new WeakSet,$=function(t){if(!r(this,ie))return!1;const n=t;return!!n&&n instanceof Promise&&n.hasOwnProperty("__staleWhileFetching")&&n.__abortController instanceof gi},ci=new WeakSet,fl=function(t,n){r(this,Wt)[n]=t,r(this,Zt)[t]=n},me=new WeakSet,je=function(t){t!==r(this,at)&&(t===r(this,bt)?k(this,bt,r(this,Zt)[t]):K(this,ci,fl).call(this,r(this,Wt)[t],r(this,Zt)[t]),K(this,ci,fl).call(this,r(this,at),t),k(this,at,t))};const vn=new yl({max:1e3}),qh=(t,n,o)=>{const s=JSON.stringify(t.properties),c=vn.get(s);if(c)return c;const d=(()=>{switch(re.types[t.type]){case"Polygon":return"polygon";case"LineString":return"polyline";case"Point":return"marker";default:return}})(),h=(()=>{if((o==null?void 0:o.type)!=="simple"||!d)return;const y=$h("",t,n,d);if(y)return Ri==null?void 0:Ri(o,y)})(),p=(()=>{if(d==="polygon"){const y=h==null?void 0:h.polygon;return{fillStyle:((y==null?void 0:y.fill)??!0)&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.fillColor:"rgba(0,0,0,0)",strokeStyle:y!=null&&y.stroke&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.strokeColor:"rgba(0,0,0,0)",lineWidth:y==null?void 0:y.strokeWidth,lineJoin:y==null?void 0:y.lineJoin}}if(d==="polyline"){const y=h==null?void 0:h.polyline;return{fillStyle:((y==null?void 0:y.strokeColor)??!0)&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.strokeColor:"rgba(0,0,0,0)",strokeStyle:y!=null&&y.strokeColor&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.strokeColor:"rgba(0,0,0,0)",lineWidth:y==null?void 0:y.strokeWidth}}if(d==="marker"){const y=h==null?void 0:h.marker;return{fillStyle:((y==null?void 0:y.pointColor)??!0)&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.pointColor:"rgba(0,0,0,0)",strokeStyle:y!=null&&y.pointColor&&((y==null?void 0:y.show)??!0)?y==null?void 0:y.pointColor:"rgba(0,0,0,0)",lineWidth:y==null?void 0:y.pointSize}}})();return vn.set(s,p),p},$h=(t,n,o,s)=>{const c=n.loadGeometry(),[d,h]=(()=>{if(s==="polygon")return["Polygon",c.map(p=>p.map(y=>[y.x,y.y]))];if(s==="polyline")return["LineString",c[0].map(p=>[p.x,p.y])];if(s==="marker")return["Point",[c[0][0].x,c[0][0].y]];throw new Error(`Unexpected appearance ${s}`)})();return{type:"feature",id:t,geometry:{type:d,coordinates:h},properties:n.properties,range:{x:o.x,y:o.y,z:o.level}}};function tb(t){return ib(t)===Cesium$1.WindingOrder.COUNTER_CLOCKWISE}function Bn(t,n){const o=t.x,s=t.y;let c=!1;for(let d=0,h=n.length-1;d<n.length;h=d++){const p=n[d].x,y=n[d].y,E=n[h].x,L=n[h].y;y>s!=L>s&&o<(E-p)*(s-y)/(L-y)+p&&(c=!c)}return c}function eb(t,n){for(let o=0;o<t.length;o++)if(Bn(n,t[o])){let s=!1;for(;o+1<t.length&&!tb(t[o+1]);)o++,!s&&Bn(n,t[o])&&(s=!0);if(!s)return!0}return!1}function ib(t){const n=t.length;let o=t[n-1].x*(t[0].y-t[n-2].y)+t[0].x*(t[1].y-t[n-1].y);for(let s=1;s<=n-2;s++)o+=t[s].x*(t[s+1].y-t[s-1].y);if(isNaN(o))throw new Error;return o>0?Cesium$1.WindingOrder.COUNTER_CLOCKWISE:Cesium$1.WindingOrder.CLOCKWISE}const ue=256;class lb{constructor(n){Y(this,"_urlTemplate"),Y(this,"_parseTile"),Y(this,"_tilingScheme"),Y(this,"_layerNames"),Y(this,"_tileWidth"),Y(this,"_tileHeight"),Y(this,"_tileCaches"),this._parseTile=nb,this._urlTemplate=n.urlTemplate,this._tileWidth=ue,this._tileHeight=ue,this._layerNames=n.layerNames,this._tilingScheme=new ce}async render(n,o,s,c){const d=jn(this._urlTemplate,o);await Promise.all(this._layerNames.map(h=>this._renderCanvas(d,n,o,h,s,c)))}async _renderCanvas(n,o,s,c,d,h){if(!n)return;const p=await this._cachedTile(n),y=c.split(/, */).filter(Boolean).map(E=>p==null?void 0:p.layers[E]);y&&(o.strokeStyle="black",o.fillStyle="black",o.lineWidth=1,o.miterLimit=2,o.setTransform(this._tileWidth*d/ue,0,0,this._tileHeight*d/ue,0,0),y.forEach(E=>{if(!E)return;const L=ue/E.extent;for(let F=0;F<E.length;F++){const N=E.feature(F),z=qh(N,s,h);if(!z)continue;o.fillStyle=z.fillStyle??o.fillStyle,o.strokeStyle=z.strokeStyle??o.strokeStyle,o.lineWidth=z.lineWidth??o.lineWidth,o.lineJoin=z.lineJoin??o.lineJoin;const oe=N.loadGeometry();re.types[N.type]==="Polygon"?this._renderPolygon(o,oe,L,(z.lineWidth??1)>0):re.types[N.type]==="Point"?this._renderPoint(o,oe,L):re.types[N.type]==="LineString"?this._renderLineString(o,oe,L):console.error(`Unexpected geometry type: ${N.type} in region map on tile ${[s.level,s.x,s.y].join("/")}`)}}))}_renderPolygon(n,o,s,c){n.beginPath();const d=()=>{c&&n.stroke(),n.fill()};let h=0;for(let p=0;p<o.length;p++){const y=o[p];h+y.length>5400&&(d(),h=0,n.beginPath());let E=y[0];n.moveTo(E.x*s,E.y*s);for(let L=1;L<y.length;L++)E=y[L],n.lineTo(E.x*s,E.y*s);h+=y.length}h>0&&d()}_renderPoint(n,o,s){n.beginPath();for(let c=0;c<o.length;c++){const d=o[c][0],[h,p]=[d.x*s,d.y*s],y=n.lineWidth;n.beginPath(),n.arc(h,p,y,0,2*Math.PI),n.fill()}}_renderLineString(n,o,s){n.beginPath();for(let c=0;c<o.length;c++){let d=o[c][0];n.moveTo(d.x*s,d.y*s);for(let h=1;h<o[c].length;h++)d=o[c][h],n.lineTo(d.x*s,d.y*s)}n.stroke()}pickFeatures(n,o,s,c){const d=jn(this._urlTemplate,n);return this._pickFeaturesFromLayer(d,n,o,s,c)}async _pickFeaturesFromLayer(n,o,s,c,d){try{const h=await this._cachedTile(n);return h?(await Promise.all(this._layerNames.map(async p=>{const y=h.layers[p];return y?await this._pickFeatures(o,s,c,y,d)||[]:[]}))).flat():[]}catch{return[]}}async _pickFeatures(n,o,s,c,d){const h=this._tilingScheme.tileXYToNativeRectangle(n.x,n.y,n.level),p=[h.west,h.east],y=[h.north,h.south],E=function(oe,W,lt,nt,Ee){const yt=new Cesium$1.Cartesian2;Cesium$1.Cartesian2.subtract(oe,new Cesium$1.Cartesian2(W[0],lt[0]),yt);const Ai=new Cesium$1.Cartesian2((nt[1]-nt[0])/(W[1]-W[0]),(Ee[1]-Ee[0])/(lt[1]-lt[0]));return Cesium$1.Cartesian2.add(Cesium$1.Cartesian2.multiplyComponents(yt,Ai,new Cesium$1.Cartesian2),new Cesium$1.Cartesian2(nt[0],Ee[0]),new Cesium$1.Cartesian2)},L=[],F=[0,c.extent-1],N=E(Cesium$1.Cartesian2.fromCartesian3(this._tilingScheme.projection.project(new Cesium$1.Cartographic(o,s))),p,y,F,F),z=new Cc(N.x,N.y);for(let oe=0;oe<c.length;oe++){const W=c.feature(oe);if(re.types[W.type]==="Polygon"&&eb(W.loadGeometry(),z)){const lt=Oh(W,n,d);lt&&L.push(lt)}}return L}async _cachedTile(n){var o,s;if(n){if((o=this._tileCaches)!=null&&o.has(n))return this._tileCaches.get(n);try{const c=ob(await this._parseTile(n));return c&&((s=this._tileCaches)==null||s.set(n,c)),c}catch{return}}}clearCache(){var n;(n=this._tileCaches)==null||n.clear()}}const nb=async t=>{try{const n=await db(t);return n?cb(n):void 0}catch{return}},cb=t=>new p0(new y0(t)),db=async t=>{if(!t){console.error("fetch request failed because request url is undefined");return}try{const n=await fetch(t);return n.ok?await n.arrayBuffer():void 0}catch{return}},ob=t=>{var n;if(!t)return;const o={};for(const[s,c]of Object.entries(t.layers)){const d=[],h=c;for(let p=0;p<h.length;p++){const y=h.feature(p);let E;const L=(n=y.bbox)==null?void 0:n.call(y),F={...y,id:y.id,loadGeometry:()=>(E||(E=y.loadGeometry()),E),bbox:L?()=>L:void 0,toGeoJSON:y.toGeoJSON};d.push(F)}o[s]={...h,feature:p=>d[p]}}return{layers:o}},jn=(t,n)=>decodeURIComponent(t).replace("{z}",String(n.level)).replace("{x}",String(n.x)).replace("{y}",String(n.y));var jc={},xt={},Xe={};Object.defineProperty(Xe,"__esModule",{value:!0}),Xe.DefaultSerializer=Xe.extendSerializer=void 0;function sb(t,n){const o=t.deserialize.bind(t),s=t.serialize.bind(t);return{deserialize(c){return n.deserialize(c,o)},serialize(c){return n.serialize(c,s)}}}Xe.extendSerializer=sb;const On={deserialize(t){return Object.assign(Error(t.message),{name:t.name,stack:t.stack})},serialize(t){return{__error_marker:"$$error",message:t.message,name:t.name,stack:t.stack}}},ab=t=>t&&typeof t=="object"&&"__error_marker"in t&&t.__error_marker==="$$error";Xe.DefaultSerializer={deserialize(t){return ab(t)?On.deserialize(t):t},serialize(t){return t instanceof Error?On.serialize(t):t}},Object.defineProperty(xt,"__esModule",{value:!0}),xt.serialize=xt.deserialize=xt.registerSerializer=void 0;const Oc=Xe;let Ni=Oc.DefaultSerializer;function ub(t){Ni=Oc.extendSerializer(Ni,t)}xt.registerSerializer=ub;function rb(t){return Ni.deserialize(t)}xt.deserialize=rb;function hb(t){return Ni.serialize(t)}xt.serialize=hb;var Dc={},jt={},Ne={};Object.defineProperty(Ne,"__esModule",{value:!0}),Ne.getBundleURL=Ne.getBaseURL=void 0;let ll;function bb(){return ll||(ll=mb()),ll}Ne.getBundleURL=bb;function mb(){try{throw new Error}catch(t){const n=(""+t.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\/\/[^)\n]+/g);if(n)return Ac(n[0])}return"/"}function Ac(t){return(""+t).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\/\/.+)?\/[^/]+(?:\?.*)?$/,"$1")+"/"}Ne.getBaseURL=Ac,Object.defineProperty(jt,"__esModule",{value:!0}),jt.isWorkerRuntime=jt.getWorkerImplementation=jt.defaultPoolSize=void 0;const Dn=Ne;jt.defaultPoolSize=typeof navigator<"u"&&navigator.hardwareConcurrency?navigator.hardwareConcurrency:4;const An=t=>/^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(t);function _n(t){const n=new Blob([t],{type:"application/javascript"});return URL.createObjectURL(n)}function Zb(){if(typeof Worker>"u")return class{constructor(){throw Error("No web worker implementation available. You might have tried to spawn a worker within a worker in a browser that doesn't support workers in workers.")}};class t extends Worker{constructor(s,c){var d,h;typeof s=="string"&&c&&c._baseURL?s=new URL(s,c._baseURL):typeof s=="string"&&!An(s)&&Dn.getBundleURL().match(/^file:\/\//i)&&(s=new URL(s,Dn.getBundleURL().replace(/\/[^\/]+$/,"/")),(!((d=c==null?void 0:c.CORSWorkaround)!==null&&d!==void 0)||d)&&(s=_n(`importScripts(${JSON.stringify(s)});`))),typeof s=="string"&&An(s)&&(!((h=c==null?void 0:c.CORSWorkaround)!==null&&h!==void 0)||h)&&(s=_n(`importScripts(${JSON.stringify(s)});`)),super(s,c)}}class n extends t{constructor(s,c){const d=window.URL.createObjectURL(s);super(d,c)}static fromText(s,c){const d=new window.Blob([s],{type:"text/javascript"});return new n(d,c)}}return{blob:n,default:t}}let nl$2;function Vb(){return nl$2||(nl$2=Zb()),nl$2}jt.getWorkerImplementation=Vb;function Xb(){const t=typeof self<"u"&&typeof Window<"u"&&self instanceof Window;return!!(typeof self<"u"&&self.postMessage&&!t)}jt.isWorkerRuntime=Xb;var _c={},Me={},Gb={get exports(){return Me},set exports(t){Me=t}},cl,qn;function pb(){if(qn)return cl;qn=1;var t=1e3,n=t*60,o=n*60,s=o*24,c=s*7,d=s*365.25;cl=function(L,F){F=F||{};var N=typeof L;if(N==="string"&&L.length>0)return h(L);if(N==="number"&&isFinite(L))return F.long?y(L):p(L);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(L))};function h(L){if(L=String(L),!(L.length>100)){var F=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(L);if(F){var N=parseFloat(F[1]),z=(F[2]||"ms").toLowerCase();switch(z){case"years":case"year":case"yrs":case"yr":case"y":return N*d;case"weeks":case"week":case"w":return N*c;case"days":case"day":case"d":return N*s;case"hours":case"hour":case"hrs":case"hr":case"h":return N*o;case"minutes":case"minute":case"mins":case"min":case"m":return N*n;case"seconds":case"second":case"secs":case"sec":case"s":return N*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return N;default:return}}}}function p(L){var F=Math.abs(L);return F>=s?Math.round(L/s)+"d":F>=o?Math.round(L/o)+"h":F>=n?Math.round(L/n)+"m":F>=t?Math.round(L/t)+"s":L+"ms"}function y(L){var F=Math.abs(L);return F>=s?E(L,F,s,"day"):F>=o?E(L,F,o,"hour"):F>=n?E(L,F,n,"minute"):F>=t?E(L,F,t,"second"):L+" ms"}function E(L,F,N,z){var oe=F>=N*1.5;return Math.round(L/N)+" "+z+(oe?"s":"")}return cl}function yb(t){o.debug=o,o.default=o,o.coerce=y,o.disable=d,o.enable=c,o.enabled=h,o.humanize=pb(),o.destroy=E,Object.keys(t).forEach(L=>{o[L]=t[L]}),o.names=[],o.skips=[],o.formatters={};function n(L){let F=0;for(let N=0;N<L.length;N++)F=(F<<5)-F+L.charCodeAt(N),F|=0;return o.colors[Math.abs(F)%o.colors.length]}o.selectColor=n;function o(L){let F,N=null,z,oe;function W(...lt){if(!W.enabled)return;const nt=W,Ee=Number(new Date),yt=Ee-(F||Ee);nt.diff=yt,nt.prev=F,nt.curr=Ee,F=Ee,lt[0]=o.coerce(lt[0]),typeof lt[0]!="string"&<.unshift("%O");let Ai=0;lt[0]=lt[0].replace(/%([a-zA-Z%])/g,(zi,ha)=>{if(zi==="%%")return"%";Ai++;const ba=o.formatters[ha];if(typeof ba=="function"){const Sa=lt[Ai];zi=ba.call(nt,Sa),lt.splice(Ai,1),Ai--}return zi}),o.formatArgs.call(nt,lt),(nt.log||o.log).apply(nt,lt)}return W.namespace=L,W.useColors=o.useColors(),W.color=o.selectColor(L),W.extend=s,W.destroy=o.destroy,Object.defineProperty(W,"enabled",{enumerable:!0,configurable:!1,get:()=>N!==null?N:(z!==o.namespaces&&(z=o.namespaces,oe=o.enabled(L)),oe),set:lt=>{N=lt}}),typeof o.init=="function"&&o.init(W),W}function s(L,F){const N=o(this.namespace+(typeof F>"u"?":":F)+L);return N.log=this.log,N}function c(L){o.save(L),o.namespaces=L,o.names=[],o.skips=[];let F;const N=(typeof L=="string"?L:"").split(/[\s,]+/),z=N.length;for(F=0;F<z;F++)N[F]&&(L=N[F].replace(/\*/g,".*?"),L[0]==="-"?o.skips.push(new RegExp("^"+L.slice(1)+"$")):o.names.push(new RegExp("^"+L+"$")))}function d(){const L=[...o.names.map(p),...o.skips.map(p).map(F=>"-"+F)].join(",");return o.enable(""),L}function h(L){if(L[L.length-1]==="*")return!0;let F,N;for(F=0,N=o.skips.length;F<N;F++)if(o.skips[F].test(L))return!1;for(F=0,N=o.names.length;F<N;F++)if(o.names[F].test(L))return!0;return!1}function p(L){return L.toString().substring(2,L.toString().length-2).replace(/\.\*\?$/,"*")}function y(L){return L instanceof Error?L.stack||L.message:L}function E(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return o.enable(o.load()),o}var Rb=yb;(function(t,n){n.formatArgs=s,n.save=c,n.load=d,n.useColors=o,n.storage=h(),n.destroy=(()=>{let y=!1;return()=>{y||(y=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),n.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function o(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function s(y){if(y[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+y[0]+(this.useColors?"%c ":" ")+"+"+t.exports.humanize(this.diff),!this.useColors)return;const E="color: "+this.color;y.splice(1,0,E,"color: inherit");let L=0,F=0;y[0].replace(/%[a-zA-Z%]/g,N=>{N!=="%%"&&(L++,N==="%c"&&(F=L))}),y.splice(F,0,E)}n.log=console.debug||console.log||(()=>{});function c(y){try{y?n.storage.setItem("debug",y):n.storage.removeItem("debug")}catch{}}function d(){let y;try{y=n.storage.getItem("debug")}catch{}return!y&&typeof process<"u"&&"env"in process&&(y=process.env.DEBUG),y}function h(){try{return localStorage}catch{}}t.exports=Rb(n);const{formatters:p}=t.exports;p.j=function(y){try{return JSON.stringify(y)}catch(E){return"[UnexpectedJSONParseError]: "+E.message}}})(Gb,Me);var Wb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})};class wi{constructor(n){this._baseObserver=n,this._pendingPromises=new Set}complete(){Promise.all(this._pendingPromises).then(()=>this._baseObserver.complete()).catch(n=>this._baseObserver.error(n))}error(n){this._baseObserver.error(n)}schedule(n){const o=Promise.all(this._pendingPromises),s=[],c=h=>s.push(h),d=Promise.resolve().then(()=>Wb(this,void 0,void 0,function*(){yield o,yield n(c),this._pendingPromises.delete(d);for(const h of s)this._baseObserver.next(h)})).catch(h=>{this._pendingPromises.delete(d),this._baseObserver.error(h)});this._pendingPromises.add(d)}}const qc=()=>typeof Symbol=="function",di=t=>qc()&&!!Symbol[t],Bl=t=>di(t)?Symbol[t]:"@@"+t;di("asyncIterator")||(Symbol.asyncIterator=Symbol.asyncIterator||Symbol.for("Symbol.asyncIterator"));const fb=Bl("iterator"),Sl=Bl("observable"),$c=Bl("species");function Mi(t,n){const o=t[n];if(o!=null){if(typeof o!="function")throw new TypeError(o+" is not a function");return o}}function ve(t){let n=t.constructor;return n!==void 0&&(n=n[$c],n===null&&(n=void 0)),n!==void 0?n:It}function Sb(t){return t instanceof It}function He(t){He.log?He.log(t):setTimeout(()=>{throw t},0)}function Fi(t){Promise.resolve().then(()=>{try{t()}catch(n){He(n)}})}function td(t){const n=t._cleanup;if(n!==void 0&&(t._cleanup=void 0,!!n))try{if(typeof n=="function")n();else{const o=Mi(n,"unsubscribe");o&&o.call(n)}}catch(o){He(o)}}function Ll(t){t._observer=void 0,t._queue=void 0,t._state="closed"}function Lb(t){const n=t._queue;if(n){t._queue=void 0,t._state="ready";for(const o of n)if(ed(t,o.type,o.value),t._state==="closed")break}}function ed(t,n,o){t._state="running";const s=t._observer;try{const c=s?Mi(s,n):void 0;switch(n){case"next":c&&c.call(s,o);break;case"error":if(Ll(t),c)c.call(s,o);else throw o;break;case"complete":Ll(t),c&&c.call(s);break}}catch(c){He(c)}t._state==="closed"?td(t):t._state==="running"&&(t._state="ready")}function dl(t,n,o){if(t._state!=="closed"){if(t._state==="buffering"){t._queue=t._queue||[],t._queue.push({type:n,value:o});return}if(t._state!=="ready"){t._state="buffering",t._queue=[{type:n,value:o}],Fi(()=>Lb(t));return}ed(t,n,o)}}class Fb{constructor(n,o){this._cleanup=void 0,this._observer=n,this._queue=void 0,this._state="initializing";const s=new Ib(this);try{this._cleanup=o.call(void 0,s)}catch(c){s.error(c)}this._state==="initializing"&&(this._state="ready")}get closed(){return this._state==="closed"}unsubscribe(){this._state!=="closed"&&(Ll(this),td(this))}}class Ib{constructor(n){this._subscription=n}get closed(){return this._subscription._state==="closed"}next(n){dl(this._subscription,"next",n)}error(n){dl(this._subscription,"error",n)}complete(){dl(this._subscription,"complete")}}class It{constructor(n){if(!(this instanceof It))throw new TypeError("Observable cannot be called as a function");if(typeof n!="function")throw new TypeError("Observable initializer must be a function");this._subscriber=n}subscribe(n,o,s){return(typeof n!="object"||n===null)&&(n={next:n,error:o,complete:s}),new Fb(n,this._subscriber)}pipe(n,...o){let s=this;for(const c of[n,...o])s=c(s);return s}tap(n,o,s){const c=typeof n!="object"||n===null?{next:n,error:o,complete:s}:n;return new It(d=>this.subscribe({next(h){c.next&&c.next(h),d.next(h)},error(h){c.error&&c.error(h),d.error(h)},complete(){c.complete&&c.complete(),d.complete()},start(h){c.start&&c.start(h)}}))}forEach(n){return new Promise((o,s)=>{if(typeof n!="function"){s(new TypeError(n+" is not a function"));return}function c(){d.unsubscribe(),o(void 0)}const d=this.subscribe({next(h){try{n(h,c)}catch(p){s(p),d.unsubscribe()}},error(h){s(h)},complete(){o(void 0)}})})}map(n){if(typeof n!="function")throw new TypeError(n+" is not a function");const o=ve(this);return new o(s=>this.subscribe({next(c){let d=c;try{d=n(c)}catch(h){return s.error(h)}s.next(d)},error(c){s.error(c)},complete(){s.complete()}}))}filter(n){if(typeof n!="function")throw new TypeError(n+" is not a function");const o=ve(this);return new o(s=>this.subscribe({next(c){try{if(!n(c))return}catch(d){return s.error(d)}s.next(c)},error(c){s.error(c)},complete(){s.complete()}}))}reduce(n,o){if(typeof n!="function")throw new TypeError(n+" is not a function");const s=ve(this),c=arguments.length>1;let d=!1,h=o;return new s(p=>this.subscribe({next(y){const E=!d;if(d=!0,!E||c)try{h=n(h,y)}catch(L){return p.error(L)}else h=y},error(y){p.error(y)},complete(){if(!d&&!c)return p.error(new TypeError("Cannot reduce an empty sequence"));p.next(h),p.complete()}}))}concat(...n){const o=ve(this);return new o(s=>{let c,d=0;function h(p){c=p.subscribe({next(y){s.next(y)},error(y){s.error(y)},complete(){d===n.length?(c=void 0,s.complete()):h(o.from(n[d++]))}})}return h(this),()=>{c&&(c.unsubscribe(),c=void 0)}})}flatMap(n){if(typeof n!="function")throw new TypeError(n+" is not a function");const o=ve(this);return new o(s=>{const c=[],d=this.subscribe({next(p){let y;if(n)try{y=n(p)}catch(L){return s.error(L)}else y=p;const E=o.from(y).subscribe({next(L){s.next(L)},error(L){s.error(L)},complete(){const L=c.indexOf(E);L>=0&&c.splice(L,1),h()}});c.push(E)},error(p){s.error(p)},complete(){h()}});function h(){d.closed&&c.length===0&&s.complete()}return()=>{c.forEach(p=>p.unsubscribe()),d.unsubscribe()}})}[Sl](){return this}static from(n){const o=typeof this=="function"?this:It;if(n==null)throw new TypeError(n+" is not an object");const s=Mi(n,Sl);if(s){const c=s.call(n);if(Object(c)!==c)throw new TypeError(c+" is not an object");return Sb(c)&&c.constructor===o?c:new o(d=>c.subscribe(d))}if(di("iterator")){const c=Mi(n,fb);if(c)return new o(d=>{Fi(()=>{if(!d.closed){for(const h of c.call(n))if(d.next(h),d.closed)return;d.complete()}})})}if(Array.isArray(n))return new o(c=>{Fi(()=>{if(!c.closed){for(const d of n)if(c.next(d),c.closed)return;c.complete()}})});throw new TypeError(n+" is not observable")}static of(...n){const o=typeof this=="function"?this:It;return new o(s=>{Fi(()=>{if(!s.closed){for(const c of n)if(s.next(c),s.closed)return;s.complete()}})})}static get[$c](){return this}}qc()&&Object.defineProperty(It,Symbol("extensions"),{value:{symbol:Sl,hostReportError:He},configurable:!0});const ye=It;function Re(t){typeof t=="function"?t():t&&typeof t.unsubscribe=="function"&&t.unsubscribe()}var xb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})};function Tb(t){return n=>new ye(o=>{const s=new wi(o),c=n.subscribe({complete(){s.complete()},error(d){s.error(d)},next(d){s.schedule(h=>xb(this,void 0,void 0,function*(){(yield t(d))&&h(d)}))}});return()=>Re(c)})}function Ub(t){return t&&di("asyncIterator")&&t[Symbol.asyncIterator]}function Yb(t){return t&&di("iterator")&&t[Symbol.iterator]}var Jb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})},Cb=globalThis&&globalThis.__asyncValues||function(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=t[Symbol.asyncIterator],o;return n?n.call(t):(t=typeof __values=="function"?__values(t):t[Symbol.iterator](),o={},s("next"),s("throw"),s("return"),o[Symbol.asyncIterator]=function(){return this},o);function s(d){o[d]=t[d]&&function(h){return new Promise(function(p,y){h=t[d](h),c(p,y,h.done,h.value)})}}function c(d,h,p,y){Promise.resolve(y).then(function(E){d({value:E,done:p})},h)}};function Kb(t){return n=>new ye(o=>{const s=new wi(o),c=n.subscribe({complete(){s.complete()},error(d){s.error(d)},next(d){s.schedule(h=>Jb(this,void 0,void 0,function*(){var p,y;const E=yield t(d);if(Yb(E)||Ub(E))try{for(var L=Cb(E),F;F=yield L.next(),!F.done;){const N=F.value;h(N)}}catch(N){p={error:N}}finally{try{F&&!F.done&&(y=L.return)&&(yield y.call(L))}finally{if(p)throw p.error}}else E.map(N=>h(N))}))}});return()=>Re(c)})}function gb(t){return new It(n=>{let o=0;const s=setInterval(()=>{n.next(o++)},t);return()=>clearInterval(s)})}var Nb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})};function Mb(t){return n=>new ye(o=>{const s=new wi(o),c=n.subscribe({complete(){s.complete()},error(d){s.error(d)},next(d){s.schedule(h=>Nb(this,void 0,void 0,function*(){const p=yield t(d);h(p)}))}});return()=>Re(c)})}function Hb(...t){return t.length===0?It.from([]):new It(n=>{let o=0;const s=t.map(d=>d.subscribe({error(h){n.error(h),c()},next(h){n.next(h)},complete(){++o===t.length&&(n.complete(),c())}})),c=()=>{s.forEach(d=>Re(d))};return c})}class kb extends ye{constructor(){super(n=>(this._observers.add(n),()=>this._observers.delete(n))),this._observers=new Set}next(n){for(const o of this._observers)o.next(n)}error(n){for(const o of this._observers)o.error(n)}complete(){for(const n of this._observers)n.complete()}}const id$2=kb;function zb(t){const n=new id$2;let o,s=0;return new ye(c=>{o||(o=t.subscribe(n));const d=n.subscribe(c);return s++,()=>{s--,d.unsubscribe(),s===0&&(Re(o),o=void 0)}})}var Qb=globalThis&&globalThis.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})};function Eb(t,n){return o=>new ye(s=>{let c,d=0;const h=new wi(s),p=o.subscribe({complete(){h.complete()},error(y){h.error(y)},next(y){h.schedule(E=>Qb(this,void 0,void 0,function*(){c=yield t(d===0?typeof n>"u"?y:n:c,y,d++),E(c)}))}});return()=>Re(p)})}const Pb=Object.freeze(Object.defineProperty({__proto__:null,Observable:ye,Subject:id$2,filter:Tb,flatMap:Kb,interval:gb,map:Mb,merge:Hb,multicast:zb,scan:Eb,unsubscribe:Re},Symbol.toStringTag,{value:"Module"})),vi=Kr(Pb);var Bi={};Object.defineProperty(Bi,"__esModule",{value:!0}),Bi.allSettled=void 0;function wb(t){return Promise.all(t.map(n=>{const o=d=>({status:"fulfilled",value:d}),s=d=>({status:"rejected",reason:d}),c=Promise.resolve(n);try{return c.then(o,s)}catch(d){return Promise.reject(d)}}))}Bi.allSettled=wb;var ld={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.PoolEventType=void 0,function(n){n.initialized="initialized",n.taskCanceled="taskCanceled",n.taskCompleted="taskCompleted",n.taskFailed="taskFailed",n.taskQueued="taskQueued",n.taskQueueDrained="taskQueueDrained",n.taskStart="taskStart",n.terminated="terminated"}(t.PoolEventType||(t.PoolEventType={}))})(ld);var oi={},pt={};Object.defineProperty(pt,"__esModule",{value:!0}),pt.$worker=pt.$transferable=pt.$terminate=pt.$events=pt.$errors=void 0,pt.$errors=Symbol("thread.errors"),pt.$events=Symbol("thread.events"),pt.$terminate=Symbol("thread.terminate"),pt.$transferable=Symbol("thread.transferable"),pt.$worker=Symbol("thread.worker"),Object.defineProperty(oi,"__esModule",{value:!0}),oi.Thread=void 0;const ol=pt;function $n(t){throw Error(t)}oi.Thread={errors(t){return t[ol.$errors]||$n("Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.")},events(t){return t[ol.$events]||$n("Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.")},terminate(t){return t[ol.$terminate]()}},function(t){var n=rt&&rt.__awaiter||function(nt,Ee,yt,Ai){function zi(ha){return ha instanceof yt?ha:new yt(function(ba){ba(ha)})}return new(yt||(yt=Promise))(function(ha,ba){function Sa(bs){try{ms(Ai.next(bs))}catch(Ra){ba(Ra)}}function ya(bs){try{ms(Ai.throw(bs))}catch(Ra){ba(Ra)}}function ms(bs){bs.done?ha(bs.value):zi(bs.value).then(Sa,ya)}ms((Ai=Ai.apply(nt,Ee||[])).next())})},o=rt&&rt.__importDefault||function(nt){return nt&&nt.__esModule?nt:{default:nt}};Object.defineProperty(t,"__esModule",{value:!0}),t.Pool=t.Thread=t.PoolEventType=void 0;const s=o(Me),c=vi,d=Bi,h=jt,p=ld;Object.defineProperty(t,"PoolEventType",{enumerable:!0,get:function(){return p.PoolEventType}});const y=oi;Object.defineProperty(t,"Thread",{enumerable:!0,get:function(){return y.Thread}});let E=1;function L(nt){const Ee=[];for(let yt=0;yt<nt;yt++)Ee.push(yt);return Ee}function F(nt){return new Promise(Ee=>setTimeout(Ee,nt))}function N(nt,Ee){return nt.reduce((yt,Ai)=>[...yt,...Ee(Ai)],[])}function z(nt){return nt.replace(/\W/g," ").trim().replace(/\s+/g,"-")}function oe(nt,Ee){return L(Ee).map(()=>({init:nt(),runningTasks:[]}))}class W{constructor(Ee,yt){this.eventSubject=new c.Subject,this.initErrors=[],this.isClosing=!1,this.nextTaskID=1,this.taskQueue=[];const Ai=typeof yt=="number"?{size:yt}:yt||{},{size:zi=h.defaultPoolSize}=Ai;this.debug=s.default(`threads:pool:${z(Ai.name||String(E++))}`),this.options=Ai,this.workers=oe(Ee,zi),this.eventObservable=c.multicast(c.Observable.from(this.eventSubject)),Promise.all(this.workers.map(ha=>ha.init)).then(()=>this.eventSubject.next({type:p.PoolEventType.initialized,size:this.workers.length}),ha=>{this.debug("Error while initializing pool worker:",ha),this.eventSubject.error(ha),this.initErrors.push(ha)})}findIdlingWorker(){const{concurrency:Ee=1}=this.options;return this.workers.find(yt=>yt.runningTasks.length<Ee)}runPoolTask(Ee,yt){return n(this,void 0,void 0,function*(){const Ai=this.workers.indexOf(Ee)+1;this.debug(`Running task #${yt.id} on worker #${Ai}...`),this.eventSubject.next({type:p.PoolEventType.taskStart,taskID:yt.id,workerID:Ai});try{const zi=yield yt.run(yield Ee.init);this.debug(`Task #${yt.id} completed successfully`),this.eventSubject.next({type:p.PoolEventType.taskCompleted,returnValue:zi,taskID:yt.id,workerID:Ai})}catch(zi){this.debug(`Task #${yt.id} failed`),this.eventSubject.next({type:p.PoolEventType.taskFailed,taskID:yt.id,error:zi,workerID:Ai})}})}run(Ee,yt){return n(this,void 0,void 0,function*(){const Ai=n(this,void 0,void 0,function*(){const zi=()=>{Ee.runningTasks=Ee.runningTasks.filter(ha=>ha!==Ai)};yield F(0);try{yield this.runPoolTask(Ee,yt)}finally{zi(),this.isClosing||this.scheduleWork()}});Ee.runningTasks.push(Ai)})}scheduleWork(){this.debug("Attempt de-queueing a task in order to run it...");const Ee=this.findIdlingWorker();if(!Ee)return;const yt=this.taskQueue.shift();if(!yt){this.debug("Task queue is empty"),this.eventSubject.next({type:p.PoolEventType.taskQueueDrained});return}this.run(Ee,yt)}taskCompletion(Ee){return new Promise((yt,Ai)=>{const zi=this.events().subscribe(ha=>{ha.type===p.PoolEventType.taskCompleted&&ha.taskID===Ee?(zi.unsubscribe(),yt(ha.returnValue)):ha.type===p.PoolEventType.taskFailed&&ha.taskID===Ee?(zi.unsubscribe(),Ai(ha.error)):ha.type===p.PoolEventType.terminated&&(zi.unsubscribe(),Ai(Error("Pool has been terminated before task was run.")))})})}settled(Ee=!1){return n(this,void 0,void 0,function*(){const yt=()=>N(this.workers,ha=>ha.runningTasks),Ai=[],zi=this.eventObservable.subscribe(ha=>{ha.type===p.PoolEventType.taskFailed&&Ai.push(ha.error)});return this.initErrors.length>0?Promise.reject(this.initErrors[0]):Ee&&this.taskQueue.length===0?(yield d.allSettled(yt()),Ai):(yield new Promise((ha,ba)=>{const Sa=this.eventObservable.subscribe({next(ya){ya.type===p.PoolEventType.taskQueueDrained&&(Sa.unsubscribe(),ha(void 0))},error:ba})}),yield d.allSettled(yt()),zi.unsubscribe(),Ai)})}completed(Ee=!1){return n(this,void 0,void 0,function*(){const yt=this.settled(Ee),Ai=new Promise((ha,ba)=>{const Sa=this.eventObservable.subscribe({next(ya){ya.type===p.PoolEventType.taskQueueDrained?(Sa.unsubscribe(),ha(yt)):ya.type===p.PoolEventType.taskFailed&&(Sa.unsubscribe(),ba(ya.error))},error:ba})}),zi=yield Promise.race([yt,Ai]);if(zi.length>0)throw zi[0]})}events(){return this.eventObservable}queue(Ee){const{maxQueuedJobs:yt=1/0}=this.options;if(this.isClosing)throw Error("Cannot schedule pool tasks after terminate() has been called.");if(this.initErrors.length>0)throw this.initErrors[0];const Ai=this.nextTaskID++,zi=this.taskCompletion(Ai);zi.catch(ba=>{this.debug(`Task #${Ai} errored:`,ba)});const ha={id:Ai,run:Ee,cancel:()=>{this.taskQueue.indexOf(ha)!==-1&&(this.taskQueue=this.taskQueue.filter(ba=>ba!==ha),this.eventSubject.next({type:p.PoolEventType.taskCanceled,taskID:ha.id}))},then:zi.then.bind(zi)};if(this.taskQueue.length>=yt)throw Error(`Maximum number of pool tasks queued. Refusing to queue another one.
|
|
6100
6100
|
This usually happens for one of two reasons: We are either at peak workload right now or some tasks just won't finish, thus blocking the pool.`);return this.debug(`Queueing task #${ha.id}...`),this.taskQueue.push(ha),this.eventSubject.next({type:p.PoolEventType.taskQueued,taskID:ha.id}),this.scheduleWork(),ha}terminate(Ee){return n(this,void 0,void 0,function*(){this.isClosing=!0,Ee||(yield this.completed(!0)),this.eventSubject.next({type:p.PoolEventType.terminated,remainingQueue:[...this.taskQueue]}),this.eventSubject.complete(),yield Promise.all(this.workers.map(yt=>n(this,void 0,void 0,function*(){return y.Thread.terminate(yield yt.init)})))})}}W.EventType=p.PoolEventType;function lt(nt,Ee){return new W(nt,Ee)}lt.EventType=p.PoolEventType,t.Pool=lt}(_c);var ji={},Oi={};Object.defineProperty(Oi,"__esModule",{value:!0}),Oi.createPromiseWithResolver=void 0;const vb=()=>{};function Bb(){let t=!1,n,o=vb;return[new Promise(s=>{t?s(n):o=s}),s=>{t=!0,n=s,o(n)}]}Oi.createPromiseWithResolver=Bb;var nd={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.WorkerEventType=void 0,function(n){n.internalError="internalError",n.message="message",n.termination="termination"}(t.WorkerEventType||(t.WorkerEventType={}))})(nd);var ke={},Di={};Object.defineProperty(Di,"__esModule",{value:!0}),Di.ObservablePromise=void 0;const jb=vi,Ob=()=>{},Db=t=>t,tc=t=>Promise.resolve().then(t);function Ab(t){throw t}function _b(t){return t&&typeof t.then=="function"}class jl extends jb.Observable{constructor(n){super(o=>{const s=this,c=Object.assign(Object.assign({},o),{complete(){o.complete(),s.onCompletion()},error(d){o.error(d),s.onError(d)},next(d){o.next(d),s.onNext(d)}});try{return this.initHasRun=!0,n(c)}catch(d){c.error(d)}}),this.initHasRun=!1,this.fulfillmentCallbacks=[],this.rejectionCallbacks=[],this.firstValueSet=!1,this.state="pending"}onNext(n){this.firstValueSet||(this.firstValue=n,this.firstValueSet=!0)}onError(n){this.state="rejected",this.rejection=n;for(const o of this.rejectionCallbacks)tc(()=>o(n))}onCompletion(){this.state="fulfilled";for(const n of this.fulfillmentCallbacks)tc(()=>n(this.firstValue))}then(n,o){const s=n||Db,c=o||Ab;let d=!1;return new Promise((h,p)=>{const y=L=>{if(!d){d=!0;try{h(c(L))}catch(F){p(F)}}},E=L=>{try{h(s(L))}catch(F){y(F)}};if(this.initHasRun||this.subscribe({error:y}),this.state==="fulfilled")return h(s(this.firstValue));if(this.state==="rejected")return d=!0,h(c(this.rejection));this.fulfillmentCallbacks.push(E),this.rejectionCallbacks.push(y)})}catch(n){return this.then(void 0,n)}finally(n){const o=n||Ob;return this.then(s=>(o(),s),()=>o())}static from(n){return _b(n)?new jl(o=>{const s=d=>{o.next(d),o.complete()},c=d=>{o.error(d)};n.then(s,c)}):super.from(n)}}Di.ObservablePromise=jl;var Ot={};Object.defineProperty(Ot,"__esModule",{value:!0}),Ot.Transfer=Ot.isTransferDescriptor=void 0;const cd=pt;function qb(t){return!(!t||typeof t!="object")}function $b(t){return t&&typeof t=="object"&&t[cd.$transferable]}Ot.isTransferDescriptor=$b;function tm(t,n){if(!n){if(!qb(t))throw Error();n=[t]}return{[cd.$transferable]:!0,send:t,transferables:n}}Ot.Transfer=tm;var Ol={};(function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.WorkerMessageType=t.MasterMessageType=void 0,function(n){n.cancel="cancel",n.run="run"}(t.MasterMessageType||(t.MasterMessageType={})),function(n){n.error="error",n.init="init",n.result="result",n.running="running",n.uncaughtError="uncaughtError"}(t.WorkerMessageType||(t.WorkerMessageType={}))})(Ol);var em=rt&&rt.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ke,"__esModule",{value:!0}),ke.createProxyModule=ke.createProxyFunction=void 0;const im=em(Me),dd=vi,De=xt,ec=Di,lm=Ot,si=Ol,od=im.default("threads:master:messages");let nm=1;const cm=t=>Array.from(new Set(t)),dm=t=>t&&t.type===si.WorkerMessageType.error,om=t=>t&&t.type===si.WorkerMessageType.result,sm=t=>t&&t.type===si.WorkerMessageType.running;function am(t,n){return new dd.Observable(o=>{let s;const c=d=>{if(od("Message from worker:",d.data),!(!d.data||d.data.uid!==n)){if(sm(d.data))s=d.data.resultType;else if(om(d.data))s==="promise"?(typeof d.data.payload<"u"&&o.next(De.deserialize(d.data.payload)),o.complete(),t.removeEventListener("message",c)):(d.data.payload&&o.next(De.deserialize(d.data.payload)),d.data.complete&&(o.complete(),t.removeEventListener("message",c)));else if(dm(d.data)){const h=De.deserialize(d.data.error);o.error(h),t.removeEventListener("message",c)}}};return t.addEventListener("message",c),()=>{if(s==="observable"||!s){const d={type:si.MasterMessageType.cancel,uid:n};t.postMessage(d)}t.removeEventListener("message",c)}})}function um(t){if(t.length===0)return{args:[],transferables:[]};const n=[],o=[];for(const s of t)lm.isTransferDescriptor(s)?(n.push(De.serialize(s.send)),o.push(...s.transferables)):n.push(De.serialize(s));return{args:n,transferables:o.length===0?o:cm(o)}}function sd(t,n){return(...o)=>{const s=nm++,{args:c,transferables:d}=um(o),h={type:si.MasterMessageType.run,uid:s,method:n,args:c};od("Sending command to run function to worker:",h);try{t.postMessage(h,d)}catch(p){return ec.ObservablePromise.from(Promise.reject(p))}return ec.ObservablePromise.from(dd.multicast(am(t,s)))}}ke.createProxyFunction=sd;function rm(t,n){const o={};for(const s of n)o[s]=sd(t,s);return o}ke.createProxyModule=rm;var Dl=rt&&rt.__awaiter||function(t,n,o,s){function c(d){return d instanceof o?d:new o(function(h){h(d)})}return new(o||(o=Promise))(function(d,h){function p(L){try{E(s.next(L))}catch(F){h(F)}}function y(L){try{E(s.throw(L))}catch(F){h(F)}}function E(L){L.done?d(L.value):c(L.value).then(p,y)}E((s=s.apply(t,n||[])).next())})},hm=rt&&rt.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ji,"__esModule",{value:!0}),ji.spawn=void 0;const Al=hm(Me),bm=vi,mm=xt,Zm=Oi,Xi=pt,Ii=nd,ic=ke,Vm=Al.default("threads:master:messages"),Xm=Al.default("threads:master:spawn"),ad=Al.default("threads:master:thread-utils"),Gm=t=>t&&t.type==="init",pm=t=>t&&t.type==="uncaughtError",ym=typeof process<"u"&&process.env.THREADS_WORKER_INIT_TIMEOUT?Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT,10):1e4;function Rm(t,n,o){return Dl(this,void 0,void 0,function*(){let s;const c=new Promise((h,p)=>{s=setTimeout(()=>p(Error(o)),n)}),d=yield Promise.race([t,c]);return clearTimeout(s),d})}function Wm(t){return new Promise((n,o)=>{const s=c=>{Vm("Message from worker before finishing initialization:",c.data),Gm(c.data)?(t.removeEventListener("message",s),n(c.data)):pm(c.data)&&(t.removeEventListener("message",s),o(mm.deserialize(c.data.error)))};t.addEventListener("message",s)})}function fm(t,n){return new bm.Observable(o=>{const s=d=>{const h={type:Ii.WorkerEventType.message,data:d.data};o.next(h)},c=d=>{ad("Unhandled promise rejection event in thread:",d);const h={type:Ii.WorkerEventType.internalError,error:Error(d.reason)};o.next(h)};t.addEventListener("message",s),t.addEventListener("unhandledrejection",c),n.then(()=>{const d={type:Ii.WorkerEventType.termination};t.removeEventListener("message",s),t.removeEventListener("unhandledrejection",c),o.next(d),o.complete()})})}function Sm(t){const[n,o]=Zm.createPromiseWithResolver();return{terminate:()=>Dl(this,void 0,void 0,function*(){ad("Terminating worker"),yield t.terminate(),o()}),termination:n}}function lc(t,n,o,s){const c=o.filter(d=>d.type===Ii.WorkerEventType.internalError).map(d=>d.error);return Object.assign(t,{[Xi.$errors]:c,[Xi.$events]:o,[Xi.$terminate]:s,[Xi.$worker]:n})}function Lm(t,n){return Dl(this,void 0,void 0,function*(){Xm("Initializing new thread");const o=n&&n.timeout?n.timeout:ym,s=(yield Rm(Wm(t),o,`Timeout: Did not receive an init message from worker after ${o}ms. Make sure the worker calls expose().`)).exposed,{termination:c,terminate:d}=Sm(t),h=fm(t,c);if(s.type==="function"){const p=ic.createProxyFunction(t);return lc(p,t,h,d)}else if(s.type==="module"){const p=ic.createProxyModule(t,s.methods);return lc(p,t,h,d)}else{const p=s.type;throw Error(`Worker init message states unexpected type of expose(): ${p}`)}})}ji.spawn=Lm,function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.Worker=t.BlobWorker=t.isWorkerRuntime=t.Thread=t.spawn=t.Pool=void 0;const n=jt;Object.defineProperty(t,"isWorkerRuntime",{enumerable:!0,get:function(){return n.isWorkerRuntime}});var o=_c;Object.defineProperty(t,"Pool",{enumerable:!0,get:function(){return o.Pool}});var s=ji;Object.defineProperty(t,"spawn",{enumerable:!0,get:function(){return s.spawn}});var c=oi;Object.defineProperty(t,"Thread",{enumerable:!0,get:function(){return c.Thread}}),t.BlobWorker=n.getWorkerImplementation().blob,t.Worker=n.getWorkerImplementation().default}(Dc);var ud={},Fm=t=>t?typeof Symbol.observable=="symbol"&&typeof t[Symbol.observable]=="function"?t===t[Symbol.observable]():typeof t["@@observable"]=="function"?t===t["@@observable"]():!1:!1,_l={};Object.defineProperty(_l,"__esModule",{value:!0});const Im=function(){const t=typeof self<"u"&&typeof Window<"u"&&self instanceof Window;return!!(typeof self<"u"&&self.postMessage&&!t)},xm=function(t,n){self.postMessage(t,n)},Tm=function(t){const n=s=>{t(s.data)},o=()=>{self.removeEventListener("message",n)};return self.addEventListener("message",n),o};_l.default={isWorkerRuntime:Im,postMessageToMaster:xm,subscribeToMasterMessages:Tm},function(t){var n=rt&&rt.__awaiter||function(ya,ms,bs,Ra){function pi(mt){return mt instanceof bs?mt:new bs(function(fa){fa(mt)})}return new(bs||(bs=Promise))(function(mt,fa){function Wa(Xd){try{Vd(Ra.next(Xd))}catch(pu){fa(pu)}}function sl(Xd){try{Vd(Ra.throw(Xd))}catch(pu){fa(pu)}}function Vd(Xd){Xd.done?mt(Xd.value):pi(Xd.value).then(Wa,sl)}Vd((Ra=Ra.apply(ya,ms||[])).next())})},o=rt&&rt.__importDefault||function(ya){return ya&&ya.__esModule?ya:{default:ya}};Object.defineProperty(t,"__esModule",{value:!0}),t.expose=t.isWorkerRuntime=t.Transfer=t.registerSerializer=void 0;const s=o(Fm),c=xt,d=Ot,h=Ol,p=o(_l);var y=xt;Object.defineProperty(t,"registerSerializer",{enumerable:!0,get:function(){return y.registerSerializer}});var E=Ot;Object.defineProperty(t,"Transfer",{enumerable:!0,get:function(){return E.Transfer}}),t.isWorkerRuntime=p.default.isWorkerRuntime;let L=!1;const F=new Map,N=ya=>ya&&ya.type===h.MasterMessageType.cancel,z=ya=>ya&&ya.type===h.MasterMessageType.run,oe=ya=>s.default(ya)||W(ya);function W(ya){return ya&&typeof ya=="object"&&typeof ya.subscribe=="function"}function lt(ya){return d.isTransferDescriptor(ya)?{payload:ya.send,transferables:ya.transferables}:{payload:ya,transferables:void 0}}function nt(){const ya={type:h.WorkerMessageType.init,exposed:{type:"function"}};p.default.postMessageToMaster(ya)}function Ee(ya){const ms={type:h.WorkerMessageType.init,exposed:{type:"module",methods:ya}};p.default.postMessageToMaster(ms)}function yt(ya,ms){const{payload:bs,transferables:Ra}=lt(ms),pi={type:h.WorkerMessageType.error,uid:ya,error:c.serialize(bs)};p.default.postMessageToMaster(pi,Ra)}function Ai(ya,ms,bs){const{payload:Ra,transferables:pi}=lt(bs),mt={type:h.WorkerMessageType.result,uid:ya,complete:ms?!0:void 0,payload:Ra};p.default.postMessageToMaster(mt,pi)}function zi(ya,ms){const bs={type:h.WorkerMessageType.running,uid:ya,resultType:ms};p.default.postMessageToMaster(bs)}function ha(ya){try{const ms={type:h.WorkerMessageType.uncaughtError,error:c.serialize(ya)};p.default.postMessageToMaster(ms)}catch(ms){console.error(`Not reporting uncaught error back to master thread as it occured while reporting an uncaught error already.
|
|
6101
6101
|
Latest error:`,ms,`
|
|
6102
|
-
Original error:`,ya)}}function ba(ya,ms,bs){return n(this,void 0,void 0,function*(){let Ra;try{Ra=ms(...bs)}catch(mt){return yt(ya,mt)}const pi=oe(Ra)?"observable":"promise";if(zi(ya,pi),oe(Ra)){const mt=Ra.subscribe(fa=>Ai(ya,!1,c.serialize(fa)),fa=>{yt(ya,c.serialize(fa)),F.delete(ya)},()=>{Ai(ya,!0),F.delete(ya)});F.set(ya,mt)}else try{const mt=yield Ra;Ai(ya,!0,c.serialize(mt))}catch(mt){yt(ya,c.serialize(mt))}})}function Sa(ya){if(!p.default.isWorkerRuntime())throw Error("expose() called in the master thread.");if(L)throw Error("expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.");if(L=!0,typeof ya=="function")p.default.subscribeToMasterMessages(ms=>{z(ms)&&!ms.method&&ba(ms.uid,ya,ms.args.map(c.deserialize))}),nt();else if(typeof ya=="object"&&ya){p.default.subscribeToMasterMessages(bs=>{z(bs)&&bs.method&&ba(bs.uid,ya[bs.method],bs.args.map(c.deserialize))});const ms=Object.keys(ya).filter(bs=>typeof ya[bs]=="function");Ee(ms)}else throw Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${ya}`);p.default.subscribeToMasterMessages(ms=>{if(N(ms)){const bs=ms.uid,Ra=F.get(bs);Ra&&(Ra.unsubscribe(),F.delete(bs))}})}t.expose=Sa,typeof self<"u"&&typeof self.addEventListener=="function"&&p.default.isWorkerRuntime()&&(self.addEventListener("error",ya=>{setTimeout(()=>ha(ya.error||ya),250)}),self.addEventListener("unhandledrejection",ya=>{const ms=ya.reason;ms&&typeof ms.message=="string"&&setTimeout(()=>ha(ms),250)})),typeof process<"u"&&typeof process.on=="function"&&p.default.isWorkerRuntime()&&(process.on("uncaughtException",ya=>{setTimeout(()=>ha(ya),250)}),process.on("unhandledRejection",ya=>{ya&&typeof ya.message=="string"&&setTimeout(()=>ha(ya),250)}))}(ud),function(t){var n=rt&&rt.__createBinding||(Object.create?function(p,y,E,L){L===void 0&&(L=E),Object.defineProperty(p,L,{enumerable:!0,get:function(){return y[E]}})}:function(p,y,E,L){L===void 0&&(L=E),p[L]=y[E]}),o=rt&&rt.__exportStar||function(p,y){for(var E in p)E!=="default"&&!Object.prototype.hasOwnProperty.call(y,E)&&n(y,p,E)};Object.defineProperty(t,"__esModule",{value:!0}),t.Transfer=t.DefaultSerializer=t.expose=t.registerSerializer=void 0;var s=xt;Object.defineProperty(t,"registerSerializer",{enumerable:!0,get:function(){return s.registerSerializer}}),o(Dc,t);var c=ud;Object.defineProperty(t,"expose",{enumerable:!0,get:function(){return c.expose}});var d=Xe;Object.defineProperty(t,"DefaultSerializer",{enumerable:!0,get:function(){return d.DefaultSerializer}});var h=Ot;Object.defineProperty(t,"Transfer",{enumerable:!0,get:function(){return h.Transfer}})}(jc);const de=Cr(jc);de.registerSerializer;const Um=de.spawn;de.BlobWorker,de.DefaultSerializer;const Ym=de.Pool;de.Thread;const Jm=de.Transfer;de.Worker;const rd="dmFyIHgwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgTzA9KFgsayxudCk9PmsgaW4gWD94MChYLGsse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm50fSk6WFtrXT1udDt2YXIgdj0oWCxrLG50KT0+KE8wKFgsdHlwZW9mIGshPSJzeW1ib2wiP2srIiI6ayxudCksbnQpLGFyPShYLGssbnQpPT57aWYoIWsuaGFzKFgpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbnQpfTt2YXIgYz0oWCxrLG50KT0+KGFyKFgsaywicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxudD9udC5jYWxsKFgpOmsuZ2V0KFgpKSxVPShYLGssbnQpPT57aWYoay5oYXMoWCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ayBpbnN0YW5jZW9mIFdlYWtTZXQ/ay5hZGQoWCk6ay5zZXQoWCxudCl9LEM9KFgsayxudCxFZSk9PihhcihYLGssIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxFZT9FZS5jYWxsKFgsbnQpOmsuc2V0KFgsbnQpLG50KSx5bj0oWCxrLG50LEVlKT0+KHtzZXQgXyh3dCl7QyhYLGssd3QsbnQpfSxnZXQgXygpe3JldHVybiBjKFgsayxFZSl9fSksdz0oWCxrLG50KT0+KGFyKFgsaywiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksbnQpOyhmdW5jdGlvbigpe3ZhciBIaSxGZSxJdCxSdCxOdCxNdCxJZSx1dCxDdCxhdCx0dCxMLF90LHh0LEV0LGh0LHZ0LGZ0LER0LEx0LE90LFB0LEp0LHB0LCRlLHVyLGhlLEh0LFZlLGJ0LEVuLHFpLGZlLE5lLHplLCR0LHRlLFZ0LGVlLFdlLGNyLFIwLE1lLEFuLENlLFRuLFksZXQsWGUsaHIsbGUscWU7InVzZSBzdHJpY3QiO3ZhciBYPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6e307ZnVuY3Rpb24gayh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBudD17fSxFZT10PT50P3R5cGVvZiBTeW1ib2wub2JzZXJ2YWJsZT09InN5bWJvbCImJnR5cGVvZiB0W1N5bWJvbC5vYnNlcnZhYmxlXT09ImZ1bmN0aW9uIj90PT09dFtTeW1ib2wub2JzZXJ2YWJsZV0oKTp0eXBlb2YgdFsiQEBvYnNlcnZhYmxlIl09PSJmdW5jdGlvbiI/dD09PXRbIkBAb2JzZXJ2YWJsZSJdKCk6ITE6ITEsd3Q9e30sX2U9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KF9lLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxfZS5EZWZhdWx0U2VyaWFsaXplcj1fZS5leHRlbmRTZXJpYWxpemVyPXZvaWQgMDtmdW5jdGlvbiBraSh0LGUpe2NvbnN0IG49dC5kZXNlcmlhbGl6ZS5iaW5kKHQpLHI9dC5zZXJpYWxpemUuYmluZCh0KTtyZXR1cm57ZGVzZXJpYWxpemUoaSl7cmV0dXJuIGUuZGVzZXJpYWxpemUoaSxuKX0sc2VyaWFsaXplKGkpe3JldHVybiBlLnNlcmlhbGl6ZShpLHIpfX19X2UuZXh0ZW5kU2VyaWFsaXplcj1raTtjb25zdCBmcj17ZGVzZXJpYWxpemUodCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IodC5tZXNzYWdlKSx7bmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFja30pfSxzZXJpYWxpemUodCl7cmV0dXJue19fZXJyb3JfbWFya2VyOiIkJGVycm9yIixtZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrfX19LFlpPXQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIl9fZXJyb3JfbWFya2VyImluIHQmJnQuX19lcnJvcl9tYXJrZXI9PT0iJCRlcnJvciI7X2UuRGVmYXVsdFNlcmlhbGl6ZXI9e2Rlc2VyaWFsaXplKHQpe3JldHVybiBZaSh0KT9mci5kZXNlcmlhbGl6ZSh0KTp0fSxzZXJpYWxpemUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcj9mci5zZXJpYWxpemUodCk6dH19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksd3Quc2VyaWFsaXplPXd0LmRlc2VyaWFsaXplPXd0LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3QgbHI9X2U7bGV0IGtlPWxyLkRlZmF1bHRTZXJpYWxpemVyO2Z1bmN0aW9uIEtpKHQpe2tlPWxyLmV4dGVuZFNlcmlhbGl6ZXIoa2UsdCl9d3QucmVnaXN0ZXJTZXJpYWxpemVyPUtpO2Z1bmN0aW9uIFppKHQpe3JldHVybiBrZS5kZXNlcmlhbGl6ZSh0KX13dC5kZXNlcmlhbGl6ZT1aaTtmdW5jdGlvbiBRaSh0KXtyZXR1cm4ga2Uuc2VyaWFsaXplKHQpfXd0LnNlcmlhbGl6ZT1RaTt2YXIgbmU9e30sU3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxTdC4kd29ya2VyPVN0LiR0cmFuc2ZlcmFibGU9U3QuJHRlcm1pbmF0ZT1TdC4kZXZlbnRzPVN0LiRlcnJvcnM9dm9pZCAwLFN0LiRlcnJvcnM9U3ltYm9sKCJ0aHJlYWQuZXJyb3JzIiksU3QuJGV2ZW50cz1TeW1ib2woInRocmVhZC5ldmVudHMiKSxTdC4kdGVybWluYXRlPVN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpLFN0LiR0cmFuc2ZlcmFibGU9U3ltYm9sKCJ0aHJlYWQudHJhbnNmZXJhYmxlIiksU3QuJHdvcmtlcj1TeW1ib2woInRocmVhZC53b3JrZXIiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG5lLlRyYW5zZmVyPW5lLmlzVHJhbnNmZXJEZXNjcmlwdG9yPXZvaWQgMDtjb25zdCBkcj1TdDtmdW5jdGlvbiBKaSh0KXtyZXR1cm4hKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCImJnRbZHIuJHRyYW5zZmVyYWJsZV19bmUuaXNUcmFuc2ZlckRlc2NyaXB0b3I9dG87ZnVuY3Rpb24gZW8odCxlKXtpZighZSl7aWYoIUppKHQpKXRocm93IEVycm9yKCk7ZT1bdF19cmV0dXJue1tkci4kdHJhbnNmZXJhYmxlXTohMCxzZW5kOnQsdHJhbnNmZXJhYmxlczplfX1uZS5UcmFuc2Zlcj1lbzt2YXIgRXI9e307KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lldvcmtlck1lc3NhZ2VUeXBlPXQuTWFzdGVyTWVzc2FnZVR5cGU9dm9pZCAwLGZ1bmN0aW9uKGUpe2UuY2FuY2VsPSJjYW5jZWwiLGUucnVuPSJydW4ifSh0Lk1hc3Rlck1lc3NhZ2VUeXBlfHwodC5NYXN0ZXJNZXNzYWdlVHlwZT17fSkpLGZ1bmN0aW9uKGUpe2UuZXJyb3I9ImVycm9yIixlLmluaXQ9ImluaXQiLGUucmVzdWx0PSJyZXN1bHQiLGUucnVubmluZz0icnVubmluZyIsZS51bmNhdWdodEVycm9yPSJ1bmNhdWdodEVycm9yIn0odC5Xb3JrZXJNZXNzYWdlVHlwZXx8KHQuV29ya2VyTWVzc2FnZVR5cGU9e30pKX0pKEVyKTt2YXIgUm49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFJuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBubz1mdW5jdGlvbigpe2NvbnN0IGU9dHlwZW9mIHNlbGY8InUiJiZ0eXBlb2YgV2luZG93PCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdpbmRvdztyZXR1cm4hISh0eXBlb2Ygc2VsZjwidSImJnNlbGYucG9zdE1lc3NhZ2UmJiFlKX0scm89ZnVuY3Rpb24oZSxuKXtzZWxmLnBvc3RNZXNzYWdlKGUsbil9LGlvPWZ1bmN0aW9uKGUpe2NvbnN0IG49aT0+e2UoaS5kYXRhKX0scj0oKT0+e3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHJ9O1JuLmRlZmF1bHQ9e2lzV29ya2VyUnVudGltZTpubyxwb3N0TWVzc2FnZVRvTWFzdGVyOnJvLHN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXM6aW99LGZ1bmN0aW9uKHQpe3ZhciBlPVgmJlguX19hd2FpdGVyfHxmdW5jdGlvbihULEIsJCxEKXtmdW5jdGlvbiB5dChvdCl7cmV0dXJuIG90IGluc3RhbmNlb2YgJD9vdDpuZXcgJChmdW5jdGlvbihndCl7Z3Qob3QpfSl9cmV0dXJuIG5ldygkfHwoJD1Qcm9taXNlKSkoZnVuY3Rpb24ob3QsZ3Qpe2Z1bmN0aW9uIF9uKGRlKXt0cnl7SGUoRC5uZXh0KGRlKSl9Y2F0Y2goc3Ipe2d0KHNyKX19ZnVuY3Rpb24gcG4oZGUpe3RyeXtIZShELnRocm93KGRlKSl9Y2F0Y2goc3Ipe2d0KHNyKX19ZnVuY3Rpb24gSGUoZGUpe2RlLmRvbmU/b3QoZGUudmFsdWUpOnl0KGRlLnZhbHVlKS50aGVuKF9uLHBuKX1IZSgoRD1ELmFwcGx5KFQsQnx8W10pKS5uZXh0KCkpfSl9LG49WCYmWC5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKFQpe3JldHVybiBUJiZULl9fZXNNb2R1bGU/VDp7ZGVmYXVsdDpUfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZXhwb3NlPXQuaXNXb3JrZXJSdW50aW1lPXQuVHJhbnNmZXI9dC5yZWdpc3RlclNlcmlhbGl6ZXI9dm9pZCAwO2NvbnN0IHI9bihFZSksaT13dCxvPW5lLHM9RXIsdT1uKFJuKTt2YXIgYT13dDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJTZXJpYWxpemVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5yZWdpc3RlclNlcmlhbGl6ZXJ9fSk7dmFyIGw9bmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlRyYW5zZmVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5UcmFuc2Zlcn19KSx0LmlzV29ya2VyUnVudGltZT11LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lO2xldCBkPSExO2NvbnN0IF89bmV3IE1hcCxPPVQ9PlQmJlQudHlwZT09PXMuTWFzdGVyTWVzc2FnZVR5cGUuY2FuY2VsLGI9VD0+VCYmVC50eXBlPT09cy5NYXN0ZXJNZXNzYWdlVHlwZS5ydW4sRj1UPT5yLmRlZmF1bHQoVCl8fFMoVCk7ZnVuY3Rpb24gUyhUKXtyZXR1cm4gVCYmdHlwZW9mIFQ9PSJvYmplY3QiJiZ0eXBlb2YgVC5zdWJzY3JpYmU9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gTihUKXtyZXR1cm4gby5pc1RyYW5zZmVyRGVzY3JpcHRvcihUKT97cGF5bG9hZDpULnNlbmQsdHJhbnNmZXJhYmxlczpULnRyYW5zZmVyYWJsZXN9OntwYXlsb2FkOlQsdHJhbnNmZXJhYmxlczp2b2lkIDB9fWZ1bmN0aW9uIGcoKXtjb25zdCBUPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUuaW5pdCxleHBvc2VkOnt0eXBlOiJmdW5jdGlvbiJ9fTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihUKX1mdW5jdGlvbiBHKFQpe2NvbnN0IEI9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LGV4cG9zZWQ6e3R5cGU6Im1vZHVsZSIsbWV0aG9kczpUfX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9ZnVuY3Rpb24gSyhULEIpe2NvbnN0e3BheWxvYWQ6JCx0cmFuc2ZlcmFibGVzOkR9PU4oQikseXQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5lcnJvcix1aWQ6VCxlcnJvcjppLnNlcmlhbGl6ZSgkKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoeXQsRCl9ZnVuY3Rpb24gVihULEIsJCl7Y29uc3R7cGF5bG9hZDpELHRyYW5zZmVyYWJsZXM6eXR9PU4oJCksb3Q9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5yZXN1bHQsdWlkOlQsY29tcGxldGU6Qj8hMDp2b2lkIDAscGF5bG9hZDpEfTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihvdCx5dCl9ZnVuY3Rpb24gaXQoVCxCKXtjb25zdCAkPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUucnVubmluZyx1aWQ6VCxyZXN1bHRUeXBlOkJ9O3UuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKCQpfWZ1bmN0aW9uIGx0KFQpe3RyeXtjb25zdCBCPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvcixlcnJvcjppLnNlcmlhbGl6ZShUKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9Y2F0Y2goQil7Y29uc29sZS5lcnJvcihgTm90IHJlcG9ydGluZyB1bmNhdWdodCBlcnJvciBiYWNrIHRvIG1hc3RlciB0aHJlYWQgYXMgaXQgb2NjdXJlZCB3aGlsZSByZXBvcnRpbmcgYW4gdW5jYXVnaHQgZXJyb3IgYWxyZWFkeS4KTGF0ZXN0IGVycm9yOmAsQixgCk9yaWdpbmFsIGVycm9yOmAsVCl9fWZ1bmN0aW9uIHJ0KFQsQiwkKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IEQ7dHJ5e0Q9QiguLi4kKX1jYXRjaChvdCl7cmV0dXJuIEsoVCxvdCl9Y29uc3QgeXQ9RihEKT8ib2JzZXJ2YWJsZSI6InByb21pc2UiO2lmKGl0KFQseXQpLEYoRCkpe2NvbnN0IG90PUQuc3Vic2NyaWJlKGd0PT5WKFQsITEsaS5zZXJpYWxpemUoZ3QpKSxndD0+e0soVCxpLnNlcmlhbGl6ZShndCkpLF8uZGVsZXRlKFQpfSwoKT0+e1YoVCwhMCksXy5kZWxldGUoVCl9KTtfLnNldChULG90KX1lbHNlIHRyeXtjb25zdCBvdD15aWVsZCBEO1YoVCwhMCxpLnNlcmlhbGl6ZShvdCkpfWNhdGNoKG90KXtLKFQsaS5zZXJpYWxpemUob3QpKX19KX1mdW5jdGlvbiBCdChUKXtpZighdS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKXRocm93IEVycm9yKCJleHBvc2UoKSBjYWxsZWQgaW4gdGhlIG1hc3RlciB0aHJlYWQuIik7aWYoZCl0aHJvdyBFcnJvcigiZXhwb3NlKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiBUaGlzIGlzIG5vdCBwb3NzaWJsZS4gUGFzcyBhbiBvYmplY3QgdG8gZXhwb3NlKCkgaWYgeW91IHdhbnQgdG8gZXhwb3NlIG11bHRpcGxlIGZ1bmN0aW9ucy4iKTtpZihkPSEwLHR5cGVvZiBUPT0iZnVuY3Rpb24iKXUuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntiKEIpJiYhQi5tZXRob2QmJnJ0KEIudWlkLFQsQi5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KSxnKCk7ZWxzZSBpZih0eXBlb2YgVD09Im9iamVjdCImJlQpe3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKCQ9PntiKCQpJiYkLm1ldGhvZCYmcnQoJC51aWQsVFskLm1ldGhvZF0sJC5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KTtjb25zdCBCPU9iamVjdC5rZXlzKFQpLmZpbHRlcigkPT50eXBlb2YgVFskXT09ImZ1bmN0aW9uIik7RyhCKX1lbHNlIHRocm93IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBleHBvc2UoKS4gRXhwZWN0ZWQgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QsIGdvdDogJHtUfWApO3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntpZihPKEIpKXtjb25zdCAkPUIudWlkLEQ9Xy5nZXQoJCk7RCYmKEQudW5zdWJzY3JpYmUoKSxfLmRlbGV0ZSgkKSl9fSl9dC5leHBvc2U9QnQsdHlwZW9mIHNlbGY8InUiJiZ0eXBlb2Ygc2VsZi5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixUPT57c2V0VGltZW91dCgoKT0+bHQoVC5lcnJvcnx8VCksMjUwKX0pLHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigidW5oYW5kbGVkcmVqZWN0aW9uIixUPT57Y29uc3QgQj1ULnJlYXNvbjtCJiZ0eXBlb2YgQi5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoQiksMjUwKX0pKSx0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZiBwcm9jZXNzLm9uPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsVD0+e3NldFRpbWVvdXQoKCk9Pmx0KFQpLDI1MCl9KSxwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLFQ9PntUJiZ0eXBlb2YgVC5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoVCksMjUwKX0pKX0obnQpO3ZhciB4bj1rKG50KTtjb25zdCBvbz14bi5leHBvc2U7eG4ucmVnaXN0ZXJTZXJpYWxpemVyLHhuLlRyYW5zZmVyO2Z1bmN0aW9uIG0odCxlKXtyZXR1cm4gdD8/ZX1tLkVNUFRZX09CSkVDVD1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBwKHQpe3JldHVybiB0IT1udWxsfWZ1bmN0aW9uIHgodCl7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXAoT2JqZWN0LmNyZWF0ZSkmJih4LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSkseC5wcm90b3R5cGUuY29uc3RydWN0b3I9eCkseC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBwKHRoaXMuc3RhY2spJiYodCs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSx0fSx4LnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IHgoIlRoaXMgZnVuY3Rpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiIpfTtjb25zdCBzdD17fTtzdC50eXBlT2Y9e307ZnVuY3Rpb24gc28odCl7cmV0dXJuYCR7dH0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiBwZSh0LGUsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7ZX0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7dH1gfXN0LmRlZmluZWQ9ZnVuY3Rpb24odCxlKXtpZighcChlKSl0aHJvdyBuZXcgeChzbyh0KSl9LHN0LnR5cGVPZi5mdW5jPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImZ1bmN0aW9uIix0KSl9LHN0LnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsInN0cmluZyIsdCkpfSxzdC50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyB4KHBlKHR5cGVvZiBlLCJudW1iZXIiLHQpKX0sc3QudHlwZU9mLm51bWJlci5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU+PW4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKHN0LnR5cGVPZi5udW1iZXIodCxlKSxlPm4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZihzdC50eXBlT2YubnVtYmVyKHQsZSksZTw9bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU8bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsIm9iamVjdCIsdCkpfSxzdC50eXBlT2YuYm9vbD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImJvb2xlYW4iLHQpKX0sc3QudHlwZU9mLmJpZ2ludD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYmlnaW50Iil0aHJvdyBuZXcgeChwZSh0eXBlb2YgZSwiYmlnaW50Iix0KSl9LHN0LnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHN0LnR5cGVPZi5udW1iZXIodCxuKSxzdC50eXBlT2YubnVtYmVyKGUsciksbiE9PXIpdGhyb3cgbmV3IHgoYCR7dH0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHtufSBhbmQgJHtyfWApfTt2YXIgaD1zdCx6dD1mdW5jdGlvbih0KXt0PT1udWxsJiYodD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHQuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheSh0LHQubGVuZ3RoKTp0aGlzLmluaXRfc2VlZCh0KX07enQucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbih0KXtmb3IodGhpcy5tdFswXT10Pj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgdD10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKCh0JjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsodCY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0senQucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEscj0wLGk9dGhpcy5OPmU/dGhpcy5OOmU7aTtpLS0pe3ZhciBvPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKG8mNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhvJjY1NTM1KSoxNjY0NTI1KSt0W3JdK3IsdGhpcy5tdFtuXT4+Pj0wLG4rKyxyKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLHI+PWUmJihyPTApfWZvcihpPXRoaXMuTi0xO2k7aS0tKXt2YXIgbz10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChvJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsobyY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LHp0LnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIHQsZT1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV50Pj4+MV5lW3QmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV50Pj4+MV5lW3QmMV07dD10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1edD4+PjFeZVt0JjFdLHRoaXMubXRpPTB9cmV0dXJuIHQ9dGhpcy5tdFt0aGlzLm10aSsrXSx0Xj10Pj4+MTEsdF49dDw8NyYyNjM2OTI4NjQwLHRePXQ8PDE1JjQwMjI3MzA3NTIsdF49dD4+PjE4LHQ+Pj4wfSx6dC5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX0senQucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfSx6dC5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfSx6dC5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfSx6dC5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmRvbV9pbnQoKT4+PjUsZT10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKHQqNjcxMDg4NjQrZSkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3ZhciBfcj16dDtjb25zdCB5PXt9O3kuRVBTSUxPTjE9LjEseS5FUFNJTE9OMj0uMDEseS5FUFNJTE9OMz0uMDAxLHkuRVBTSUxPTjQ9MWUtNCx5LkVQU0lMT041PTFlLTUseS5FUFNJTE9ONj0xZS02LHkuRVBTSUxPTjc9MWUtNyx5LkVQU0lMT044PTFlLTgseS5FUFNJTE9OOT0xZS05LHkuRVBTSUxPTjEwPTFlLTEwLHkuRVBTSUxPTjExPTFlLTExLHkuRVBTSUxPTjEyPTFlLTEyLHkuRVBTSUxPTjEzPTFlLTEzLHkuRVBTSUxPTjE0PTFlLTE0LHkuRVBTSUxPTjE1PTFlLTE1LHkuRVBTSUxPTjE2PTFlLTE2LHkuRVBTSUxPTjE3PTFlLTE3LHkuRVBTSUxPTjE4PTFlLTE4LHkuRVBTSUxPTjE5PTFlLTE5LHkuRVBTSUxPTjIwPTFlLTIwLHkuRVBTSUxPTjIxPTFlLTIxLHkuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTUseS5TT0xBUl9SQURJVVM9Njk1NWU1LHkuTFVOQVJfUkFESVVTPTE3Mzc0MDAseS5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0LHkuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNCx5LnNpZ249bShNYXRoLnNpZ24sZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PTB8fGUhPT1lP2U6ZT4wPzE6LTF9KSx5LnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX0seS50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9bShlLDI1NSksTWF0aC5yb3VuZCgoeS5jbGFtcCh0LC0xLDEpKi41Ky41KSplKX0seS5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1tKGUsMjU1KSx5LmNsYW1wKHQsMCxlKS9lKjItMX0seS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPU1hdGgubWF4KG4tZSwwKSxuPT09MD8wOnkuY2xhbXAoKHQtZSkvbiwwLDEpfSx5LnNpbmg9bShNYXRoLnNpbmgsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpLU1hdGguZXhwKC1lKSkvMn0pLHkuY29zaD1tKE1hdGguY29zaCxmdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfSkseS5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX0seS5QST1NYXRoLlBJLHkuT05FX09WRVJfUEk9MS9NYXRoLlBJLHkuUElfT1ZFUl9UV089TWF0aC5QSS8yLHkuUElfT1ZFUl9USFJFRT1NYXRoLlBJLzMseS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80LHkuUElfT1ZFUl9TSVg9TWF0aC5QSS82LHkuVEhSRUVfUElfT1ZFUl9UV089MypNYXRoLlBJLzIseS5UV09fUEk9MipNYXRoLlBJLHkuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSkseS5SQURJQU5TX1BFUl9ERUdSRUU9TWF0aC5QSS8xODAseS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEkseS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9eS5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMCx5LnRvUmFkaWFucz1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZGVncmVlcyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdCp5LlJBRElBTlNfUEVSX0RFR1JFRX0seS50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqeS5ERUdSRUVTX1BFUl9SQURJQU59LHkuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtjb25zdCBlPXkuVFdPX1BJLG49dC1NYXRoLmZsb29yKHQvZSkqZTtyZXR1cm4gbjwtTWF0aC5QST9uK2U6bj49TWF0aC5QST9uLWU6bn0seS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHkuY2xhbXAodCwtMSp5LlBJX09WRVJfVFdPLHkuUElfT1ZFUl9UV08pfSx5Lm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49LXkuUEkmJnQ8PXkuUEk/dDp5Lnplcm9Ub1R3b1BpKHQreS5QSSkteS5QSX0seS56ZXJvVG9Ud29QaT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYodD49MCYmdDw9eS5UV09fUEkpcmV0dXJuIHQ7Y29uc3QgZT15Lm1vZCh0LHkuVFdPX1BJKTtyZXR1cm4gTWF0aC5hYnMoZSk8eS5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPnkuRVBTSUxPTjE0P3kuVFdPX1BJOmV9LHkubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoIm0gaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IHgoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIHkuc2lnbih0KT09PXkuc2lnbihlKSYmTWF0aC5hYnModCk8TWF0aC5hYnMoZSk/dDoodCVlK2UpJWV9LHkuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixyKXtpZighcCh0KSl0aHJvdyBuZXcgeCgibGVmdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmlnaHQgaXMgcmVxdWlyZWQuIik7bj1tKG4sMCkscj1tKHIsbik7Y29uc3QgaT1NYXRoLmFicyh0LWUpO3JldHVybiBpPD1yfHxpPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX0seS5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIXAodCkpdGhyb3cgbmV3IHgoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFwKGUpKXRocm93IG5ldyB4KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIXAobikpdGhyb3cgbmV3IHgoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPC1ufSx5Lmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFwKHQpKXRocm93IG5ldyB4KCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufSx5LmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn0seS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+LW59O2NvbnN0IFllPVsxXTt5LmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgeCgiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7Y29uc3QgZT1ZZS5sZW5ndGg7aWYodD49ZSl7bGV0IG49WWVbZS0xXTtmb3IobGV0IHI9ZTtyPD10O3IrKyl7Y29uc3QgaT1uKnI7WWUucHVzaChpKSxuPWl9fXJldHVybiBZZVt0XX0seS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPW0obiwwKSwhcCh0KSl0aHJvdyBuZXcgeCgibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyB4KCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9LHkuaXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQhPT0wJiYodCZ0LTEpPT09MH0seS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD4yMTQ3NDgzNjQ4KXRocm93IG5ldyB4KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuIik7cmV0dXJuLS10LHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsKyt0LHR9LHkucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH0seS5jbGFtcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLGgudHlwZU9mLm51bWJlcigibWluIixlKSxoLnR5cGVPZi5udW1iZXIoIm1heCIsbiksdDxlP2U6dD5uP246dH07bGV0IHByPW5ldyBfcjt5LnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInNlZWQgaXMgcmVxdWlyZWQuIik7cHI9bmV3IF9yKHQpfSx5Lm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gcHIucmFuZG9tKCl9LHkucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB5Lm5leHRSYW5kb21OdW1iZXIoKSooZS10KSt0fSx5LmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKHkuY2xhbXAodCwtMSwxKSl9LHkuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmFzaW4oeS5jbGFtcCh0LC0xLDEpKX0seS5jaG9yZExlbmd0aD1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmFkaXVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiAyKmUqTWF0aC5zaW4odCouNSl9LHkubG9nQmFzZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJudW1iZXIgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoImJhc2UgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGgubG9nKHQpL01hdGgubG9nKGUpfSx5LmNicnQ9bShNYXRoLmNicnQsZnVuY3Rpb24oZSl7Y29uc3Qgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufSkseS5sb2cyPW0oTWF0aC5sb2cyLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfSkseS5mb2c9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigieCIsdCksdCooLS4xNzg0Kk1hdGguYWJzKHQpLS4wNjYzKnQqdCsxLjAzMDEpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2YubnVtYmVyKCJ4Iix0KSxoLnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLHI9TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtjb25zdCBpPU1hdGgubWF4KHIsbik7bj1NYXRoLm1pbihyLG4pO2NvbnN0IG89bi9pO2lmKGlzTmFOKG8pKXRocm93IG5ldyB4KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpO3JldHVybiByPXkuZmFzdEFwcHJveGltYXRlQXRhbihvKSxyPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP3kuUElfT1ZFUl9UV08tcjpyLHI9dDwwP3kuUEktcjpyLHI9ZTwwPy1yOnIscn07dmFyIFI9eTtmdW5jdGlvbiBBKHQsZSl7dGhpcy54PW0odCwwKSx0aGlzLnk9bShlLDApfUEuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcChuKT8obi54PXQsbi55PWUsbik6bmV3IEEodCxlKX0sQS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcgQSh0LngsdC55KX0sQS5mcm9tQ2FydGVzaWFuMz1BLmNsb25lLEEuZnJvbUNhcnRlc2lhbjQ9QS5jbG9uZSxBLnBhY2tlZExlbmd0aD0yLEEucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGguZGVmaW5lZCgiYXJyYXkiLGUpLG49bShuLDApLGVbbisrXT10LngsZVtuXT10LnksZX0sQS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLmRlZmluZWQoImFycmF5Iix0KSxlPW0oZSwwKSxwKG4pfHwobj1uZXcgQSksbi54PXRbZSsrXSxuLnk9dFtlXSxufSxBLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjI7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMiBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpQS5wYWNrKHRbaV0sZSxpKjIpO3JldHVybiBlfSxBLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMiksdC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8yOmU9bmV3IEFycmF5KG4vMik7Zm9yKGxldCByPTA7cjxuO3IrPTIpe2NvbnN0IGk9ci8yO2VbaV09QS51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxBLmZyb21BcnJheT1BLnVucGFjayxBLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55KX0sQS5taW5pbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5taW4odC54LHQueSl9LEEubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59LEEubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG59LEEuY2xhbXA9ZnVuY3Rpb24odCxlLG4scil7aC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLGgudHlwZU9mLm9iamVjdCgibWF4IixuKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIscik7Y29uc3QgaT1SLmNsYW1wKHQueCxlLngsbi54KSxvPVIuY2xhbXAodC55LGUueSxuLnkpO3JldHVybiByLng9aSxyLnk9byxyfSxBLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0Lnl9LEEubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoQS5tYWduaXR1ZGVTcXVhcmVkKHQpKX07Y29uc3QgS2U9bmV3IEE7QS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLEEuc3VidHJhY3QodCxlLEtlKSxBLm1hZ25pdHVkZShLZSl9LEEuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5zdWJ0cmFjdCh0LGUsS2UpLEEubWFnbml0dWRlU3F1YXJlZChLZSl9LEEubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtjb25zdCBuPUEubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24saXNOYU4oZS54KXx8aXNOYU4oZS55KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LEEuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55fSxBLmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fSxBLm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG59LEEuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG59LEEuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn0sQS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG59LEEubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbn0sQS5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn0sQS5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlfSxBLmFicz1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGV9O2NvbnN0IHlyPW5ldyBBO0EubGVycD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCksaC50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLGgudHlwZU9mLm51bWJlcigidCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLEEubXVsdGlwbHlCeVNjYWxhcihlLG4seXIpLHI9QS5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLHIpLEEuYWRkKHlyLHIscil9O2NvbnN0IEFyPW5ldyBBLFRyPW5ldyBBO0EuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5ub3JtYWxpemUodCxBciksQS5ub3JtYWxpemUoZSxUciksUi5hY29zQ2xhbXBlZChBLmRvdChBcixUcikpfTtjb25zdCBhbz1uZXcgQTtBLm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7Y29uc3Qgbj1BLm5vcm1hbGl6ZSh0LGFvKTtyZXR1cm4gQS5hYnMobixuKSxuLng8PW4ueT9lPUEuY2xvbmUoQS5VTklUX1gsZSk6ZT1BLmNsb25lKEEuVU5JVF9ZLGUpLGV9LEEuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxwKHQpJiZwKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueX0sQS5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX0sQS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKX0sQS5aRVJPPU9iamVjdC5mcmVlemUobmV3IEEoMCwwKSksQS5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgQSgxLDEpKSxBLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBBKDEsMCkpLEEuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IEEoMCwxKSksQS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEEuY2xvbmUodGhpcyx0KX0sQS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBBLmVxdWFscyh0aGlzLHQpfSxBLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQS5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfSxBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0pYH07ZnVuY3Rpb24gZih0LGUsbil7dGhpcy54PW0odCwwKSx0aGlzLnk9bShlLDApLHRoaXMuej1tKG4sMCl9Zi5mcm9tU3BoZXJpY2FsPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQuY2xvY2sscj10LmNvbmUsaT1tKHQubWFnbml0dWRlLDEpLG89aSpNYXRoLnNpbihyKTtyZXR1cm4gZS54PW8qTWF0aC5jb3MobiksZS55PW8qTWF0aC5zaW4obiksZS56PWkqTWF0aC5jb3MociksZX0sZi5mcm9tRWxlbWVudHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHAocik/KHIueD10LHIueT1lLHIuej1uLHIpOm5ldyBmKHQsZSxuKX0sZi5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBmKHQueCx0LnksdC56KX0sZi5mcm9tQ2FydGVzaWFuND1mLmNsb25lLGYucGFja2VkTGVuZ3RoPTMsZi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1tKG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbl09dC56LGV9LGYudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJhcnJheSIsdCksZT1tKGUsMCkscChuKXx8KG49bmV3IGYpLG4ueD10W2UrK10sbi55PXRbZSsrXSxuLno9dFtlXSxufSxmLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjM7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpZi5wYWNrKHRbaV0sZSxpKjMpO3JldHVybiBlfSxmLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMyksdC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCByPTA7cjxuO3IrPTMpe2NvbnN0IGk9ci8zO2VbaV09Zi51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxmLmZyb21BcnJheT1mLnVucGFjayxmLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55LHQueil9LGYubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX0sZi5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSxoLnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG59LGYubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG4uej1NYXRoLm1heCh0LnosZS56KSxufSxmLmNsYW1wPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGgudHlwZU9mLm9iamVjdCgibWluIixlKSxoLnR5cGVPZi5vYmplY3QoIm1heCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpO2NvbnN0IGk9Ui5jbGFtcCh0LngsZS54LG4ueCksbz1SLmNsYW1wKHQueSxlLnksbi55KSxzPVIuY2xhbXAodC56LGUueixuLnopO3JldHVybiByLng9aSxyLnk9byxyLno9cyxyfSxmLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0LnkrdC56KnQuen0sZi5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChmLm1hZ25pdHVkZVNxdWFyZWQodCkpfTtjb25zdCBaZT1uZXcgZjtmLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5zdWJ0cmFjdCh0LGUsWmUpLGYubWFnbml0dWRlKFplKX0sZi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxmLnN1YnRyYWN0KHQsZSxaZSksZi5tYWduaXR1ZGVTcXVhcmVkKFplKX0sZi5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5tYWduaXR1ZGUodCk7aWYoZS54PXQueC9uLGUueT10LnkvbixlLno9dC56L24saXNOYU4oZS54KXx8aXNOYU4oZS55KXx8aXNOYU4oZS56KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LGYuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9LGYubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbn0sZi5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbi56PXQuei9lLnosbn0sZi5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufSxmLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbn0sZi5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxuLno9dC56KmUsbn0sZi5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59LGYubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZX0sZi5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlfTtjb25zdCBScj1uZXcgZjtmLmxlcnA9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLGgudHlwZU9mLm9iamVjdCgiZW5kIixlKSxoLnR5cGVPZi5udW1iZXIoInQiLG4pLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKSxmLm11bHRpcGx5QnlTY2FsYXIoZSxuLFJyKSxyPWYubXVsdGlwbHlCeVNjYWxhcih0LDEtbixyKSxmLmFkZChScixyLHIpfTtjb25zdCBRZT1uZXcgZixPbj1uZXcgZjtmLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5ub3JtYWxpemUodCxRZSksZi5ub3JtYWxpemUoZSxPbik7Y29uc3Qgbj1mLmRvdChRZSxPbikscj1mLm1hZ25pdHVkZShmLmNyb3NzKFFlLE9uLFFlKSk7cmV0dXJuIE1hdGguYXRhbjIocixuKX07Y29uc3QgdW89bmV3IGY7Zi5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5ub3JtYWxpemUodCx1byk7cmV0dXJuIGYuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1mLmNsb25lKGYuVU5JVF9YLGUpOmU9Zi5jbG9uZShmLlVOSVRfWixlKTpuLnk8PW4uej9lPWYuY2xvbmUoZi5VTklUX1ksZSk6ZT1mLmNsb25lKGYuVU5JVF9aLGUpLGV9LGYucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhIix0KSxoLmRlZmluZWQoImIiLGUpLGguZGVmaW5lZCgicmVzdWx0IixuKTtjb25zdCByPWYuZG90KHQsZSkvZi5kb3QoZSxlKTtyZXR1cm4gZi5tdWx0aXBseUJ5U2NhbGFyKGUscixuKX0sZi5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQueD09PWUueCYmdC55PT09ZS55JiZ0Lno9PT1lLnp9LGYuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX0sZi5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueixlLnosbixyKX0sZi5jcm9zcz1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7Y29uc3Qgcj10LngsaT10Lnksbz10Lnoscz1lLngsdT1lLnksYT1lLnosbD1pKmEtbyp1LGQ9bypzLXIqYSxfPXIqdS1pKnM7cmV0dXJuIG4ueD1sLG4ueT1kLG4uej1fLG59LGYubWlkcG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9KHQueCtlLngpKi41LG4ueT0odC55K2UueSkqLjUsbi56PSh0LnorZS56KSouNSxufSxmLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksZi5mcm9tUmFkaWFucyh0LGUsbixyLGkpfTtsZXQgbXQ9bmV3IGYseWU9bmV3IGY7Y29uc3QgY289bmV3IGYoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO2YuZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXtoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1tKG4sMCk7Y29uc3Qgbz1wKHIpP3IucmFkaWlTcXVhcmVkOmNvLHM9TWF0aC5jb3MoZSk7bXQueD1zKk1hdGguY29zKHQpLG10Lnk9cypNYXRoLnNpbih0KSxtdC56PU1hdGguc2luKGUpLG10PWYubm9ybWFsaXplKG10LG10KSxmLm11bHRpcGx5Q29tcG9uZW50cyhvLG10LHllKTtjb25zdCB1PU1hdGguc3FydChmLmRvdChtdCx5ZSkpO3JldHVybiB5ZT1mLmRpdmlkZUJ5U2NhbGFyKHllLHUseWUpLG10PWYubXVsdGlwbHlCeVNjYWxhcihtdCxuLG10KSxwKGkpfHwoaT1uZXcgZiksZi5hZGQoeWUsbXQsaSl9LGYuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoaC5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtjb25zdCByPXQubGVuZ3RoO3Aobik/bi5sZW5ndGg9ci8yOm49bmV3IEFycmF5KHIvMik7Zm9yKGxldCBpPTA7aTxyO2krPTIpe2NvbnN0IG89dFtpXSxzPXRbaSsxXSx1PWkvMjtuW3VdPWYuZnJvbURlZ3JlZXMobyxzLDAsZSxuW3VdKX1yZXR1cm4gbn0sZi5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzI6bj1uZXcgQXJyYXkoci8yKTtmb3IobGV0IGk9MDtpPHI7aSs9Mil7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9aS8yO25bdV09Zi5mcm9tUmFkaWFucyhvLHMsMCxlLG5bdV0pfXJldHVybiBufSxmLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tRGVncmVlcyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tUmFkaWFucyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgZigwLDAsMCkpLGYuT05FPU9iamVjdC5mcmVlemUobmV3IGYoMSwxLDEpKSxmLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBmKDEsMCwwKSksZi5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgZigwLDEsMCkpLGYuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IGYoMCwwLDEpKSxmLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gZi5jbG9uZSh0aGlzLHQpfSxmLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGYuZXF1YWxzKHRoaXMsdCl9LGYucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9LGYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9KWB9O2NvbnN0IGhvPW5ldyBmLGZvPW5ldyBmO2Z1bmN0aW9uIHhyKHQsZSxuLHIsaSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFwKHIpKXRocm93IG5ldyB4KCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2NvbnN0IG89dC54LHM9dC55LHU9dC56LGE9ZS54LGw9ZS55LGQ9ZS56LF89bypvKmEqYSxPPXMqcypsKmwsYj11KnUqZCpkLEY9XytPK2IsUz1NYXRoLnNxcnQoMS9GKSxOPWYubXVsdGlwbHlCeVNjYWxhcih0LFMsaG8pO2lmKEY8cilyZXR1cm4gaXNGaW5pdGUoUyk/Zi5jbG9uZShOLGkpOnZvaWQgMDtjb25zdCBnPW4ueCxHPW4ueSxLPW4ueixWPWZvO1YueD1OLngqZyoyLFYueT1OLnkqRyoyLFYuej1OLnoqSyoyO2xldCBpdD0oMS1TKSpmLm1hZ25pdHVkZSh0KS8oLjUqZi5tYWduaXR1ZGUoVikpLGx0PTAscnQsQnQsVCxCLCQsRCx5dCxvdCxndCxfbixwbjtkb3tpdC09bHQsVD0xLygxK2l0KmcpLEI9MS8oMStpdCpHKSwkPTEvKDEraXQqSyksRD1UKlQseXQ9QipCLG90PSQqJCxndD1EKlQsX249eXQqQixwbj1vdCokLHJ0PV8qRCtPKnl0K2Iqb3QtMSxCdD1fKmd0KmcrTypfbipHK2IqcG4qSztjb25zdCBIZT0tMipCdDtsdD1ydC9IZX13aGlsZShNYXRoLmFicyhydCk+Ui5FUFNJTE9OMTIpO3JldHVybiBwKGkpPyhpLng9bypULGkueT1zKkIsaS56PXUqJCxpKTpuZXcgZihvKlQscypCLHUqJCl9ZnVuY3Rpb24gSCh0LGUsbil7dGhpcy5sb25naXR1ZGU9bSh0LDApLHRoaXMubGF0aXR1ZGU9bShlLDApLHRoaXMuaGVpZ2h0PW0obiwwKX1ILmZyb21SYWRpYW5zPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1tKG4sMCkscChyKT8oci5sb25naXR1ZGU9dCxyLmxhdGl0dWRlPWUsci5oZWlnaHQ9bixyKTpuZXcgSCh0LGUsbil9LEguZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksSC5mcm9tUmFkaWFucyh0LGUsbixyKX07Y29uc3QgbG89bmV3IGYsRW89bmV3IGYsX289bmV3IGYscG89bmV3IGYoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpLHlvPW5ldyBmKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKSxBbz1SLkVQU0lMT04xO0guZnJvbUNhcnRlc2lhbj1mdW5jdGlvbih0LGUsbil7Y29uc3Qgcj1wKGUpP2Uub25lT3ZlclJhZGlpOnBvLGk9cChlKT9lLm9uZU92ZXJSYWRpaVNxdWFyZWQ6eW8sbz1wKGUpP2UuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ6QW8scz14cih0LHIsaSxvLEVvKTtpZighcChzKSlyZXR1cm47bGV0IHU9Zi5tdWx0aXBseUNvbXBvbmVudHMocyxpLGxvKTt1PWYubm9ybWFsaXplKHUsdSk7Y29uc3QgYT1mLnN1YnRyYWN0KHQscyxfbyksbD1NYXRoLmF0YW4yKHUueSx1LngpLGQ9TWF0aC5hc2luKHUueiksXz1SLnNpZ24oZi5kb3QoYSx0KSkqZi5tYWduaXR1ZGUoYSk7cmV0dXJuIHAobik/KG4ubG9uZ2l0dWRlPWwsbi5sYXRpdHVkZT1kLG4uaGVpZ2h0PV8sbik6bmV3IEgobCxkLF8pfSxILnRvQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWMiLHQpLGYuZnJvbVJhZGlhbnModC5sb25naXR1ZGUsdC5sYXRpdHVkZSx0LmhlaWdodCxlLG4pfSxILmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYocCh0KSlyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBIKHQubG9uZ2l0dWRlLHQubGF0aXR1ZGUsdC5oZWlnaHQpfSxILmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC5sb25naXR1ZGU9PT1lLmxvbmdpdHVkZSYmdC5sYXRpdHVkZT09PWUubGF0aXR1ZGUmJnQuaGVpZ2h0PT09ZS5oZWlnaHR9LEguZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49bShuLDApLHQ9PT1lfHxwKHQpJiZwKGUpJiZNYXRoLmFicyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSk8PW4mJk1hdGguYWJzKHQubGF0aXR1ZGUtZS5sYXRpdHVkZSk8PW4mJk1hdGguYWJzKHQuaGVpZ2h0LWUuaGVpZ2h0KTw9bn0sSC5aRVJPPU9iamVjdC5mcmVlemUobmV3IEgoMCwwLDApKSxILnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gSC5jbG9uZSh0aGlzLHQpfSxILnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEguZXF1YWxzKHRoaXMsdCl9LEgucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gSC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX0sSC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5sb25naXR1ZGV9LCAke3RoaXMubGF0aXR1ZGV9LCAke3RoaXMuaGVpZ2h0fSlgfTtmdW5jdGlvbiBPcih0LGUsbixyKXtlPW0oZSwwKSxuPW0obiwwKSxyPW0ociwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieCIsZSwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieSIsbiwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieiIsciwwKSx0Ll9yYWRpaT1uZXcgZihlLG4sciksdC5fcmFkaWlTcXVhcmVkPW5ldyBmKGUqZSxuKm4scipyKSx0Ll9yYWRpaVRvVGhlRm91cnRoPW5ldyBmKGUqZSplKmUsbipuKm4qbixyKnIqcipyKSx0Ll9vbmVPdmVyUmFkaWk9bmV3IGYoZT09PTA/MDoxL2Usbj09PTA/MDoxL24scj09PTA/MDoxL3IpLHQuX29uZU92ZXJSYWRpaVNxdWFyZWQ9bmV3IGYoZT09PTA/MDoxLyhlKmUpLG49PT0wPzA6MS8obipuKSxyPT09MD8wOjEvKHIqcikpLHQuX21pbmltdW1SYWRpdXM9TWF0aC5taW4oZSxuLHIpLHQuX21heGltdW1SYWRpdXM9TWF0aC5tYXgoZSxuLHIpLHQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9Ui5FUFNJTE9OMSx0Ll9yYWRpaVNxdWFyZWQueiE9PTAmJih0Ll9zcXVhcmVkWE92ZXJTcXVhcmVkWj10Ll9yYWRpaVNxdWFyZWQueC90Ll9yYWRpaVNxdWFyZWQueil9ZnVuY3Rpb24gaih0LGUsbil7dGhpcy5fcmFkaWk9dm9pZCAwLHRoaXMuX3JhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aD12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9taW5pbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9tYXhpbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXZvaWQgMCx0aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWj12b2lkIDAsT3IodGhpcyx0LGUsbil9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoai5wcm90b3R5cGUse3JhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWl9fSxyYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVNxdWFyZWR9fSxyYWRpaVRvVGhlRm91cnRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aH19LG9uZU92ZXJSYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaX19LG9uZU92ZXJSYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkfX0sbWluaW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbmltdW1SYWRpdXN9fSxtYXhpbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4aW11bVJhZGl1c319fSksai5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXJldHVybjtjb25zdCBuPXQuX3JhZGlpO3JldHVybiBwKGUpPyhmLmNsb25lKG4sZS5fcmFkaWkpLGYuY2xvbmUodC5fcmFkaWlTcXVhcmVkLGUuX3JhZGlpU3F1YXJlZCksZi5jbG9uZSh0Ll9yYWRpaVRvVGhlRm91cnRoLGUuX3JhZGlpVG9UaGVGb3VydGgpLGYuY2xvbmUodC5fb25lT3ZlclJhZGlpLGUuX29uZU92ZXJSYWRpaSksZi5jbG9uZSh0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkLGUuX29uZU92ZXJSYWRpaVNxdWFyZWQpLGUuX21pbmltdW1SYWRpdXM9dC5fbWluaW11bVJhZGl1cyxlLl9tYXhpbXVtUmFkaXVzPXQuX21heGltdW1SYWRpdXMsZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD10Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGUpOm5ldyBqKG4ueCxuLnksbi56KX0sai5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgaikscCh0KSYmT3IoZSx0LngsdC55LHQueiksZX0sai5XR1M4ND1PYmplY3QuZnJlZXplKG5ldyBqKDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSksai5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyBqKDEsMSwxKSksai5NT09OPU9iamVjdC5mcmVlemUobmV3IGooUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMpKSxqLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gai5jbG9uZSh0aGlzLHQpfSxqLnBhY2tlZExlbmd0aD1mLnBhY2tlZExlbmd0aCxqLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSxoLmRlZmluZWQoImFycmF5IixlKSxuPW0obiwwKSxmLnBhY2sodC5fcmFkaWksZSxuKSxlfSxqLnVucGFjaz1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhcnJheSIsdCksZT1tKGUsMCk7Y29uc3Qgcj1mLnVucGFjayh0LGUpO3JldHVybiBqLmZyb21DYXJ0ZXNpYW4zKHIsbil9LGoucHJvdG90eXBlLmdlb2NlbnRyaWNTdXJmYWNlTm9ybWFsPWYubm9ybWFsaXplLGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIix0KTtjb25zdCBuPXQubG9uZ2l0dWRlLHI9dC5sYXRpdHVkZSxpPU1hdGguY29zKHIpLG89aSpNYXRoLmNvcyhuKSxzPWkqTWF0aC5zaW4obiksdT1NYXRoLnNpbihyKTtyZXR1cm4gcChlKXx8KGU9bmV3IGYpLGUueD1vLGUueT1zLGUuej11LGYubm9ybWFsaXplKGUsZSl9LGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbD1mdW5jdGlvbih0LGUpe2lmKCFmLmVxdWFsc0Vwc2lsb24odCxmLlpFUk8sUi5FUFNJTE9OMTQpKXJldHVybiBwKGUpfHwoZT1uZXcgZiksZT1mLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsZSksZi5ub3JtYWxpemUoZSxlKX07Y29uc3QgVG89bmV3IGYsUm89bmV3IGY7ai5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlKXtjb25zdCBuPVRvLHI9Um87dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWModCxuKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0aGlzLl9yYWRpaVNxdWFyZWQsbixyKTtjb25zdCBpPU1hdGguc3FydChmLmRvdChuLHIpKTtyZXR1cm4gZi5kaXZpZGVCeVNjYWxhcihyLGksciksZi5tdWx0aXBseUJ5U2NhbGFyKG4sdC5oZWlnaHQsbikscChlKXx8KGU9bmV3IGYpLGYuYWRkKHIsbixlKX0sai5wcm90b3R5cGUuY2FydG9ncmFwaGljQXJyYXlUb0NhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47cisrKWVbcl09dGhpcy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbih0W3JdLGVbcl0pO3JldHVybiBlfTtjb25zdCB4bz1uZXcgZixPbz1uZXcgZixibz1uZXcgZjtqLnByb3RvdHlwZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQsT28pO2lmKCFwKG4pKXJldHVybjtjb25zdCByPXRoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4seG8pLGk9Zi5zdWJ0cmFjdCh0LG4sYm8pLG89TWF0aC5hdGFuMihyLnksci54KSxzPU1hdGguYXNpbihyLnopLHU9Ui5zaWduKGYuZG90KGksdCkpKmYubWFnbml0dWRlKGkpO3JldHVybiBwKGUpPyhlLmxvbmdpdHVkZT1vLGUubGF0aXR1ZGU9cyxlLmhlaWdodD11LGUpOm5ldyBIKG8scyx1KX0sai5wcm90b3R5cGUuY2FydGVzaWFuQXJyYXlUb0NhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47KytyKWVbcl09dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W3JdLGVbcl0pO3JldHVybiBlfSxqLnByb3RvdHlwZS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHhyKHQsdGhpcy5fb25lT3ZlclJhZGlpLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKX0sai5wcm90b3R5cGUuc2NhbGVUb0dlb2NlbnRyaWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQueCxyPXQueSxpPXQueixvPXRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQscz0xL01hdGguc3FydChuKm4qby54K3IqcipvLnkraSppKm8ueik7cmV0dXJuIGYubXVsdGlwbHlCeVNjYWxhcih0LHMsZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgZiksZi5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWksZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uRnJvbVNjYWxlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAoZSl8fChlPW5ldyBmKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX3JhZGlpLGUpfSxqLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHxwKHQpJiZmLmVxdWFscyh0aGlzLl9yYWRpaSx0Ll9yYWRpaSl9LGoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpLnRvU3RyaW5nKCl9LGoucHJvdG90eXBlLmdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXM9ZnVuY3Rpb24odCxlLG4pe2lmKGgudHlwZU9mLm9iamVjdCgicG9zaXRpb24iLHQpLCFSLmVxdWFsc0Vwc2lsb24odGhpcy5fcmFkaWkueCx0aGlzLl9yYWRpaS55LFIuRVBTSUxPTjE1KSl0aHJvdyBuZXcgeCgiRWxsaXBzb2lkIG11c3QgYmUgYW4gZWxsaXBzb2lkIG9mIHJldm9sdXRpb24gKHJhZGlpLnggPT0gcmFkaWkueSkiKTtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW4oIkVsbGlwc29pZC5yYWRpaS56Iix0aGlzLl9yYWRpaS56LDApLGU9bShlLDApO2NvbnN0IHI9dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYocChuKXx8KG49bmV3IGYpLG4ueD0wLG4ueT0wLG4uej10LnoqKDEtciksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LWUpKXJldHVybiBufTtjb25zdCBnbz1bLjE0ODg3NDMzODk4MTYzLC40MzMzOTUzOTQxMjkyNSwuNjc5NDA5NTY4Mjk5MDIsLjg2NTA2MzM2NjY4ODk4LC45NzM5MDY1Mjg1MTcxNywwXSxTbz1bLjI5NTUyNDIyNDcxNDc1LC4yNjkyNjY3MTkzMDk5OSwuMjE5MDg2MzYyNTE1OTgsLjE0OTQ1MTM0OTE1MDU4LC4wNjY2NzEzNDQzMDg2ODQsMF07ZnVuY3Rpb24gYnIodCxlLG4pe2gudHlwZU9mLm51bWJlcigiYSIsdCksaC50eXBlT2YubnVtYmVyKCJiIixlKSxoLnR5cGVPZi5mdW5jKCJmdW5jIixuKTtjb25zdCByPS41KihlK3QpLGk9LjUqKGUtdCk7bGV0IG89MDtmb3IobGV0IHM9MDtzPDU7cysrKXtjb25zdCB1PWkqZ29bc107bys9U29bc10qKG4ocit1KStuKHItdSkpfXJldHVybiBvKj1pLG99ai5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24odCl7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2NvbnN0IGU9dC53ZXN0O2xldCBuPXQuZWFzdDtjb25zdCByPXQuc291dGgsaT10Lm5vcnRoO2Zvcig7bjxlOyluKz1SLlRXT19QSTtjb25zdCBvPXRoaXMuX3JhZGlpU3F1YXJlZCxzPW8ueCx1PW8ueSxhPW8ueixsPXMqdTtyZXR1cm4gYnIocixpLGZ1bmN0aW9uKGQpe2NvbnN0IF89TWF0aC5jb3MoZCksTz1NYXRoLnNpbihkKTtyZXR1cm4gTWF0aC5jb3MoZCkqYnIoZSxuLGZ1bmN0aW9uKGIpe2NvbnN0IEY9TWF0aC5jb3MoYiksUz1NYXRoLnNpbihiKTtyZXR1cm4gTWF0aC5zcXJ0KGwqTypPK2EqKHUqRipGK3MqUypTKSpfKl8pfSl9KX07ZnVuY3Rpb24gSSh0LGUsbixyKXt0aGlzLndlc3Q9bSh0LDApLHRoaXMuc291dGg9bShlLDApLHRoaXMuZWFzdD1tKG4sMCksdGhpcy5ub3J0aD1tKHIsMCl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSS5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5jb21wdXRlV2lkdGgodGhpcyl9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBJLmNvbXB1dGVIZWlnaHQodGhpcyl9fX0pLEkucGFja2VkTGVuZ3RoPTQsSS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1tKG4sMCksZVtuKytdPXQud2VzdCxlW24rK109dC5zb3V0aCxlW24rK109dC5lYXN0LGVbbl09dC5ub3J0aCxlfSxJLnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguZGVmaW5lZCgiYXJyYXkiLHQpLGU9bShlLDApLHAobil8fChuPW5ldyBJKSxuLndlc3Q9dFtlKytdLG4uc291dGg9dFtlKytdLG4uZWFzdD10W2UrK10sbi5ub3J0aD10W2VdLG59LEkuY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgZT10LmVhc3Q7Y29uc3Qgbj10Lndlc3Q7cmV0dXJuIGU8biYmKGUrPVIuVFdPX1BJKSxlLW59LEkuY29tcHV0ZUhlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHQubm9ydGgtdC5zb3V0aH0sSS5mcm9tRGVncmVlcz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0PVIudG9SYWRpYW5zKG0odCwwKSksZT1SLnRvUmFkaWFucyhtKGUsMCkpLG49Ui50b1JhZGlhbnMobShuLDApKSxyPVIudG9SYWRpYW5zKG0ociwwKSkscChpKT8oaS53ZXN0PXQsaS5zb3V0aD1lLGkuZWFzdD1uLGkubm9ydGg9cixpKTpuZXcgSSh0LGUsbixyKX0sSS5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBwKGkpPyhpLndlc3Q9bSh0LDApLGkuc291dGg9bShlLDApLGkuZWFzdD1tKG4sMCksaS5ub3J0aD1tKHIsMCksaSk6bmV3IEkodCxlLG4scil9LEkuZnJvbUNhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtsZXQgbj1OdW1iZXIuTUFYX1ZBTFVFLHI9LU51bWJlci5NQVhfVkFMVUUsaT1OdW1iZXIuTUFYX1ZBTFVFLG89LU51bWJlci5NQVhfVkFMVUUscz1OdW1iZXIuTUFYX1ZBTFVFLHU9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBhPTAsbD10Lmxlbmd0aDthPGw7YSsrKXtjb25zdCBkPXRbYV07bj1NYXRoLm1pbihuLGQubG9uZ2l0dWRlKSxyPU1hdGgubWF4KHIsZC5sb25naXR1ZGUpLHM9TWF0aC5taW4ocyxkLmxhdGl0dWRlKSx1PU1hdGgubWF4KHUsZC5sYXRpdHVkZSk7Y29uc3QgXz1kLmxvbmdpdHVkZT49MD9kLmxvbmdpdHVkZTpkLmxvbmdpdHVkZStSLlRXT19QSTtpPU1hdGgubWluKGksXyksbz1NYXRoLm1heChvLF8pfXJldHVybiByLW4+by1pJiYobj1pLHI9byxyPlIuUEkmJihyPXItUi5UV09fUEkpLG4+Ui5QSSYmKG49bi1SLlRXT19QSSkpLHAoZSk/KGUud2VzdD1uLGUuc291dGg9cyxlLmVhc3Q9cixlLm5vcnRoPXUsZSk6bmV3IEkobixzLHIsdSl9LEkuZnJvbUNhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSxuKXtoLmRlZmluZWQoImNhcnRlc2lhbnMiLHQpLGU9bShlLGouV0dTODQpO2xldCByPU51bWJlci5NQVhfVkFMVUUsaT0tTnVtYmVyLk1BWF9WQUxVRSxvPU51bWJlci5NQVhfVkFMVUUscz0tTnVtYmVyLk1BWF9WQUxVRSx1PU51bWJlci5NQVhfVkFMVUUsYT0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IGw9MCxkPXQubGVuZ3RoO2w8ZDtsKyspe2NvbnN0IF89ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W2xdKTtyPU1hdGgubWluKHIsXy5sb25naXR1ZGUpLGk9TWF0aC5tYXgoaSxfLmxvbmdpdHVkZSksdT1NYXRoLm1pbih1LF8ubGF0aXR1ZGUpLGE9TWF0aC5tYXgoYSxfLmxhdGl0dWRlKTtjb25zdCBPPV8ubG9uZ2l0dWRlPj0wP18ubG9uZ2l0dWRlOl8ubG9uZ2l0dWRlK1IuVFdPX1BJO289TWF0aC5taW4obyxPKSxzPU1hdGgubWF4KHMsTyl9cmV0dXJuIGktcj5zLW8mJihyPW8saT1zLGk+Ui5QSSYmKGk9aS1SLlRXT19QSSkscj5SLlBJJiYocj1yLVIuVFdPX1BJKSkscChuKT8obi53ZXN0PXIsbi5zb3V0aD11LG4uZWFzdD1pLG4ubm9ydGg9YSxuKTpuZXcgSShyLHUsaSxhKX0sSS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUud2VzdD10Lndlc3QsZS5zb3V0aD10LnNvdXRoLGUuZWFzdD10LmVhc3QsZS5ub3J0aD10Lm5vcnRoLGUpOm5ldyBJKHQud2VzdCx0LnNvdXRoLHQuZWFzdCx0Lm5vcnRoKX0sSS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj1tKG4sMCksdD09PWV8fHAodCkmJnAoZSkmJk1hdGguYWJzKHQud2VzdC1lLndlc3QpPD1uJiZNYXRoLmFicyh0LnNvdXRoLWUuc291dGgpPD1uJiZNYXRoLmFicyh0LmVhc3QtZS5lYXN0KTw9biYmTWF0aC5hYnModC5ub3J0aC1lLm5vcnRoKTw9bn0sSS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEkuY2xvbmUodGhpcyx0KX0sSS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBJLmVxdWFscyh0aGlzLHQpfSxJLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC53ZXN0PT09ZS53ZXN0JiZ0LnNvdXRoPT09ZS5zb3V0aCYmdC5lYXN0PT09ZS5lYXN0JiZ0Lm5vcnRoPT09ZS5ub3J0aH0sSS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBJLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfSxJLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtjb25zdCBlPXQubm9ydGg7aC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoIixlLC1SLlBJX09WRVJfVFdPKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGgiLGUsUi5QSV9PVkVSX1RXTyk7Y29uc3Qgbj10LnNvdXRoO2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJzb3V0aCIsbiwtUi5QSV9PVkVSX1RXTyksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoIixuLFIuUElfT1ZFUl9UV08pO2NvbnN0IHI9dC53ZXN0O2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ3ZXN0IixyLC1NYXRoLlBJKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygid2VzdCIscixNYXRoLlBJKTtjb25zdCBpPXQuZWFzdDtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdCIsaSwtTWF0aC5QSSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3QiLGksTWF0aC5QSSl9LEkuc291dGh3ZXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10Lndlc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC53ZXN0LHQuc291dGgpfSxJLm5vcnRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBIKHQud2VzdCx0Lm5vcnRoKX0sSS5ub3J0aGVhc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHAoZSk/KGUubG9uZ2l0dWRlPXQuZWFzdCxlLmxhdGl0dWRlPXQubm9ydGgsZS5oZWlnaHQ9MCxlKTpuZXcgSCh0LmVhc3QsdC5ub3J0aCl9LEkuc291dGhlYXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10LmVhc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC5lYXN0LHQuc291dGgpfSxJLmNlbnRlcj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgbj10LmVhc3Q7Y29uc3Qgcj10Lndlc3Q7bjxyJiYobis9Ui5UV09fUEkpO2NvbnN0IGk9Ui5uZWdhdGl2ZVBpVG9QaSgocituKSouNSksbz0odC5zb3V0aCt0Lm5vcnRoKSouNTtyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9aSxlLmxhdGl0dWRlPW8sZS5oZWlnaHQ9MCxlKTpuZXcgSChpLG8pfSxJLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2xldCByPXQuZWFzdCxpPXQud2VzdCxvPWUuZWFzdCxzPWUud2VzdDtyPGkmJm8+MD9yKz1SLlRXT19QSTpvPHMmJnI+MCYmKG8rPVIuVFdPX1BJKSxyPGkmJnM8MD9zKz1SLlRXT19QSTpvPHMmJmk8MCYmKGkrPVIuVFdPX1BJKTtjb25zdCB1PVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgoaSxzKSksYT1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWluKHIsbykpO2lmKCh0Lndlc3Q8dC5lYXN0fHxlLndlc3Q8ZS5lYXN0KSYmYTw9dSlyZXR1cm47Y29uc3QgbD1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLGQ9TWF0aC5taW4odC5ub3J0aCxlLm5vcnRoKTtpZighKGw+PWQpKXJldHVybiBwKG4pPyhuLndlc3Q9dSxuLnNvdXRoPWwsbi5lYXN0PWEsbi5ub3J0aD1kLG4pOm5ldyBJKHUsbCxhLGQpfSxJLnNpbXBsZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2NvbnN0IHI9TWF0aC5tYXgodC53ZXN0LGUud2VzdCksaT1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLG89TWF0aC5taW4odC5lYXN0LGUuZWFzdCkscz1NYXRoLm1pbih0Lm5vcnRoLGUubm9ydGgpO2lmKCEoaT49c3x8cj49bykpcmV0dXJuIHAobik/KG4ud2VzdD1yLG4uc291dGg9aSxuLmVhc3Q9byxuLm5vcnRoPXMsbik6bmV3IEkocixpLG8scyl9LEkudW5pb249ZnVuY3Rpb24odCxlLG4pe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxoLnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKSxwKG4pfHwobj1uZXcgSSk7bGV0IHI9dC5lYXN0LGk9dC53ZXN0LG89ZS5lYXN0LHM9ZS53ZXN0O3I8aSYmbz4wP3IrPVIuVFdPX1BJOm88cyYmcj4wJiYobys9Ui5UV09fUEkpLHI8aSYmczwwP3MrPVIuVFdPX1BJOm88cyYmaTwwJiYoaSs9Ui5UV09fUEkpO2NvbnN0IHU9Ui5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihpLHMpKSxhPVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgocixvKSk7cmV0dXJuIG4ud2VzdD11LG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLnNvdXRoKSxuLmVhc3Q9YSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5ub3J0aCksbn0sSS5leHBhbmQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpLHAobil8fChuPW5ldyBJKSxuLndlc3Q9TWF0aC5taW4odC53ZXN0LGUubG9uZ2l0dWRlKSxuLnNvdXRoPU1hdGgubWluKHQuc291dGgsZS5sYXRpdHVkZSksbi5lYXN0PU1hdGgubWF4KHQuZWFzdCxlLmxvbmdpdHVkZSksbi5ub3J0aD1NYXRoLm1heCh0Lm5vcnRoLGUubGF0aXR1ZGUpLG59LEkuY29udGFpbnM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpO2xldCBuPWUubG9uZ2l0dWRlO2NvbnN0IHI9ZS5sYXRpdHVkZSxpPXQud2VzdDtsZXQgbz10LmVhc3Q7cmV0dXJuIG88aSYmKG8rPVIuVFdPX1BJLG48MCYmKG4rPVIuVFdPX1BJKSksKG4+aXx8Ui5lcXVhbHNFcHNpbG9uKG4saSxSLkVQU0lMT04xNCkpJiYobjxvfHxSLmVxdWFsc0Vwc2lsb24obixvLFIuRVBTSUxPTjE0KSkmJnI+PXQuc291dGgmJnI8PXQubm9ydGh9O2NvbnN0IG1vPW5ldyBIO0kuc3Vic2FtcGxlPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxlPW0oZSxqLldHUzg0KSxuPW0obiwwKSxwKHIpfHwocj1bXSk7bGV0IGk9MDtjb25zdCBvPXQubm9ydGgscz10LnNvdXRoLHU9dC5lYXN0LGE9dC53ZXN0LGw9bW87bC5oZWlnaHQ9bixsLmxvbmdpdHVkZT1hLGwubGF0aXR1ZGU9byxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sYXRpdHVkZT1zLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxsLmxvbmdpdHVkZT1hLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxvPDA/bC5sYXRpdHVkZT1vOnM+MD9sLmxhdGl0dWRlPXM6bC5sYXRpdHVkZT0wO2ZvcihsZXQgZD0xO2Q8ODsrK2QpbC5sb25naXR1ZGU9LU1hdGguUEkrZCpSLlBJX09WRVJfVFdPLEkuY29udGFpbnModCxsKSYmKHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyk7cmV0dXJuIGwubGF0aXR1ZGU9PT0wJiYobC5sb25naXR1ZGU9YSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyspLHIubGVuZ3RoPWkscn0sSS5zdWJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtpZihoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGhMZXJwIixuLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4sMSksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImVhc3RMZXJwIixyLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0TGVycCIsciwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibm9ydGhMZXJwIixpLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLGksMSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLHIpLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4saSkscChvKXx8KG89bmV3IEkpLHQud2VzdDw9dC5lYXN0KXtjb25zdCB1PXQuZWFzdC10Lndlc3Q7by53ZXN0PXQud2VzdCtlKnUsby5lYXN0PXQud2VzdCtyKnV9ZWxzZXtjb25zdCB1PVIuVFdPX1BJK3QuZWFzdC10Lndlc3Q7by53ZXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K2UqdSksby5lYXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K3IqdSl9Y29uc3Qgcz10Lm5vcnRoLXQuc291dGg7cmV0dXJuIG8uc291dGg9dC5zb3V0aCtuKnMsby5ub3J0aD10LnNvdXRoK2kqcyxlPT09MSYmKG8ud2VzdD10LmVhc3QpLHI9PT0xJiYoby5lYXN0PXQuZWFzdCksbj09PTEmJihvLnNvdXRoPXQubm9ydGgpLGk9PT0xJiYoby5ub3J0aD10Lm5vcnRoKSxvfSxJLk1BWF9WQUxVRT1PYmplY3QuZnJlZXplKG5ldyBJKC1NYXRoLlBJLC1SLlBJX09WRVJfVFdPLE1hdGguUEksUi5QSV9PVkVSX1RXTykpO3ZhciBncj1PYmplY3QuZnJlZXplKHtERVBUSF9CVUZGRVJfQklUOjI1NixTVEVOQ0lMX0JVRkZFUl9CSVQ6MTAyNCxDT0xPUl9CVUZGRVJfQklUOjE2Mzg0LFBPSU5UUzowLExJTkVTOjEsTElORV9MT09QOjIsTElORV9TVFJJUDozLFRSSUFOR0xFUzo0LFRSSUFOR0xFX1NUUklQOjUsVFJJQU5HTEVfRkFOOjYsWkVSTzowLE9ORToxLFNSQ19DT0xPUjo3NjgsT05FX01JTlVTX1NSQ19DT0xPUjo3NjksU1JDX0FMUEhBOjc3MCxPTkVfTUlOVVNfU1JDX0FMUEhBOjc3MSxEU1RfQUxQSEE6NzcyLE9ORV9NSU5VU19EU1RfQUxQSEE6NzczLERTVF9DT0xPUjo3NzQsT05FX01JTlVTX0RTVF9DT0xPUjo3NzUsU1JDX0FMUEhBX1NBVFVSQVRFOjc3NixGVU5DX0FERDozMjc3NCxCTEVORF9FUVVBVElPTjozMjc3NyxCTEVORF9FUVVBVElPTl9SR0I6MzI3NzcsQkxFTkRfRVFVQVRJT05fQUxQSEE6MzQ4NzcsRlVOQ19TVUJUUkFDVDozMjc3OCxGVU5DX1JFVkVSU0VfU1VCVFJBQ1Q6MzI3NzksQkxFTkRfRFNUX1JHQjozMjk2OCxCTEVORF9TUkNfUkdCOjMyOTY5LEJMRU5EX0RTVF9BTFBIQTozMjk3MCxCTEVORF9TUkNfQUxQSEE6MzI5NzEsQ09OU1RBTlRfQ09MT1I6MzI3NjksT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOjMyNzcwLENPTlNUQU5UX0FMUEhBOjMyNzcxLE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQTozMjc3MixCTEVORF9DT0xPUjozMjc3MyxBUlJBWV9CVUZGRVI6MzQ5NjIsRUxFTUVOVF9BUlJBWV9CVUZGRVI6MzQ5NjMsQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjQsRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORzozNDk2NSxTVFJFQU1fRFJBVzozNTA0MCxTVEFUSUNfRFJBVzozNTA0NCxEWU5BTUlDX0RSQVc6MzUwNDgsQlVGRkVSX1NJWkU6MzQ2NjAsQlVGRkVSX1VTQUdFOjM0NjYxLENVUlJFTlRfVkVSVEVYX0FUVFJJQjozNDM0MixGUk9OVDoxMDI4LEJBQ0s6MTAyOSxGUk9OVF9BTkRfQkFDSzoxMDMyLENVTExfRkFDRToyODg0LEJMRU5EOjMwNDIsRElUSEVSOjMwMjQsU1RFTkNJTF9URVNUOjI5NjAsREVQVEhfVEVTVDoyOTI5LFNDSVNTT1JfVEVTVDozMDg5LFBPTFlHT05fT0ZGU0VUX0ZJTEw6MzI4MjMsU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOjMyOTI2LFNBTVBMRV9DT1ZFUkFHRTozMjkyOCxOT19FUlJPUjowLElOVkFMSURfRU5VTToxMjgwLElOVkFMSURfVkFMVUU6MTI4MSxJTlZBTElEX09QRVJBVElPTjoxMjgyLE9VVF9PRl9NRU1PUlk6MTI4NSxDVzoyMzA0LENDVzoyMzA1LExJTkVfV0lEVEg6Mjg0OSxBTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6MzM5MDEsQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOjMzOTAyLENVTExfRkFDRV9NT0RFOjI4ODUsRlJPTlRfRkFDRToyODg2LERFUFRIX1JBTkdFOjI5MjgsREVQVEhfV1JJVEVNQVNLOjI5MzAsREVQVEhfQ0xFQVJfVkFMVUU6MjkzMSxERVBUSF9GVU5DOjI5MzIsU1RFTkNJTF9DTEVBUl9WQUxVRToyOTYxLFNURU5DSUxfRlVOQzoyOTYyLFNURU5DSUxfRkFJTDoyOTY0LFNURU5DSUxfUEFTU19ERVBUSF9GQUlMOjI5NjUsU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1M6Mjk2NixTVEVOQ0lMX1JFRjoyOTY3LFNURU5DSUxfVkFMVUVfTUFTSzoyOTYzLFNURU5DSUxfV1JJVEVNQVNLOjI5NjgsU1RFTkNJTF9CQUNLX0ZVTkM6MzQ4MTYsU1RFTkNJTF9CQUNLX0ZBSUw6MzQ4MTcsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTDozNDgxOCxTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTOjM0ODE5LFNURU5DSUxfQkFDS19SRUY6MzYwMDMsU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0s6MzYwMDQsU1RFTkNJTF9CQUNLX1dSSVRFTUFTSzozNjAwNSxWSUVXUE9SVDoyOTc4LFNDSVNTT1JfQk9YOjMwODgsQ09MT1JfQ0xFQVJfVkFMVUU6MzEwNixDT0xPUl9XUklURU1BU0s6MzEwNyxVTlBBQ0tfQUxJR05NRU5UOjMzMTcsUEFDS19BTElHTk1FTlQ6MzMzMyxNQVhfVEVYVFVSRV9TSVpFOjMzNzksTUFYX1ZJRVdQT1JUX0RJTVM6MzM4NixTVUJQSVhFTF9CSVRTOjM0MDgsUkVEX0JJVFM6MzQxMCxHUkVFTl9CSVRTOjM0MTEsQkxVRV9CSVRTOjM0MTIsQUxQSEFfQklUUzozNDEzLERFUFRIX0JJVFM6MzQxNCxTVEVOQ0lMX0JJVFM6MzQxNSxQT0xZR09OX09GRlNFVF9VTklUUzoxMDc1MixQT0xZR09OX09GRlNFVF9GQUNUT1I6MzI4MjQsVEVYVFVSRV9CSU5ESU5HXzJEOjMyODczLFNBTVBMRV9CVUZGRVJTOjMyOTM2LFNBTVBMRVM6MzI5MzcsU0FNUExFX0NPVkVSQUdFX1ZBTFVFOjMyOTM4LFNBTVBMRV9DT1ZFUkFHRV9JTlZFUlQ6MzI5MzksQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6MzQ0NjcsRE9OVF9DQVJFOjQzNTIsRkFTVEVTVDo0MzUzLE5JQ0VTVDo0MzU0LEdFTkVSQVRFX01JUE1BUF9ISU5UOjMzMTcwLEJZVEU6NTEyMCxVTlNJR05FRF9CWVRFOjUxMjEsU0hPUlQ6NTEyMixVTlNJR05FRF9TSE9SVDo1MTIzLElOVDo1MTI0LFVOU0lHTkVEX0lOVDo1MTI1LEZMT0FUOjUxMjYsREVQVEhfQ09NUE9ORU5UOjY0MDIsQUxQSEE6NjQwNixSR0I6NjQwNyxSR0JBOjY0MDgsTFVNSU5BTkNFOjY0MDksTFVNSU5BTkNFX0FMUEhBOjY0MTAsVU5TSUdORURfU0hPUlRfNF80XzRfNDozMjgxOSxVTlNJR05FRF9TSE9SVF81XzVfNV8xOjMyODIwLFVOU0lHTkVEX1NIT1JUXzVfNl81OjMzNjM1LEZSQUdNRU5UX1NIQURFUjozNTYzMixWRVJURVhfU0hBREVSOjM1NjMzLE1BWF9WRVJURVhfQVRUUklCUzozNDkyMSxNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzozNjM0NyxNQVhfVkFSWUlOR19WRUNUT1JTOjM2MzQ4LE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOjM1NjYxLE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MCxNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNDkzMCxNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTOjM2MzQ5LFNIQURFUl9UWVBFOjM1NjYzLERFTEVURV9TVEFUVVM6MzU3MTIsTElOS19TVEFUVVM6MzU3MTQsVkFMSURBVEVfU1RBVFVTOjM1NzE1LEFUVEFDSEVEX1NIQURFUlM6MzU3MTcsQUNUSVZFX1VOSUZPUk1TOjM1NzE4LEFDVElWRV9BVFRSSUJVVEVTOjM1NzIxLFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjozNTcyNCxDVVJSRU5UX1BST0dSQU06MzU3MjUsTkVWRVI6NTEyLExFU1M6NTEzLEVRVUFMOjUxNCxMRVFVQUw6NTE1LEdSRUFURVI6NTE2LE5PVEVRVUFMOjUxNyxHRVFVQUw6NTE4LEFMV0FZUzo1MTksS0VFUDo3NjgwLFJFUExBQ0U6NzY4MSxJTkNSOjc2ODIsREVDUjo3NjgzLElOVkVSVDo1Mzg2LElOQ1JfV1JBUDozNDA1NSxERUNSX1dSQVA6MzQwNTYsVkVORE9SOjc5MzYsUkVOREVSRVI6NzkzNyxWRVJTSU9OOjc5MzgsTkVBUkVTVDo5NzI4LExJTkVBUjo5NzI5LE5FQVJFU1RfTUlQTUFQX05FQVJFU1Q6OTk4NCxMSU5FQVJfTUlQTUFQX05FQVJFU1Q6OTk4NSxORUFSRVNUX01JUE1BUF9MSU5FQVI6OTk4NixMSU5FQVJfTUlQTUFQX0xJTkVBUjo5OTg3LFRFWFRVUkVfTUFHX0ZJTFRFUjoxMDI0MCxURVhUVVJFX01JTl9GSUxURVI6MTAyNDEsVEVYVFVSRV9XUkFQX1M6MTAyNDIsVEVYVFVSRV9XUkFQX1Q6MTAyNDMsVEVYVFVSRV8yRDozNTUzLFRFWFRVUkU6NTg5MCxURVhUVVJFX0NVQkVfTUFQOjM0MDY3LFRFWFRVUkVfQklORElOR19DVUJFX01BUDozNDA2OCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6MzQwNjksVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOjM0MDcwLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWTozNDA3MSxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6MzQwNzIsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOjM0MDczLFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjozNDA3NCxNQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOjM0MDc2LFRFWFRVUkUwOjMzOTg0LFRFWFRVUkUxOjMzOTg1LFRFWFRVUkUyOjMzOTg2LFRFWFRVUkUzOjMzOTg3LFRFWFRVUkU0OjMzOTg4LFRFWFRVUkU1OjMzOTg5LFRFWFRVUkU2OjMzOTkwLFRFWFRVUkU3OjMzOTkxLFRFWFRVUkU4OjMzOTkyLFRFWFRVUkU5OjMzOTkzLFRFWFRVUkUxMDozMzk5NCxURVhUVVJFMTE6MzM5OTUsVEVYVFVSRTEyOjMzOTk2LFRFWFRVUkUxMzozMzk5NyxURVhUVVJFMTQ6MzM5OTgsVEVYVFVSRTE1OjMzOTk5LFRFWFRVUkUxNjozNGUzLFRFWFRVUkUxNzozNDAwMSxURVhUVVJFMTg6MzQwMDIsVEVYVFVSRTE5OjM0MDAzLFRFWFRVUkUyMDozNDAwNCxURVhUVVJFMjE6MzQwMDUsVEVYVFVSRTIyOjM0MDA2LFRFWFRVUkUyMzozNDAwNyxURVhUVVJFMjQ6MzQwMDgsVEVYVFVSRTI1OjM0MDA5LFRFWFRVUkUyNjozNDAxMCxURVhUVVJFMjc6MzQwMTEsVEVYVFVSRTI4OjM0MDEyLFRFWFRVUkUyOTozNDAxMyxURVhUVVJFMzA6MzQwMTQsVEVYVFVSRTMxOjM0MDE1LEFDVElWRV9URVhUVVJFOjM0MDE2LFJFUEVBVDoxMDQ5NyxDTEFNUF9UT19FREdFOjMzMDcxLE1JUlJPUkVEX1JFUEVBVDozMzY0OCxGTE9BVF9WRUMyOjM1NjY0LEZMT0FUX1ZFQzM6MzU2NjUsRkxPQVRfVkVDNDozNTY2NixJTlRfVkVDMjozNTY2NyxJTlRfVkVDMzozNTY2OCxJTlRfVkVDNDozNTY2OSxCT09MOjM1NjcwLEJPT0xfVkVDMjozNTY3MSxCT09MX1ZFQzM6MzU2NzIsQk9PTF9WRUM0OjM1NjczLEZMT0FUX01BVDI6MzU2NzQsRkxPQVRfTUFUMzozNTY3NSxGTE9BVF9NQVQ0OjM1Njc2LFNBTVBMRVJfMkQ6MzU2NzgsU0FNUExFUl9DVUJFOjM1NjgwLFZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDozNDMzOCxWRVJURVhfQVRUUklCX0FSUkFZX1NJWkU6MzQzMzksVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREU6MzQzNDAsVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFOjM0MzQxLFZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDozNDkyMixWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVI6MzQzNzMsVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORzozNDk3NSxJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6MzU3MzgsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6MzU3MzksQ09NUElMRV9TVEFUVVM6MzU3MTMsTE9XX0ZMT0FUOjM2MzM2LE1FRElVTV9GTE9BVDozNjMzNyxISUdIX0ZMT0FUOjM2MzM4LExPV19JTlQ6MzYzMzksTUVESVVNX0lOVDozNjM0MCxISUdIX0lOVDozNjM0MSxGUkFNRUJVRkZFUjozNjE2MCxSRU5ERVJCVUZGRVI6MzYxNjEsUkdCQTQ6MzI4NTQsUkdCNV9BMTozMjg1NSxSR0I1NjU6MzYxOTQsREVQVEhfQ09NUE9ORU5UMTY6MzMxODksU1RFTkNJTF9JTkRFWDo2NDAxLFNURU5DSUxfSU5ERVg4OjM2MTY4LERFUFRIX1NURU5DSUw6MzQwNDEsUkVOREVSQlVGRkVSX1dJRFRIOjM2MTYyLFJFTkRFUkJVRkZFUl9IRUlHSFQ6MzYxNjMsUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVDozNjE2NCxSRU5ERVJCVUZGRVJfUkVEX1NJWkU6MzYxNzYsUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU6MzYxNzcsUkVOREVSQlVGRkVSX0JMVUVfU0laRTozNjE3OCxSRU5ERVJCVUZGRVJfQUxQSEFfU0laRTozNjE3OSxSRU5ERVJCVUZGRVJfREVQVEhfU0laRTozNjE4MCxSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFOjM2MTgxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6MzYwNDgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRTozNjA0OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUw6MzYwNTAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6MzYwNTEsQ09MT1JfQVRUQUNITUVOVDA6MzYwNjQsREVQVEhfQVRUQUNITUVOVDozNjA5NixTVEVOQ0lMX0FUVEFDSE1FTlQ6MzYxMjgsREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOjMzMzA2LE5PTkU6MCxGUkFNRUJVRkZFUl9DT01QTEVURTozNjA1MyxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6MzYwNTQsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6MzYwNTUsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOjM2MDU3LEZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOjM2MDYxLEZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVOREVSQlVGRkVSX0JJTkRJTkc6MzYwMDcsTUFYX1JFTkRFUkJVRkZFUl9TSVpFOjM0MDI0LElOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOjEyODYsVU5QQUNLX0ZMSVBfWV9XRUJHTDozNzQ0MCxVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6Mzc0NDEsQ09OVEVYVF9MT1NUX1dFQkdMOjM3NDQyLFVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0w6Mzc0NDMsQlJPV1NFUl9ERUZBVUxUX1dFQkdMOjM3NDQ0LENPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6MzM3NzYsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6MzM3NzcsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6MzM3NzgsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6MzM3NzksQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRzozNTg0MCxDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOjM1ODQxLENPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HOjM1ODQyLENPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOjM1ODQzLENPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9XRUJHTDozNzgwOCxDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOjM2MTk2LENPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNOjM2NDkyLEhBTEZfRkxPQVRfT0VTOjM2MTkzLERPVUJMRTo1MTMwLFJFQURfQlVGRkVSOjMwNzQsVU5QQUNLX1JPV19MRU5HVEg6MzMxNCxVTlBBQ0tfU0tJUF9ST1dTOjMzMTUsVU5QQUNLX1NLSVBfUElYRUxTOjMzMTYsUEFDS19ST1dfTEVOR1RIOjMzMzAsUEFDS19TS0lQX1JPV1M6MzMzMSxQQUNLX1NLSVBfUElYRUxTOjMzMzIsQ09MT1I6NjE0NCxERVBUSDo2MTQ1LFNURU5DSUw6NjE0NixSRUQ6NjQwMyxSR0I4OjMyODQ5LFJHQkE4OjMyODU2LFJHQjEwX0EyOjMyODU3LFRFWFRVUkVfQklORElOR18zRDozMjg3NCxVTlBBQ0tfU0tJUF9JTUFHRVM6MzI4NzcsVU5QQUNLX0lNQUdFX0hFSUdIVDozMjg3OCxURVhUVVJFXzNEOjMyODc5LFRFWFRVUkVfV1JBUF9SOjMyODgyLE1BWF8zRF9URVhUVVJFX1NJWkU6MzI4ODMsVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWOjMzNjQwLE1BWF9FTEVNRU5UU19WRVJUSUNFUzozM2UzLE1BWF9FTEVNRU5UU19JTkRJQ0VTOjMzMDAxLFRFWFRVUkVfTUlOX0xPRDozMzA4MixURVhUVVJFX01BWF9MT0Q6MzMwODMsVEVYVFVSRV9CQVNFX0xFVkVMOjMzMDg0LFRFWFRVUkVfTUFYX0xFVkVMOjMzMDg1LE1JTjozMjc3NSxNQVg6MzI3NzYsREVQVEhfQ09NUE9ORU5UMjQ6MzMxOTAsTUFYX1RFWFRVUkVfTE9EX0JJQVM6MzQwNDUsVEVYVFVSRV9DT01QQVJFX01PREU6MzQ4OTIsVEVYVFVSRV9DT01QQVJFX0ZVTkM6MzQ4OTMsQ1VSUkVOVF9RVUVSWTozNDkxNyxRVUVSWV9SRVNVTFQ6MzQ5MTgsUVVFUllfUkVTVUxUX0FWQUlMQUJMRTozNDkxOSxTVFJFQU1fUkVBRDozNTA0MSxTVFJFQU1fQ09QWTozNTA0MixTVEFUSUNfUkVBRDozNTA0NSxTVEFUSUNfQ09QWTozNTA0NixEWU5BTUlDX1JFQUQ6MzUwNDksRFlOQU1JQ19DT1BZOjM1MDUwLE1BWF9EUkFXX0JVRkZFUlM6MzQ4NTIsRFJBV19CVUZGRVIwOjM0ODUzLERSQVdfQlVGRkVSMTozNDg1NCxEUkFXX0JVRkZFUjI6MzQ4NTUsRFJBV19CVUZGRVIzOjM0ODU2LERSQVdfQlVGRkVSNDozNDg1NyxEUkFXX0JVRkZFUjU6MzQ4NTgsRFJBV19CVUZGRVI2OjM0ODU5LERSQVdfQlVGRkVSNzozNDg2MCxEUkFXX0JVRkZFUjg6MzQ4NjEsRFJBV19CVUZGRVI5OjM0ODYyLERSQVdfQlVGRkVSMTA6MzQ4NjMsRFJBV19CVUZGRVIxMTozNDg2NCxEUkFXX0JVRkZFUjEyOjM0ODY1LERSQVdfQlVGRkVSMTM6MzQ4NjYsRFJBV19CVUZGRVIxNDozNDg2NyxEUkFXX0JVRkZFUjE1OjM0ODY4LE1BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTcsTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTgsU0FNUExFUl8zRDozNTY3OSxTQU1QTEVSXzJEX1NIQURPVzozNTY4MixGUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UOjM1NzIzLFBJWEVMX1BBQ0tfQlVGRkVSOjM1MDUxLFBJWEVMX1VOUEFDS19CVUZGRVI6MzUwNTIsUElYRUxfUEFDS19CVUZGRVJfQklORElORzozNTA1MyxQSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTUsRkxPQVRfTUFUMngzOjM1Njg1LEZMT0FUX01BVDJ4NDozNTY4NixGTE9BVF9NQVQzeDI6MzU2ODcsRkxPQVRfTUFUM3g0OjM1Njg4LEZMT0FUX01BVDR4MjozNTY4OSxGTE9BVF9NQVQ0eDM6MzU2OTAsU1JHQjozNTkwNCxTUkdCODozNTkwNSxTUkdCOF9BTFBIQTg6MzU5MDcsQ09NUEFSRV9SRUZfVE9fVEVYVFVSRTozNDg5NCxSR0JBMzJGOjM0ODM2LFJHQjMyRjozNDgzNyxSR0JBMTZGOjM0ODQyLFJHQjE2RjozNDg0MyxWRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVI6MzUwNjksTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTOjM1MDcxLE1JTl9QUk9HUkFNX1RFWEVMX09GRlNFVDozNTA3NixNQVhfUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzcsTUFYX1ZBUllJTkdfQ09NUE9ORU5UUzozNTY1OSxURVhUVVJFXzJEX0FSUkFZOjM1ODY2LFRFWFRVUkVfQklORElOR18yRF9BUlJBWTozNTg2OSxSMTFGX0cxMUZfQjEwRjozNTg5OCxVTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWOjM1ODk5LFJHQjlfRTU6MzU5MDEsVU5TSUdORURfSU5UXzVfOV85XzlfUkVWOjM1OTAyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERTozNTk2NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0NPTVBPTkVOVFM6MzU5NjgsVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTOjM1OTcxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQ6MzU5NzIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFOjM1OTczLFRSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU46MzU5NzYsUkFTVEVSSVpFUl9ESVNDQVJEOjM1OTc3LE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UUzozNTk3OCxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlM6MzU5NzksSU5URVJMRUFWRURfQVRUUklCUzozNTk4MCxTRVBBUkFURV9BVFRSSUJTOjM1OTgxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVI6MzU5ODIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HOjM1OTgzLFJHQkEzMlVJOjM2MjA4LFJHQjMyVUk6MzYyMDksUkdCQTE2VUk6MzYyMTQsUkdCMTZVSTozNjIxNSxSR0JBOFVJOjM2MjIwLFJHQjhVSTozNjIyMSxSR0JBMzJJOjM2MjI2LFJHQjMySTozNjIyNyxSR0JBMTZJOjM2MjMyLFJHQjE2STozNjIzMyxSR0JBOEk6MzYyMzgsUkdCOEk6MzYyMzksUkVEX0lOVEVHRVI6MzYyNDQsUkdCX0lOVEVHRVI6MzYyNDgsUkdCQV9JTlRFR0VSOjM2MjQ5LFNBTVBMRVJfMkRfQVJSQVk6MzYyODksU0FNUExFUl8yRF9BUlJBWV9TSEFET1c6MzYyOTIsU0FNUExFUl9DVUJFX1NIQURPVzozNjI5MyxVTlNJR05FRF9JTlRfVkVDMjozNjI5NCxVTlNJR05FRF9JTlRfVkVDMzozNjI5NSxVTlNJR05FRF9JTlRfVkVDNDozNjI5NixJTlRfU0FNUExFUl8yRDozNjI5OCxJTlRfU0FNUExFUl8zRDozNjI5OSxJTlRfU0FNUExFUl9DVUJFOjM2MzAwLElOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzAzLFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEOjM2MzA2LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzNEOjM2MzA3LFVOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkU6MzYzMDgsVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVk6MzYzMTEsREVQVEhfQ09NUE9ORU5UMzJGOjM2MDEyLERFUFRIMzJGX1NURU5DSUw4OjM2MDEzLEZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFVjozNjI2OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HOjMzMjk2LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEU6MzMyOTcsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRTozMzI5OCxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkU6MzMyOTksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkU6MzMzMDAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFOjMzMzAxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRTozMzMwMixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRTozMzMwMyxGUkFNRUJVRkZFUl9ERUZBVUxUOjMzMzA0LFVOU0lHTkVEX0lOVF8yNF84OjM0MDQyLERFUFRIMjRfU1RFTkNJTDg6MzUwNTYsVU5TSUdORURfTk9STUFMSVpFRDozNTg2MyxEUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVBRF9GUkFNRUJVRkZFUjozNjAwOCxEUkFXX0ZSQU1FQlVGRkVSOjM2MDA5LFJFQURfRlJBTUVCVUZGRVJfQklORElORzozNjAxMCxSRU5ERVJCVUZGRVJfU0FNUExFUzozNjAxMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVI6MzYwNTIsTUFYX0NPTE9SX0FUVEFDSE1FTlRTOjM2MDYzLENPTE9SX0FUVEFDSE1FTlQxOjM2MDY1LENPTE9SX0FUVEFDSE1FTlQyOjM2MDY2LENPTE9SX0FUVEFDSE1FTlQzOjM2MDY3LENPTE9SX0FUVEFDSE1FTlQ0OjM2MDY4LENPTE9SX0FUVEFDSE1FTlQ1OjM2MDY5LENPTE9SX0FUVEFDSE1FTlQ2OjM2MDcwLENPTE9SX0FUVEFDSE1FTlQ3OjM2MDcxLENPTE9SX0FUVEFDSE1FTlQ4OjM2MDcyLENPTE9SX0FUVEFDSE1FTlQ5OjM2MDczLENPTE9SX0FUVEFDSE1FTlQxMDozNjA3NCxDT0xPUl9BVFRBQ0hNRU5UMTE6MzYwNzUsQ09MT1JfQVRUQUNITUVOVDEyOjM2MDc2LENPTE9SX0FUVEFDSE1FTlQxMzozNjA3NyxDT0xPUl9BVFRBQ0hNRU5UMTQ6MzYwNzgsQ09MT1JfQVRUQUNITUVOVDE1OjM2MDc5LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEU6MzYxODIsTUFYX1NBTVBMRVM6MzYxODMsSEFMRl9GTE9BVDo1MTMxLFJHOjMzMzE5LFJHX0lOVEVHRVI6MzMzMjAsUjg6MzMzMjEsUkc4OjMzMzIzLFIxNkY6MzMzMjUsUjMyRjozMzMyNixSRzE2RjozMzMyNyxSRzMyRjozMzMyOCxSOEk6MzMzMjksUjhVSTozMzMzMCxSMTZJOjMzMzMxLFIxNlVJOjMzMzMyLFIzMkk6MzMzMzMsUjMyVUk6MzMzMzQsUkc4STozMzMzNSxSRzhVSTozMzMzNixSRzE2STozMzMzNyxSRzE2VUk6MzMzMzgsUkczMkk6MzMzMzksUkczMlVJOjMzMzQwLFZFUlRFWF9BUlJBWV9CSU5ESU5HOjM0MjI5LFI4X1NOT1JNOjM2NzU2LFJHOF9TTk9STTozNjc1NyxSR0I4X1NOT1JNOjM2NzU4LFJHQkE4X1NOT1JNOjM2NzU5LFNJR05FRF9OT1JNQUxJWkVEOjM2NzY0LENPUFlfUkVBRF9CVUZGRVI6MzY2NjIsQ09QWV9XUklURV9CVUZGRVI6MzY2NjMsQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSX0JJTkRJTkc6MzY2NjMsVU5JRk9STV9CVUZGRVI6MzUzNDUsVU5JRk9STV9CVUZGRVJfQklORElORzozNTM2OCxVTklGT1JNX0JVRkZFUl9TVEFSVDozNTM2OSxVTklGT1JNX0JVRkZFUl9TSVpFOjM1MzcwLE1BWF9WRVJURVhfVU5JRk9STV9CTE9DS1M6MzUzNzEsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTOjM1MzczLE1BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUzozNTM3NCxNQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1M6MzUzNzUsTUFYX1VOSUZPUk1fQkxPQ0tfU0laRTozNTM3NixNQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3NyxNQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1Mzc5LFVOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQ6MzUzODAsQUNUSVZFX1VOSUZPUk1fQkxPQ0tTOjM1MzgyLFVOSUZPUk1fVFlQRTozNTM4MyxVTklGT1JNX1NJWkU6MzUzODQsVU5JRk9STV9CTE9DS19JTkRFWDozNTM4NixVTklGT1JNX09GRlNFVDozNTM4NyxVTklGT1JNX0FSUkFZX1NUUklERTozNTM4OCxVTklGT1JNX01BVFJJWF9TVFJJREU6MzUzODksVU5JRk9STV9JU19ST1dfTUFKT1I6MzUzOTAsVU5JRk9STV9CTE9DS19CSU5ESU5HOjM1MzkxLFVOSUZPUk1fQkxPQ0tfREFUQV9TSVpFOjM1MzkyLFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TOjM1Mzk0LFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1fSU5ESUNFUzozNTM5NSxVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUjozNTM5NixVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSOjM1Mzk4LElOVkFMSURfSU5ERVg6NDI5NDk2NzI5NSxNQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTOjM3MTU0LE1BWF9GUkFHTUVOVF9JTlBVVF9DT01QT05FTlRTOjM3MTU3LE1BWF9TRVJWRVJfV0FJVF9USU1FT1VUOjM3MTM3LE9CSkVDVF9UWVBFOjM3MTM4LFNZTkNfQ09ORElUSU9OOjM3MTM5LFNZTkNfU1RBVFVTOjM3MTQwLFNZTkNfRkxBR1M6MzcxNDEsU1lOQ19GRU5DRTozNzE0MixTWU5DX0dQVV9DT01NQU5EU19DT01QTEVURTozNzE0MyxVTlNJR05BTEVEOjM3MTQ0LFNJR05BTEVEOjM3MTQ1LEFMUkVBRFlfU0lHTkFMRUQ6MzcxNDYsVElNRU9VVF9FWFBJUkVEOjM3MTQ3LENPTkRJVElPTl9TQVRJU0ZJRUQ6MzcxNDgsV0FJVF9GQUlMRUQ6MzcxNDksU1lOQ19GTFVTSF9DT01NQU5EU19CSVQ6MSxWRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1I6MzUwNzAsQU5ZX1NBTVBMRVNfUEFTU0VEOjM1ODg3LEFOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkU6MzYyMDIsU0FNUExFUl9CSU5ESU5HOjM1MDk3LFJHQjEwX0EyVUk6MzY5NzUsSU5UXzJfMTBfMTBfMTBfUkVWOjM2MjU1LFRSQU5TRk9STV9GRUVEQkFDSzozNjM4NixUUkFOU0ZPUk1fRkVFREJBQ0tfUEFVU0VEOjM2Mzg3LFRSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkU6MzYzODgsVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkc6MzYzODksQ09NUFJFU1NFRF9SMTFfRUFDOjM3NDg4LENPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUM6Mzc0ODksQ09NUFJFU1NFRF9SRzExX0VBQzozNzQ5MCxDT01QUkVTU0VEX1NJR05FRF9SRzExX0VBQzozNzQ5MSxDT01QUkVTU0VEX1JHQjhfRVRDMjozNzQ5MixDT01QUkVTU0VEX1NSR0I4X0VUQzI6Mzc0OTMsQ09NUFJFU1NFRF9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NCxDT01QUkVTU0VEX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NSxDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDOjM3NDk2LENPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDOjM3NDk3LFRFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVDozNzE2NyxNQVhfRUxFTUVOVF9JTkRFWDozNjIwMyxURVhUVVJFX0lNTVVUQUJMRV9MRVZFTFM6MzM1MDMsTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUOjM0MDQ3fSk7Y29uc3QgSmU9e0NMT0NLV0lTRTpnci5DVyxDT1VOVEVSX0NMT0NLV0lTRTpnci5DQ1d9O0plLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09SmUuQ0xPQ0tXSVNFfHx0PT09SmUuQ09VTlRFUl9DTE9DS1dJU0V9O3ZhciBibj1PYmplY3QuZnJlZXplKEplKTtmdW5jdGlvbiBBdCh0KXt0aGlzLl9lbGxpcHNvaWQ9bSh0LGouV0dTODQpLHRoaXMuX3NlbWltYWpvckF4aXM9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsdGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXM9MS90aGlzLl9zZW1pbWFqb3JBeGlzfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KSxBdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBSLlBJX09WRVJfVFdPLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10KSl9LEF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGU9ZnVuY3Rpb24odCl7dD5BdC5NYXhpbXVtTGF0aXR1ZGU/dD1BdC5NYXhpbXVtTGF0aXR1ZGU6dDwtQXQuTWF4aW11bUxhdGl0dWRlJiYodD0tQXQuTWF4aW11bUxhdGl0dWRlKTtjb25zdCBlPU1hdGguc2luKHQpO3JldHVybiAuNSpNYXRoLmxvZygoMStlKS8oMS1lKSl9LEF0Lk1heGltdW1MYXRpdHVkZT1BdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlKE1hdGguUEkpLEF0LnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9zZW1pbWFqb3JBeGlzLHI9dC5sb25naXR1ZGUqbixpPUF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUodC5sYXRpdHVkZSkqbixvPXQuaGVpZ2h0O3JldHVybiBwKGUpPyhlLng9cixlLnk9aSxlLno9byxlKTpuZXcgZihyLGksbyl9LEF0LnByb3RvdHlwZS51bnByb2plY3Q9ZnVuY3Rpb24odCxlKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiY2FydGVzaWFuIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxyPXQueCpuLGk9QXQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZSh0Lnkqbiksbz10Lno7cmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPXIsZS5sYXRpdHVkZT1pLGUuaGVpZ2h0PW8sZSk6bmV3IEgocixpLG8pfTtjbGFzcyBGb3thZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19Y2xhc3Mgd297Y29uc3RydWN0b3IoZSl7dGhpcy5qc2VwPWUsdGhpcy5yZWdpc3RlcmVkPXt9fXJlZ2lzdGVyKC4uLmUpe2UuZm9yRWFjaChuPT57aWYodHlwZW9mIG4hPSJvYmplY3QifHwhbi5uYW1lfHwhbi5pbml0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBKU0VQIHBsdWdpbiBmb3JtYXQiKTt0aGlzLnJlZ2lzdGVyZWRbbi5uYW1lXXx8KG4uaW5pdCh0aGlzLmpzZXApLHRoaXMucmVnaXN0ZXJlZFtuLm5hbWVdPW4pfSl9fWNsYXNzIEV7c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjEuMy44In1zdGF0aWMgdG9TdHJpbmcoKXtyZXR1cm4iSmF2YVNjcmlwdCBFeHByZXNzaW9uIFBhcnNlciAoSlNFUCkgdiIrRS52ZXJzaW9ufXN0YXRpYyBhZGRVbmFyeU9wKGUpe3JldHVybiBFLm1heF91bm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF91bm9wX2xlbiksRS51bmFyeV9vcHNbZV09MSxFfXN0YXRpYyBhZGRCaW5hcnlPcChlLG4scil7cmV0dXJuIEUubWF4X2Jpbm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF9iaW5vcF9sZW4pLEUuYmluYXJ5X29wc1tlXT1uLHI/RS5yaWdodF9hc3NvY2lhdGl2ZS5hZGQoZSk6RS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSksRX1zdGF0aWMgYWRkSWRlbnRpZmllckNoYXIoZSl7cmV0dXJuIEUuYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzLmFkZChlKSxFfXN0YXRpYyBhZGRMaXRlcmFsKGUsbil7cmV0dXJuIEUubGl0ZXJhbHNbZV09bixFfXN0YXRpYyByZW1vdmVVbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS51bmFyeV9vcHNbZV0sZS5sZW5ndGg9PT1FLm1heF91bm9wX2xlbiYmKEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSksRX1zdGF0aWMgcmVtb3ZlQWxsVW5hcnlPcHMoKXtyZXR1cm4gRS51bmFyeV9vcHM9e30sRS5tYXhfdW5vcF9sZW49MCxFfXN0YXRpYyByZW1vdmVJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4gRS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUJpbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS5iaW5hcnlfb3BzW2VdLGUubGVuZ3RoPT09RS5tYXhfYmlub3BfbGVuJiYoRS5tYXhfYmlub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUuYmluYXJ5X29wcykpLEUucmlnaHRfYXNzb2NpYXRpdmUuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUFsbEJpbmFyeU9wcygpe3JldHVybiBFLmJpbmFyeV9vcHM9e30sRS5tYXhfYmlub3BfbGVuPTAsRX1zdGF0aWMgcmVtb3ZlTGl0ZXJhbChlKXtyZXR1cm4gZGVsZXRlIEUubGl0ZXJhbHNbZV0sRX1zdGF0aWMgcmVtb3ZlQWxsTGl0ZXJhbHMoKXtyZXR1cm4gRS5saXRlcmFscz17fSxFfWdldCBjaGFyKCl7cmV0dXJuIHRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCl9Z2V0IGNvZGUoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCl9Y29uc3RydWN0b3IoZSl7dGhpcy5leHByPWUsdGhpcy5pbmRleD0wfXN0YXRpYyBwYXJzZShlKXtyZXR1cm4gbmV3IEUoZSkucGFyc2UoKX1zdGF0aWMgZ2V0TWF4S2V5TGVuKGUpe3JldHVybiBNYXRoLm1heCgwLC4uLk9iamVjdC5rZXlzKGUpLm1hcChuPT5uLmxlbmd0aCkpfXN0YXRpYyBpc0RlY2ltYWxEaWdpdChlKXtyZXR1cm4gZT49NDgmJmU8PTU3fXN0YXRpYyBiaW5hcnlQcmVjZWRlbmNlKGUpe3JldHVybiBFLmJpbmFyeV9vcHNbZV18fDB9c3RhdGljIGlzSWRlbnRpZmllclN0YXJ0KGUpe3JldHVybiBlPj02NSYmZTw9OTB8fGU+PTk3JiZlPD0xMjJ8fGU+PTEyOCYmIUUuYmluYXJ5X29wc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGUpXXx8RS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuaGFzKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfXN0YXRpYyBpc0lkZW50aWZpZXJQYXJ0KGUpe3JldHVybiBFLmlzSWRlbnRpZmllclN0YXJ0KGUpfHxFLmlzRGVjaW1hbERpZ2l0KGUpfXRocm93RXJyb3IoZSl7Y29uc3Qgbj1uZXcgRXJyb3IoZSsiIGF0IGNoYXJhY3RlciAiK3RoaXMuaW5kZXgpO3Rocm93IG4uaW5kZXg9dGhpcy5pbmRleCxuLmRlc2NyaXB0aW9uPWUsbn1ydW5Ib29rKGUsbil7aWYoRS5ob29rc1tlXSl7Y29uc3Qgcj17Y29udGV4dDp0aGlzLG5vZGU6bn07cmV0dXJuIEUuaG9va3MucnVuKGUsciksci5ub2RlfXJldHVybiBufXNlYXJjaEhvb2soZSl7aWYoRS5ob29rc1tlXSl7Y29uc3Qgbj17Y29udGV4dDp0aGlzfTtyZXR1cm4gRS5ob29rc1tlXS5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNhbGwobi5jb250ZXh0LG4pLG4ubm9kZX0pLG4ubm9kZX19Z29iYmxlU3BhY2VzKCl7bGV0IGU9dGhpcy5jb2RlO2Zvcig7ZT09PUUuU1BBQ0VfQ09ERXx8ZT09PUUuVEFCX0NPREV8fGU9PT1FLkxGX0NPREV8fGU9PT1FLkNSX0NPREU7KWU9dGhpcy5leHByLmNoYXJDb2RlQXQoKyt0aGlzLmluZGV4KTt0aGlzLnJ1bkhvb2soImdvYmJsZS1zcGFjZXMiKX1wYXJzZSgpe3RoaXMucnVuSG9vaygiYmVmb3JlLWFsbCIpO2NvbnN0IGU9dGhpcy5nb2JibGVFeHByZXNzaW9ucygpLG49ZS5sZW5ndGg9PT0xP2VbMF06e3R5cGU6RS5DT01QT1VORCxib2R5OmV9O3JldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLWFsbCIsbil9Z29iYmxlRXhwcmVzc2lvbnMoZSl7bGV0IG49W10scixpO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOylpZihyPXRoaXMuY29kZSxyPT09RS5TRU1DT0xfQ09ERXx8cj09PUUuQ09NTUFfQ09ERSl0aGlzLmluZGV4Kys7ZWxzZSBpZihpPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpKW4ucHVzaChpKTtlbHNlIGlmKHRoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCl7aWYocj09PWUpYnJlYWs7dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpfXJldHVybiBufWdvYmJsZUV4cHJlc3Npb24oKXtjb25zdCBlPXRoaXMuc2VhcmNoSG9vaygiZ29iYmxlLWV4cHJlc3Npb24iKXx8dGhpcy5nb2JibGVCaW5hcnlFeHByZXNzaW9uKCk7cmV0dXJuIHRoaXMuZ29iYmxlU3BhY2VzKCksdGhpcy5ydW5Ib29rKCJhZnRlci1leHByZXNzaW9uIixlKX1nb2JibGVCaW5hcnlPcCgpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IGU9dGhpcy5leHByLnN1YnN0cih0aGlzLmluZGV4LEUubWF4X2Jpbm9wX2xlbiksbj1lLmxlbmd0aDtmb3IoO24+MDspe2lmKEUuYmluYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShlKSYmKCFFLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrZS5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIUUuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K2UubGVuZ3RoKSkpKXJldHVybiB0aGlzLmluZGV4Kz1uLGU7ZT1lLnN1YnN0cigwLC0tbil9cmV0dXJuITF9Z29iYmxlQmluYXJ5RXhwcmVzc2lvbigpe2xldCBlLG4scixpLG8scyx1LGEsbDtpZihzPXRoaXMuZ29iYmxlVG9rZW4oKSwhc3x8KG49dGhpcy5nb2JibGVCaW5hcnlPcCgpLCFuKSlyZXR1cm4gcztmb3Iobz17dmFsdWU6bixwcmVjOkUuYmluYXJ5UHJlY2VkZW5jZShuKSxyaWdodF9hOkUucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSx1PXRoaXMuZ29iYmxlVG9rZW4oKSx1fHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24gYWZ0ZXIgIituKSxpPVtzLG8sdV07bj10aGlzLmdvYmJsZUJpbmFyeU9wKCk7KXtpZihyPUUuYmluYXJ5UHJlY2VkZW5jZShuKSxyPT09MCl7dGhpcy5pbmRleC09bi5sZW5ndGg7YnJlYWt9bz17dmFsdWU6bixwcmVjOnIscmlnaHRfYTpFLnJpZ2h0X2Fzc29jaWF0aXZlLmhhcyhuKX0sbD1uO2NvbnN0IGQ9Xz0+by5yaWdodF9hJiZfLnJpZ2h0X2E/cj5fLnByZWM6cjw9Xy5wcmVjO2Zvcig7aS5sZW5ndGg+MiYmZChpW2kubGVuZ3RoLTJdKTspdT1pLnBvcCgpLG49aS5wb3AoKS52YWx1ZSxzPWkucG9wKCksZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6bixsZWZ0OnMscmlnaHQ6dX0saS5wdXNoKGUpO2U9dGhpcy5nb2JibGVUb2tlbigpLGV8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK2wpLGkucHVzaChvLGUpfWZvcihhPWkubGVuZ3RoLTEsZT1pW2FdO2E+MTspZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6aVthLTFdLnZhbHVlLGxlZnQ6aVthLTJdLHJpZ2h0OmV9LGEtPTI7cmV0dXJuIGV9Z29iYmxlVG9rZW4oKXtsZXQgZSxuLHIsaTtpZih0aGlzLmdvYmJsZVNwYWNlcygpLGk9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtdG9rZW4iKSxpKXJldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIixpKTtpZihlPXRoaXMuY29kZSxFLmlzRGVjaW1hbERpZ2l0KGUpfHxlPT09RS5QRVJJT0RfQ09ERSlyZXR1cm4gdGhpcy5nb2JibGVOdW1lcmljTGl0ZXJhbCgpO2lmKGU9PT1FLlNRVU9URV9DT0RFfHxlPT09RS5EUVVPVEVfQ09ERSlpPXRoaXMuZ29iYmxlU3RyaW5nTGl0ZXJhbCgpO2Vsc2UgaWYoZT09PUUuT0JSQUNLX0NPREUpaT10aGlzLmdvYmJsZUFycmF5KCk7ZWxzZXtmb3Iobj10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgsRS5tYXhfdW5vcF9sZW4pLHI9bi5sZW5ndGg7cj4wOyl7aWYoRS51bmFyeV9vcHMuaGFzT3duUHJvcGVydHkobikmJighRS5pc0lkZW50aWZpZXJTdGFydCh0aGlzLmNvZGUpfHx0aGlzLmluZGV4K24ubGVuZ3RoPHRoaXMuZXhwci5sZW5ndGgmJiFFLmlzSWRlbnRpZmllclBhcnQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCtuLmxlbmd0aCkpKSl7dGhpcy5pbmRleCs9cjtjb25zdCBvPXRoaXMuZ29iYmxlVG9rZW4oKTtyZXR1cm4gb3x8dGhpcy50aHJvd0Vycm9yKCJtaXNzaW5nIHVuYXJ5T3AgYXJndW1lbnQiKSx0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIix7dHlwZTpFLlVOQVJZX0VYUCxvcGVyYXRvcjpuLGFyZ3VtZW50Om8scHJlZml4OiEwfSl9bj1uLnN1YnN0cigwLC0tcil9RS5pc0lkZW50aWZpZXJTdGFydChlKT8oaT10aGlzLmdvYmJsZUlkZW50aWZpZXIoKSxFLmxpdGVyYWxzLmhhc093blByb3BlcnR5KGkubmFtZSk/aT17dHlwZTpFLkxJVEVSQUwsdmFsdWU6RS5saXRlcmFsc1tpLm5hbWVdLHJhdzppLm5hbWV9OmkubmFtZT09PUUudGhpc19zdHImJihpPXt0eXBlOkUuVEhJU19FWFB9KSk6ZT09PUUuT1BBUkVOX0NPREUmJihpPXRoaXMuZ29iYmxlR3JvdXAoKSl9cmV0dXJuIGk/KGk9dGhpcy5nb2JibGVUb2tlblByb3BlcnR5KGkpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpKTp0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIiwhMSl9Z29iYmxlVG9rZW5Qcm9wZXJ0eShlKXt0aGlzLmdvYmJsZVNwYWNlcygpO2xldCBuPXRoaXMuY29kZTtmb3IoO249PT1FLlBFUklPRF9DT0RFfHxuPT09RS5PQlJBQ0tfQ09ERXx8bj09PUUuT1BBUkVOX0NPREV8fG49PT1FLlFVTUFSS19DT0RFOyl7bGV0IHI7aWYobj09PUUuUVVNQVJLX0NPREUpe2lmKHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrMSkhPT1FLlBFUklPRF9DT0RFKWJyZWFrO3I9ITAsdGhpcy5pbmRleCs9Mix0aGlzLmdvYmJsZVNwYWNlcygpLG49dGhpcy5jb2RlfXRoaXMuaW5kZXgrKyxuPT09RS5PQlJBQ0tfQ09ERT8oZT17dHlwZTpFLk1FTUJFUl9FWFAsY29tcHV0ZWQ6ITAsb2JqZWN0OmUscHJvcGVydHk6dGhpcy5nb2JibGVFeHByZXNzaW9uKCl9LHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PUUuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PUUuT1BBUkVOX0NPREU/ZT17dHlwZTpFLkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT1FLlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6RS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDtFLmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT1FLlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7RS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUsRS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT1FLlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PUUuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6RS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOkUuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2ZvcihFLmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLEUuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTpFLklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT1FLkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09RS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PUUuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT1FLkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT1FLkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoRS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09RS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOkUuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTpFLkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNCUkFDS19DT0RFKX19fWNvbnN0IElvPW5ldyBGbztPYmplY3QuYXNzaWduKEUse2hvb2tzOklvLHBsdWdpbnM6bmV3IHdvKEUpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiJiYiOjIsInwiOjMsIl4iOjQsIiYiOjUsIj09Ijo2LCIhPSI6NiwiPT09Ijo2LCIhPT0iOjYsIjwiOjcsIj4iOjcsIjw9Ijo3LCI+PSI6NywiPDwiOjgsIj4+Ijo4LCI+Pj4iOjgsIisiOjksIi0iOjksIioiOjEwLCIvIjoxMCwiJSI6MTB9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQsYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzOm5ldyBTZXQoWyIkIiwiXyJdKSxsaXRlcmFsczp7dHJ1ZTohMCxmYWxzZTohMSxudWxsOm51bGx9LHRoaXNfc3RyOiJ0aGlzIn0pLEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSxFLm1heF9iaW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS5iaW5hcnlfb3BzKTtjb25zdCBxdD10PT5uZXcgRSh0KS5wYXJzZSgpO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEUpLmZvckVhY2godD0+e3F0W3RdPT09dm9pZCAwJiZ0IT09InByb3RvdHlwZSImJihxdFt0XT1FW3RdKX0pLHF0LkpzZXA9RTtjb25zdCBObz0iQ29uZGl0aW9uYWxFeHByZXNzaW9uIjt2YXIgTW89e25hbWU6InRlcm5hcnkiLGluaXQodCl7dC5ob29rcy5hZGQoImFmdGVyLWV4cHJlc3Npb24iLGZ1bmN0aW9uKG4pe2lmKG4ubm9kZSYmdGhpcy5jb2RlPT09dC5RVU1BUktfQ09ERSl7dGhpcy5pbmRleCsrO2NvbnN0IHI9bi5ub2RlLGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7aWYoaXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIiksdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLmNvZGU9PT10LkNPTE9OX0NPREUpe3RoaXMuaW5kZXgrKztjb25zdCBvPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpO2lmKG98fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiIpLG4ubm9kZT17dHlwZTpObyx0ZXN0OnIsY29uc2VxdWVudDppLGFsdGVybmF0ZTpvfSxyLm9wZXJhdG9yJiZ0LmJpbmFyeV9vcHNbci5vcGVyYXRvcl08PS45KXtsZXQgcz1yO2Zvcig7cy5yaWdodC5vcGVyYXRvciYmdC5iaW5hcnlfb3BzW3MucmlnaHQub3BlcmF0b3JdPD0uOTspcz1zLnJpZ2h0O24ubm9kZS50ZXN0PXMucmlnaHQscy5yaWdodD1uLm5vZGUsbi5ub2RlPXJ9fWVsc2UgdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCA6Iil9fSl9fTtxdC5wbHVnaW5zLnJlZ2lzdGVyKE1vKTtmdW5jdGlvbiBrdCh0KXtpZih0PW0odCxtLkVNUFRZX09CSkVDVCksdGhpcy5fZWxsaXBzb2lkPW0odC5lbGxpcHNvaWQsai5XR1M4NCksdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1g9bSh0Lm51bWJlck9mTGV2ZWxaZXJvVGlsZXNYLDEpLHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNZPW0odC5udW1iZXJPZkxldmVsWmVyb1RpbGVzWSwxKSx0aGlzLl9wcm9qZWN0aW9uPW5ldyBBdCh0aGlzLl9lbGxpcHNvaWQpLHAodC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycykmJnAodC5yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycykpdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnM9dC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycyx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz10LnJlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzO2Vsc2V7Y29uc3Qgcj10aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cypNYXRoLlBJO3RoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzPW5ldyBBKC1yLC1yKSx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz1uZXcgQShyLHIpfWNvbnN0IGU9dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMpLG49dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMpO3RoaXMuX3JlY3RhbmdsZT1uZXcgSShlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLG4ubG9uZ2l0dWRlLG4ubGF0aXR1ZGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGt0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX0scmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdGFuZ2xlfX0scHJvamVjdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2plY3Rpb259fX0pLGt0LnByb3RvdHlwZS5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNYPDx0fSxrdC5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWTw8dH0sa3QucHJvdG90eXBlLnJlY3RhbmdsZVRvTmF0aXZlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9wcm9qZWN0aW9uLHI9bi5wcm9qZWN0KEkuc291dGh3ZXN0KHQpKSxpPW4ucHJvamVjdChJLm5vcnRoZWFzdCh0KSk7cmV0dXJuIHAoZSk/KGUud2VzdD1yLngsZS5zb3V0aD1yLnksZS5lYXN0PWkueCxlLm5vcnRoPWkueSxlKTpuZXcgSShyLngsci55LGkueCxpLnkpfSxrdC5wcm90b3R5cGUudGlsZVhZVG9OYXRpdmVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChuKSxvPXRoaXMuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsKG4pLHM9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLngtdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCkvaSx1PXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngrdCpzLGE9dGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCsodCsxKSpzLGw9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueSkvbyxkPXRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktZSpsLF89dGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS0oZSsxKSpsO3JldHVybiBwKHIpPyhyLndlc3Q9dSxyLnNvdXRoPV8sci5lYXN0PWEsci5ub3J0aD1kLHIpOm5ldyBJKHUsXyxhLGQpfSxrdC5wcm90b3R5cGUudGlsZVhZVG9SZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKHQsZSxuLHIpLG89dGhpcy5fcHJvamVjdGlvbixzPW8udW5wcm9qZWN0KG5ldyBBKGkud2VzdCxpLnNvdXRoKSksdT1vLnVucHJvamVjdChuZXcgQShpLmVhc3QsaS5ub3J0aCkpO3JldHVybiBpLndlc3Q9cy5sb25naXR1ZGUsaS5zb3V0aD1zLmxhdGl0dWRlLGkuZWFzdD11LmxvbmdpdHVkZSxpLm5vcnRoPXUubGF0aXR1ZGUsaX0sa3QucHJvdG90eXBlLnBvc2l0aW9uVG9UaWxlWFk9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9dGhpcy5fcmVjdGFuZ2xlO2lmKCFJLmNvbnRhaW5zKHIsdCkpcmV0dXJuO2NvbnN0IGk9dGhpcy5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWwoZSksbz10aGlzLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbChlKSx1PSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngpL2ksbD0odGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy55KS9vLF89dGhpcy5fcHJvamVjdGlvbi5wcm9qZWN0KHQpLE89Xy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngsYj10aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LV8ueTtsZXQgRj1PL3V8MDtGPj1pJiYoRj1pLTEpO2xldCBTPWIvbHwwO3JldHVybiBTPj1vJiYoUz1vLTEpLHAobik/KG4ueD1GLG4ueT1TLG4pOm5ldyBBKEYsUyl9O2Z1bmN0aW9uIGduKCl7dGhpcy5uYW1lPXZvaWQgMCx0aGlzLmRlc2NyaXB0aW9uPXZvaWQgMCx0aGlzLnBvc2l0aW9uPXZvaWQgMCx0aGlzLmRhdGE9dm9pZCAwLHRoaXMuaW1hZ2VyeUxheWVyPXZvaWQgMH1nbi5wcm90b3R5cGUuY29uZmlndXJlTmFtZUZyb21Qcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe2xldCBlPTEwLG47Zm9yKGNvbnN0IHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpJiZ0W3JdKXtjb25zdCBpPXIudG9Mb3dlckNhc2UoKTtlPjEmJmk9PT0ibmFtZSI/KGU9MSxuPXIpOmU+MiYmaT09PSJ0aXRsZSI/KGU9MixuPXIpOmU+MyYmL25hbWUvaS50ZXN0KHIpPyhlPTMsbj1yKTplPjQmJi90aXRsZS9pLnRlc3QocikmJihlPTQsbj1yKX1wKG4pJiYodGhpcy5uYW1lPXRbbl0pfSxnbi5wcm90b3R5cGUuY29uZmlndXJlRGVzY3JpcHRpb25Gcm9tUHJvcGVydGllcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe2xldCByPSc8dGFibGUgY2xhc3M9ImNlc2l1bS1pbmZvQm94LWRlZmF1bHRUYWJsZSI+Jztmb3IoY29uc3QgaSBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkoaSkpe2NvbnN0IG89bltpXTtwKG8pJiYodHlwZW9mIG89PSJvYmplY3QiP3IrPWA8dHI+PHRkPiR7aX08L3RkPjx0ZD4ke2Uobyl9PC90ZD48L3RyPmA6cis9YDx0cj48dGQ+JHtpfTwvdGQ+PHRkPiR7b308L3RkPjwvdHI+YCl9cmV0dXJuIHIrPSI8L3RhYmxlPiIscn10aGlzLmRlc2NyaXB0aW9uPWUodCl9O3ZhciBTcj1BZTtmdW5jdGlvbiBBZSh0LGUpe3RoaXMueD10LHRoaXMueT1lfUFlLnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFlKHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpfSxzdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpfSxtdWx0QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludCh0KX0sZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHQpfSxtdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQodCl9LGRpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYodCl9LHJvdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUodCl9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZUFyb3VuZCh0LGUpfSxtYXRNdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQodCl9LHVuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCl9LHBlcnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sbWFnOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55fSxkaXN0OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHQpKX0sZGlzdFNxcjpmdW5jdGlvbih0KXt2YXIgZT10LngtdGhpcy54LG49dC55LXRoaXMueTtyZXR1cm4gZSplK24qbn0sYW5nbGU6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksdGhpcy54KX0sYW5nbGVUbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnktdC55LHRoaXMueC10LngpfSxhbmdsZVdpdGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKHQueCx0LnkpfSxhbmdsZVdpdGhTZXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLngqZS10aGlzLnkqdCx0aGlzLngqdCt0aGlzLnkqZSl9LF9tYXRNdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0qdGhpcy54K3RbMV0qdGhpcy55LG49dFsyXSp0aGlzLngrdFszXSp0aGlzLnk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXN9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LF9zdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LF9tdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9LF9kaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sX211bHRCeVBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfSxfZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc30sX3VuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGl2KHRoaXMubWFnKCkpLHRoaXN9LF9wZXJwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55O3JldHVybiB0aGlzLnk9dGhpcy54LHRoaXMueD0tdCx0aGlzfSxfcm90YXRlOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCkscj1lKnRoaXMueC1uKnRoaXMueSxpPW4qdGhpcy54K2UqdGhpcy55O3JldHVybiB0aGlzLng9cix0aGlzLnk9aSx0aGlzfSxfcm90YXRlQXJvdW5kOmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5jb3ModCkscj1NYXRoLnNpbih0KSxpPWUueCtuKih0aGlzLngtZS54KS1yKih0aGlzLnktZS55KSxvPWUueStyKih0aGlzLngtZS54KStuKih0aGlzLnktZS55KTtyZXR1cm4gdGhpcy54PWksdGhpcy55PW8sdGhpc30sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfX0sQWUuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFlP3Q6QXJyYXkuaXNBcnJheSh0KT9uZXcgQWUodFswXSx0WzFdKTp0fTt2YXIgQ289U3IsbXI9VGU7ZnVuY3Rpb24gVGUodCxlLG4scixpKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9bix0aGlzLnR5cGU9MCx0aGlzLl9wYmY9dCx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPXIsdGhpcy5fdmFsdWVzPWksdC5yZWFkRmllbGRzKHZvLHRoaXMsZSl9ZnVuY3Rpb24gdm8odCxlLG4pe3Q9PTE/ZS5pZD1uLnJlYWRWYXJpbnQoKTp0PT0yP0RvKG4sZSk6dD09Mz9lLnR5cGU9bi5yZWFkVmFyaW50KCk6dD09NCYmKGUuX2dlb21ldHJ5PW4ucG9zKX1mdW5jdGlvbiBEbyh0LGUpe2Zvcih2YXIgbj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxuOyl7dmFyIHI9ZS5fa2V5c1t0LnJlYWRWYXJpbnQoKV0saT1lLl92YWx1ZXNbdC5yZWFkVmFyaW50KCldO2UucHJvcGVydGllc1tyXT1pfX1UZS50eXBlcz1bIlVua25vd24iLCJQb2ludCIsIkxpbmVTdHJpbmciLCJQb2x5Z29uIl0sVGUucHJvdG90eXBlLmxvYWRHZW9tZXRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BiZjt0LnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIGU9dC5yZWFkVmFyaW50KCkrdC5wb3Msbj0xLHI9MCxpPTAsbz0wLHM9W10sdTt0LnBvczxlOyl7aWYocjw9MCl7dmFyIGE9dC5yZWFkVmFyaW50KCk7bj1hJjcscj1hPj4zfWlmKHItLSxuPT09MXx8bj09PTIpaSs9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxuPT09MSYmKHUmJnMucHVzaCh1KSx1PVtdKSx1LnB1c2gobmV3IENvKGksbykpO2Vsc2UgaWYobj09PTcpdSYmdS5wdXNoKHVbMF0uY2xvbmUoKSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybiB1JiZzLnB1c2godSksc30sVGUucHJvdG90eXBlLmJib3g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYmY7dC5wb3M9dGhpcy5fZ2VvbWV0cnk7Zm9yKHZhciBlPXQucmVhZFZhcmludCgpK3QucG9zLG49MSxyPTAsaT0wLG89MCxzPTEvMCx1PS0xLzAsYT0xLzAsbD0tMS8wO3QucG9zPGU7KXtpZihyPD0wKXt2YXIgZD10LnJlYWRWYXJpbnQoKTtuPWQmNyxyPWQ+PjN9aWYoci0tLG49PT0xfHxuPT09MilpKz10LnJlYWRTVmFyaW50KCksbys9dC5yZWFkU1ZhcmludCgpLGk8cyYmKHM9aSksaT51JiYodT1pKSxvPGEmJihhPW8pLG8+bCYmKGw9byk7ZWxzZSBpZihuIT09Nyl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybltzLGEsdSxsXX0sVGUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5leHRlbnQqTWF0aC5wb3coMixuKSxpPXRoaXMuZXh0ZW50KnQsbz10aGlzLmV4dGVudCplLHM9dGhpcy5sb2FkR2VvbWV0cnkoKSx1PVRlLnR5cGVzW3RoaXMudHlwZV0sYSxsO2Z1bmN0aW9uIGQoYil7Zm9yKHZhciBGPTA7RjxiLmxlbmd0aDtGKyspe3ZhciBTPWJbRl0sTj0xODAtKFMueStvKSozNjAvcjtiW0ZdPVsoUy54K2kpKjM2MC9yLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoTipNYXRoLlBJLzE4MCkpLTkwXX19c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSAxOnZhciBfPVtdO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspX1thXT1zW2FdWzBdO3M9XyxkKHMpO2JyZWFrO2Nhc2UgMjpmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKWQoc1thXSk7YnJlYWs7Y2FzZSAzOmZvcihzPUxvKHMpLGE9MDthPHMubGVuZ3RoO2ErKylmb3IobD0wO2w8c1thXS5sZW5ndGg7bCsrKWQoc1thXVtsXSk7YnJlYWt9cy5sZW5ndGg9PT0xP3M9c1swXTp1PSJNdWx0aSIrdTt2YXIgTz17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6dSxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOnRoaXMucHJvcGVydGllc307cmV0dXJuImlkImluIHRoaXMmJihPLmlkPXRoaXMuaWQpLE99O2Z1bmN0aW9uIExvKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTEpcmV0dXJuW3RdO2Zvcih2YXIgbj1bXSxyLGksbz0wO288ZTtvKyspe3ZhciBzPVBvKHRbb10pO3MhPT0wJiYoaT09PXZvaWQgMCYmKGk9czwwKSxpPT09czwwPyhyJiZuLnB1c2gocikscj1bdFtvXV0pOnIucHVzaCh0W29dKSl9cmV0dXJuIHImJm4ucHVzaChyKSxufWZ1bmN0aW9uIFBvKHQpe2Zvcih2YXIgZT0wLG49MCxyPXQubGVuZ3RoLGk9ci0xLG8scztuPHI7aT1uKyspbz10W25dLHM9dFtpXSxlKz0ocy54LW8ueCkqKG8ueStzLnkpO3JldHVybiBlfXZhciBCbz1tcixVbz1GcjtmdW5jdGlvbiBGcih0LGUpe3RoaXMudmVyc2lvbj0xLHRoaXMubmFtZT1udWxsLHRoaXMuZXh0ZW50PTQwOTYsdGhpcy5sZW5ndGg9MCx0aGlzLl9wYmY9dCx0aGlzLl9rZXlzPVtdLHRoaXMuX3ZhbHVlcz1bXSx0aGlzLl9mZWF0dXJlcz1bXSx0LnJlYWRGaWVsZHMoam8sdGhpcyxlKSx0aGlzLmxlbmd0aD10aGlzLl9mZWF0dXJlcy5sZW5ndGh9ZnVuY3Rpb24gam8odCxlLG4pe3Q9PT0xNT9lLnZlcnNpb249bi5yZWFkVmFyaW50KCk6dD09PTE/ZS5uYW1lPW4ucmVhZFN0cmluZygpOnQ9PT01P2UuZXh0ZW50PW4ucmVhZFZhcmludCgpOnQ9PT0yP2UuX2ZlYXR1cmVzLnB1c2gobi5wb3MpOnQ9PT0zP2UuX2tleXMucHVzaChuLnJlYWRTdHJpbmcoKSk6dD09PTQmJmUuX3ZhbHVlcy5wdXNoKEdvKG4pKX1mdW5jdGlvbiBHbyh0KXtmb3IodmFyIGU9bnVsbCxuPXQucmVhZFZhcmludCgpK3QucG9zO3QucG9zPG47KXt2YXIgcj10LnJlYWRWYXJpbnQoKT4+MztlPXI9PT0xP3QucmVhZFN0cmluZygpOnI9PT0yP3QucmVhZEZsb2F0KCk6cj09PTM/dC5yZWFkRG91YmxlKCk6cj09PTQ/dC5yZWFkVmFyaW50NjQoKTpyPT09NT90LnJlYWRWYXJpbnQoKTpyPT09Nj90LnJlYWRTVmFyaW50KCk6cj09PTc/dC5yZWFkQm9vbGVhbigpOm51bGx9cmV0dXJuIGV9RnIucHJvdG90eXBlLmZlYXR1cmU9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLl9mZWF0dXJlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW3RdO3ZhciBlPXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IEJvKHRoaXMuX3BiZixlLHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX07dmFyICRvPVVvLFZvPXpvO2Z1bmN0aW9uIHpvKHQsZSl7dGhpcy5sYXllcnM9dC5yZWFkRmllbGRzKFdvLHt9LGUpfWZ1bmN0aW9uIFdvKHQsZSxuKXtpZih0PT09Myl7dmFyIHI9bmV3ICRvKG4sbi5yZWFkVmFyaW50KCkrbi5wb3MpO3IubGVuZ3RoJiYoZVtyLm5hbWVdPXIpfX12YXIgWG89Vm8scmU9bXIsU249e307LyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9Tbi5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8scyx1PWkqOC1yLTEsYT0oMTw8dSktMSxsPWE+PjEsZD0tNyxfPW4/aS0xOjAsTz1uPy0xOjEsYj10W2UrX107Zm9yKF8rPU8sbz1iJigxPDwtZCktMSxiPj49LWQsZCs9dTtkPjA7bz1vKjI1Nit0W2UrX10sXys9TyxkLT04KTtmb3Iocz1vJigxPDwtZCktMSxvPj49LWQsZCs9cjtkPjA7cz1zKjI1Nit0W2UrX10sXys9TyxkLT04KTtpZihvPT09MClvPTEtbDtlbHNle2lmKG89PT1hKXJldHVybiBzP05hTjooYj8tMToxKSooMS8wKTtzPXMrTWF0aC5wb3coMixyKSxvPW8tbH1yZXR1cm4oYj8tMToxKSpzKk1hdGgucG93KDIsby1yKX0sU24ud3JpdGU9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBzLHUsYSxsPW8qOC1pLTEsZD0oMTw8bCktMSxfPWQ+PjEsTz1pPT09MjM/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGI9cj8wOm8tMSxGPXI/MTotMSxTPWU8MHx8ZT09PTAmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8odT1pc05hTihlKT8xOjAscz1kKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKihhPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGEqPTIpLHMrXz49MT9lKz1PL2E6ZSs9TypNYXRoLnBvdygyLDEtXyksZSphPj0yJiYocysrLGEvPTIpLHMrXz49ZD8odT0wLHM9ZCk6cytfPj0xPyh1PShlKmEtMSkqTWF0aC5wb3coMixpKSxzPXMrXyk6KHU9ZSpNYXRoLnBvdygyLF8tMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O3RbbitiXT11JjI1NSxiKz1GLHUvPTI1NixpLT04KTtmb3Iocz1zPDxpfHUsbCs9aTtsPjA7dFtuK2JdPXMmMjU1LGIrPUYscy89MjU2LGwtPTgpO3RbbitiLUZdfD1TKjEyOH07dmFyIEhvPXosdG49U247ZnVuY3Rpb24geih0KXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcmJkFycmF5QnVmZmVyLmlzVmlldyh0KT90Om5ldyBVaW50OEFycmF5KHR8fDApLHRoaXMucG9zPTAsdGhpcy50eXBlPTAsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofXouVmFyaW50PTAsei5GaXhlZDY0PTEsei5CeXRlcz0yLHouRml4ZWQzMj01O3ZhciBtbj0oMTw8MTYpKigxPDwxNiksd3I9MS9tbixxbz0xMixJcj10eXBlb2YgVGV4dERlY29kZXI+InUiP251bGw6bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik7ei5wcm90b3R5cGU9e2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmJ1Zj1udWxsfSxyZWFkRmllbGRzOmZ1bmN0aW9uKHQsZSxuKXtmb3Iobj1ufHx0aGlzLmxlbmd0aDt0aGlzLnBvczxuOyl7dmFyIHI9dGhpcy5yZWFkVmFyaW50KCksaT1yPj4zLG89dGhpcy5wb3M7dGhpcy50eXBlPXImNyx0KGksZSx0aGlzKSx0aGlzLnBvcz09PW8mJnRoaXMuc2tpcChyKX1yZXR1cm4gZX0scmVhZE1lc3NhZ2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWFkRmllbGRzKHQsZSx0aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyl9LHJlYWRGaXhlZDMyOmZ1bmN0aW9uKCl7dmFyIHQ9ZW4odGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD1Ncih0aGlzLmJ1Zix0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9ZW4odGhpcy5idWYsdGhpcy5wb3MpK2VuKHRoaXMuYnVmLHRoaXMucG9zKzQpKm1uO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkU0ZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD1lbih0aGlzLmJ1Zix0aGlzLnBvcykrTXIodGhpcy5idWYsdGhpcy5wb3MrNCkqbW47cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRGbG9hdDpmdW5jdGlvbigpe3ZhciB0PXRuLnJlYWQodGhpcy5idWYsdGhpcy5wb3MsITAsMjMsNCk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD10bi5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDUyLDgpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYnVmLG4scjtyZXR1cm4gcj1lW3RoaXMucG9zKytdLG49ciYxMjcscjwxMjh8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8NyxyPDEyOCl8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8MTQscjwxMjgpfHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDIxLHI8MTI4KT9uOihyPWVbdGhpcy5wb3NdLG58PShyJjE1KTw8Mjgsa28obix0LHRoaXMpKX0scmVhZFZhcmludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFZhcmludCghMCl9LHJlYWRTVmFyaW50OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVmFyaW50KCk7cmV0dXJuIHQlMj09PTE/KHQrMSkvLTI6dC8yfSxyZWFkQm9vbGVhbjpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKX0scmVhZFN0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5wb3M7cmV0dXJuIHRoaXMucG9zPXQsdC1lPj1xbyYmSXI/dXModGhpcy5idWYsZSx0KTphcyh0aGlzLmJ1ZixlLHQpfSxyZWFkQnl0ZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxlPXRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGV9LHJlYWRQYWNrZWRWYXJpbnQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTt2YXIgbj1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxuOyl0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTtyZXR1cm4gdH0scmVhZFBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PXouQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gdH0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PXouQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3JldHVybiB0fSxyZWFkUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiB0fSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBlPXQmNztpZihlPT09ei5WYXJpbnQpZm9yKDt0aGlzLmJ1Zlt0aGlzLnBvcysrXT4xMjc7KTtlbHNlIGlmKGU9PT16LkJ5dGVzKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYoZT09PXouRml4ZWQzMil0aGlzLnBvcys9NDtlbHNlIGlmKGU9PT16LkZpeGVkNjQpdGhpcy5wb3MrPTg7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuaW1wbGVtZW50ZWQgdHlwZTogIitlKX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8ZSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGVuZ3RofHwxNjtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXt2YXIgbj1uZXcgVWludDhBcnJheShlKTtuLnNldCh0aGlzLmJ1ZiksdGhpcy5idWY9bix0aGlzLmxlbmd0aD1lfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc3ViYXJyYXkoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCkseGUodGhpcy5idWYsdCx0aGlzLnBvcyksdGhpcy5wb3MrPTR9LHdyaXRlU0ZpeGVkMzI6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLHhlKHRoaXMuYnVmLHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlVmFyaW50OmZ1bmN0aW9uKHQpe2lmKHQ9K3R8fDAsdD4yNjg0MzU0NTV8fHQ8MCl7WW8odCx0aGlzKTtyZXR1cm59dGhpcy5yZWFsbG9jKDQpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjcmMTI3KSkpfSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCh0PDA/LXQqMi0xOnQqMil9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KSx0aGlzLnJlYWxsb2ModC5sZW5ndGgqNCksdGhpcy5wb3MrKzt2YXIgZT10aGlzLnBvczt0aGlzLnBvcz1jcyh0aGlzLmJ1Zix0LHRoaXMucG9zKTt2YXIgbj10aGlzLnBvcy1lO24+PTEyOCYmTnIoZSxuLHRoaXMpLHRoaXMucG9zPWUtMSx0aGlzLndyaXRlVmFyaW50KG4pLHRoaXMucG9zKz1ufSx3cml0ZUZsb2F0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg0KSx0bi53cml0ZSh0aGlzLmJ1Zix0LHRoaXMucG9zLCEwLDIzLDQpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksdG4ud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCw1Miw4KSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGUpLHRoaXMucmVhbGxvYyhlKTtmb3IodmFyIG49MDtuPGU7bisrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbbl19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGUpe3RoaXMucG9zKys7dmFyIG49dGhpcy5wb3M7dChlLHRoaXMpO3ZhciByPXRoaXMucG9zLW47cj49MTI4JiZOcihuLHIsdGhpcyksdGhpcy5wb3M9bi0xLHRoaXMud3JpdGVWYXJpbnQociksdGhpcy5wb3MrPXJ9LHdyaXRlTWVzc2FnZTpmdW5jdGlvbih0LGUsbil7dGhpcy53cml0ZVRhZyh0LHouQnl0ZXMpLHRoaXMud3JpdGVSYXdNZXNzYWdlKGUsbil9LHdyaXRlUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsUW8sZSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LEpvLGUpfSx3cml0ZVBhY2tlZEJvb2xlYW46ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxucyxlKX0sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHRzLGUpfSx3cml0ZVBhY2tlZERvdWJsZTpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGVzLGUpfSx3cml0ZVBhY2tlZEZpeGVkMzI6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxycyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGlzLGUpfSx3cml0ZVBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxvcyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHNzLGUpfSx3cml0ZUJ5dGVzRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5CeXRlcyksdGhpcy53cml0ZUJ5dGVzKGUpfSx3cml0ZUZpeGVkMzJGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGUpfSx3cml0ZVNGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5GaXhlZDMyKSx0aGlzLndyaXRlU0ZpeGVkMzIoZSl9LHdyaXRlRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LHouRml4ZWQ2NCksdGhpcy53cml0ZUZpeGVkNjQoZSl9LHdyaXRlU0ZpeGVkNjRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChlKX0sd3JpdGVWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LlZhcmludCksdGhpcy53cml0ZVZhcmludChlKX0sd3JpdGVTVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5WYXJpbnQpLHRoaXMud3JpdGVTVmFyaW50KGUpfSx3cml0ZVN0cmluZ0ZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LHouQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoZSl9LHdyaXRlRmxvYXRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkMzIpLHRoaXMud3JpdGVGbG9hdChlKX0sd3JpdGVEb3VibGVGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkNjQpLHRoaXMud3JpdGVEb3VibGUoZSl9LHdyaXRlQm9vbGVhbkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVZhcmludEZpZWxkKHQsQm9vbGVhbihlKSl9fTtmdW5jdGlvbiBrbyh0LGUsbil7dmFyIHI9bi5idWYsaSxvO2lmKG89cltuLnBvcysrXSxpPShvJjExMik+PjQsbzwxMjh8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MyxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MTAsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDE3LG88MTI4KXx8KG89cltuLnBvcysrXSxpfD0obyYxMjcpPDwyNCxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMSk8PDMxLG88MTI4KSlyZXR1cm4gUmUodCxpLGUpO3Rocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMiKX1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gdC50eXBlPT09ei5CeXRlcz90LnJlYWRWYXJpbnQoKSt0LnBvczp0LnBvcysxfWZ1bmN0aW9uIFJlKHQsZSxuKXtyZXR1cm4gbj9lKjQyOTQ5NjcyOTYrKHQ+Pj4wKTooZT4+PjApKjQyOTQ5NjcyOTYrKHQ+Pj4wKX1mdW5jdGlvbiBZbyh0LGUpe3ZhciBuLHI7aWYodD49MD8obj10JTQyOTQ5NjcyOTZ8MCxyPXQvNDI5NDk2NzI5NnwwKToobj1+KC10JTQyOTQ5NjcyOTYpLHI9figtdC80Mjk0OTY3Mjk2KSxuXjQyOTQ5NjcyOTU/bj1uKzF8MDoobj0wLHI9cisxfDApKSx0Pj0xODQ0Njc0NDA3MzcwOTU1MmUzfHx0PC0xODQ0Njc0NDA3MzcwOTU1MmUzKXRocm93IG5ldyBFcnJvcigiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXMiKTtlLnJlYWxsb2MoMTApLEtvKG4scixlKSxabyhyLGUpfWZ1bmN0aW9uIEtvKHQsZSxuKXtuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zKytdPXQmMTI3fDEyOCx0Pj4+PTcsbi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zXT10JjEyN31mdW5jdGlvbiBabyh0LGUpe3ZhciBuPSh0JjcpPDw0O2UuYnVmW2UucG9zKytdfD1ufCgodD4+Pj0zKT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3KSkpKSl9ZnVuY3Rpb24gTnIodCxlLG4pe3ZhciByPWU8PTE2MzgzPzE6ZTw9MjA5NzE1MT8yOmU8PTI2ODQzNTQ1NT8zOk1hdGguZmxvb3IoTWF0aC5sb2coZSkvKE1hdGguTE4yKjcpKTtuLnJlYWxsb2Mocik7Zm9yKHZhciBpPW4ucG9zLTE7aT49dDtpLS0pbi5idWZbaStyXT1uLmJ1ZltpXX1mdW5jdGlvbiBRbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVWYXJpbnQodFtuXSl9ZnVuY3Rpb24gSm8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU1ZhcmludCh0W25dKX1mdW5jdGlvbiB0cyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGbG9hdCh0W25dKX1mdW5jdGlvbiBlcyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVEb3VibGUodFtuXSl9ZnVuY3Rpb24gbnModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlQm9vbGVhbih0W25dKX1mdW5jdGlvbiBycyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIGlzKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIG9zKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZUZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gc3ModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU0ZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gZW4odCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrdFtlKzNdKjE2Nzc3MjE2fWZ1bmN0aW9uIHhlKHQsZSxuKXt0W25dPWUsdFtuKzFdPWU+Pj44LHRbbisyXT1lPj4+MTYsdFtuKzNdPWU+Pj4yNH1mdW5jdGlvbiBNcih0LGUpe3JldHVybih0W2VdfHRbZSsxXTw8OHx0W2UrMl08PDE2KSsodFtlKzNdPDwyNCl9ZnVuY3Rpb24gYXModCxlLG4pe2Zvcih2YXIgcj0iIixpPWU7aTxuOyl7dmFyIG89dFtpXSxzPW51bGwsdT1vPjIzOT80Om8+MjIzPzM6bz4xOTE/MjoxO2lmKGkrdT5uKWJyZWFrO3ZhciBhLGwsZDt1PT09MT9vPDEyOCYmKHM9byk6dT09PTI/KGE9dFtpKzFdLChhJjE5Mik9PT0xMjgmJihzPShvJjMxKTw8NnxhJjYzLHM8PTEyNyYmKHM9bnVsbCkpKTp1PT09Mz8oYT10W2krMV0sbD10W2krMl0sKGEmMTkyKT09PTEyOCYmKGwmMTkyKT09PTEyOCYmKHM9KG8mMTUpPDwxMnwoYSY2Myk8PDZ8bCY2Mywoczw9MjA0N3x8cz49NTUyOTYmJnM8PTU3MzQzKSYmKHM9bnVsbCkpKTp1PT09NCYmKGE9dFtpKzFdLGw9dFtpKzJdLGQ9dFtpKzNdLChhJjE5Mik9PT0xMjgmJihsJjE5Mik9PT0xMjgmJihkJjE5Mik9PT0xMjgmJihzPShvJjE1KTw8MTh8KGEmNjMpPDwxMnwobCY2Myk8PDZ8ZCY2Mywoczw9NjU1MzV8fHM+PTExMTQxMTIpJiYocz1udWxsKSkpLHM9PT1udWxsPyhzPTY1NTMzLHU9MSk6cz42NTUzNSYmKHMtPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUocz4+PjEwJjEwMjN8NTUyOTYpLHM9NTYzMjB8cyYxMDIzKSxyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpLGkrPXV9cmV0dXJuIHJ9ZnVuY3Rpb24gdXModCxlLG4pe3JldHVybiBJci5kZWNvZGUodC5zdWJhcnJheShlLG4pKX1mdW5jdGlvbiBjcyh0LGUsbil7Zm9yKHZhciByPTAsaSxvO3I8ZS5sZW5ndGg7cisrKXtpZihpPWUuY2hhckNvZGVBdChyKSxpPjU1Mjk1JiZpPDU3MzQ0KWlmKG8paWYoaTw1NjMyMCl7dFtuKytdPTIzOSx0W24rK109MTkxLHRbbisrXT0xODksbz1pO2NvbnRpbnVlfWVsc2UgaT1vLTU1Mjk2PDwxMHxpLTU2MzIwfDY1NTM2LG89bnVsbDtlbHNle2k+NTYzMTl8fHIrMT09PWUubGVuZ3RoPyh0W24rK109MjM5LHRbbisrXT0xOTEsdFtuKytdPTE4OSk6bz1pO2NvbnRpbnVlfWVsc2UgbyYmKHRbbisrXT0yMzksdFtuKytdPTE5MSx0W24rK109MTg5LG89bnVsbCk7aTwxMjg/dFtuKytdPWk6KGk8MjA0OD90W24rK109aT4+NnwxOTI6KGk8NjU1MzY/dFtuKytdPWk+PjEyfDIyNDoodFtuKytdPWk+PjE4fDI0MCx0W24rK109aT4+MTImNjN8MTI4KSx0W24rK109aT4+NiY2M3wxMjgpLHRbbisrXT1pJjYzfDEyOCl9cmV0dXJuIG59dmFyIGhzPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxDcj1ocyxmcz10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGxzPUNyfHxmc3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxVdD1scyxkcz1VdC5TeW1ib2wsanQ9ZHMsdnI9T2JqZWN0LnByb3RvdHlwZSxFcz12ci5oYXNPd25Qcm9wZXJ0eSxfcz12ci50b1N0cmluZyx2ZT1qdD9qdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gcHModCl7dmFyIGU9RXMuY2FsbCh0LHZlKSxuPXRbdmVdO3RyeXt0W3ZlXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBpPV9zLmNhbGwodCk7cmV0dXJuIHImJihlP3RbdmVdPW46ZGVsZXRlIHRbdmVdKSxpfXZhciB5cz1PYmplY3QucHJvdG90eXBlLEFzPXlzLnRvU3RyaW5nO2Z1bmN0aW9uIFRzKHQpe3JldHVybiBBcy5jYWxsKHQpfXZhciBScz0iW29iamVjdCBOdWxsXSIseHM9IltvYmplY3QgVW5kZWZpbmVkXSIsRHI9anQ/anQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIE9lKHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/eHM6UnM6RHImJkRyIGluIE9iamVjdCh0KT9wcyh0KTpUcyh0KX1mdW5jdGlvbiBiZSh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBPcz0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBGbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxiZSh0KSYmT2UodCk9PU9zfWZ1bmN0aW9uIGJzKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9QXJyYXkocik7KytuPHI7KWlbbl09ZSh0W25dLG4sdCk7cmV0dXJuIGl9dmFyIGdzPUFycmF5LmlzQXJyYXksWXQ9Z3MsU3M9MS8wLExyPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsUHI9THI/THIudG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIEJyKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdDtpZihZdCh0KSlyZXR1cm4gYnModCxCcikrIiI7aWYoRm4odCkpcmV0dXJuIFByP1ByLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4gZT09IjAiJiYxL3Q9PS1Tcz8iLTAiOmV9ZnVuY3Rpb24gaWUodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihlPT0ib2JqZWN0Inx8ZT09ImZ1bmN0aW9uIil9ZnVuY3Rpb24gbXModCl7cmV0dXJuIHR9dmFyIEZzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIix3cz0iW29iamVjdCBGdW5jdGlvbl0iLElzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsTnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBVcih0KXtpZighaWUodCkpcmV0dXJuITE7dmFyIGU9T2UodCk7cmV0dXJuIGU9PXdzfHxlPT1Jc3x8ZT09RnN8fGU9PU5zfXZhciBNcz1VdFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sd249TXMsanI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKHduJiZ3bi5rZXlzJiZ3bi5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIENzKHQpe3JldHVybiEhanImJmpyIGluIHR9dmFyIHZzPUZ1bmN0aW9uLnByb3RvdHlwZSxEcz12cy50b1N0cmluZztmdW5jdGlvbiBvZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIERzLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBMcz0vW1xcXiQuKis/KClbXF17fXxdL2csUHM9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sQnM9RnVuY3Rpb24ucHJvdG90eXBlLFVzPU9iamVjdC5wcm90b3R5cGUsanM9QnMudG9TdHJpbmcsR3M9VXMuaGFzT3duUHJvcGVydHksJHM9UmVnRXhwKCJeIitqcy5jYWxsKEdzKS5yZXBsYWNlKExzLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIFZzKHQpe2lmKCFpZSh0KXx8Q3ModCkpcmV0dXJuITE7dmFyIGU9VXIodCk/JHM6UHM7cmV0dXJuIGUudGVzdChvZSh0KSl9ZnVuY3Rpb24genModCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBzZSh0LGUpe3ZhciBuPXpzKHQsZSk7cmV0dXJuIFZzKG4pP246dm9pZCAwfXZhciBXcz1zZShVdCwiV2Vha01hcCIpLEluPVdzLEdyPU9iamVjdC5jcmVhdGUsWHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighaWUoZSkpcmV0dXJue307aWYoR3IpcmV0dXJuIEdyKGUpO3QucHJvdG90eXBlPWU7dmFyIG49bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxufX0oKSxIcz1YcztmdW5jdGlvbiBxcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIGtzKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9QXJyYXkocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9dmFyIFlzPTgwMCxLcz0xNixacz1EYXRlLm5vdztmdW5jdGlvbiBRcyh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1acygpLGk9S3MtKHItbik7aWYobj1yLGk+MCl7aWYoKytlPj1ZcylyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBKcyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIHRhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXNlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpLG5uPXRhLGVhPW5uP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIG5uKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6SnMoZSksd3JpdGFibGU6ITB9KX06bXMsbmE9ZWEscmE9UXMobmEpLGlhPXJhO2Z1bmN0aW9uIG9hKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoOysrbjxyJiZlKHRbbl0sbix0KSE9PSExOyk7cmV0dXJuIHR9dmFyIHNhPTkwMDcxOTkyNTQ3NDA5OTEsYWE9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIE5uKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuIGU9ZT8/c2EsISFlJiYobj09Im51bWJlciJ8fG4hPSJzeW1ib2wiJiZhYS50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9ZnVuY3Rpb24gJHIodCxlLG4pe2U9PSJfX3Byb3RvX18iJiZubj9ubih0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gVnIodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgdWE9T2JqZWN0LnByb3RvdHlwZSxjYT11YS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBNbih0LGUsbil7dmFyIHI9dFtlXTsoIShjYS5jYWxsKHQsZSkmJlZyKHIsbikpfHxuPT09dm9pZCAwJiYhKGUgaW4gdCkpJiYkcih0LGUsbil9ZnVuY3Rpb24gcm4odCxlLG4scil7dmFyIGk9IW47bnx8KG49e30pO2Zvcih2YXIgbz0tMSxzPWUubGVuZ3RoOysrbzxzOyl7dmFyIHU9ZVtvXSxhPXI/cihuW3VdLHRbdV0sdSxuLHQpOnZvaWQgMDthPT09dm9pZCAwJiYoYT10W3VdKSxpPyRyKG4sdSxhKTpNbihuLHUsYSl9cmV0dXJuIG59dmFyIHpyPU1hdGgubWF4O2Z1bmN0aW9uIGhhKHQsZSxuKXtyZXR1cm4gZT16cihlPT09dm9pZCAwP3QubGVuZ3RoLTE6ZSwwKSxmdW5jdGlvbigpe2Zvcih2YXIgcj1hcmd1bWVudHMsaT0tMSxvPXpyKHIubGVuZ3RoLWUsMCkscz1BcnJheShvKTsrK2k8bzspc1tpXT1yW2UraV07aT0tMTtmb3IodmFyIHU9QXJyYXkoZSsxKTsrK2k8ZTspdVtpXT1yW2ldO3JldHVybiB1W2VdPW4ocykscXModCx0aGlzLHUpfX12YXIgZmE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBDbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PWZhfWZ1bmN0aW9uIFdyKHQpe3JldHVybiB0IT1udWxsJiZDbih0Lmxlbmd0aCkmJiFVcih0KX12YXIgbGE9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiB2bih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yLG49dHlwZW9mIGU9PSJmdW5jdGlvbiImJmUucHJvdG90eXBlfHxsYTtyZXR1cm4gdD09PW59ZnVuY3Rpb24gZGEodCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfXZhciBFYT0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBYcih0KXtyZXR1cm4gYmUodCkmJk9lKHQpPT1FYX12YXIgSHI9T2JqZWN0LnByb3RvdHlwZSxfYT1Ici5oYXNPd25Qcm9wZXJ0eSxwYT1Ici5wcm9wZXJ0eUlzRW51bWVyYWJsZSx5YT1YcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1hyOmZ1bmN0aW9uKHQpe3JldHVybiBiZSh0KSYmX2EuY2FsbCh0LCJjYWxsZWUiKSYmIXBhLmNhbGwodCwiY2FsbGVlIil9LERuPXlhO2Z1bmN0aW9uIEFhKCl7cmV0dXJuITF9dmFyIHFyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsa3I9cXImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxUYT1rciYma3IuZXhwb3J0cz09PXFyLFlyPVRhP1V0LkJ1ZmZlcjp2b2lkIDAsUmE9WXI/WXIuaXNCdWZmZXI6dm9pZCAwLHhhPVJhfHxBYSxLcj14YSxPYT0iW29iamVjdCBBcmd1bWVudHNdIixiYT0iW29iamVjdCBBcnJheV0iLGdhPSJbb2JqZWN0IEJvb2xlYW5dIixTYT0iW29iamVjdCBEYXRlXSIsbWE9IltvYmplY3QgRXJyb3JdIixGYT0iW29iamVjdCBGdW5jdGlvbl0iLHdhPSJbb2JqZWN0IE1hcF0iLElhPSJbb2JqZWN0IE51bWJlcl0iLE5hPSJbb2JqZWN0IE9iamVjdF0iLE1hPSJbb2JqZWN0IFJlZ0V4cF0iLENhPSJbb2JqZWN0IFNldF0iLHZhPSJbb2JqZWN0IFN0cmluZ10iLERhPSJbb2JqZWN0IFdlYWtNYXBdIixMYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLFBhPSJbb2JqZWN0IERhdGFWaWV3XSIsQmE9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsVWE9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsamE9IltvYmplY3QgSW50OEFycmF5XSIsR2E9IltvYmplY3QgSW50MTZBcnJheV0iLCRhPSJbb2JqZWN0IEludDMyQXJyYXldIixWYT0iW29iamVjdCBVaW50OEFycmF5XSIsemE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixXYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFhhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsUT17fTtRW0JhXT1RW1VhXT1RW2phXT1RW0dhXT1RWyRhXT1RW1ZhXT1RW3phXT1RW1dhXT1RW1hhXT0hMCxRW09hXT1RW2JhXT1RW0xhXT1RW2dhXT1RW1BhXT1RW1NhXT1RW21hXT1RW0ZhXT1RW3dhXT1RW0lhXT1RW05hXT1RW01hXT1RW0NhXT1RW3ZhXT1RW0RhXT0hMTtmdW5jdGlvbiBIYSh0KXtyZXR1cm4gYmUodCkmJkNuKHQubGVuZ3RoKSYmISFRW09lKHQpXX1mdW5jdGlvbiBMbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBacj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVpyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUscWE9RGUmJkRlLmV4cG9ydHM9PT1acixQbj1xYSYmQ3IucHJvY2VzcyxrYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxQbiYmUG4uYmluZGluZyYmUG4uYmluZGluZygidXRpbCIpfWNhdGNoe319KCksZ2U9a2EsUXI9Z2UmJmdlLmlzVHlwZWRBcnJheSxZYT1Rcj9MbihRcik6SGEsS2E9WWEsWmE9T2JqZWN0LnByb3RvdHlwZSxRYT1aYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBKcih0LGUpe3ZhciBuPVl0KHQpLHI9IW4mJkRuKHQpLGk9IW4mJiFyJiZLcih0KSxvPSFuJiYhciYmIWkmJkthKHQpLHM9bnx8cnx8aXx8byx1PXM/ZGEodC5sZW5ndGgsU3RyaW5nKTpbXSxhPXUubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShlfHxRYS5jYWxsKHQsbCkpJiYhKHMmJihsPT0ibGVuZ3RoInx8aSYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fG8mJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxObihsLGEpKSkmJnUucHVzaChsKTtyZXR1cm4gdX1mdW5jdGlvbiB0aSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19dmFyIEphPXRpKE9iamVjdC5rZXlzLE9iamVjdCksdHU9SmEsZXU9T2JqZWN0LnByb3RvdHlwZSxudT1ldS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBydSh0KXtpZighdm4odCkpcmV0dXJuIHR1KHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpbnUuY2FsbCh0LG4pJiZuIT0iY29uc3RydWN0b3IiJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIFdyKHQpP0pyKHQpOnJ1KHQpfWZ1bmN0aW9uIGl1KHQpe3ZhciBlPVtdO2lmKHQhPW51bGwpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9dmFyIG91PU9iamVjdC5wcm90b3R5cGUsc3U9b3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gYXUodCl7aWYoIWllKHQpKXJldHVybiBpdSh0KTt2YXIgZT12bih0KSxuPVtdO2Zvcih2YXIgciBpbiB0KXI9PSJjb25zdHJ1Y3RvciImJihlfHwhc3UuY2FsbCh0LHIpKXx8bi5wdXNoKHIpO3JldHVybiBufWZ1bmN0aW9uIFVuKHQpe3JldHVybiBXcih0KT9Kcih0LCEwKTphdSh0KX12YXIgdXU9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sY3U9L15cdyokLztmdW5jdGlvbiBodSh0LGUpe2lmKFl0KHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8Rm4odCk/ITA6Y3UudGVzdCh0KXx8IXV1LnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBmdT1zZShPYmplY3QsImNyZWF0ZSIpLExlPWZ1O2Z1bmN0aW9uIGx1KCl7dGhpcy5fX2RhdGFfXz1MZT9MZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBkdSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgRXU9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLF91PU9iamVjdC5wcm90b3R5cGUscHU9X3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24geXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihMZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PUV1P3ZvaWQgMDpufXJldHVybiBwdS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIEF1PU9iamVjdC5wcm90b3R5cGUsVHU9QXUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUnUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gTGU/ZVt0XSE9PXZvaWQgMDpUdS5jYWxsKGUsdCl9dmFyIHh1PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBPdSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09TGUmJmU9PT12b2lkIDA/eHU6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1sdSxhZS5wcm90b3R5cGUuZGVsZXRlPWR1LGFlLnByb3RvdHlwZS5nZXQ9eXUsYWUucHJvdG90eXBlLmhhcz1SdSxhZS5wcm90b3R5cGUuc2V0PU91O2Z1bmN0aW9uIGJ1KCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFZyKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIGd1PUFycmF5LnByb3RvdHlwZSxTdT1ndS5zcGxpY2U7ZnVuY3Rpb24gbXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPW9uKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpTdS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBGdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49b24oZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIHd1KHQpe3JldHVybiBvbih0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIEl1KHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPW9uKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gWHQodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19WHQucHJvdG90eXBlLmNsZWFyPWJ1LFh0LnByb3RvdHlwZS5kZWxldGU9bXUsWHQucHJvdG90eXBlLmdldD1GdSxYdC5wcm90b3R5cGUuaGFzPXd1LFh0LnByb3RvdHlwZS5zZXQ9SXU7dmFyIE51PXNlKFV0LCJNYXAiKSxQZT1OdTtmdW5jdGlvbiBNdSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoUGV8fFh0KSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiBDdSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBzbih0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIEN1KGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gdnUodCl7dmFyIGU9c24odGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBEdSh0KXtyZXR1cm4gc24odGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gTHUodCl7cmV0dXJuIHNuKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIFB1KHQsZSl7dmFyIG49c24odGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBLdCh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1LdC5wcm90b3R5cGUuY2xlYXI9TXUsS3QucHJvdG90eXBlLmRlbGV0ZT12dSxLdC5wcm90b3R5cGUuZ2V0PUR1LEt0LnByb3RvdHlwZS5oYXM9THUsS3QucHJvdG90eXBlLnNldD1QdTt2YXIgQnU9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIGpuKHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoQnUpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiBuLmNhY2hlPW5ldyhqbi5DYWNoZXx8S3QpLG59am4uQ2FjaGU9S3Q7dmFyIFV1PTUwMDtmdW5jdGlvbiBqdSh0KXt2YXIgZT1qbih0LGZ1bmN0aW9uKHIpe3JldHVybiBuLnNpemU9PT1VdSYmbi5jbGVhcigpLHJ9KSxuPWUuY2FjaGU7cmV0dXJuIGV9dmFyIEd1PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLCR1PS9cXChcXCk/L2csVnU9anUoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHQuY2hhckNvZGVBdCgwKT09PTQ2JiZlLnB1c2goIiIpLHQucmVwbGFjZShHdSxmdW5jdGlvbihuLHIsaSxvKXtlLnB1c2goaT9vLnJlcGxhY2UoJHUsIiQxIik6cnx8bil9KSxlfSksenU9VnU7ZnVuY3Rpb24gV3UodCl7cmV0dXJuIHQ9PW51bGw/IiI6QnIodCl9ZnVuY3Rpb24gYW4odCxlKXtyZXR1cm4gWXQodCk/dDpodSh0LGUpP1t0XTp6dShXdSh0KSl9dmFyIFh1PTEvMDtmdW5jdGlvbiBHbih0KXtpZih0eXBlb2YgdD09InN0cmluZyJ8fEZuKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIGU9PSIwIiYmMS90PT0tWHU/Ii0wIjplfWZ1bmN0aW9uIEh1KHQsZSl7ZT1hbihlLHQpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7dCE9bnVsbCYmbjxyOyl0PXRbR24oZVtuKytdKV07cmV0dXJuIG4mJm49PXI/dDp2b2lkIDB9ZnVuY3Rpb24gJG4odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH12YXIgZWk9anQ/anQuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMDtmdW5jdGlvbiBxdSh0KXtyZXR1cm4gWXQodCl8fERuKHQpfHwhIShlaSYmdCYmdFtlaV0pfWZ1bmN0aW9uIG5pKHQsZSxuLHIsaSl7dmFyIG89LTEscz10Lmxlbmd0aDtmb3Iobnx8KG49cXUpLGl8fChpPVtdKTsrK288czspe3ZhciB1PXRbb107ZT4wJiZuKHUpP2U+MT9uaSh1LGUtMSxuLHIsaSk6JG4oaSx1KTpyfHwoaVtpLmxlbmd0aF09dSl9cmV0dXJuIGl9ZnVuY3Rpb24ga3UodCl7dmFyIGU9dD09bnVsbD8wOnQubGVuZ3RoO3JldHVybiBlP25pKHQsMSk6W119ZnVuY3Rpb24gWXUodCl7cmV0dXJuIGlhKGhhKHQsdm9pZCAwLGt1KSx0KyIiKX12YXIgS3U9dGkoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCkscmk9S3U7ZnVuY3Rpb24gWnUoKXt0aGlzLl9fZGF0YV9fPW5ldyBYdCx0aGlzLnNpemU9MH1mdW5jdGlvbiBRdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn1mdW5jdGlvbiBKdSh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gdGModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBlYz0yMDA7ZnVuY3Rpb24gbmModCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBYdCl7dmFyIHI9bi5fX2RhdGFfXztpZighUGV8fHIubGVuZ3RoPGVjLTEpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBLdChyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9ZnVuY3Rpb24gU2UodCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgWHQodCk7dGhpcy5zaXplPWUuc2l6ZX1TZS5wcm90b3R5cGUuY2xlYXI9WnUsU2UucHJvdG90eXBlLmRlbGV0ZT1RdSxTZS5wcm90b3R5cGUuZ2V0PUp1LFNlLnByb3RvdHlwZS5oYXM9dGMsU2UucHJvdG90eXBlLnNldD1uYztmdW5jdGlvbiByYyh0LGUpe3JldHVybiB0JiZybihlLEJuKGUpLHQpfWZ1bmN0aW9uIGljKHQsZSl7cmV0dXJuIHQmJnJuKGUsVW4oZSksdCl9dmFyIGlpPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsb2k9aWkmJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxvYz1vaSYmb2kuZXhwb3J0cz09PWlpLHNpPW9jP1V0LkJ1ZmZlcjp2b2lkIDAsYWk9c2k/c2kuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uIHNjKHQsZSl7aWYoZSlyZXR1cm4gdC5zbGljZSgpO3ZhciBuPXQubGVuZ3RoLHI9YWk/YWkobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfWZ1bmN0aW9uIGFjKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtlKHMsbix0KSYmKG9baSsrXT1zKX1yZXR1cm4gb31mdW5jdGlvbiB1aSgpe3JldHVybltdfXZhciB1Yz1PYmplY3QucHJvdG90eXBlLGNjPXVjLnByb3BlcnR5SXNFbnVtZXJhYmxlLGNpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsaGM9Y2k/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLGFjKGNpKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBjYy5jYWxsKHQsZSl9KSl9OnVpLFZuPWhjO2Z1bmN0aW9uIGZjKHQsZSl7cmV0dXJuIHJuKHQsVm4odCksZSl9dmFyIGxjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsZGM9bGM/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KSRuKGUsVm4odCkpLHQ9cmkodCk7cmV0dXJuIGV9OnVpLGhpPWRjO2Z1bmN0aW9uIEVjKHQsZSl7cmV0dXJuIHJuKHQsaGkodCksZSl9ZnVuY3Rpb24gZmkodCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIFl0KHQpP3I6JG4ocixuKHQpKX1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gZmkodCxCbixWbil9ZnVuY3Rpb24gcGModCl7cmV0dXJuIGZpKHQsVW4saGkpfXZhciB5Yz1zZShVdCwiRGF0YVZpZXciKSx6bj15YyxBYz1zZShVdCwiUHJvbWlzZSIpLFduPUFjLFRjPXNlKFV0LCJTZXQiKSxYbj1UYyxsaT0iW29iamVjdCBNYXBdIixSYz0iW29iamVjdCBPYmplY3RdIixkaT0iW29iamVjdCBQcm9taXNlXSIsRWk9IltvYmplY3QgU2V0XSIsX2k9IltvYmplY3QgV2Vha01hcF0iLHBpPSJbb2JqZWN0IERhdGFWaWV3XSIseGM9b2Uoem4pLE9jPW9lKFBlKSxiYz1vZShXbiksZ2M9b2UoWG4pLFNjPW9lKEluKSx1ZT1PZTsoem4mJnVlKG5ldyB6bihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9cGl8fFBlJiZ1ZShuZXcgUGUpIT1saXx8V24mJnVlKFduLnJlc29sdmUoKSkhPWRpfHxYbiYmdWUobmV3IFhuKSE9RWl8fEluJiZ1ZShuZXcgSW4pIT1faSkmJih1ZT1mdW5jdGlvbih0KXt2YXIgZT1PZSh0KSxuPWU9PVJjP3QuY29uc3RydWN0b3I6dm9pZCAwLHI9bj9vZShuKToiIjtpZihyKXN3aXRjaChyKXtjYXNlIHhjOnJldHVybiBwaTtjYXNlIE9jOnJldHVybiBsaTtjYXNlIGJjOnJldHVybiBkaTtjYXNlIGdjOnJldHVybiBFaTtjYXNlIFNjOnJldHVybiBfaX1yZXR1cm4gZX0pO3ZhciBIbj11ZSxtYz1PYmplY3QucHJvdG90eXBlLEZjPW1jLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHdjKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmRmMuY2FsbCh0LCJpbmRleCIpJiYobi5pbmRleD10LmluZGV4LG4uaW5wdXQ9dC5pbnB1dCksbn12YXIgSWM9VXQuVWludDhBcnJheSx5aT1JYztmdW5jdGlvbiBxbih0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgeWkoZSkuc2V0KG5ldyB5aSh0KSksZX1mdW5jdGlvbiBOYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfXZhciBNYz0vXHcqJC87ZnVuY3Rpb24gQ2ModCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2UsTWMuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9dmFyIEFpPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsVGk9QWk/QWkudmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gdmModCl7cmV0dXJuIFRpP09iamVjdChUaS5jYWxsKHQpKTp7fX1mdW5jdGlvbiBEYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCl9dmFyIExjPSJbb2JqZWN0IEJvb2xlYW5dIixQYz0iW29iamVjdCBEYXRlXSIsQmM9IltvYmplY3QgTWFwXSIsVWM9IltvYmplY3QgTnVtYmVyXSIsamM9IltvYmplY3QgUmVnRXhwXSIsR2M9IltvYmplY3QgU2V0XSIsJGM9IltvYmplY3QgU3RyaW5nXSIsVmM9IltvYmplY3QgU3ltYm9sXSIsemM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixXYz0iW29iamVjdCBEYXRhVmlld10iLFhjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLEhjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHFjPSJbb2JqZWN0IEludDhBcnJheV0iLGtjPSJbb2JqZWN0IEludDE2QXJyYXldIixZYz0iW29iamVjdCBJbnQzMkFycmF5XSIsS2M9IltvYmplY3QgVWludDhBcnJheV0iLFpjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsUWM9IltvYmplY3QgVWludDE2QXJyYXldIixKYz0iW29iamVjdCBVaW50MzJBcnJheV0iO2Z1bmN0aW9uIHRoKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlIHpjOnJldHVybiBxbih0KTtjYXNlIExjOmNhc2UgUGM6cmV0dXJuIG5ldyByKCt0KTtjYXNlIFdjOnJldHVybiBOYyh0LG4pO2Nhc2UgWGM6Y2FzZSBIYzpjYXNlIHFjOmNhc2Uga2M6Y2FzZSBZYzpjYXNlIEtjOmNhc2UgWmM6Y2FzZSBRYzpjYXNlIEpjOnJldHVybiBEYyh0LG4pO2Nhc2UgQmM6cmV0dXJuIG5ldyByO2Nhc2UgVWM6Y2FzZSAkYzpyZXR1cm4gbmV3IHIodCk7Y2FzZSBqYzpyZXR1cm4gQ2ModCk7Y2FzZSBHYzpyZXR1cm4gbmV3IHI7Y2FzZSBWYzpyZXR1cm4gdmModCl9fWZ1bmN0aW9uIGVoKHQpe3JldHVybiB0eXBlb2YgdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIXZuKHQpP0hzKHJpKHQpKTp7fX12YXIgbmg9IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gcmgodCl7cmV0dXJuIGJlKHQpJiZIbih0KT09bmh9dmFyIFJpPWdlJiZnZS5pc01hcCxpaD1SaT9MbihSaSk6cmgsb2g9aWgsc2g9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gYWgodCl7cmV0dXJuIGJlKHQpJiZIbih0KT09c2h9dmFyIHhpPWdlJiZnZS5pc1NldCx1aD14aT9Mbih4aSk6YWgsY2g9dWgsaGg9MSxmaD0yLGxoPTQsT2k9IltvYmplY3QgQXJndW1lbnRzXSIsZGg9IltvYmplY3QgQXJyYXldIixFaD0iW29iamVjdCBCb29sZWFuXSIsX2g9IltvYmplY3QgRGF0ZV0iLHBoPSJbb2JqZWN0IEVycm9yXSIsYmk9IltvYmplY3QgRnVuY3Rpb25dIix5aD0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLEFoPSJbb2JqZWN0IE1hcF0iLFRoPSJbb2JqZWN0IE51bWJlcl0iLGdpPSJbb2JqZWN0IE9iamVjdF0iLFJoPSJbb2JqZWN0IFJlZ0V4cF0iLHhoPSJbb2JqZWN0IFNldF0iLE9oPSJbb2JqZWN0IFN0cmluZ10iLGJoPSJbb2JqZWN0IFN5bWJvbF0iLGdoPSJbb2JqZWN0IFdlYWtNYXBdIixTaD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLG1oPSJbb2JqZWN0IERhdGFWaWV3XSIsRmg9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsd2g9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsSWg9IltvYmplY3QgSW50OEFycmF5XSIsTmg9IltvYmplY3QgSW50MTZBcnJheV0iLE1oPSJbb2JqZWN0IEludDMyQXJyYXldIixDaD0iW29iamVjdCBVaW50OEFycmF5XSIsdmg9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixEaD0iW29iamVjdCBVaW50MTZBcnJheV0iLExoPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWj17fTtaW09pXT1aW2RoXT1aW1NoXT1aW21oXT1aW0VoXT1aW19oXT1aW0ZoXT1aW3doXT1aW0loXT1aW05oXT1aW01oXT1aW0FoXT1aW1RoXT1aW2dpXT1aW1JoXT1aW3hoXT1aW09oXT1aW2JoXT1aW0NoXT1aW3ZoXT1aW0RoXT1aW0xoXT0hMCxaW3BoXT1aW2JpXT1aW2doXT0hMTtmdW5jdGlvbiB1bih0LGUsbixyLGksbyl7dmFyIHMsdT1lJmhoLGE9ZSZmaCxsPWUmbGg7aWYobiYmKHM9aT9uKHQscixpLG8pOm4odCkpLHMhPT12b2lkIDApcmV0dXJuIHM7aWYoIWllKHQpKXJldHVybiB0O3ZhciBkPVl0KHQpO2lmKGQpe2lmKHM9d2ModCksIXUpcmV0dXJuIGtzKHQscyl9ZWxzZXt2YXIgXz1Ibih0KSxPPV89PWJpfHxfPT15aDtpZihLcih0KSlyZXR1cm4gc2ModCx1KTtpZihfPT1naXx8Xz09T2l8fE8mJiFpKXtpZihzPWF8fE8/e306ZWgodCksIXUpcmV0dXJuIGE/RWModCxpYyhzLHQpKTpmYyh0LHJjKHMsdCkpfWVsc2V7aWYoIVpbX10pcmV0dXJuIGk/dDp7fTtzPXRoKHQsXyx1KX19b3x8KG89bmV3IFNlKTt2YXIgYj1vLmdldCh0KTtpZihiKXJldHVybiBiO28uc2V0KHQscyksY2godCk/dC5mb3JFYWNoKGZ1bmN0aW9uKE4pe3MuYWRkKHVuKE4sZSxuLE4sdCxvKSl9KTpvaCh0KSYmdC5mb3JFYWNoKGZ1bmN0aW9uKE4sZyl7cy5zZXQoZyx1bihOLGUsbixnLHQsbykpfSk7dmFyIEY9bD9hP3BjOl9jOmE/VW46Qm4sUz1kP3ZvaWQgMDpGKHQpO3JldHVybiBvYShTfHx0LGZ1bmN0aW9uKE4sZyl7UyYmKGc9TixOPXRbZ10pLE1uKHMsZyx1bihOLGUsbixnLHQsbykpfSksc312YXIgUGg9MSxCaD00O2Z1bmN0aW9uIFVoKHQpe3JldHVybiB1bih0LFBofEJoKX1mdW5jdGlvbiBqaCh0LGUpe3JldHVybiB0IT1udWxsJiZlIGluIE9iamVjdCh0KX1mdW5jdGlvbiBHaCh0LGUsbil7ZT1hbihlLHQpO2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89ITE7KytyPGk7KXt2YXIgcz1HbihlW3JdKTtpZighKG89dCE9bnVsbCYmbih0LHMpKSlicmVhazt0PXRbc119cmV0dXJuIG98fCsrciE9aT9vOihpPXQ9PW51bGw/MDp0Lmxlbmd0aCwhIWkmJkNuKGkpJiZObihzLGkpJiYoWXQodCl8fERuKHQpKSl9ZnVuY3Rpb24gJGgodCxlKXtyZXR1cm4gdCE9bnVsbCYmR2godCxlLGpoKX1mdW5jdGlvbiBWaCh0LGUsbixyKXtpZighaWUodCkpcmV0dXJuIHQ7ZT1hbihlLHQpO2Zvcih2YXIgaT0tMSxvPWUubGVuZ3RoLHM9by0xLHU9dDt1IT1udWxsJiYrK2k8bzspe3ZhciBhPUduKGVbaV0pLGw9bjtpZihhPT09Il9fcHJvdG9fXyJ8fGE9PT0iY29uc3RydWN0b3IifHxhPT09InByb3RvdHlwZSIpcmV0dXJuIHQ7aWYoaSE9cyl7dmFyIGQ9dVthXTtsPXI/cihkLGEsdSk6dm9pZCAwLGw9PT12b2lkIDAmJihsPWllKGQpP2Q6Tm4oZVtpKzFdKT9bXTp7fSl9TW4odSxhLGwpLHU9dVthXX1yZXR1cm4gdH1mdW5jdGlvbiB6aCh0LGUsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBzPWVbcl0sdT1IdSh0LHMpO24odSxzKSYmVmgobyxhbihzLHQpLHUpfXJldHVybiBvfWZ1bmN0aW9uIFdoKHQsZSl7cmV0dXJuIHpoKHQsZSxmdW5jdGlvbihuLHIpe3JldHVybiAkaCh0LHIpfSl9dmFyIFhoPVl1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306V2godCxlKX0pLEhoPVhoO2Z1bmN0aW9uIHFoKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KX1mdW5jdGlvbiBkdCh0LGUpe3JldHVybiB0Pz9lfWNvbnN0IGtoPXQ9PntsZXQgZT0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXQuY2hhckNvZGVBdChuKTtlPShlPDw1KS1lK3IsZSY9ZX1yZXR1cm4gZS50b1N0cmluZygxNil9LFloPXFoKHttYXJrZXI6MSxwb2x5bGluZToxLHBvbHlnb246MSxlbGxpcHNvaWQ6MSxlbGxpcHNlOjEsbW9kZWw6MSwiM2R0aWxlcyI6MSxib3g6MSxwaG90b292ZXJsYXk6MSxyZXNvdXJjZToxLHJhc3RlcjoxLGhlYXRNYXA6MSxmcnVzdHVtOjEsdHJhbnNpdGlvbjoxfSk7dmFyIE09KHQ9Pih0W3QuVkFSSUFCTEU9MF09IlZBUklBQkxFIix0W3QuVU5BUlk9MV09IlVOQVJZIix0W3QuQklOQVJZPTJdPSJCSU5BUlkiLHRbdC5URVJOQVJZPTNdPSJURVJOQVJZIix0W3QuQ09ORElUSU9OQUw9NF09IkNPTkRJVElPTkFMIix0W3QuTUVNQkVSPTVdPSJNRU1CRVIiLHRbdC5GVU5DVElPTl9DQUxMPTZdPSJGVU5DVElPTl9DQUxMIix0W3QuQVJSQVk9N109IkFSUkFZIix0W3QuUkVHRVg9OF09IlJFR0VYIix0W3QuVkFSSUFCTEVfSU5fU1RSSU5HPTldPSJWQVJJQUJMRV9JTl9TVFJJTkciLHRbdC5MSVRFUkFMX05VTEw9MTBdPSJMSVRFUkFMX05VTEwiLHRbdC5MSVRFUkFMX0JPT0xFQU49MTFdPSJMSVRFUkFMX0JPT0xFQU4iLHRbdC5MSVRFUkFMX05VTUJFUj0xMl09IkxJVEVSQUxfTlVNQkVSIix0W3QuTElURVJBTF9TVFJJTkc9MTNdPSJMSVRFUkFMX1NUUklORyIsdFt0LkxJVEVSQUxfQ09MT1I9MTRdPSJMSVRFUkFMX0NPTE9SIix0W3QuTElURVJBTF9WRUNUT1I9MTVdPSJMSVRFUkFMX1ZFQ1RPUiIsdFt0LkxJVEVSQUxfUkVHRVg9MTZdPSJMSVRFUkFMX1JFR0VYIix0W3QuTElURVJBTF9VTkRFRklORUQ9MTddPSJMSVRFUkFMX1VOREVGSU5FRCIsdFt0LkJVSUxUSU5fVkFSSUFCTEU9MThdPSJCVUlMVElOX1ZBUklBQkxFIix0KSkoTXx8e30pO2NvbnN0IEtoPVsiISIsIi0iLCIrIl0sWmg9WyIrIiwiLSIsIioiLCIvIiwiJSIsIj09PSIsIiE9PSIsIj4iLCI+PSIsIjwiLCI8PSIsIiYmIiwifHwiLCIhfiIsIj1+IiwiPT0iLCIhPSJdLFFoPS9cXC9nLEpoPSJAIyUiLHRmPS9AIyUvZyxlZj0vXiMoWzAtOWEtZl0pKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pPyQvaSxuZj0vXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPyQvaSxTaT17QUxJQ0VCTFVFOiIjRjBGOEZGIixBTlRJUVVFV0hJVEU6IiNGQUVCRDciLEFRVUE6IiMwMEZGRkYiLEFRVUFNQVJJTkU6IiM3RkZGRDQiLEFaVVJFOiIjRjBGRkZGIixCRUlHRToiI0Y1RjVEQyIsQklTUVVFOiIjRkZFNEM0IixCTEFDSzoiIzAwMDAwMCIsQkxBTkNIRURBTE1PTkQ6IiNGRkVCQ0QiLEJMVUU6IiMwMDAwRkYiLEJMVUVWSU9MRVQ6IiM4QTJCRTIiLEJST1dOOiIjQTUyQTJBIixCVVJMWVdPT0Q6IiNERUI4ODciLENBREVUQkxVRToiIzVGOUVBMCIsQ0hBUlRSRVVTRToiIzdGRkYwMCIsQ0hPQ09MQVRFOiIjRDI2OTFFIixDT1JBTDoiI0ZGN0Y1MCIsQ09STkZMT1dFUkJMVUU6IiM2NDk1RUQiLENPUk5TSUxLOiIjRkZGOERDIixDUklNU09OOiIjREMxNDNDIixDWUFOOiIjMDBGRkZGIixEQVJLQkxVRToiIzAwMDA4QiIsREFSS0NZQU46IiMwMDhCOEIiLERBUktHT0xERU5ST0Q6IiNCODg2MEIiLERBUktHUkFZOiIjQTlBOUE5IixEQVJLR1JFRU46IiMwMDY0MDAiLERBUktHUkVZOiIjQTlBOUE5IixEQVJLS0hBS0k6IiNCREI3NkIiLERBUktNQUdFTlRBOiIjOEIwMDhCIixEQVJLT0xJVkVHUkVFTjoiIzU1NkIyRiIsREFSS09SQU5HRToiI0ZGOEMwMCIsREFSS09SQ0hJRDoiIzk5MzJDQyIsREFSS1JFRDoiIzhCMDAwMCIsREFSS1NBTE1PTjoiI0U5OTY3QSIsREFSS1NFQUdSRUVOOiIjOEZCQzhGIixEQVJLU0xBVEVCTFVFOiIjNDgzRDhCIixEQVJLU0xBVEVHUkFZOiIjMkY0RjRGIixEQVJLU0xBVEVHUkVZOiIjMkY0RjRGIixEQVJLVFVSUVVPSVNFOiIjMDBDRUQxIixEQVJLVklPTEVUOiIjOTQwMEQzIixERUVQUElOSzoiI0ZGMTQ5MyIsREVFUFNLWUJMVUU6IiMwMEJGRkYiLERJTUdSQVk6IiM2OTY5NjkiLERJTUdSRVk6IiM2OTY5NjkiLERPREdFUkJMVUU6IiMxRTkwRkYiLEZJUkVCUklDSzoiI0IyMjIyMiIsRkxPUkFMV0hJVEU6IiNGRkZBRjAiLEZPUkVTVEdSRUVOOiIjMjI4QjIyIixGVUNIU0lBOiIjRkYwMEZGIixHQUlOU0JPUk86IiNEQ0RDREMiLEdIT1NUV0hJVEU6IiNGOEY4RkYiLEdPTEQ6IiNGRkQ3MDAiLEdPTERFTlJPRDoiI0RBQTUyMCIsR1JBWToiIzgwODA4MCIsR1JFRU46IiMwMDgwMDAiLEdSRUVOWUVMTE9XOiIjQURGRjJGIixHUkVZOiIjODA4MDgwIixIT05FWURFVzoiI0YwRkZGMCIsSE9UUElOSzoiI0ZGNjlCNCIsSU5ESUFOUkVEOiIjQ0Q1QzVDIixJTkRJR086IiM0QjAwODIiLElWT1JZOiIjRkZGRkYwIixLSEFLSToiI0YwRTY4QyIsTEFWRU5ERVI6IiNFNkU2RkEiLExBVkVOREFSX0JMVVNIOiIjRkZGMEY1IixMQVdOR1JFRU46IiM3Q0ZDMDAiLExFTU9OQ0hJRkZPTjoiI0ZGRkFDRCIsTElHSFRCTFVFOiIjQUREOEU2IixMSUdIVENPUkFMOiIjRjA4MDgwIixMSUdIVENZQU46IiNFMEZGRkYiLExJR0hUR09MREVOUk9EWUVMTE9XOiIjRkFGQUQyIixMSUdIVEdSQVk6IiNEM0QzRDMiLExJR0hUR1JFRU46IiM5MEVFOTAiLExJR0hUR1JFWToiI0QzRDNEMyIsTElHSFRQSU5LOiIjRkZCNkMxIixMSUdIVFNFQUdSRUVOOiIjMjBCMkFBIixMSUdIVFNLWUJMVUU6IiM4N0NFRkEiLExJR0hUU0xBVEVHUkFZOiIjNzc4ODk5IixMSUdIVFNMQVRFR1JFWToiIzc3ODg5OSIsTElHSFRTVEVFTEJMVUU6IiNCMEM0REUiLExJR0hUWUVMTE9XOiIjRkZGRkUwIixMSU1FOiIjMDBGRjAwIixMSU1FR1JFRU46IiMzMkNEMzIiLExJTkVOOiIjRkFGMEU2IixNQUdFTlRBOiIjRkYwMEZGIixNQVJPT046IiM4MDAwMDAiLE1FRElVTUFRVUFNQVJJTkU6IiM2NkNEQUEiLE1FRElVTUJMVUU6IiMwMDAwQ0QiLE1FRElVTU9SQ0hJRDoiI0JBNTVEMyIsTUVESVVNUFVSUExFOiIjOTM3MERCIixNRURJVU1TRUFHUkVFTjoiIzNDQjM3MSIsTUVESVVNU0xBVEVCTFVFOiIjN0I2OEVFIixNRURJVU1TUFJJTkdHUkVFTjoiIzAwRkE5QSIsTUVESVVNVFVSUVVPSVNFOiIjNDhEMUNDIixNRURJVU1WSU9MRVRSRUQ6IiNDNzE1ODUiLE1JRE5JR0hUQkxVRToiIzE5MTk3MCIsTUlOVENSRUFNOiIjRjVGRkZBIixNSVNUWVJPU0U6IiNGRkU0RTEiLE1PQ0NBU0lOOiIjRkZFNEI1IixOQVZBSk9XSElURToiI0ZGREVBRCIsTkFWWToiIzAwMDA4MCIsT0xETEFDRToiI0ZERjVFNiIsT0xJVkU6IiM4MDgwMDAiLE9MSVZFRFJBQjoiIzZCOEUyMyIsT1JBTkdFOiIjRkZBNTAwIixPUkFOR0VSRUQ6IiNGRjQ1MDAiLE9SQ0hJRDoiI0RBNzBENiIsUEFMRUdPTERFTlJPRDoiI0VFRThBQSIsUEFMRUdSRUVOOiIjOThGQjk4IixQQUxFVFVSUVVPSVNFOiIjQUZFRUVFIixQQUxFVklPTEVUUkVEOiIjREI3MDkzIixQQVBBWUFXSElQOiIjRkZFRkQ1IixQRUFDSFBVRkY6IiNGRkRBQjkiLFBFUlU6IiNDRDg1M0YiLFBJTks6IiNGRkMwQ0IiLFBMVU06IiNEREEwREQiLFBPV0RFUkJMVUU6IiNCMEUwRTYiLFBVUlBMRToiIzgwMDA4MCIsUkVEOiIjRkYwMDAwIixST1NZQlJPV046IiNCQzhGOEYiLFJPWUFMQkxVRToiIzQxNjlFMSIsU0FERExFQlJPV046IiM4QjQ1MTMiLFNBTE1PTjoiI0ZBODA3MiIsU0FORFlCUk9XTjoiI0Y0QTQ2MCIsU0VBR1JFRU46IiMyRThCNTciLFNFQVNIRUxMOiIjRkZGNUVFIixTSUVOTkE6IiNBMDUyMkQiLFNJTFZFUjoiI0MwQzBDMCIsU0tZQkxVRToiIzg3Q0VFQiIsU0xBVEVCTFVFOiIjNkE1QUNEIixTTEFURUdSQVk6IiM3MDgwOTAiLFNMQVRFR1JFWToiIzcwODA5MCIsU05PVzoiI0ZGRkFGQSIsU1BSSU5HR1JFRU46IiMwMEZGN0YiLFNURUVMQkxVRToiIzQ2ODJCNCIsVEFOOiIjRDJCNDhDIixURUFMOiIjMDA4MDgwIixUSElTVExFOiIjRDhCRkQ4IixUT01BVE86IiNGRjYzNDciLFRVUlFVT0lTRToiIzQwRTBEMCIsVklPTEVUOiIjRUU4MkVFIixXSEVBVDoiI0Y1REVCMyIsV0hJVEU6IiNGRkZGRkYiLFdISVRFU01PS0U6IiNGNUY1RjUiLFlFTExPVzoiI0ZGRkYwMCIsWUVMTE9XR1JFRU46IiM5QUNEMzIifTtmdW5jdGlvbiByZih0KXtjb25zdCBlPWtuW3RdO3JldHVybiBmdW5jdGlvbihuKXtjb25zdCByPXRoaXMuX2xlZnQuZXZhbHVhdGUobiksaT10aGlzLl9yaWdodC5ldmFsdWF0ZShuKTtyZXR1cm4gZSh0LHIsaSl9fWNvbnN0IGtuPXthdGFuMjpCZShNYXRoLmF0YW4yLCExKSxwb3c6QmUoTWF0aC5wb3csITEpLG1pbjpCZShNYXRoLm1pbiwhMCksbWF4OkJlKE1hdGgubWF4LCEwKSxzdGFydHNXaXRoOkJlKG9mLCExKX07ZnVuY3Rpb24gQmUodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe2lmKGUmJnR5cGVvZiBpPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIifHx0eXBlb2Ygcj09Im51bWJlciImJnR5cGVvZiBpPT0ibnVtYmVyInx8dHlwZW9mIHI9PSJzdHJpbmciJiZ0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHQocixpKTt0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uICIke259IiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcy4gQXJndW1lbnRzIGFyZSAke3J9IGFuZCAke2l9LmApfX1mdW5jdGlvbiBvZih0LGUpe3JldHVybiB0LnN0YXJ0c1dpdGgoZSl9ZnVuY3Rpb24gc2YodCl7Y29uc3QgZT1Zblt0XTtyZXR1cm4gZnVuY3Rpb24obil7Y29uc3Qgcj10aGlzLl9sZWZ0LmV2YWx1YXRlKG4pO3JldHVybiBlKHQscil9fWNvbnN0IFluPXthYnM6Y3QoTWF0aC5hYnMpLHNxcnQ6Y3QoTWF0aC5zcXJ0KSxjb3M6Y3QoTWF0aC5jb3MpLHNpbjpjdChNYXRoLnNpbiksdGFuOmN0KE1hdGgudGFuKSxhY29zOmN0KE1hdGguYWNvcyksYXNpbjpjdChNYXRoLmFzaW4pLGF0YW46Y3QoTWF0aC5hdGFuKSxyYWRpYW5zOmN0KFIudG9SYWRpYW5zKSxkZWdyZWVzOmN0KFIudG9EZWdyZWVzKSxzaWduOmN0KFIuc2lnbiksZmxvb3I6Y3QoTWF0aC5mbG9vciksY2VpbDpjdChNYXRoLmNlaWwpLHJvdW5kOmN0KE1hdGgucm91bmQpLGV4cDI6Y3QodWYpLGxvZzpjdChNYXRoLmxvZyksbG9nMjpjdChjZiksZnJhY3Q6Y3QoYWYpfTtmdW5jdGlvbiBjdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuIHQobik7dGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiAiJHtlfSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfX1mdW5jdGlvbiBhZih0KXtyZXR1cm4gdC1NYXRoLmZsb29yKHQpfWZ1bmN0aW9uIHVmKHQpe3JldHVybiBNYXRoLnBvdygyLHQpfWZ1bmN0aW9uIGNmKHQpe3JldHVybiBSLmxvZzIodCl9Y29uc3QgaGY9L15yZ2JhP1woXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPykoPzpccyosXHMqKFswLTkuXSspKT9ccypcKSQvaSxmZj0vXmhzbGE/XChccyooWzAtOS5dKylccyosXHMqKFswLTkuXSslKVxzKixccyooWzAtOS5dKyUpKD86XHMqLFxzKihbMC05Ll0rKSk/XHMqXCkkL2k7Y2xhc3MgSntjb25zdHJ1Y3RvcihlLG4scixpKXt2KHRoaXMsInJlZCIpO3YodGhpcywiZ3JlZW4iKTt2KHRoaXMsImJsdWUiKTt2KHRoaXMsImFscGhhIik7dGhpcy5yZWQ9ZHQoZSwxKSx0aGlzLmdyZWVuPWR0KG4sMSksdGhpcy5ibHVlPWR0KHIsMSksdGhpcy5hbHBoYT1kdChpLDEpfXN0YXRpYyBieXRlVG9GbG9hdChlKXtyZXR1cm4gZS8yNTV9c3RhdGljIGZsb2F0VG9CeXRlKGUpe3JldHVybiBlPT09MT8yNTU6ZSoyNTZ8MH1zdGF0aWMgZnJvbUNzc0NvbG9yU3RyaW5nKGUpe2U9ZS5yZXBsYWNlKC9ccy9nLCIiKTtjb25zdCBuPWxmKGUpO2lmKHR5cGVvZiBuPCJ1IilyZXR1cm4gbjtsZXQgcj1lZi5leGVjKGUpO2lmKHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8xNSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzE1LGkuYmx1ZT1wYXJzZUludChyWzNdLDE2KS8xNSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImYiKSwxNikvMTUsaX1pZihyPW5mLmV4ZWMoZSksciE9PW51bGwpe2NvbnN0IGk9bmV3IEo7cmV0dXJuIGkucmVkPXBhcnNlSW50KHJbMV0sMTYpLzI1NSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzI1NSxpLmJsdWU9cGFyc2VJbnQoclszXSwxNikvMjU1LGkuYWxwaGE9cGFyc2VJbnQoZHQocls0XSwiZmYiKSwxNikvMjU1LGl9aWYocj1oZi5leGVjKGUpLHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUZsb2F0KHJbMV0pLyhyWzFdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ncmVlbj1wYXJzZUZsb2F0KHJbMl0pLyhyWzJdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ibHVlPXBhcnNlRmxvYXQoclszXSkvKHJbM10uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmFscGhhPXBhcnNlRmxvYXQoZHQocls0XSwiMS4wIikpLGl9aWYocj1mZi5leGVjKGUpLHIhPT1udWxsKXJldHVybiBKLmZyb21Ic2wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAscGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSkpfXN0YXRpYyBmcm9tSHNsKGUsbixyLGkpe2lmKGU9ZHQoZSwwKSUxLG49ZHQobiwwKSxyPWR0KHIsMCksaT1kdChpLDEpLGUmJm4mJnImJmkpe2xldCBvPXIscz1yLHU9cjtjb25zdCBhPW5ldyBKO2lmKG4hPT0wKXtsZXQgbDtyPC41P2w9ciooMStuKTpsPXIrbi1yKm47Y29uc3QgZD0yKnItbDtvPUtuKGQsbCxlKzEvMykscz1LbihkLGwsZSksdT1LbihkLGwsZS0xLzMpfXJldHVybiB0eXBlb2YgYT4idSI/bmV3IEoobyxzLHUsaSk6KGEucmVkPW8sYS5ncmVlbj1zLGEuYmx1ZT11LGEuYWxwaGE9aSxhKX19dG9Dc3NIZXhTdHJpbmcoKXtsZXQgZT1KLmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7ZS5sZW5ndGg8MiYmKGU9YDAke2V9YCk7bGV0IG49Si5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKS50b1N0cmluZygxNik7bi5sZW5ndGg8MiYmKG49YDAke259YCk7bGV0IHI9Si5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLnRvU3RyaW5nKDE2KTtpZihyLmxlbmd0aDwyJiYocj1gMCR7cn1gKSx0aGlzLmFscGhhPDEpe2xldCBpPUouZmxvYXRUb0J5dGUodGhpcy5hbHBoYSkudG9TdHJpbmcoMTYpO3JldHVybiBpLmxlbmd0aDwyJiYoaT1gMCR7aX1gKSxgIyR7ZX0ke259JHtyfSR7aX1gfXJldHVybmAjJHtlfSR7bn0ke3J9YC50b1VwcGVyQ2FzZSgpfXN0YXRpYyBmcm9tQnl0ZXMoZSxuLHIsaSl7cmV0dXJuIGU9dGhpcy5ieXRlVG9GbG9hdChkdChlLDI1NSkpLG49Si5ieXRlVG9GbG9hdChkdChuLDI1NSkpLHI9Si5ieXRlVG9GbG9hdChkdChyLDI1NSkpLGk9Si5ieXRlVG9GbG9hdChkdChpLDI1NSkpLG5ldyBKKGUsbixyLGkpfX1mdW5jdGlvbiBsZih0KXtpZih0PXQudG9VcHBlckNhc2UoKSxTaVt0XSlyZXR1cm4gSi5mcm9tQ3NzQ29sb3JTdHJpbmcoU2lbdF0pO3N3aXRjaCh0KXtjYXNlIlRSQU5TUEFSRU5UIjpyZXR1cm4gbmV3IEooMCwwLDAsMCk7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIEtuKHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbio2PDE/dCsoZS10KSo2Km46bioyPDE/ZTpuKjM8Mj90KyhlLXQpKigyLzMtbikqNjp0fWNsYXNzIFB7Y29uc3RydWN0b3IoZSxuLHIsaSxvKXt2KHRoaXMsIl90eXBlIik7dih0aGlzLCJfdmFsdWUiKTt2KHRoaXMsIl9sZWZ0Iik7dih0aGlzLCJfcmlnaHQiKTt2KHRoaXMsIl90ZXN0Iik7dih0aGlzLCJldmFsdWF0ZSIpO3RoaXMuX3R5cGU9ZSx0aGlzLl92YWx1ZT1uLHRoaXMuX2xlZnQ9cix0aGlzLl9yaWdodD1pLHRoaXMuX3Rlc3Q9byx0aGlzLnNldEV2YWx1YXRlRnVuY3Rpb24oKX1zZXRFdmFsdWF0ZUZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLl90eXBlLG49dGhpcy5fdmFsdWU7c3dpdGNoKGUpe2Nhc2UgTS5DT05ESVRJT05BTDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uYWw7YnJlYWs7Y2FzZSBNLkZVTkNUSU9OX0NBTEw6c3dpdGNoKG4pe2Nhc2UidG9TdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVUb1N0cmluZzticmVha31icmVhaztjYXNlIE0uVU5BUlk6c3dpdGNoKG4pe2Nhc2UiISI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdDticmVhaztjYXNlIi0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOZWdhdGl2ZTticmVhaztjYXNlIisiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVQb3NpdGl2ZTticmVhaztjYXNlImlzTmFOIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTmFOO2JyZWFrO2Nhc2UiaXNGaW5pdGUiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVJc0Zpbml0ZTticmVhaztjYXNlIkJvb2xlYW4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVCb29sZWFuQ29udmVyc2lvbjticmVhaztjYXNlIk51bWJlciI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb247YnJlYWs7Y2FzZSJTdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVTdHJpbmdDb252ZXJzaW9uO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIFluW25dPCJ1IiYmKHRoaXMuZXZhbHVhdGU9c2YobikpO2JyZWFrfWJyZWFrO2Nhc2UgTS5CSU5BUlk6c3dpdGNoKG4pe2Nhc2UiKyI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZVBsdXM7YnJlYWs7Y2FzZSItIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWludXM7YnJlYWs7Y2FzZSIqIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVGltZXM7YnJlYWs7Y2FzZSIvIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRGl2aWRlO2JyZWFrO2Nhc2UiJSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1vZDticmVhaztjYXNlIj09PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUVxdWFsc1N0cmljdDticmVhaztjYXNlIiE9PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdEVxdWFsc1N0cmljdDticmVhaztjYXNlIjwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVMZXNzVGhhbjticmVhaztjYXNlIjw9Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGVzc1RoYW5PckVxdWFsczticmVhaztjYXNlIj4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVHcmVhdGVyVGhhbjticmVhaztjYXNlIj49Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlR3JlYXRlclRoYW5PckVxdWFsczticmVhaztjYXNlIiYmIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQW5kO2JyZWFrO2Nhc2UifHwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVPcjticmVhaztjYXNlIj09Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRXF1YWxzO2JyZWFrO2Nhc2UiIT0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOb3RFcXVhbHM7YnJlYWs7ZGVmYXVsdDp0eXBlb2Yga25bbl08InUiJiYodGhpcy5ldmFsdWF0ZT1yZihuKSk7YnJlYWt9YnJlYWs7Y2FzZSBNLk1FTUJFUjpuPT09ImJyYWNrZXRzIj90aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWVtYmVyQnJhY2tldHM6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1lbWJlckRvdDticmVhaztjYXNlIE0uQVJSQVk6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUFycmF5O2JyZWFrO2Nhc2UgTS5WQVJJQUJMRTp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGU7YnJlYWs7Y2FzZSBNLlZBUklBQkxFX0lOX1NUUklORzp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGVTdHJpbmc7YnJlYWs7Y2FzZSBNLkxJVEVSQUxfQ09MT1I6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxDb2xvcjticmVhaztjYXNlIE0uTElURVJBTF9TVFJJTkc6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxTdHJpbmc7YnJlYWs7ZGVmYXVsdDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGl0ZXJhbDticmVha319X2V2YWx1YXRlTGl0ZXJhbCgpe3JldHVybiB0aGlzLl92YWx1ZX1fZXZhbHVhdGVMaXRlcmFsU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfV9ldmFsdWF0ZVZhcmlhYmxlU3RyaW5nKGUpe2NvbnN0IG49L1wkeyguKj8pfS9nO2xldCByPXRoaXMuX3ZhbHVlLGk9bi5leGVjKHIpO2Zvcig7aSE9PW51bGw7KXtjb25zdCBvPWlbMF0scz1pWzFdO2xldCB1PWU9PW51bGw/dm9pZCAwOmUucHJvcGVydGllc1tzXTt0eXBlb2YgdT4idSImJih1PSIiKSxyPXIucmVwbGFjZShvLHUpLGk9bi5leGVjKHIpfXJldHVybiByfV9ldmFsdWF0ZVZhcmlhYmxlKGUpe2xldCBuO3JldHVybiBlJiZTdHJpbmcodGhpcy5fdmFsdWUpaW4gZS5wcm9wZXJ0aWVzP249ZS5wcm9wZXJ0aWVzW1N0cmluZyh0aGlzLl92YWx1ZSldOlN0cmluZyh0aGlzLl92YWx1ZSk9PT0iaWQiP249ZT09bnVsbD92b2lkIDA6ZS5pZDplJiZTdHJpbmcodGhpcy5fdmFsdWUpPT09InJvb3RQcm9wZXJ0aWVzIiYmKG49ZS5wcm9wZXJ0aWVzKSx0eXBlb2Ygbj4idSImJihuPSIiKSxufV9ldmFsdWF0ZU1lbWJlckRvdChlKXtpZihtaSh0aGlzLl9sZWZ0KSlyZXR1cm4gZT09bnVsbD92b2lkIDA6ZS5wcm9wZXJ0aWVzW3RoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpXTtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4+InUiKXJldHVybjtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuW3JdfV9ldmFsdWF0ZU1lbWJlckJyYWNrZXRzKGUpe2lmKG1pKHRoaXMuX2xlZnQpKXJldHVybiBlPT1udWxsP3ZvaWQgMDplLnByb3BlcnRpZXNbdGhpcy5fcmlnaHQuZXZhbHVhdGUoZSldO2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj4idSIpcmV0dXJuO2NvbnN0IHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG5bcl19X2V2YWx1YXRlQXJyYXkoZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX3ZhbHVlLmxlbmd0aDtyKyspbltyXT10aGlzLl92YWx1ZVtyXS5ldmFsdWF0ZShlKTtyZXR1cm4gbn1fZXZhbHVhdGVOb3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiISIgcmVxdWlyZXMgYSBib29sZWFuIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiFufV9ldmFsdWF0ZU5lZ2F0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuLW47dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfV9ldmFsdWF0ZVBvc2l0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiKyIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiBufV9ldmFsdWF0ZUxlc3NUaGFuKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPCIgcmVxdWlyZXMgbnVtYmVyIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApLCExKTpuPHJ9X2V2YWx1YXRlTGVzc1RoYW5PckVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIG4hPSJudW1iZXIifHx0eXBlb2YgciE9Im51bWJlciI/KGNvbnNvbGUud2FybihgT3BlcmF0b3IgIjw9IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm48PXJ9X2V2YWx1YXRlR3JlYXRlclRoYW4oZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHR5cGVvZiBuIT0ibnVtYmVyInx8dHlwZW9mIHIhPSJudW1iZXIiPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICI+IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm4+cn1fZXZhbHVhdGVHcmVhdGVyVGhhbk9yRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPj0iIHJlcXVpcmVzIG51bWJlciBhcmd1bWVudHMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKSwhMSk6bj49cn1fZXZhbHVhdGVPcihlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4hPSJib29sZWFuIilyZXR1cm4gY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyAke259LmApLCExO2lmKG4pcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIHIhPSJib29sZWFuIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBTZWNvbmQgYXJndW1lbnQgaXMgJHtyfS5gKSwhMSk6bnx8cn1fZXZhbHVhdGVBbmQoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpcmV0dXJuIGNvbnNvbGUud2FybihgT3BlcmF0b3IgIiYmIiByZXF1aXJlcyBib29sZWFuIGFyZ3VtZW50cy4gRmlyc3QgYXJndW1lbnQgaXMgJHtufS5gKSwhMTtpZighbilyZXR1cm4hMTtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgciE9ImJvb2xlYW4iPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICImJiIgcmVxdWlyZXMgYm9vbGVhbiBhcmd1bWVudHMuIFNlY29uZCBhcmd1bWVudCBpcyAke3J9LmApLCExKTpuJiZyfV9ldmFsdWF0ZVBsdXMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4rcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIrIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYXQgbGVhc3Qgb25lIHN0cmluZyBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1pbnVzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIiKXJldHVybiBuLXI7dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVUaW1lcyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbipyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIioiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgdmVjdG9ycyB0aGV5IG11c3QgYmUgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVEaXZpZGUoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4vcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIvIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYSBudW1iZXIgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1vZChlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbiVyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIiUiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzIG9mIG1hdGNoaW5nIHR5cGVzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCl9X2V2YWx1YXRlRXF1YWxzU3RyaWN0KGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuPT09cn1fZXZhbHVhdGVOb3RFcXVhbHNTdHJpY3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG4hPT1yfV9ldmFsdWF0ZUNvbmRpdGlvbmFsKGUpe2NvbnN0IG49dGhpcy5fdGVzdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcihgQ29uZGl0aW9uYWwgYXJndW1lbnQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGEgYm9vbGVhbi4gQXJndW1lbnQgaXMgJHtufS5gKTtyZXR1cm4gbj90aGlzLl9sZWZ0LmV2YWx1YXRlKGUpOnRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpfV9ldmFsdWF0ZU5hTihlKXtyZXR1cm4gaXNOYU4odGhpcy5fbGVmdC5ldmFsdWF0ZShlKSl9X2V2YWx1YXRlSXNGaW5pdGUoZSl7cmV0dXJuIGlzRmluaXRlKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZUJvb2xlYW5Db252ZXJzaW9uKGUpe3JldHVybiBCb29sZWFuKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb24oZSl7Y29uc3Qgbj1kZih0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKTtyZXR1cm4gTnVtYmVyKG4pfV9ldmFsdWF0ZVN0cmluZ0NvbnZlcnNpb24oZSl7cmV0dXJuIFN0cmluZyh0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKX1fZXZhbHVhdGVUb1N0cmluZyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYobiBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gU3RyaW5nKG4pO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke3RoaXMuX3ZhbHVlfSIuYCl9X2V2YWx1YXRlTGl0ZXJhbENvbG9yKGUpe2NvbnN0IG49dGhpcy5fbGVmdDtsZXQgcj1uZXcgSjtpZih0aGlzLl92YWx1ZT09PSJjb2xvciIpaWYodHlwZW9mIG4+InUiKXI9Si5mcm9tQnl0ZXMoMjU1LDI1NSwyNTUsMjU1KTtlbHNlIGlmKG4ubGVuZ3RoPjEpe2NvbnN0IGk9Si5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCk7ci5hbHBoYT1uWzFdLmV2YWx1YXRlKGUpfWVsc2V7Y29uc3QgaT1KLmZyb21Dc3NDb2xvclN0cmluZyhuWzBdLmV2YWx1YXRlKGUpKTtpZihpKXI9aTtlbHNlIHRocm93IG5ldyBFcnJvcihgd3JvbmcgbGl0ZXJhbENvbG9yIGNhbGwgIiR7dGhpcy5fdmFsdWV9LCAke259fSJgKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09InJnYiIpcj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSwyNTUpO2Vsc2UgaWYodGhpcy5fdmFsdWU9PT0icmdiYSIpe2NvbnN0IGk9blszXS5ldmFsdWF0ZShlKSoyNTU7cj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSxpKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbCIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLDEpO2kmJihyPWkpfWVsc2UgaWYodGhpcy5fdmFsdWU9PT0iaHNsYSIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLG5bM10uZXZhbHVhdGUoZSkpO2kmJihyPWkpfXJldHVybiByLnRvQ3NzSGV4U3RyaW5nKCl9X2V2YWx1YXRlRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBGdChuKSYmIUZ0KHIpP24uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT9yLmluY2x1ZGVzKG4pOihGdChyKSYmRnQobikmJmNvbnNvbGUuZXJyb3IoIkVxdWFscyBsZWZ0IGFuZCByaWdodCBib3RoIGNhbid0IGJlIGFycmF5IGF0IHRoZSBzYW1lIHRpbWUiKSxuPT1yKX1fZXZhbHVhdGVOb3RFcXVhbHMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIEZ0KG4pJiYhRnQocik/IW4uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT8hci5pbmNsdWRlcyhuKTooRnQocikmJkZ0KG4pJiZjb25zb2xlLmVycm9yKCJOb3RFcXVhbHMgbGVmdCBhbmQgcmlnaHQgYm90aCBjYW4ndCBiZSBhcnJheSBhdCB0aGUgc2FtZSB0aW1lIiksbiE9cil9fWZ1bmN0aW9uIGRmKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDtjb25zdCBlPVsiJSJdO2Zvcihjb25zdCBuIG9mIGUpaWYodC5lbmRzV2l0aChuKSlyZXR1cm4gdC5zbGljZSgwLC1uLmxlbmd0aCkudHJpbSgpO3JldHVybiB0LnRyaW0oKX1mdW5jdGlvbiBtaSh0KXtyZXR1cm4gdC5fdmFsdWU9PT0iZmVhdHVyZSJ9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gRWYodCxlLG4pe3JldHVybiBlPVVlKGUpLFJmKHQsWm4oKT9SZWZsZWN0LmNvbnN0cnVjdChlLG58fFtdLFVlKHQpLmNvbnN0cnVjdG9yKTplLmFwcGx5KHQsbikpfWZ1bmN0aW9uIEZpKHQsZSxuKXtpZihabigpKXJldHVybiBSZWZsZWN0LmNvbnN0cnVjdC5hcHBseShudWxsLGFyZ3VtZW50cyk7dmFyIHI9W251bGxdO3IucHVzaC5hcHBseShyLGUpO3ZhciBpPW5ldyh0LmJpbmQuYXBwbHkodCxyKSk7cmV0dXJuIG4mJmplKGksbi5wcm90b3R5cGUpLGl9ZnVuY3Rpb24gWm4oKXt0cnl7dmFyIHQ9IUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpfWNhdGNoe31yZXR1cm4oWm49ZnVuY3Rpb24oKXtyZXR1cm4hIXR9KSgpfWZ1bmN0aW9uIF9mKHQsZSl7aWYodHlwZW9mIHQhPSJvYmplY3QifHwhdClyZXR1cm4gdDt2YXIgbj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZih0eXBlb2YgciE9Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oZT09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKHQpfWZ1bmN0aW9uIHBmKHQpe3ZhciBlPV9mKHQsInN0cmluZyIpO3JldHVybiB0eXBlb2YgZT09InN5bWJvbCI/ZTpTdHJpbmcoZSl9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIEd0PXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxHdCh0KX1mdW5jdGlvbiB3aSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIElpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxwZihyLmtleSkscil9fWZ1bmN0aW9uIE5pKHQsZSxuKXtyZXR1cm4gZSYmSWkodC5wcm90b3R5cGUsZSksbiYmSWkodCxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0fWZ1bmN0aW9uIHlmKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGUmJmplKHQsZSl9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIFVlPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKG4pe3JldHVybiBuLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pfSxVZSh0KX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBqZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGkpe3JldHVybiByLl9fcHJvdG9fXz1pLHJ9LGplKHQsZSl9ZnVuY3Rpb24gQWYodCl7dHJ5e3JldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKSE9PS0xfWNhdGNoe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIn19ZnVuY3Rpb24gUW4odCl7dmFyIGU9dHlwZW9mIE1hcD09ImZ1bmN0aW9uIj9uZXcgTWFwOnZvaWQgMDtyZXR1cm4gUW49ZnVuY3Rpb24ocil7aWYocj09PW51bGx8fCFBZihyKSlyZXR1cm4gcjtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2lmKHR5cGVvZiBlPCJ1Iil7aWYoZS5oYXMocikpcmV0dXJuIGUuZ2V0KHIpO2Uuc2V0KHIsaSl9ZnVuY3Rpb24gaSgpe3JldHVybiBGaShyLGFyZ3VtZW50cyxVZSh0aGlzKS5jb25zdHJ1Y3Rvcil9cmV0dXJuIGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGplKGkscil9LFFuKHQpfWZ1bmN0aW9uIFRmKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBSZih0LGUpe2lmKGUmJih0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKSlyZXR1cm4gZTtpZihlIT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIFRmKHQpfWZ1bmN0aW9uIHhmKHQpe3JldHVybiBPZih0KXx8YmYodCl8fE1pKHQpfHxnZigpfWZ1bmN0aW9uIE9mKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEpuKHQpfWZ1bmN0aW9uIGJmKHQpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fHRbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbSh0KX1mdW5jdGlvbiBNaSh0LGUpe2lmKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gSm4odCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIEpuKHQsZSl9fWZ1bmN0aW9uIEpuKHQsZSl7KGU9PW51bGx8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gZ2YoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIFNmKHQsZSl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj1NaSh0KSl8fGUmJnQmJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciIpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIG89ITAscz0hMSx1O3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwodCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gbz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtzPSEwLHU9YX0sZjpmdW5jdGlvbigpe3RyeXshbyYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IHV9fX19dmFyIFR0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gWnQodCxlKXtyZXR1cm4gdD10LnNsaWNlKCksdC5wdXNoKGUpLHR9ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gZT1lLnNsaWNlKCksZS51bnNoaWZ0KHQpLGV9dmFyIG1mPWZ1bmN0aW9uKHQpe3lmKGUsdCk7ZnVuY3Rpb24gZShuKXt2YXIgcjtyZXR1cm4gd2kodGhpcyxlKSxyPUVmKHRoaXMsZSxbJ0pTT05QYXRoIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggIm5ldyIgKGl0IHByZXZlbnRzIHJldHVybiBvZiAodW53cmFwcGVkKSBzY2FsYXIgdmFsdWVzKSddKSxyLmF2b2lkTmV3PSEwLHIudmFsdWU9bixyLm5hbWU9Ik5ld0Vycm9yIixyfXJldHVybiBOaShlKX0oUW4oRXJyb3IpKTtmdW5jdGlvbiBxKHQsZSxuLHIsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcSkpdHJ5e3JldHVybiBuZXcgcSh0LGUsbixyLGkpfWNhdGNoKGEpe2lmKCFhLmF2b2lkTmV3KXRocm93IGE7cmV0dXJuIGEudmFsdWV9dHlwZW9mIHQ9PSJzdHJpbmciJiYoaT1yLHI9bixuPWUsZT10LHQ9bnVsbCk7dmFyIG89dCYmR3QodCk9PT0ib2JqZWN0IjtpZih0PXR8fHt9LHRoaXMuanNvbj10Lmpzb258fG4sdGhpcy5wYXRoPXQucGF0aHx8ZSx0aGlzLnJlc3VsdFR5cGU9dC5yZXN1bHRUeXBlfHwidmFsdWUiLHRoaXMuZmxhdHRlbj10LmZsYXR0ZW58fCExLHRoaXMud3JhcD1UdC5jYWxsKHQsIndyYXAiKT90LndyYXA6ITAsdGhpcy5zYW5kYm94PXQuc2FuZGJveHx8e30sdGhpcy5wcmV2ZW50RXZhbD10LnByZXZlbnRFdmFsfHwhMSx0aGlzLnBhcmVudD10LnBhcmVudHx8bnVsbCx0aGlzLnBhcmVudFByb3BlcnR5PXQucGFyZW50UHJvcGVydHl8fG51bGwsdGhpcy5jYWxsYmFjaz10LmNhbGxiYWNrfHxyfHxudWxsLHRoaXMub3RoZXJUeXBlQ2FsbGJhY2s9dC5vdGhlclR5cGVDYWxsYmFja3x8aXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBzdXBwbHkgYW4gb3RoZXJUeXBlQ2FsbGJhY2sgY2FsbGJhY2sgb3B0aW9uIHdpdGggdGhlIEBvdGhlcigpIG9wZXJhdG9yLiIpfSx0LmF1dG9zdGFydCE9PSExKXt2YXIgcz17cGF0aDpvP3QucGF0aDplfTtvPyJqc29uImluIHQmJihzLmpzb249dC5qc29uKTpzLmpzb249bjt2YXIgdT10aGlzLmV2YWx1YXRlKHMpO2lmKCF1fHxHdCh1KSE9PSJvYmplY3QiKXRocm93IG5ldyBtZih1KTtyZXR1cm4gdX19cS5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXRoaXMucGFyZW50LHM9dGhpcy5wYXJlbnRQcm9wZXJ0eSx1PXRoaXMuZmxhdHRlbixhPXRoaXMud3JhcDtpZih0aGlzLmN1cnJSZXN1bHRUeXBlPXRoaXMucmVzdWx0VHlwZSx0aGlzLmN1cnJQcmV2ZW50RXZhbD10aGlzLnByZXZlbnRFdmFsLHRoaXMuY3VyclNhbmRib3g9dGhpcy5zYW5kYm94LG49bnx8dGhpcy5jYWxsYmFjayx0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjaz1yfHx0aGlzLm90aGVyVHlwZUNhbGxiYWNrLGU9ZXx8dGhpcy5qc29uLHQ9dHx8dGhpcy5wYXRoLHQmJkd0KHQpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KHQpKXtpZighdC5wYXRoJiZ0LnBhdGghPT0iIil0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSAicGF0aCIgcHJvcGVydHkgd2hlbiBwcm92aWRpbmcgYW4gb2JqZWN0IGFyZ3VtZW50IHRvIEpTT05QYXRoLmV2YWx1YXRlKCkuJyk7aWYoIVR0LmNhbGwodCwianNvbiIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHN1cHBseSBhICJqc29uIiBwcm9wZXJ0eSB3aGVuIHByb3ZpZGluZyBhbiBvYmplY3QgYXJndW1lbnQgdG8gSlNPTlBhdGguZXZhbHVhdGUoKS4nKTt2YXIgbD10O2U9bC5qc29uLHU9VHQuY2FsbCh0LCJmbGF0dGVuIik/dC5mbGF0dGVuOnUsdGhpcy5jdXJyUmVzdWx0VHlwZT1UdC5jYWxsKHQsInJlc3VsdFR5cGUiKT90LnJlc3VsdFR5cGU6dGhpcy5jdXJyUmVzdWx0VHlwZSx0aGlzLmN1cnJTYW5kYm94PVR0LmNhbGwodCwic2FuZGJveCIpP3Quc2FuZGJveDp0aGlzLmN1cnJTYW5kYm94LGE9VHQuY2FsbCh0LCJ3cmFwIik/dC53cmFwOmEsdGhpcy5jdXJyUHJldmVudEV2YWw9VHQuY2FsbCh0LCJwcmV2ZW50RXZhbCIpP3QucHJldmVudEV2YWw6dGhpcy5jdXJyUHJldmVudEV2YWwsbj1UdC5jYWxsKHQsImNhbGxiYWNrIik/dC5jYWxsYmFjazpuLHRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrPVR0LmNhbGwodCwib3RoZXJUeXBlQ2FsbGJhY2siKT90Lm90aGVyVHlwZUNhbGxiYWNrOnRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrLG89VHQuY2FsbCh0LCJwYXJlbnQiKT90LnBhcmVudDpvLHM9VHQuY2FsbCh0LCJwYXJlbnRQcm9wZXJ0eSIpP3QucGFyZW50UHJvcGVydHk6cyx0PXQucGF0aH1pZihvPW98fG51bGwscz1zfHxudWxsLEFycmF5LmlzQXJyYXkodCkmJih0PXEudG9QYXRoU3RyaW5nKHQpKSwhKCF0JiZ0IT09IiJ8fCFlKSl7dmFyIGQ9cS50b1BhdGhBcnJheSh0KTtkWzBdPT09IiQiJiZkLmxlbmd0aD4xJiZkLnNoaWZ0KCksdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9bnVsbDt2YXIgXz10aGlzLl90cmFjZShkLGUsWyIkIl0sbyxzLG4pLmZpbHRlcihmdW5jdGlvbihPKXtyZXR1cm4gTyYmIU8uaXNQYXJlbnRTZWxlY3Rvcn0pO3JldHVybiBfLmxlbmd0aD8hYSYmXy5sZW5ndGg9PT0xJiYhX1swXS5oYXNBcnJFeHByP3RoaXMuX2dldFByZWZlcnJlZE91dHB1dChfWzBdKTpfLnJlZHVjZShmdW5jdGlvbihPLGIpe3ZhciBGPWkuX2dldFByZWZlcnJlZE91dHB1dChiKTtyZXR1cm4gdSYmQXJyYXkuaXNBcnJheShGKT9PPU8uY29uY2F0KEYpOk8ucHVzaChGKSxPfSxbXSk6YT9bXTp2b2lkIDB9fSxxLnByb3RvdHlwZS5fZ2V0UHJlZmVycmVkT3V0cHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VyclJlc3VsdFR5cGU7c3dpdGNoKGUpe2Nhc2UiYWxsIjp7dmFyIG49QXJyYXkuaXNBcnJheSh0LnBhdGgpP3QucGF0aDpxLnRvUGF0aEFycmF5KHQucGF0aCk7cmV0dXJuIHQucG9pbnRlcj1xLnRvUG9pbnRlcihuKSx0LnBhdGg9dHlwZW9mIHQucGF0aD09InN0cmluZyI/dC5wYXRoOnEudG9QYXRoU3RyaW5nKHQucGF0aCksdH1jYXNlInZhbHVlIjpjYXNlInBhcmVudCI6Y2FzZSJwYXJlbnRQcm9wZXJ0eSI6cmV0dXJuIHRbZV07Y2FzZSJwYXRoIjpyZXR1cm4gcS50b1BhdGhTdHJpbmcodFtlXSk7Y2FzZSJwb2ludGVyIjpyZXR1cm4gcS50b1BvaW50ZXIodC5wYXRoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gcmVzdWx0IHR5cGUiKX19LHEucHJvdG90eXBlLl9oYW5kbGVDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7aWYoZSl7dmFyIHI9dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KHQpO3QucGF0aD10eXBlb2YgdC5wYXRoPT0ic3RyaW5nIj90LnBhdGg6cS50b1BhdGhTdHJpbmcodC5wYXRoKSxlKHIsbix0KX19LHEucHJvdG90eXBlLl90cmFjZT1mdW5jdGlvbih0LGUsbixyLGksbyxzLHUpe3ZhciBhPXRoaXMsbDtpZighdC5sZW5ndGgpcmV0dXJuIGw9e3BhdGg6bix2YWx1ZTplLHBhcmVudDpyLHBhcmVudFByb3BlcnR5OmksaGFzQXJyRXhwcjpzfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInZhbHVlIiksbDt2YXIgZD10WzBdLF89dC5zbGljZSgxKSxPPVtdO2Z1bmN0aW9uIGIoRCl7QXJyYXkuaXNBcnJheShEKT9ELmZvckVhY2goZnVuY3Rpb24oeXQpe08ucHVzaCh5dCl9KTpPLnB1c2goRCl9aWYoKHR5cGVvZiBkIT0ic3RyaW5nInx8dSkmJmUmJlR0LmNhbGwoZSxkKSliKHRoaXMuX3RyYWNlKF8sZVtkXSxadChuLGQpLGUsZCxvLHMpKTtlbHNlIGlmKGQ9PT0iKiIpdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2IoYS5fdHJhY2UoXyxlW0RdLFp0KG4sRCksZSxELG8sITAsITApKX0pO2Vsc2UgaWYoZD09PSIuLiIpYih0aGlzLl90cmFjZShfLGUsbixyLGksbyxzKSksdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe0d0KGVbRF0pPT09Im9iamVjdCImJmIoYS5fdHJhY2UodC5zbGljZSgpLGVbRF0sWnQobixEKSxlLEQsbywhMCkpfSk7ZWxzZXtpZihkPT09Il4iKXJldHVybiB0aGlzLl9oYXNQYXJlbnRTZWxlY3Rvcj0hMCx7cGF0aDpuLnNsaWNlKDAsLTEpLGV4cHI6Xyxpc1BhcmVudFNlbGVjdG9yOiEwfTtpZihkPT09In4iKXJldHVybiBsPXtwYXRoOlp0KG4sZCksdmFsdWU6aSxwYXJlbnQ6cixwYXJlbnRQcm9wZXJ0eTpudWxsfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInByb3BlcnR5IiksbDtpZihkPT09IiQiKWIodGhpcy5fdHJhY2UoXyxlLG4sbnVsbCxudWxsLG8scykpO2Vsc2UgaWYoL14oXHgyRD9bMC05XSopOihceDJEP1swLTldKik6PyhbMC05XSopJC8udGVzdChkKSliKHRoaXMuX3NsaWNlKGQsXyxlLG4scixpLG8pKTtlbHNlIGlmKGQuaW5kZXhPZigiPygiKT09PTApe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbPyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7dmFyIEY9ZC5yZXBsYWNlKC9eXD9cKCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/KVwpJC8sIiQxIiksUz0vQCg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pPygoPzpbXDAtPkAtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsnXFtdKFw/P1woKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1wpKSg/ISg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pXClcXSlbJ1xdXS9nLmV4ZWMoRik7Uz90aGlzLl93YWxrKGUsZnVuY3Rpb24oRCl7dmFyIHl0PVtTWzJdXSxvdD1TWzFdP2VbRF1bU1sxXV06ZVtEXSxndD1hLl90cmFjZSh5dCxvdCxuLHIsaSxvLCEwKTtndC5sZW5ndGg+MCYmYihhLl90cmFjZShfLGVbRF0sWnQobixEKSxlLEQsbywhMCkpfSk6dGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2EuX2V2YWwoRixlW0RdLEQsbixyLGkpJiZiKGEuX3RyYWNlKF8sZVtEXSxadChuLEQpLGUsRCxvLCEwKSl9KX1lbHNlIGlmKGRbMF09PT0iKCIpe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbKGV4cHIpXSBwcmV2ZW50ZWQgaW4gSlNPTlBhdGggZXhwcmVzc2lvbi4iKTtiKHRoaXMuX3RyYWNlKHRyKHRoaXMuX2V2YWwoZCxlLG5bbi5sZW5ndGgtMV0sbi5zbGljZSgwLC0xKSxyLGkpLF8pLGUsbixyLGksbyxzKSl9ZWxzZSBpZihkWzBdPT09IkAiKXt2YXIgTj0hMSxnPWQuc2xpY2UoMSwtMik7c3dpdGNoKGcpe2Nhc2Uic2NhbGFyIjooIWV8fCFbIm9iamVjdCIsImZ1bmN0aW9uIl0uaW5jbHVkZXMoR3QoZSkpKSYmKE49ITApO2JyZWFrO2Nhc2UiYm9vbGVhbiI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpjYXNlImZ1bmN0aW9uIjpHdChlKT09PWcmJihOPSEwKTticmVhaztjYXNlImludGVnZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmIShlJTEpJiYoTj0hMCk7YnJlYWs7Y2FzZSJudW1iZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmKE49ITApO2JyZWFrO2Nhc2Uibm9uRmluaXRlIjp0eXBlb2YgZT09Im51bWJlciImJiFOdW1iZXIuaXNGaW5pdGUoZSkmJihOPSEwKTticmVhaztjYXNlIm9iamVjdCI6ZSYmR3QoZSk9PT1nJiYoTj0hMCk7YnJlYWs7Y2FzZSJhcnJheSI6QXJyYXkuaXNBcnJheShlKSYmKE49ITApO2JyZWFrO2Nhc2Uib3RoZXIiOk49dGhpcy5jdXJyT3RoZXJUeXBlQ2FsbGJhY2soZSxuLHIsaSk7YnJlYWs7Y2FzZSJudWxsIjplPT09bnVsbCYmKE49ITApO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB2YWx1ZSB0eXBlICIrZyl9aWYoTilyZXR1cm4gbD17cGF0aDpuLHZhbHVlOmUscGFyZW50OnIscGFyZW50UHJvcGVydHk6aX0sdGhpcy5faGFuZGxlQ2FsbGJhY2sobCxvLCJ2YWx1ZSIpLGx9ZWxzZSBpZihkWzBdPT09ImAiJiZlJiZUdC5jYWxsKGUsZC5zbGljZSgxKSkpe3ZhciBHPWQuc2xpY2UoMSk7Yih0aGlzLl90cmFjZShfLGVbR10sWnQobixHKSxlLEcsbyxzLCEwKSl9ZWxzZSBpZihkLmluY2x1ZGVzKCIsIikpe3ZhciBLPWQuc3BsaXQoIiwiKSxWPVNmKEspLGl0O3RyeXtmb3IoVi5zKCk7IShpdD1WLm4oKSkuZG9uZTspe3ZhciBsdD1pdC52YWx1ZTtiKHRoaXMuX3RyYWNlKHRyKGx0LF8pLGUsbixyLGksbywhMCkpfX1jYXRjaChEKXtWLmUoRCl9ZmluYWxseXtWLmYoKX19ZWxzZSF1JiZlJiZUdC5jYWxsKGUsZCkmJmIodGhpcy5fdHJhY2UoXyxlW2RdLFp0KG4sZCksZSxkLG8scywhMCkpfWlmKHRoaXMuX2hhc1BhcmVudFNlbGVjdG9yKWZvcih2YXIgcnQ9MDtydDxPLmxlbmd0aDtydCsrKXt2YXIgQnQ9T1tydF07aWYoQnQmJkJ0LmlzUGFyZW50U2VsZWN0b3Ipe3ZhciBUPXRoaXMuX3RyYWNlKEJ0LmV4cHIsZSxCdC5wYXRoLHIsaSxvLHMpO2lmKEFycmF5LmlzQXJyYXkoVCkpe09bcnRdPVRbMF07Zm9yKHZhciBCPVQubGVuZ3RoLCQ9MTskPEI7JCsrKXJ0KyssTy5zcGxpY2UocnQsMCxUWyRdKX1lbHNlIE9bcnRdPVR9fXJldHVybiBPfSxxLnByb3RvdHlwZS5fd2Fsaz1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBuPXQubGVuZ3RoLHI9MDtyPG47cisrKWUocik7ZWxzZSB0JiZHdCh0KT09PSJvYmplY3QiJiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2UoaSl9KX0scS5wcm90b3R5cGUuX3NsaWNlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciB1PW4ubGVuZ3RoLGE9dC5zcGxpdCgiOiIpLGw9YVsyXSYmTnVtYmVyLnBhcnNlSW50KGFbMl0pfHwxLGQ9YVswXSYmTnVtYmVyLnBhcnNlSW50KGFbMF0pfHwwLF89YVsxXSYmTnVtYmVyLnBhcnNlSW50KGFbMV0pfHx1O2Q9ZDwwP01hdGgubWF4KDAsZCt1KTpNYXRoLm1pbih1LGQpLF89XzwwP01hdGgubWF4KDAsXyt1KTpNYXRoLm1pbih1LF8pO2Zvcih2YXIgTz1bXSxiPWQ7YjxfO2IrPWwpe3ZhciBGPXRoaXMuX3RyYWNlKHRyKGIsZSksbixyLGksbyxzLCEwKTtGLmZvckVhY2goZnVuY3Rpb24oUyl7Ty5wdXNoKFMpfSl9cmV0dXJuIE99fSxxLnByb3RvdHlwZS5fZXZhbD1mdW5jdGlvbih0LGUsbixyLGksbyl7dGhpcy5jdXJyU2FuZGJveC5fJF9wYXJlbnRQcm9wZXJ0eT1vLHRoaXMuY3VyclNhbmRib3guXyRfcGFyZW50PWksdGhpcy5jdXJyU2FuZGJveC5fJF9wcm9wZXJ0eT1uLHRoaXMuY3VyclNhbmRib3guXyRfcm9vdD10aGlzLmpzb24sdGhpcy5jdXJyU2FuZGJveC5fJF92PWU7dmFyIHM9dC5pbmNsdWRlcygiQHBhdGgiKTtzJiYodGhpcy5jdXJyU2FuZGJveC5fJF9wYXRoPXEudG9QYXRoU3RyaW5nKHIuY29uY2F0KFtuXSkpKTt2YXIgdT0ic2NyaXB0OiIrdDtpZighcS5jYWNoZVt1XSl7dmFyIGE9dC5yZXBsYWNlKC9AcGFyZW50UHJvcGVydHkvZywiXyRfcGFyZW50UHJvcGVydHkiKS5yZXBsYWNlKC9AcGFyZW50L2csIl8kX3BhcmVudCIpLnJlcGxhY2UoL0Bwcm9wZXJ0eS9nLCJfJF9wcm9wZXJ0eSIpLnJlcGxhY2UoL0Byb290L2csIl8kX3Jvb3QiKS5yZXBsYWNlKC9AKFtcdC1cciBcKVwuXFtceEEwXHUxNjgwXHUyMDAwLVx1MjAwQVx1MjAyOFx1MjAyOVx1MjAyRlx1MjA1Rlx1MzAwMFx1RkVGRl0pL2csIl8kX3YkMSIpO3MmJihhPWEucmVwbGFjZSgvQHBhdGgvZywiXyRfcGF0aCIpKSxxLmNhY2hlW3VdPW5ldyB0aGlzLnZtLlNjcmlwdChhKX10cnl7cmV0dXJuIHEuY2FjaGVbdV0ucnVuSW5OZXdDb250ZXh0KHRoaXMuY3VyclNhbmRib3gpfWNhdGNoKGwpe3Rocm93IG5ldyBFcnJvcigianNvblBhdGg6ICIrbC5tZXNzYWdlKyI6ICIrdCl9fSxxLmNhY2hlPXt9LHEudG9QYXRoU3RyaW5nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iJCIsaT0xO2k8bjtpKyspL14ofnxcXnxAKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1woXCkpJC8udGVzdChlW2ldKXx8KHIrPS9eW1wqMC05XSskLy50ZXN0KGVbaV0pPyJbIitlW2ldKyJdIjoiWyciK2VbaV0rIiddIik7cmV0dXJuIHJ9LHEudG9Qb2ludGVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iIixpPTE7aTxuO2krKykvXih+fFxefEAoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XChcKSkkLy50ZXN0KGVbaV0pfHwocis9Ii8iK2VbaV0udG9TdHJpbmcoKS5yZXBsYWNlKC9+L2csIn4wIikucmVwbGFjZSgvXC8vZywifjEiKSk7cmV0dXJuIHJ9LHEudG9QYXRoQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9cS5jYWNoZTtpZihlW3RdKXJldHVybiBlW3RdLmNvbmNhdCgpO3ZhciBuPVtdLHI9dC5yZXBsYWNlKC9AKD86bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmd8aW50ZWdlcnx1bmRlZmluZWR8bm9uRmluaXRlfHNjYWxhcnxhcnJheXxvYmplY3R8ZnVuY3Rpb258b3RoZXIpXChcKS9nLCI7JCY7IikucmVwbGFjZSgvWydcW10oXD8/XCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XCkpWydcXV0oPyEoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKVxdKS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsjIisobi5wdXNoKHMpLTEpKyJdIn0pLnJlcGxhY2UoL1xbWyInXSgoPzpbXDAtJlwoLVxcXF4tXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsiJ11cXS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsnIitzLnJlcGxhY2UoL1wuL2csIiVAJSIpLnJlcGxhY2UoL34vZywiJSVAQCUlIikrIiddIn0pLnJlcGxhY2UoL34vZywiO347IikucmVwbGFjZSgvWyInXT9cLlsiJ10/KD8hKD86W1wwLVpcXC1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSpcXSl8XFtbIiddPy9nLCI7IikucmVwbGFjZSgvJUAlL2csIi4iKS5yZXBsYWNlKC8lJUBAJSUvZywifiIpLnJlcGxhY2UoLyg/OjspPyhcXispKD86Oyk/L2csZnVuY3Rpb24obyxzKXtyZXR1cm4iOyIrcy5zcGxpdCgiIikuam9pbigiOyIpKyI7In0pLnJlcGxhY2UoLzs7O3w7Oy9nLCI7Li47IikucmVwbGFjZSgvOyR8Jz9cXXwnJC9nLCIiKSxpPXIuc3BsaXQoIjsiKS5tYXAoZnVuY3Rpb24obyl7dmFyIHM9by5tYXRjaCgvIyhbMC05XSspLyk7cmV0dXJuIXN8fCFzWzFdP286bltzWzFdXX0pO3JldHVybiBlW3RdPWksZVt0XS5jb25jYXQoKX07dmFyIEZmPWZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz0wO288aTtvKyspe3ZhciBzPWVbb107cihzKSYmbi5wdXNoKGUuc3BsaWNlKG8tLSwxKVswXSl9fSx3Zj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7d2kodGhpcyx0KSx0aGlzLmNvZGU9ZX1yZXR1cm4gTmkodCxbe2tleToicnVuSW5OZXdDb250ZXh0Iix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLmNvZGUsaT1PYmplY3Qua2V5cyhuKSxvPVtdO0ZmKGksbyxmdW5jdGlvbihkKXtyZXR1cm4gdHlwZW9mIG5bZF09PSJmdW5jdGlvbiJ9KTt2YXIgcz1pLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbltkXX0pLHU9by5yZWR1Y2UoZnVuY3Rpb24oZCxfKXt2YXIgTz1uW19dLnRvU3RyaW5nKCk7cmV0dXJuL2Z1bmN0aW9uLy50ZXN0KE8pfHwoTz0iZnVuY3Rpb24gIitPKSwidmFyICIrXysiPSIrTysiOyIrZH0sIiIpO3I9dStyLCEvKFsiJ10pdXNlIHN0cmljdFwxLy50ZXN0KHIpJiYhaS5pbmNsdWRlcygiYXJndW1lbnRzIikmJihyPSJ2YXIgYXJndW1lbnRzID0gdW5kZWZpbmVkOyIrcikscj1yLnJlcGxhY2UoLztbXHQtXHIgXHhBMFx1MTY4MFx1MjAwMC1cdTIwMEFcdTIwMjhcdTIwMjlcdTIwMkZcdTIwNUZcdTMwMDBcdUZFRkZdKiQvLCIiKTt2YXIgYT1yLmxhc3RJbmRleE9mKCI7IiksbD1hPi0xP3Iuc2xpY2UoMCxhKzEpKyIgcmV0dXJuICIrci5zbGljZShhKzEpOiIgcmV0dXJuICIrcjtyZXR1cm4gRmkoRnVuY3Rpb24saS5jb25jYXQoW2xdKSkuYXBwbHkodm9pZCAwLHhmKHMpKX19XSksdH0oKTtxLnByb3RvdHlwZS52bT17U2NyaXB0OndmfTtjb25zdCBJZj0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiLE5mPXQ9PkFycmF5LmZyb20od2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkodCkpKS5tYXAoZT0+SWZbZSV0XSkuam9pbigiIikudG9Mb3dlckNhc2UoKSxDaT10PT57aWYodHlwZW9mIHQhPSJvYmplY3QifHx0PT09bnVsbClyZXR1cm4gdDtmb3IoY29uc3QgZSBpbiB0KWlmKHR5cGVvZiB0W2VdPT0ic3RyaW5nIil0cnl7dFtlXS5zdGFydHNXaXRoKCJ7IikmJnRbZV0uZW5kc1dpdGgoIn0iKSYmKHRbZV09SlNPTi5wYXJzZSh0W2VdKSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiSW52YWxpZCBKU09OOiIsdFtlXSl9ZWxzZSB0eXBlb2YgdFtlXT09Im9iamVjdCImJih0W2VdPUNpKHRbZV0pKTtyZXR1cm4gdH0sZXI9ImN6bV8iO2Z1bmN0aW9uIE1mKHQsZSl7bGV0IG49dCxyPSIiO2NvbnN0IGk9W107bGV0IG89bi5pbmRleE9mKCIkeyIpO2NvbnN0IHM9dHlwZW9mIGU8InUiLHU9e30sYT0vXlwkLi87Zm9yKDtvPj0wOylpZihDZihuLG8pKXtjb25zdCBsPXZmKG4sbyk7cis9bi5zbGljZSgwLGwrMSksbj1uLnNsaWNlKGwrMSksbz1uLmluZGV4T2YoIiR7Iil9ZWxzZXtyKz1uLnNsaWNlKDAsbyk7Y29uc3QgbD1EZihuLG8pLGQ9bi5zbGljZShvKzIsbCk7aWYoYS50ZXN0KGQpKXtpZighcylyZXR1cm5bcixbXV07bGV0IF89dVtkXTtpZighXyl0cnl7Xz1xKHtqc29uOmUscGF0aDpkfSksdVtkXT1ffWNhdGNoe3JldHVybltyLFtdXX1pZihfLmxlbmd0aCE9PTApe2NvbnN0IE89TmYoMTApO2kucHVzaCh7bGl0ZXJhbE5hbWU6TyxsaXRlcmFsVmFsdWU6X1swXX0pLHIrPU99ZWxzZSByZXR1cm5bImZhbHNlIixbXV19ZWxzZXtjb25zdCBfPUxmKGQpO3IrPWAke2VyfSR7X31gfW49bi5zbGljZShsKzEpLG89bi5pbmRleE9mKCIkeyIpfXJldHVybiByKz1uLFtyLGldfWZ1bmN0aW9uIENmKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoIiciKSxyPXQuaW5kZXhPZignIicpO3JldHVybiBuPj0wJiZuPGU/dC5pbmRleE9mKCInIixuKzEpPj1lOnI+PTAmJnI8ZT90LmluZGV4T2YoJyInLHIrMSk+PWU6ITF9ZnVuY3Rpb24gdmYodCxlKXtjb25zdCBuPXQuaW5kZXhPZigiJyIpLHI9dC5pbmRleE9mKCciJyk7cmV0dXJuIG4+PTAmJm48ZT90LmluZGV4T2YoIiciLG4rMSk6cj49MCYmcjxlP3QuaW5kZXhPZignIicscisxKTotMX1mdW5jdGlvbiBEZih0LGUpe2NvbnN0IG49dC5pbmRleE9mKCJ9IixlKTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJyZXBsYWNlVmFyaWFibGU6IFVubWF0Y2hlZCB7LiIpO3JldHVybiBufWNvbnN0IGNlPXQ9PmAkcmVlYXJ0aF8ke3R9XyRgLG5yPXsiWyI6Y2UoIm9wZW5lZF9zcXVhcmVfYnJhY2tldCIpLCJdIjpjZSgiY2xvc2VkX3NxdWFyZV9icmFja2V0IiksInsiOmNlKCJvcGVuZWRfY3VybHlfYnJhY2tldCIpLCJ9IjpjZSgiY2xvc2VkX2N1cmx5X2JyYWNrZXQiKSwiKCI6Y2UoIm9wZW5lZF9wYXJlbnRoZXNlcyIpLCIpIjpjZSgiY2xvc2VkX3BhcmVudGhlc2VzIiksIi0iOmNlKCJoeXBoZW4iKX0sTGY9dD0+e2NvbnN0IGU9dC5yZXBsYWNlKC8tL2csbnJbIi0iXSk7cmV0dXJuLyhcXXxcKXxcfSlbXlsuXSskLy50ZXN0KGUpP09iamVjdC5lbnRyaWVzKG5yKS5yZWR1Y2UoKG4sW3IsaV0pPT5uLnJlcGxhY2VBbGwocixpKSxlKTplfSxQZj10PT5PYmplY3QuZW50cmllcyhucikucmVkdWNlKChlLFtuLHJdKT0+ZS5yZXBsYWNlQWxsKHIsbiksdCksQmY9bmV3IFNldChLaCksdmk9bmV3IFNldChaaCk7ZnVuY3Rpb24gVyh0LGUpe2xldCBuPW5ldyBFcnJvcigiZmFpbGVkIHRvIHBhcnNlIik7Y29uc3Qgcj1lLnR5cGU7aWYocj09PSJMaXRlcmFsIiluPVVmKGUpO2Vsc2UgaWYocj09PSJDYWxsRXhwcmVzc2lvbiIpbj1HZih0LGUpO2Vsc2UgaWYocj09PSJJZGVudGlmaWVyIiluPSRmKGUpO2Vsc2UgaWYocj09PSJVbmFyeUV4cHJlc3Npb24iKXtjb25zdCBpPWUub3BlcmF0b3Isbz1XKHQsZS5hcmd1bWVudCk7aWYoQmYuaGFzKGkpKW49bmV3IFAoTS5VTkFSWSxpLG8pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdG9yICIke2l9Ii5gKX1lbHNlIGlmKHI9PT0iQmluYXJ5RXhwcmVzc2lvbiIpe2NvbnN0IGk9ZS5vcGVyYXRvcixvPVcodCxlLmxlZnQpLHM9Vyh0LGUucmlnaHQpO2lmKHZpLmhhcyhpKSluPW5ldyBQKE0uQklOQVJZLGksbyxzKTtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcGVyYXRvciAiJHtpfSIuYCl9ZWxzZSBpZihyPT09IkxvZ2ljYWxFeHByZXNzaW9uIil7Y29uc3QgaT1lLm9wZXJhdG9yLG89Vyh0LGUubGVmdCkscz1XKHQsZS5yaWdodCk7dmkuaGFzKGkpJiYobj1uZXcgUChNLkJJTkFSWSxpLG8scykpfWVsc2UgaWYocj09PSJDb25kaXRpb25hbEV4cHJlc3Npb24iKXtjb25zdCBpPVcodCxlLnRlc3QpLG89Vyh0LGUuY29uc2VxdWVudCkscz1XKHQsZS5hbHRlcm5hdGUpO249bmV3IFAoTS5DT05ESVRJT05BTCwiPyIsbyxzLGkpfWVsc2UgaWYocj09PSJNZW1iZXJFeHByZXNzaW9uIiluPVdmKHQsZSk7ZWxzZSBpZihyPT09IkFycmF5RXhwcmVzc2lvbiIpe2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzxlLmVsZW1lbnRzLmxlbmd0aDtvKyspaVtvXT1XKHQsZS5lbGVtZW50c1tvXSk7bj1uZXcgUChNLkFSUkFZLGkpfWVsc2UgdGhyb3cgcj09PSJDb21wb3VuZCI/bmV3IEVycm9yKCJQcm92aWRlIGV4YWN0bHkgb25lIGV4cHJlc3Npb24uIik6bmV3IEVycm9yKCJDYW5ub3QgcGFyc2UgZXhwcmVzc2lvbi4iKTtyZXR1cm4gbn1mdW5jdGlvbiBVZih0KXtjb25zdCBlPXR5cGVvZiB0LnZhbHVlO2lmKHQudmFsdWU9PT1udWxsKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVMTCxudWxsKTtpZihlPT09ImJvb2xlYW4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfQk9PTEVBTix0LnZhbHVlKTtpZihlPT09Im51bWJlciIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsdC52YWx1ZSk7aWYoZT09PSJzdHJpbmciKXJldHVybiB0LnZhbHVlLmluZGV4T2YoIiR7Iik+PTA/bmV3IFAoTS5WQVJJQUJMRV9JTl9TVFJJTkcsdC52YWx1ZSk6bmV3IFAoTS5MSVRFUkFMX1NUUklORyxqZih0LnZhbHVlKSk7dGhyb3cgbmV3IEVycm9yKGAke3R9IGlzIG5vdCBhIGZ1bmN0aW9uLmApfWZ1bmN0aW9uIGpmKHQpe3JldHVybiB0LnJlcGxhY2UodGYsIlxcIil9ZnVuY3Rpb24gR2YodCxlKXtjb25zdCBuPWUuYXJndW1lbnRzLHI9bi5sZW5ndGg7aWYoZS5jYWxsZWUudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIil7Y29uc3Qgbz1lLmNhbGxlZS5wcm9wZXJ0eS5uYW1lLHM9ZS5jYWxsZWUub2JqZWN0O2lmKG89PT0idGVzdCJ8fG89PT0iZXhlYyIpe2lmKHMuY2FsbGVlLm5hbWUhPT0icmVnRXhwIil0aHJvdyBuZXcgRXJyb3IoYCR7b30gaXMgbm90IGEgZnVuY3Rpb24uYCk7aWYocj09PTApcmV0dXJuIG89PT0idGVzdCI/bmV3IFAoTS5MSVRFUkFMX0JPT0xFQU4sITEpOm5ldyBQKE0uTElURVJBTF9OVUxMLG51bGwpO2NvbnN0IHU9Vyh0LHMpLGE9Vyh0LG5bMF0pO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1LGEpfWVsc2UgaWYobz09PSJ0b1N0cmluZyIpe2NvbnN0IHU9Vyh0LHMpO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1KX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtvfSIuYCl9Y29uc3QgaT1lLmNhbGxlZS5uYW1lO2lmKGk9PT0iY29sb3IiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGkpO2NvbnN0IG89Vyh0LG5bMF0pO2lmKHR5cGVvZiBuWzFdPCJ1Iil7Y29uc3Qgcz1XKHQsblsxXSk7cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLFtvLHNdKX1yZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGksW29dKX1lbHNlIGlmKGk9PT0icmdiInx8aT09PSJoc2wiKXtpZihyPDMpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIHRocmVlIGFyZ3VtZW50cy5gKTtjb25zdCBvPVtXKHQsblswXSksVyh0LG5bMV0pLFcodCxuWzJdKV07cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLG8pfWVsc2UgaWYoaT09PSJyZ2JhInx8aT09PSJoc2xhIil7aWYocjw0KXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBmb3VyIGFyZ3VtZW50cy5gKTtjb25zdCBvPVtXKHQsblswXSksVyh0LG5bMV0pLFcodCxuWzJdKSxXKHQsblszXSldO3JldHVybiBuZXcgUChNLkxJVEVSQUxfQ09MT1IsaSxvKX1lbHNlIGlmKGk9PT0iaXNOYU4ifHxpPT09ImlzRmluaXRlIil7aWYocj09PTApcmV0dXJuIGk9PT0iaXNOYU4iP25ldyBQKE0uTElURVJBTF9CT09MRUFOLCEwKTpuZXcgUChNLkxJVEVSQUxfQk9PTEVBTiwhMSk7Y29uc3Qgbz1XKHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX1lbHNlIGlmKHR5cGVvZiBZbltpXTwidSIpe2lmKHIhPT0xKXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudC5gKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYodHlwZW9mIGtuW2ldPCJ1Iil7aWYociE9PTIpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cy5gKTtjb25zdCBvPVcodCxuWzBdKSxzPVcodCxuWzFdKTtyZXR1cm4gbmV3IFAoTS5CSU5BUlksaSxvLHMpfWVsc2UgaWYoaT09PSJCb29sZWFuIil7aWYocj09PTApcmV0dXJuIG5ldyBQKE0uTElURVJBTF9CT09MRUFOLCExKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJOdW1iZXIiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUiwwKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJTdHJpbmciKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX1NUUklORywiIik7Y29uc3Qgbz1XKHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtpfSIuYCl9ZnVuY3Rpb24gJGYodCl7Y29uc3QgZT10Lm5hbWU7aWYoWGYoZSkpe2NvbnN0IG49SGYoZSk7cmV0dXJuIG4uc3Vic3RyaW5nKDAsOCk9PT0idGlsZXMzZF8iP25ldyBQKE0uQlVJTFRJTl9WQVJJQUJMRSxuKTpuZXcgUChNLlZBUklBQkxFLG4pfWVsc2V7aWYoZT09PSJOYU4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE5hTik7aWYoZT09PSJJbmZpbml0eSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsMS8wKTtpZihlPT09InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9VTkRFRklORUQsdm9pZCAwKX10aHJvdyBuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IGRlZmluZWQuYCl9ZnVuY3Rpb24gVmYodCl7Y29uc3QgZT10LnByb3BlcnR5Lm5hbWU7aWYoZT09PSJQSSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsTWF0aC5QSSk7aWYoZT09PSJFIilyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUixNYXRoLkUpO3Rocm93IG5ldyBFcnJvcihgJHtlfSBNYXRoIENvbnN0YW50IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudGApfWZ1bmN0aW9uIHpmKHQpe2NvbnN0IGU9dC5wcm9wZXJ0eS5uYW1lO2lmKGU9PT0iUE9TSVRJVkVfSU5GSU5JVFkiKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dGhyb3cgbmV3IEVycm9yKGAke2V9IE51bWJlciBDb25zdGFudCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnRgKX1mdW5jdGlvbiBXZih0LGUpe2lmKGUub2JqZWN0Lm5hbWU9PT0iTWF0aCIpcmV0dXJuIFZmKGUpO2lmKGUub2JqZWN0Lm5hbWU9PT0iTnVtYmVyIilyZXR1cm4gemYoZSk7bGV0IG47Y29uc3Qgcj1XKHQsZS5vYmplY3QpO3JldHVybiBlLmNvbXB1dGVkPyhuPVcodCxlLnByb3BlcnR5KSxuZXcgUChNLk1FTUJFUiwiYnJhY2tldHMiLHIsbikpOihuPW5ldyBQKE0uTElURVJBTF9TVFJJTkcsZS5wcm9wZXJ0eS5uYW1lKSxuZXcgUChNLk1FTUJFUiwiZG90IixyLG4pKX1mdW5jdGlvbiBYZih0KXtyZXR1cm4gdC5zdWJzdHJpbmcoMCw0KT09PWVyfWZ1bmN0aW9uIEhmKHQpe3JldHVybiBQZih0KS5zdWJzdHJpbmcoNCl9Y29uc3QgRGk9bmV3IE1hcCxMaT1uZXcgTWFwLFBpPW5ldyBNYXAsQmk9bmV3IE1hcDtjbGFzcyBjbntjb25zdHJ1Y3RvcihlLG4scil7dih0aGlzLCJfcnVudGltZUFzdCIpO3YodGhpcywiX2ZlYXR1cmUiKTt2YXIgdTt0aGlzLl9mZWF0dXJlPW47bGV0IGk9W107ZT1xZihlLHIpO2NvbnN0IG89TGkuZ2V0KGUpO2lmKG8pW2UsaV09bztlbHNle2NvbnN0IGE9ZTtbZSxpXT1NZihrZihlKSwodT10aGlzLl9mZWF0dXJlKT09bnVsbD92b2lkIDA6dS5wcm9wZXJ0aWVzKSxlLmluY2x1ZGVzKGVyKSYmTGkuc2V0KGEsW2UsaV0pfWNvbnN0IHM9RGkuZ2V0KGUpO2lmKHMpdGhpcy5fcnVudGltZUFzdD1zO2Vsc2V7aWYoaS5sZW5ndGghPT0wKWZvcihjb25zdCBsIG9mIGkpcXQuYWRkTGl0ZXJhbChsLmxpdGVyYWxOYW1lLGwubGl0ZXJhbFZhbHVlKTtxdC5hZGRCaW5hcnlPcCgiPX4iLDApLHF0LmFkZEJpbmFyeU9wKCIhfiIsMCk7bGV0IGE7dHJ5e2E9cXQoZSl9Y2F0Y2gobCl7dGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gZ2VuZXJhdGUgYXN0OiAke2x9YCl9dGhpcy5fcnVudGltZUFzdD1XKHRoaXMsYSksRGkuc2V0KGUsdGhpcy5fcnVudGltZUFzdCl9fWV2YWx1YXRlKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVBc3QuZXZhbHVhdGUodGhpcy5fZmVhdHVyZSl9fWZ1bmN0aW9uIHFmKHQsZSl7aWYodHlwZW9mIGU+InUiKXJldHVybiB0O2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmVudHJpZXMoZSkuc29ydCgpKSxyPXQrbixpPUJpLmdldChyKTtpZihpKXJldHVybiBpO2xldCBvPVBpLmdldCh0KTtvfHwobz1uZXcgUmVnRXhwKGBcXCRcXHsoJHtPYmplY3Qua2V5cyhlKS5qb2luKCJ8Iil9KVxcfWAsImciKSxQaS5zZXQodCxvKSk7Y29uc3Qgcz10LnJlcGxhY2UobywodSxhKT0+dHlwZW9mIGVbYV08InUiP2AoJHtlW2FdfSlgOiIiKTtyZXR1cm4gQmkuc2V0KHIscyksc31mdW5jdGlvbiBrZih0KXtyZXR1cm4gdC5yZXBsYWNlKFFoLEpoKX1jbGFzcyBZZntjb25zdHJ1Y3RvcihlLG4scil7dih0aGlzLCJfY29uZGl0aW9ucyIpO3YodGhpcywiX3J1bnRpbWVDb25kaXRpb25zIik7dih0aGlzLCJfZmVhdHVyZSIpO3YodGhpcywiX21lbW9pemVkUmVzdWx0Iik7dGhpcy5fY29uZGl0aW9ucz1lLmNvbmRpdGlvbnMsdGhpcy5fcnVudGltZUNvbmRpdGlvbnM9W10sdGhpcy5fZmVhdHVyZT1uLHRoaXMuX21lbW9pemVkUmVzdWx0PXZvaWQgMCx0aGlzLnNldFJ1bnRpbWUocil9c2V0UnVudGltZShlKXt2YXIgcjtjb25zdCBuPShyPXRoaXMuX2NvbmRpdGlvbnMpPT1udWxsP3ZvaWQgMDpyLm1hcChpPT57Y29uc3Qgbz1TdHJpbmcoaVswXSkscz1TdHJpbmcoaVsxXSk7cmV0dXJuIG5ldyBLZihuZXcgY24obyx0aGlzLl9mZWF0dXJlLGUpLG5ldyBjbihzLHRoaXMuX2ZlYXR1cmUsZSkpfSk7dGhpcy5fcnVudGltZUNvbmRpdGlvbnM9bj8/W10sdGhpcy5fbWVtb2l6ZWRSZXN1bHQ9dm9pZCAwfWV2YWx1YXRlKCl7aWYodHlwZW9mIHRoaXMuX21lbW9pemVkUmVzdWx0PCJ1IilyZXR1cm4gdGhpcy5fbWVtb2l6ZWRSZXN1bHQ7Y29uc3QgZT10aGlzLl9ydW50aW1lQ29uZGl0aW9ucyxuPWUubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjtpKyspe2NvbnN0IG89ZVtpXTtpZihvLmNvbmRpdGlvbi5ldmFsdWF0ZSgpKXtjb25zdCBzPW8uZXhwcmVzc2lvbi5ldmFsdWF0ZSgpO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1zLHN9fWNvbnN0IHI9dm9pZCAwO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1yLHJ9fWNsYXNzIEtme2NvbnN0cnVjdG9yKGUsbil7dih0aGlzLCJjb25kaXRpb24iKTt2KHRoaXMsImV4cHJlc3Npb24iKTt0aGlzLmNvbmRpdGlvbj1lLHRoaXMuZXhwcmVzc2lvbj1ufX1jb25zdCBaZj0odCxlLG4pPT57Y29uc3Qgcj1IaCh0LFloKSxpPW4wKHQsZSk7cmV0dXJuey4uLmksLi4uUWYocix0LGkpLHR5cGU6ImNvbXB1dGVkRmVhdHVyZSIsaW50ZXJ2YWw6bn19O2Z1bmN0aW9uIFFmKHQsZSxuKXtpZighbil7aWYoIWUuaWQpdGhyb3cgbmV3IEVycm9yKCJsYXllciBpZCBpcyByZXF1aXJlZCIpO249e3R5cGU6ImZlYXR1cmUiLGlkOmUuaWQscHJvcGVydGllczplLnByb3BlcnRpZXN8fHt9fX1yZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoW3IsaV0pPT5pP1tyLFVpKGksZSxuKV06dm9pZCAwKS5maWx0ZXIocj0+ISFyKSl9ZnVuY3Rpb24gVWkodCxlLG4pe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKChbcixpXSk9PnQwKGkpP1tyLFVpKGksZSxuKV06W3IsZTAoaSxlLG4pXSkpfWZ1bmN0aW9uIEpmKHQpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQmJiJleHByZXNzaW9uImluIHR9ZnVuY3Rpb24gdDAodCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0IiYmdCYmISgiZXhwcmVzc2lvbiJpbiB0KSYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gZTAodCxlLG4pe3RyeXtpZihKZih0KSl7Y29uc3Qgcj10LmV4cHJlc3Npb24saT1DaShVaChuKSk7cmV0dXJuIHR5cGVvZiByPiJ1Ij92b2lkIDA6dHlwZW9mIHI9PSJvYmplY3QiJiZyLmNvbmRpdGlvbnM/bmV3IFlmKHIsaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJib29sZWFuInx8dHlwZW9mIHI9PSJudW1iZXIiP25ldyBjbihTdHJpbmcociksaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJzdHJpbmciP25ldyBjbihyLGksZS5kZWZpbmVzKS5ldmFsdWF0ZSgpOnJ9cmV0dXJuIHR9Y2F0Y2gocil7Y29uc29sZS5lcnJvcihyKTtyZXR1cm59fWZ1bmN0aW9uIG4wKHQsZSl7dmFyIGk7Y29uc3Qgbj0oaT10LmRhdGEpPT1udWxsP3ZvaWQgMDppLmpzb25Qcm9wZXJ0aWVzO2lmKCFlLnByb3BlcnRpZXN8fCFufHwhbi5sZW5ndGgpcmV0dXJuIGU7Y29uc3Qgcj17Li4uZSwuLi5lIT1udWxsJiZlLnByb3BlcnRpZXM/e3Byb3BlcnRpZXM6ey4uLmUucHJvcGVydGllc319Ont9fTtyZXR1cm4gbi5mb3JFYWNoKG89PntyLnByb3BlcnRpZXNbb109KCgpPT57Y29uc3Qgcz1yLnByb3BlcnRpZXNbb107dHJ5e3JldHVybiBKU09OLnBhcnNlKHMpfWNhdGNoe3JldHVybiBzfX0pKCl9KSxyfWZ1bmN0aW9uIGhuKHQsZSl7aWYodC50eXBlPT09InNpbXBsZSIpcmV0dXJuIFpmKHQsZSl9Y29uc3QgcjA9KHQsZSxuKT0+e2lmKCFuKXJldHVybjtjb25zdCByPSgoKT0+e3N3aXRjaChyZS50eXBlc1t0LnR5cGVdKXtjYXNlIlBvbHlnb24iOnJldHVybiJwb2x5Z29uIjtjYXNlIkxpbmVTdHJpbmciOnJldHVybiJwb2x5bGluZSI7Y2FzZSJQb2ludCI6cmV0dXJuIm1hcmtlciI7ZGVmYXVsdDpyZXR1cm59fSkoKTtpZighcilyZXR1cm47Y29uc3QgaT10LmlkP1N0cmluZyh0LmlkKTppMCh0LmxvYWRHZW9tZXRyeSgpLGUpLG89aG4obixvMChpLHQsZSxyKSkscz1uZXcgZ247cmV0dXJuIHMuZGF0YT17bGF5ZXJJZDpuPT1udWxsP3ZvaWQgMDpuLmlkLGZlYXR1cmVJZDppLGZlYXR1cmU6byxhcHBlYXJhbmNlVHlwZTpyZS50eXBlc1t0LnR5cGVdLnRvTG93ZXJDYXNlKCl9LHN9LGkwPSh0LGUpPT57Y29uc3Qgbj1bZS54LGUueSxlLmxldmVsLC4uLnQuZmxhdE1hcChyPT5yLm1hcChpPT5baS54LGkueV0pKV0uam9pbigiOiIpO3JldHVybiBraChuKX0sbzA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fSxtZT10eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZwZXJmb3JtYW5jZSYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj9wZXJmb3JtYW5jZTpEYXRlLGppPW5ldyBTZXQscnI9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZwcm9jZXNzP3Byb2Nlc3M6e30sR2k9KHQsZSxuLHIpPT57dHlwZW9mIHJyLmVtaXRXYXJuaW5nPT0iZnVuY3Rpb24iP3JyLmVtaXRXYXJuaW5nKHQsZSxuLHIpOmNvbnNvbGUuZXJyb3IoYFske259XSAke2V9OiAke3R9YCl9O2xldCBmbj1nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciwkaT1nbG9iYWxUaGlzLkFib3J0U2lnbmFsO2lmKHR5cGVvZiBmbj4idSIpeyRpPWNsYXNze2NvbnN0cnVjdG9yKCl7dih0aGlzLCJvbmFib3J0Iik7dih0aGlzLCJfb25hYm9ydCIsW10pO3YodGhpcywicmVhc29uIik7dih0aGlzLCJhYm9ydGVkIiwhMSl9YWRkRXZlbnRMaXN0ZW5lcihyLGkpe3RoaXMuX29uYWJvcnQucHVzaChpKX19LGZuPWNsYXNze2NvbnN0cnVjdG9yKCl7dih0aGlzLCJzaWduYWwiLG5ldyAkaSk7ZSgpfWFib3J0KHIpe3ZhciBpLG87aWYoIXRoaXMuc2lnbmFsLmFib3J0ZWQpe3RoaXMuc2lnbmFsLnJlYXNvbj1yLHRoaXMuc2lnbmFsLmFib3J0ZWQ9ITA7Zm9yKGNvbnN0IHMgb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpcyhyKTsobz0oaT10aGlzLnNpZ25hbCkub25hYm9ydCk9PW51bGx8fG8uY2FsbChpLHIpfX19O2xldCB0PSgoSGk9cnIuZW52KT09bnVsbD92b2lkIDA6SGkuTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HKSE9PSIxIjtjb25zdCBlPSgpPT57dCYmKHQ9ITEsR2koIkFib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluIG5vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlIGBub2RlLWFib3J0LWNvbnRyb2xsZXJgIHBhY2thZ2UuIEEgbWluaW1hbCBwb2x5ZmlsbCBpcyBwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgdXNlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMpLiBZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuIiwiTk9fQUJPUlRfQ09OVFJPTExFUiIsIkVOT1RTVVAiLGUpKX19Y29uc3QgczA9dD0+IWppLmhhcyh0KSxRdD10PT50JiZ0PT09TWF0aC5mbG9vcih0KSYmdD4wJiZpc0Zpbml0ZSh0KSxWaT10PT5RdCh0KT90PD1NYXRoLnBvdygyLDgpP1VpbnQ4QXJyYXk6dDw9TWF0aC5wb3coMiwxNik/VWludDE2QXJyYXk6dDw9TWF0aC5wb3coMiwzMik/VWludDMyQXJyYXk6dDw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/bG46bnVsbDpudWxsO2NsYXNzIGxuIGV4dGVuZHMgQXJyYXl7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5maWxsKDApfX1jb25zdCB3ZT1jbGFzc3tjb25zdHJ1Y3RvcihlLG4pe3YodGhpcywiaGVhcCIpO3YodGhpcywibGVuZ3RoIik7aWYoIWMod2UsRmUpKXRocm93IG5ldyBUeXBlRXJyb3IoImluc3RhbnRpYXRlIFN0YWNrIHVzaW5nIFN0YWNrLmNyZWF0ZShuKSIpO3RoaXMuaGVhcD1uZXcgbihlKSx0aGlzLmxlbmd0aD0wfXN0YXRpYyBjcmVhdGUoZSl7Y29uc3Qgbj1WaShlKTtpZighbilyZXR1cm5bXTtDKHdlLEZlLCEwKTtjb25zdCByPW5ldyB3ZShlLG4pO3JldHVybiBDKHdlLEZlLCExKSxyfXB1c2goZSl7dGhpcy5oZWFwW3RoaXMubGVuZ3RoKytdPWV9cG9wKCl7cmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXX19O2xldCBkbj13ZTtGZT1uZXcgV2Vha01hcCxVKGRuLEZlLCExKTtjb25zdCBvcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXtVKHRoaXMsJGUpO1UodGhpcyxFbik7VSh0aGlzLCR0KTtVKHRoaXMsVnQpO1UodGhpcyxXZSk7VSh0aGlzLE1lKTtVKHRoaXMsQ2UpO1UodGhpcyxZKTtVKHRoaXMsWGUpO1UodGhpcyxsZSk7VSh0aGlzLEl0LHZvaWQgMCk7VSh0aGlzLFJ0LHZvaWQgMCk7VSh0aGlzLE50LHZvaWQgMCk7VSh0aGlzLE10LHZvaWQgMCk7VSh0aGlzLEllLHZvaWQgMCk7dih0aGlzLCJ0dGwiKTt2KHRoaXMsInR0bFJlc29sdXRpb24iKTt2KHRoaXMsInR0bEF1dG9wdXJnZSIpO3YodGhpcywidXBkYXRlQWdlT25HZXQiKTt2KHRoaXMsInVwZGF0ZUFnZU9uSGFzIik7dih0aGlzLCJhbGxvd1N0YWxlIik7dih0aGlzLCJub0Rpc3Bvc2VPblNldCIpO3YodGhpcywibm9VcGRhdGVUVEwiKTt2KHRoaXMsIm1heEVudHJ5U2l6ZSIpO3YodGhpcywic2l6ZUNhbGN1bGF0aW9uIik7dih0aGlzLCJub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24iKTt2KHRoaXMsIm5vRGVsZXRlT25TdGFsZUdldCIpO3YodGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCIpO3YodGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24iKTt2KHRoaXMsImlnbm9yZUZldGNoQWJvcnQiKTtVKHRoaXMsdXQsdm9pZCAwKTtVKHRoaXMsQ3Qsdm9pZCAwKTtVKHRoaXMsYXQsdm9pZCAwKTtVKHRoaXMsdHQsdm9pZCAwKTtVKHRoaXMsTCx2b2lkIDApO1UodGhpcyxfdCx2b2lkIDApO1UodGhpcyx4dCx2b2lkIDApO1UodGhpcyxFdCx2b2lkIDApO1UodGhpcyxodCx2b2lkIDApO1UodGhpcyx2dCx2b2lkIDApO1UodGhpcyxmdCx2b2lkIDApO1UodGhpcyxEdCx2b2lkIDApO1UodGhpcyxMdCx2b2lkIDApO1UodGhpcyxPdCx2b2lkIDApO1UodGhpcyxQdCx2b2lkIDApO1UodGhpcyxKdCx2b2lkIDApO1UodGhpcyxwdCx2b2lkIDApO1UodGhpcyxoZSwoKT0+e30pO1UodGhpcyxIdCwoKT0+e30pO1UodGhpcyxWZSwoKT0+e30pO1UodGhpcyxidCwoKT0+ITEpO1UodGhpcyxmZSxlPT57fSk7VSh0aGlzLE5lLChlLG4scik9Pnt9KTtVKHRoaXMsemUsKGUsbixyLGkpPT57aWYocnx8aSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlIik7cmV0dXJuIDB9KTt2KHRoaXMsUjAsIkxSVUNhY2hlIik7Y29uc3R7bWF4Om49MCx0dGw6cix0dGxSZXNvbHV0aW9uOmk9MSx0dGxBdXRvcHVyZ2U6byx1cGRhdGVBZ2VPbkdldDpzLHVwZGF0ZUFnZU9uSGFzOnUsYWxsb3dTdGFsZTphLGRpc3Bvc2U6bCxkaXNwb3NlQWZ0ZXI6ZCxub0Rpc3Bvc2VPblNldDpfLG5vVXBkYXRlVFRMOk8sbWF4U2l6ZTpiPTAsbWF4RW50cnlTaXplOkY9MCxzaXplQ2FsY3VsYXRpb246UyxmZXRjaE1ldGhvZDpOLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpnLG5vRGVsZXRlT25TdGFsZUdldDpHLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOkssYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpWLGlnbm9yZUZldGNoQWJvcnQ6aXR9PWU7aWYobiE9PTAmJiFRdChuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggb3B0aW9uIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIik7Y29uc3QgbHQ9bj9WaShuKTpBcnJheTtpZighbHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG1heCB2YWx1ZTogIituKTtpZihDKHRoaXMsSXQsbiksQyh0aGlzLFJ0LGIpLHRoaXMubWF4RW50cnlTaXplPUZ8fGModGhpcyxSdCksdGhpcy5zaXplQ2FsY3VsYXRpb249Uyx0aGlzLnNpemVDYWxjdWxhdGlvbil7aWYoIWModGhpcyxSdCkmJiF0aGlzLm1heEVudHJ5U2l6ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUiKTtpZih0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24iKX1pZihOIT09dm9pZCAwJiZ0eXBlb2YgTiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkIik7aWYoQyh0aGlzLEllLE4pLEModGhpcyxKdCwhIU4pLEModGhpcyxhdCxuZXcgTWFwKSxDKHRoaXMsdHQsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksQyh0aGlzLEwsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksQyh0aGlzLF90LG5ldyBsdChuKSksQyh0aGlzLHh0LG5ldyBsdChuKSksQyh0aGlzLEV0LDApLEModGhpcyxodCwwKSxDKHRoaXMsdnQsZG4uY3JlYXRlKG4pKSxDKHRoaXMsdXQsMCksQyh0aGlzLEN0LDApLHR5cGVvZiBsPT0iZnVuY3Rpb24iJiZDKHRoaXMsTnQsbCksdHlwZW9mIGQ9PSJmdW5jdGlvbiI/KEModGhpcyxNdCxkKSxDKHRoaXMsZnQsW10pKTooQyh0aGlzLE10LHZvaWQgMCksQyh0aGlzLGZ0LHZvaWQgMCkpLEModGhpcyxQdCwhIWModGhpcyxOdCkpLEModGhpcyxwdCwhIWModGhpcyxNdCkpLHRoaXMubm9EaXNwb3NlT25TZXQ9ISFfLHRoaXMubm9VcGRhdGVUVEw9ISFPLHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uPSEhZyx0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uPSEhSyx0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQ9ISFWLHRoaXMuaWdub3JlRmV0Y2hBYm9ydD0hIWl0LHRoaXMubWF4RW50cnlTaXplIT09MCl7aWYoYyh0aGlzLFJ0KSE9PTAmJiFRdChjKHRoaXMsUnQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO2lmKCFRdCh0aGlzLm1heEVudHJ5U2l6ZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO3codGhpcyxFbixxaSkuY2FsbCh0aGlzKX1pZih0aGlzLmFsbG93U3RhbGU9ISFhLHRoaXMubm9EZWxldGVPblN0YWxlR2V0PSEhRyx0aGlzLnVwZGF0ZUFnZU9uR2V0PSEhcyx0aGlzLnVwZGF0ZUFnZU9uSGFzPSEhdSx0aGlzLnR0bFJlc29sdXRpb249UXQoaSl8fGk9PT0wP2k6MSx0aGlzLnR0bEF1dG9wdXJnZT0hIW8sdGhpcy50dGw9cnx8MCx0aGlzLnR0bCl7aWYoIVF0KHRoaXMudHRsKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0dGwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7dyh0aGlzLCRlLHVyKS5jYWxsKHRoaXMpfWlmKGModGhpcyxJdCk9PT0wJiZ0aGlzLnR0bD09PTAmJmModGhpcyxSdCk9PT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkF0IGxlYXN0IG9uZSBvZiBtYXgsIG1heFNpemUsIG9yIHR0bCBpcyByZXF1aXJlZCIpO2lmKCF0aGlzLnR0bEF1dG9wdXJnZSYmIWModGhpcyxJdCkmJiFjKHRoaXMsUnQpKXtjb25zdCBydD0iTFJVX0NBQ0hFX1VOQk9VTkRFRCI7czAocnQpJiYoamkuYWRkKHJ0KSxHaSgiVFRMIGNhY2hpbmcgd2l0aG91dCB0dGxBdXRvcHVyZ2UsIG1heCwgb3IgbWF4U2l6ZSBjYW4gcmVzdWx0IGluIHVuYm91bmRlZCBtZW1vcnkgY29uc3VtcHRpb24uIiwiVW5ib3VuZGVkQ2FjaGVXYXJuaW5nIixydCxvcikpfX1zdGF0aWMgdW5zYWZlRXhwb3NlSW50ZXJuYWxzKGUpe3JldHVybntzdGFydHM6YyhlLEx0KSx0dGxzOmMoZSxPdCksc2l6ZXM6YyhlLER0KSxrZXlNYXA6YyhlLGF0KSxrZXlMaXN0OmMoZSx0dCksdmFsTGlzdDpjKGUsTCksbmV4dDpjKGUsX3QpLHByZXY6YyhlLHh0KSxnZXQgaGVhZCgpe3JldHVybiBjKGUsRXQpfSxnZXQgdGFpbCgpe3JldHVybiBjKGUsaHQpfSxmcmVlOmMoZSx2dCksaXNCYWNrZ3JvdW5kRmV0Y2g6bj0+e3ZhciByO3JldHVybiB3KHI9ZSxZLGV0KS5jYWxsKHIsbil9LGJhY2tncm91bmRGZXRjaDoobixyLGksbyk9Pnt2YXIgcztyZXR1cm4gdyhzPWUsQ2UsVG4pLmNhbGwocyxuLHIsaSxvKX0sbW92ZVRvVGFpbDpuPT57dmFyIHI7cmV0dXJuIHcocj1lLGxlLHFlKS5jYWxsKHIsbil9LGluZGV4ZXM6bj0+e3ZhciByO3JldHVybiB3KHI9ZSwkdCx0ZSkuY2FsbChyLG4pfSxyaW5kZXhlczpuPT57dmFyIHI7cmV0dXJuIHcocj1lLFZ0LGVlKS5jYWxsKHIsbil9LGlzU3RhbGU6bj0+e3ZhciByO3JldHVybiBjKHI9ZSxidCkuY2FsbChyLG4pfX19Z2V0IG1heCgpe3JldHVybiBjKHRoaXMsSXQpfWdldCBtYXhTaXplKCl7cmV0dXJuIGModGhpcyxSdCl9Z2V0IGNhbGN1bGF0ZWRTaXplKCl7cmV0dXJuIGModGhpcyxDdCl9Z2V0IHNpemUoKXtyZXR1cm4gYyh0aGlzLHV0KX1nZXQgZmV0Y2hNZXRob2QoKXtyZXR1cm4gYyh0aGlzLEllKX1nZXQgZGlzcG9zZSgpe3JldHVybiBjKHRoaXMsTnQpfWdldCBkaXNwb3NlQWZ0ZXIoKXtyZXR1cm4gYyh0aGlzLE10KX1nZXRSZW1haW5pbmdUVEwoZSl7cmV0dXJuIGModGhpcyxhdCkuaGFzKGUpPzEvMDowfSplbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLCR0LHRlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KnJlbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KmtleXMoKXtmb3IoY29uc3QgZSBvZiB3KHRoaXMsJHQsdGUpLmNhbGwodGhpcykpe2NvbnN0IG49Yyh0aGlzLHR0KVtlXTtuIT09dm9pZCAwJiYhdyh0aGlzLFksZXQpLmNhbGwodGhpcyxjKHRoaXMsTClbZV0pJiYoeWllbGQgbil9fSpya2V5cygpe2Zvcihjb25zdCBlIG9mIHcodGhpcyxWdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3Qgbj1jKHRoaXMsdHQpW2VdO24hPT12b2lkIDAmJiF3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBuKX19KnZhbHVlcygpe2Zvcihjb25zdCBlIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzKSljKHRoaXMsTClbZV0hPT12b2lkIDAmJiF3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBjKHRoaXMsTClbZV0pfSpydmFsdWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkIGModGhpcyxMKVtlXSl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9ZmluZChlLG49e30pe2Zvcihjb25zdCByIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsWSxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtpZihvIT09dm9pZCAwJiZlKG8sYyh0aGlzLHR0KVtyXSx0aGlzKSlyZXR1cm4gdGhpcy5nZXQoYyh0aGlzLHR0KVtyXSxuKX19Zm9yRWFjaChlLG49dGhpcyl7Zm9yKGNvbnN0IHIgb2Ygdyh0aGlzLCR0LHRlKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyxMKVtyXSxvPXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO28hPT12b2lkIDAmJmUuY2FsbChuLG8sYyh0aGlzLHR0KVtyXSx0aGlzKX19cmZvckVhY2goZSxuPXRoaXMpe2Zvcihjb25zdCByIG9mIHcodGhpcyxWdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsWSxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtvIT09dm9pZCAwJiZlLmNhbGwobixvLGModGhpcyx0dClbcl0sdGhpcyl9fXB1cmdlU3RhbGUoKXtsZXQgZT0hMTtmb3IoY29uc3QgbiBvZiB3KHRoaXMsVnQsZWUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKWModGhpcyxidCkuY2FsbCh0aGlzLG4pJiYodGhpcy5kZWxldGUoYyh0aGlzLHR0KVtuXSksZT0hMCk7cmV0dXJuIGV9aW5mbyhlKXtjb25zdCBuPWModGhpcyxhdCkuZ2V0KGUpO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHI9Yyh0aGlzLEwpW25dLGk9dyh0aGlzLFksZXQpLmNhbGwodGhpcyxyKT9yLl9fc3RhbGVXaGlsZUZldGNoaW5nOnI7aWYoaT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbz17dmFsdWU6aX07aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7Y29uc3Qgcz1jKHRoaXMsT3QpW25dLHU9Yyh0aGlzLEx0KVtuXTtpZihzJiZ1KXtjb25zdCBhPXMtKG1lLm5vdygpLXUpO28udHRsPWEsby5zdGFydD1EYXRlLm5vdygpfX1yZXR1cm4gYyh0aGlzLER0KSYmKG8uc2l6ZT1jKHRoaXMsRHQpW25dKSxvfWR1bXAoKXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpe2NvbnN0IHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXSxvPXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO2lmKG89PT12b2lkIDB8fHI9PT12b2lkIDApY29udGludWU7Y29uc3Qgcz17dmFsdWU6b307aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7cy50dGw9Yyh0aGlzLE90KVtuXTtjb25zdCB1PW1lLm5vdygpLWModGhpcyxMdClbbl07cy5zdGFydD1NYXRoLmZsb29yKERhdGUubm93KCktdSl9Yyh0aGlzLER0KSYmKHMuc2l6ZT1jKHRoaXMsRHQpW25dKSxlLnVuc2hpZnQoW3Isc10pfXJldHVybiBlfWxvYWQoZSl7dGhpcy5jbGVhcigpO2Zvcihjb25zdFtuLHJdb2YgZSl7aWYoci5zdGFydCl7Y29uc3QgaT1EYXRlLm5vdygpLXIuc3RhcnQ7ci5zdGFydD1tZS5ub3coKS1pfXRoaXMuc2V0KG4sci52YWx1ZSxyKX19c2V0KGUsbixyPXt9KXt2YXIgTyxiLEYsUyxOO2lmKG49PT12b2lkIDApcmV0dXJuIHRoaXMuZGVsZXRlKGUpLHRoaXM7Y29uc3R7dHRsOmk9dGhpcy50dGwsc3RhcnQ6byxub0Rpc3Bvc2VPblNldDpzPXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZUNhbGN1bGF0aW9uOnU9dGhpcy5zaXplQ2FsY3VsYXRpb24sc3RhdHVzOmF9PXI7bGV0e25vVXBkYXRlVFRMOmw9dGhpcy5ub1VwZGF0ZVRUTH09cjtjb25zdCBkPWModGhpcyx6ZSkuY2FsbCh0aGlzLGUsbixyLnNpemV8fDAsdSk7aWYodGhpcy5tYXhFbnRyeVNpemUmJmQ+dGhpcy5tYXhFbnRyeVNpemUpcmV0dXJuIGEmJihhLnNldD0ibWlzcyIsYS5tYXhFbnRyeVNpemVFeGNlZWRlZD0hMCksdGhpcy5kZWxldGUoZSksdGhpcztsZXQgXz1jKHRoaXMsdXQpPT09MD92b2lkIDA6Yyh0aGlzLGF0KS5nZXQoZSk7aWYoXz09PXZvaWQgMClfPWModGhpcyx1dCk9PT0wP2ModGhpcyxodCk6Yyh0aGlzLHZ0KS5sZW5ndGghPT0wP2ModGhpcyx2dCkucG9wKCk6Yyh0aGlzLHV0KT09PWModGhpcyxJdCk/dyh0aGlzLE1lLEFuKS5jYWxsKHRoaXMsITEpOmModGhpcyx1dCksYyh0aGlzLHR0KVtfXT1lLGModGhpcyxMKVtfXT1uLGModGhpcyxhdCkuc2V0KGUsXyksYyh0aGlzLF90KVtjKHRoaXMsaHQpXT1fLGModGhpcyx4dClbX109Yyh0aGlzLGh0KSxDKHRoaXMsaHQsXykseW4odGhpcyx1dCkuXysrLGModGhpcyxOZSkuY2FsbCh0aGlzLF8sZCxhKSxhJiYoYS5zZXQ9ImFkZCIpLGw9ITE7ZWxzZXt3KHRoaXMsbGUscWUpLmNhbGwodGhpcyxfKTtjb25zdCBnPWModGhpcyxMKVtfXTtpZihuIT09Zyl7aWYoYyh0aGlzLEp0KSYmdyh0aGlzLFksZXQpLmNhbGwodGhpcyxnKSl7Zy5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoInJlcGxhY2VkIikpO2NvbnN0e19fc3RhbGVXaGlsZUZldGNoaW5nOkd9PWc7RyE9PXZvaWQgMCYmIXMmJihjKHRoaXMsUHQpJiYoKE89Yyh0aGlzLE50KSk9PW51bGx8fE8uY2FsbCh0aGlzLEcsZSwic2V0IikpLGModGhpcyxwdCkmJigoYj1jKHRoaXMsZnQpKT09bnVsbHx8Yi5wdXNoKFtHLGUsInNldCJdKSkpfWVsc2Ugc3x8KGModGhpcyxQdCkmJigoRj1jKHRoaXMsTnQpKT09bnVsbHx8Ri5jYWxsKHRoaXMsZyxlLCJzZXQiKSksYyh0aGlzLHB0KSYmKChTPWModGhpcyxmdCkpPT1udWxsfHxTLnB1c2goW2csZSwic2V0Il0pKSk7aWYoYyh0aGlzLGZlKS5jYWxsKHRoaXMsXyksYyh0aGlzLE5lKS5jYWxsKHRoaXMsXyxkLGEpLGModGhpcyxMKVtfXT1uLGEpe2Euc2V0PSJyZXBsYWNlIjtjb25zdCBHPWcmJncodGhpcyxZLGV0KS5jYWxsKHRoaXMsZyk/Zy5fX3N0YWxlV2hpbGVGZXRjaGluZzpnO0chPT12b2lkIDAmJihhLm9sZFZhbHVlPUcpfX1lbHNlIGEmJihhLnNldD0idXBkYXRlIil9aWYoaSE9PTAmJiFjKHRoaXMsT3QpJiZ3KHRoaXMsJGUsdXIpLmNhbGwodGhpcyksYyh0aGlzLE90KSYmKGx8fGModGhpcyxWZSkuY2FsbCh0aGlzLF8saSxvKSxhJiZjKHRoaXMsSHQpLmNhbGwodGhpcyxhLF8pKSwhcyYmYyh0aGlzLHB0KSYmYyh0aGlzLGZ0KSl7Y29uc3QgZz1jKHRoaXMsZnQpO2xldCBHO2Zvcig7Rz1nPT1udWxsP3ZvaWQgMDpnLnNoaWZ0KCk7KShOPWModGhpcyxNdCkpPT1udWxsfHxOLmNhbGwodGhpcywuLi5HKX1yZXR1cm4gdGhpc31wb3AoKXt2YXIgZTt0cnl7Zm9yKDtjKHRoaXMsdXQpOyl7Y29uc3Qgbj1jKHRoaXMsTClbYyh0aGlzLEV0KV07aWYodyh0aGlzLE1lLEFuKS5jYWxsKHRoaXMsITApLHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsbikpe2lmKG4uX19zdGFsZVdoaWxlRmV0Y2hpbmcpcmV0dXJuIG4uX19zdGFsZVdoaWxlRmV0Y2hpbmd9ZWxzZSBpZihuIT09dm9pZCAwKXJldHVybiBufX1maW5hbGx5e2lmKGModGhpcyxwdCkmJmModGhpcyxmdCkpe2NvbnN0IG49Yyh0aGlzLGZ0KTtsZXQgcjtmb3IoO3I9bj09bnVsbD92b2lkIDA6bi5zaGlmdCgpOykoZT1jKHRoaXMsTXQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsLi4ucil9fX1oYXMoZSxuPXt9KXtjb25zdHt1cGRhdGVBZ2VPbkhhczpyPXRoaXMudXBkYXRlQWdlT25IYXMsc3RhdHVzOml9PW4sbz1jKHRoaXMsYXQpLmdldChlKTtpZihvIT09dm9pZCAwKXtjb25zdCBzPWModGhpcyxMKVtvXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLHMpJiZzLl9fc3RhbGVXaGlsZUZldGNoaW5nPT09dm9pZCAwKXJldHVybiExO2lmKGModGhpcyxidCkuY2FsbCh0aGlzLG8pKWkmJihpLmhhcz0ic3RhbGUiLGModGhpcyxIdCkuY2FsbCh0aGlzLGksbykpO2Vsc2UgcmV0dXJuIHImJmModGhpcyxoZSkuY2FsbCh0aGlzLG8pLGkmJihpLmhhcz0iaGl0IixjKHRoaXMsSHQpLmNhbGwodGhpcyxpLG8pKSwhMH1lbHNlIGkmJihpLmhhcz0ibWlzcyIpO3JldHVybiExfXBlZWsoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlfT1uLGk9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoaT09PXZvaWQgMHx8IXImJmModGhpcyxidCkuY2FsbCh0aGlzLGkpKXJldHVybjtjb25zdCBvPWModGhpcyxMKVtpXTtyZXR1cm4gdyh0aGlzLFksZXQpLmNhbGwodGhpcyxvKT9vLl9fc3RhbGVXaGlsZUZldGNoaW5nOm99YXN5bmMgZmV0Y2goZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCx0dGw6cz10aGlzLnR0bCxub0Rpc3Bvc2VPblNldDp1PXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZTphPTAsc2l6ZUNhbGN1bGF0aW9uOmw9dGhpcy5zaXplQ2FsY3VsYXRpb24sbm9VcGRhdGVUVEw6ZD10aGlzLm5vVXBkYXRlVFRMLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfPXRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk89dGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixpZ25vcmVGZXRjaEFib3J0OmI9dGhpcy5pZ25vcmVGZXRjaEFib3J0LGFsbG93U3RhbGVPbkZldGNoQWJvcnQ6Rj10aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsY29udGV4dDpTLGZvcmNlUmVmcmVzaDpOPSExLHN0YXR1czpnLHNpZ25hbDpHfT1uO2lmKCFjKHRoaXMsSnQpKXJldHVybiBnJiYoZy5mZXRjaD0iZ2V0IiksdGhpcy5nZXQoZSx7YWxsb3dTdGFsZTpyLHVwZGF0ZUFnZU9uR2V0Omksbm9EZWxldGVPblN0YWxlR2V0Om8sc3RhdHVzOmd9KTtjb25zdCBLPXthbGxvd1N0YWxlOnIsdXBkYXRlQWdlT25HZXQ6aSxub0RlbGV0ZU9uU3RhbGVHZXQ6byx0dGw6cyxub0Rpc3Bvc2VPblNldDp1LHNpemU6YSxzaXplQ2FsY3VsYXRpb246bCxub1VwZGF0ZVRUTDpkLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk8sYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpGLGlnbm9yZUZldGNoQWJvcnQ6YixzdGF0dXM6ZyxzaWduYWw6R307bGV0IFY9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoVj09PXZvaWQgMCl7ZyYmKGcuZmV0Y2g9Im1pc3MiKTtjb25zdCBpdD13KHRoaXMsQ2UsVG4pLmNhbGwodGhpcyxlLFYsSyxTKTtyZXR1cm4gaXQuX19yZXR1cm5lZD1pdH1lbHNle2NvbnN0IGl0PWModGhpcyxMKVtWXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGl0KSl7Y29uc3QgQj1yJiZpdC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMDtyZXR1cm4gZyYmKGcuZmV0Y2g9ImluZmxpZ2h0IixCJiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksQj9pdC5fX3N0YWxlV2hpbGVGZXRjaGluZzppdC5fX3JldHVybmVkPWl0fWNvbnN0IGx0PWModGhpcyxidCkuY2FsbCh0aGlzLFYpO2lmKCFOJiYhbHQpcmV0dXJuIGcmJihnLmZldGNoPSJoaXQiKSx3KHRoaXMsbGUscWUpLmNhbGwodGhpcyxWKSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyxWKSxnJiZjKHRoaXMsSHQpLmNhbGwodGhpcyxnLFYpLGl0O2NvbnN0IHJ0PXcodGhpcyxDZSxUbikuY2FsbCh0aGlzLGUsVixLLFMpLFQ9cnQuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJnI7cmV0dXJuIGcmJihnLmZldGNoPWx0PyJzdGFsZSI6InJlZnJlc2giLFQmJmx0JiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksVD9ydC5fX3N0YWxlV2hpbGVGZXRjaGluZzpydC5fX3JldHVybmVkPXJ0fX1nZXQoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCxzdGF0dXM6c309bix1PWModGhpcyxhdCkuZ2V0KGUpO2lmKHUhPT12b2lkIDApe2NvbnN0IGE9Yyh0aGlzLEwpW3VdLGw9dyh0aGlzLFksZXQpLmNhbGwodGhpcyxhKTtyZXR1cm4gcyYmYyh0aGlzLEh0KS5jYWxsKHRoaXMscyx1KSxjKHRoaXMsYnQpLmNhbGwodGhpcyx1KT8ocyYmKHMuZ2V0PSJzdGFsZSIpLGw/KHMmJnImJmEuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJihzLnJldHVybmVkU3RhbGU9ITApLHI/YS5fX3N0YWxlV2hpbGVGZXRjaGluZzp2b2lkIDApOihvfHx0aGlzLmRlbGV0ZShlKSxzJiZyJiYocy5yZXR1cm5lZFN0YWxlPSEwKSxyP2E6dm9pZCAwKSk6KHMmJihzLmdldD0iaGl0IiksbD9hLl9fc3RhbGVXaGlsZUZldGNoaW5nOih3KHRoaXMsbGUscWUpLmNhbGwodGhpcyx1KSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyx1KSxhKSl9ZWxzZSBzJiYocy5nZXQ9Im1pc3MiKX1kZWxldGUoZSl7dmFyIHIsaSxvLHM7bGV0IG49ITE7aWYoYyh0aGlzLHV0KSE9PTApe2NvbnN0IHU9Yyh0aGlzLGF0KS5nZXQoZSk7aWYodSE9PXZvaWQgMClpZihuPSEwLGModGhpcyx1dCk9PT0xKXRoaXMuY2xlYXIoKTtlbHNle2ModGhpcyxmZSkuY2FsbCh0aGlzLHUpO2NvbnN0IGE9Yyh0aGlzLEwpW3VdO2lmKHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYSk/YS5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoImRlbGV0ZWQiKSk6KGModGhpcyxQdCl8fGModGhpcyxwdCkpJiYoYyh0aGlzLFB0KSYmKChyPWModGhpcyxOdCkpPT1udWxsfHxyLmNhbGwodGhpcyxhLGUsImRlbGV0ZSIpKSxjKHRoaXMscHQpJiYoKGk9Yyh0aGlzLGZ0KSk9PW51bGx8fGkucHVzaChbYSxlLCJkZWxldGUiXSkpKSxjKHRoaXMsYXQpLmRlbGV0ZShlKSxjKHRoaXMsdHQpW3VdPXZvaWQgMCxjKHRoaXMsTClbdV09dm9pZCAwLHU9PT1jKHRoaXMsaHQpKUModGhpcyxodCxjKHRoaXMseHQpW3VdKTtlbHNlIGlmKHU9PT1jKHRoaXMsRXQpKUModGhpcyxFdCxjKHRoaXMsX3QpW3VdKTtlbHNle2NvbnN0IGw9Yyh0aGlzLHh0KVt1XTtjKHRoaXMsX3QpW2xdPWModGhpcyxfdClbdV07Y29uc3QgZD1jKHRoaXMsX3QpW3VdO2ModGhpcyx4dClbZF09Yyh0aGlzLHh0KVt1XX15bih0aGlzLHV0KS5fLS0sYyh0aGlzLHZ0KS5wdXNoKHUpfX1pZihjKHRoaXMscHQpJiYoKG89Yyh0aGlzLGZ0KSkhPW51bGwmJm8ubGVuZ3RoKSl7Y29uc3QgdT1jKHRoaXMsZnQpO2xldCBhO2Zvcig7YT11PT1udWxsP3ZvaWQgMDp1LnNoaWZ0KCk7KShzPWModGhpcyxNdCkpPT1udWxsfHxzLmNhbGwodGhpcywuLi5hKX1yZXR1cm4gbn1jbGVhcigpe3ZhciBlLG4scjtmb3IoY29uc3QgaSBvZiB3KHRoaXMsVnQsZWUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKXtjb25zdCBvPWModGhpcyxMKVtpXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLG8pKW8uX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCJkZWxldGVkIikpO2Vsc2V7Y29uc3Qgcz1jKHRoaXMsdHQpW2ldO2ModGhpcyxQdCkmJigoZT1jKHRoaXMsTnQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsbyxzLCJkZWxldGUiKSksYyh0aGlzLHB0KSYmKChuPWModGhpcyxmdCkpPT1udWxsfHxuLnB1c2goW28scywiZGVsZXRlIl0pKX19aWYoYyh0aGlzLGF0KS5jbGVhcigpLGModGhpcyxMKS5maWxsKHZvaWQgMCksYyh0aGlzLHR0KS5maWxsKHZvaWQgMCksYyh0aGlzLE90KSYmYyh0aGlzLEx0KSYmKGModGhpcyxPdCkuZmlsbCgwKSxjKHRoaXMsTHQpLmZpbGwoMCkpLGModGhpcyxEdCkmJmModGhpcyxEdCkuZmlsbCgwKSxDKHRoaXMsRXQsMCksQyh0aGlzLGh0LDApLGModGhpcyx2dCkubGVuZ3RoPTAsQyh0aGlzLEN0LDApLEModGhpcyx1dCwwKSxjKHRoaXMscHQpJiZjKHRoaXMsZnQpKXtjb25zdCBpPWModGhpcyxmdCk7bGV0IG87Zm9yKDtvPWk9PW51bGw/dm9pZCAwOmkuc2hpZnQoKTspKHI9Yyh0aGlzLE10KSk9PW51bGx8fHIuY2FsbCh0aGlzLC4uLm8pfX19O2xldCBpcj1vcjtSMD1TeW1ib2wudG9TdHJpbmdUYWcsSXQ9bmV3IFdlYWtNYXAsUnQ9bmV3IFdlYWtNYXAsTnQ9bmV3IFdlYWtNYXAsTXQ9bmV3IFdlYWtNYXAsSWU9bmV3IFdlYWtNYXAsdXQ9bmV3IFdlYWtNYXAsQ3Q9bmV3IFdlYWtNYXAsYXQ9bmV3IFdlYWtNYXAsdHQ9bmV3IFdlYWtNYXAsTD1uZXcgV2Vha01hcCxfdD1uZXcgV2Vha01hcCx4dD1uZXcgV2Vha01hcCxFdD1uZXcgV2Vha01hcCxodD1uZXcgV2Vha01hcCx2dD1uZXcgV2Vha01hcCxmdD1uZXcgV2Vha01hcCxEdD1uZXcgV2Vha01hcCxMdD1uZXcgV2Vha01hcCxPdD1uZXcgV2Vha01hcCxQdD1uZXcgV2Vha01hcCxKdD1uZXcgV2Vha01hcCxwdD1uZXcgV2Vha01hcCwkZT1uZXcgV2Vha1NldCx1cj1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGxuKGModGhpcyxJdCkpLG49bmV3IGxuKGModGhpcyxJdCkpO0ModGhpcyxPdCxlKSxDKHRoaXMsTHQsbiksQyh0aGlzLFZlLChvLHMsdT1tZS5ub3coKSk9PntpZihuW29dPXMhPT0wP3U6MCxlW29dPXMscyE9PTAmJnRoaXMudHRsQXV0b3B1cmdlKXtjb25zdCBhPXNldFRpbWVvdXQoKCk9PntjKHRoaXMsYnQpLmNhbGwodGhpcyxvKSYmdGhpcy5kZWxldGUoYyh0aGlzLHR0KVtvXSl9LHMrMSk7YS51bnJlZiYmYS51bnJlZigpfX0pLEModGhpcyxoZSxvPT57bltvXT1lW29dIT09MD9tZS5ub3coKTowfSksQyh0aGlzLEh0LChvLHMpPT57aWYoZVtzXSl7Y29uc3QgdT1lW3NdLGE9bltzXTtpZighdXx8IWEpcmV0dXJuO28udHRsPXUsby5zdGFydD1hLG8ubm93PXJ8fGkoKTtjb25zdCBsPW8ubm93LWE7by5yZW1haW5pbmdUVEw9dS1sfX0pO2xldCByPTA7Y29uc3QgaT0oKT0+e2NvbnN0IG89bWUubm93KCk7aWYodGhpcy50dGxSZXNvbHV0aW9uPjApe3I9bztjb25zdCBzPXNldFRpbWVvdXQoKCk9PnI9MCx0aGlzLnR0bFJlc29sdXRpb24pO3MudW5yZWYmJnMudW5yZWYoKX1yZXR1cm4gb307dGhpcy5nZXRSZW1haW5pbmdUVEw9bz0+e2NvbnN0IHM9Yyh0aGlzLGF0KS5nZXQobyk7aWYocz09PXZvaWQgMClyZXR1cm4gMDtjb25zdCB1PWVbc10sYT1uW3NdO2lmKCF1fHwhYSlyZXR1cm4gMS8wO2NvbnN0IGw9KHJ8fGkoKSktYTtyZXR1cm4gdS1sfSxDKHRoaXMsYnQsbz0+e2NvbnN0IHM9bltvXSx1PWVbb107cmV0dXJuISF1JiYhIXMmJihyfHxpKCkpLXM+dX0pfSxoZT1uZXcgV2Vha01hcCxIdD1uZXcgV2Vha01hcCxWZT1uZXcgV2Vha01hcCxidD1uZXcgV2Vha01hcCxFbj1uZXcgV2Vha1NldCxxaT1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGxuKGModGhpcyxJdCkpO0ModGhpcyxDdCwwKSxDKHRoaXMsRHQsZSksQyh0aGlzLGZlLG49PntDKHRoaXMsQ3QsYyh0aGlzLEN0KS1lW25dKSxlW25dPTB9KSxDKHRoaXMsemUsKG4scixpLG8pPT57aWYodyh0aGlzLFksZXQpLmNhbGwodGhpcyxyKSlyZXR1cm4gMDtpZighUXQoaSkpaWYobyl7aWYodHlwZW9mIG8hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIG11c3QgYmUgYSBmdW5jdGlvbiIpO2lmKGk9byhyLG4pLCFRdChpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSIpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiBXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiBvciBzaXplIG11c3QgYmUgc2V0LiIpO3JldHVybiBpfSksQyh0aGlzLE5lLChuLHIsaSk9PntpZihlW25dPXIsYyh0aGlzLFJ0KSl7Y29uc3Qgbz1jKHRoaXMsUnQpLWVbbl07Zm9yKDtjKHRoaXMsQ3QpPm87KXcodGhpcyxNZSxBbikuY2FsbCh0aGlzLCEwKX1DKHRoaXMsQ3QsYyh0aGlzLEN0KStlW25dKSxpJiYoaS5lbnRyeVNpemU9cixpLnRvdGFsQ2FsY3VsYXRlZFNpemU9Yyh0aGlzLEN0KSl9KX0sZmU9bmV3IFdlYWtNYXAsTmU9bmV3IFdlYWtNYXAsemU9bmV3IFdlYWtNYXAsJHQ9bmV3IFdlYWtTZXQsdGU9ZnVuY3Rpb24qKHthbGxvd1N0YWxlOmU9dGhpcy5hbGxvd1N0YWxlfT17fSl7aWYoYyh0aGlzLHV0KSlmb3IobGV0IG49Yyh0aGlzLGh0KTshKCF3KHRoaXMsV2UsY3IpLmNhbGwodGhpcyxuKXx8KChlfHwhYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbikpJiYoeWllbGQgbiksbj09PWModGhpcyxFdCkpKTspbj1jKHRoaXMseHQpW25dfSxWdD1uZXcgV2Vha1NldCxlZT1mdW5jdGlvbiooe2FsbG93U3RhbGU6ZT10aGlzLmFsbG93U3RhbGV9PXt9KXtpZihjKHRoaXMsdXQpKWZvcihsZXQgbj1jKHRoaXMsRXQpOyEoIXcodGhpcyxXZSxjcikuY2FsbCh0aGlzLG4pfHwoKGV8fCFjKHRoaXMsYnQpLmNhbGwodGhpcyxuKSkmJih5aWVsZCBuKSxuPT09Yyh0aGlzLGh0KSkpOyluPWModGhpcyxfdClbbl19LFdlPW5ldyBXZWFrU2V0LGNyPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZjKHRoaXMsYXQpLmdldChjKHRoaXMsdHQpW2VdKT09PWV9LE1lPW5ldyBXZWFrU2V0LEFuPWZ1bmN0aW9uKGUpe3ZhciBvLHM7Y29uc3Qgbj1jKHRoaXMsRXQpLHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXTtyZXR1cm4gYyh0aGlzLEp0KSYmdyh0aGlzLFksZXQpLmNhbGwodGhpcyxpKT9pLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigiZXZpY3RlZCIpKTooYyh0aGlzLFB0KXx8Yyh0aGlzLHB0KSkmJihjKHRoaXMsUHQpJiYoKG89Yyh0aGlzLE50KSk9PW51bGx8fG8uY2FsbCh0aGlzLGksciwiZXZpY3QiKSksYyh0aGlzLHB0KSYmKChzPWModGhpcyxmdCkpPT1udWxsfHxzLnB1c2goW2ksciwiZXZpY3QiXSkpKSxjKHRoaXMsZmUpLmNhbGwodGhpcyxuKSxlJiYoYyh0aGlzLHR0KVtuXT12b2lkIDAsYyh0aGlzLEwpW25dPXZvaWQgMCxjKHRoaXMsdnQpLnB1c2gobikpLGModGhpcyx1dCk9PT0xPyhDKHRoaXMsRXQsQyh0aGlzLGh0LDApKSxjKHRoaXMsdnQpLmxlbmd0aD0wKTpDKHRoaXMsRXQsYyh0aGlzLF90KVtuXSksYyh0aGlzLGF0KS5kZWxldGUocikseW4odGhpcyx1dCkuXy0tLG59LENlPW5ldyBXZWFrU2V0LFRuPWZ1bmN0aW9uKGUsbixyLGkpe2NvbnN0IG89bj09PXZvaWQgMD92b2lkIDA6Yyh0aGlzLEwpW25dO2lmKHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsbykpcmV0dXJuIG87Y29uc3Qgcz1uZXcgZm4se3NpZ25hbDp1fT1yO3U9PW51bGx8fHUuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCgpPT5zLmFib3J0KHUucmVhc29uKSx7c2lnbmFsOnMuc2lnbmFsfSk7Y29uc3QgYT17c2lnbmFsOnMuc2lnbmFsLG9wdGlvbnM6cixjb250ZXh0Oml9LGw9KFMsTj0hMSk9Pntjb25zdHthYm9ydGVkOmd9PXMuc2lnbmFsLEc9ci5pZ25vcmVGZXRjaEFib3J0JiZTIT09dm9pZCAwO2lmKHIuc3RhdHVzJiYoZyYmIU4/KHIuc3RhdHVzLmZldGNoQWJvcnRlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPXMuc2lnbmFsLnJlYXNvbixHJiYoci5zdGF0dXMuZmV0Y2hBYm9ydElnbm9yZWQ9ITApKTpyLnN0YXR1cy5mZXRjaFJlc29sdmVkPSEwKSxnJiYhRyYmIU4pcmV0dXJuIF8ocy5zaWduYWwucmVhc29uKTtjb25zdCBLPWI7cmV0dXJuIGModGhpcyxMKVtuXT09PWImJihTPT09dm9pZCAwP0suX19zdGFsZVdoaWxlRmV0Y2hpbmc/Yyh0aGlzLEwpW25dPUsuX19zdGFsZVdoaWxlRmV0Y2hpbmc6dGhpcy5kZWxldGUoZSk6KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hVcGRhdGVkPSEwKSx0aGlzLnNldChlLFMsYS5vcHRpb25zKSkpLFN9LGQ9Uz0+KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hSZWplY3RlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPVMpLF8oUykpLF89Uz0+e2NvbnN0e2Fib3J0ZWQ6Tn09cy5zaWduYWwsZz1OJiZyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsRz1nfHxyLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLEs9R3x8ci5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sVj1iO2lmKGModGhpcyxMKVtuXT09PWImJighS3x8Vi5fX3N0YWxlV2hpbGVGZXRjaGluZz09PXZvaWQgMD90aGlzLmRlbGV0ZShlKTpnfHwoYyh0aGlzLEwpW25dPVYuX19zdGFsZVdoaWxlRmV0Y2hpbmcpKSxHKXJldHVybiByLnN0YXR1cyYmVi5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmKHIuc3RhdHVzLnJldHVybmVkU3RhbGU9ITApLFYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7aWYoVi5fX3JldHVybmVkPT09Vil0aHJvdyBTfSxPPShTLE4pPT57dmFyIEc7Y29uc3QgZz0oRz1jKHRoaXMsSWUpKT09bnVsbD92b2lkIDA6Ry5jYWxsKHRoaXMsZSxvLGEpO2cmJmcgaW5zdGFuY2VvZiBQcm9taXNlJiZnLnRoZW4oSz0+UyhLPT09dm9pZCAwP3ZvaWQgMDpLKSxOKSxzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PnsoIXIuaWdub3JlRmV0Y2hBYm9ydHx8ci5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSYmKFModm9pZCAwKSxyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQmJihTPUs9PmwoSywhMCkpKX0pfTtyLnN0YXR1cyYmKHIuc3RhdHVzLmZldGNoRGlzcGF0Y2hlZD0hMCk7Y29uc3QgYj1uZXcgUHJvbWlzZShPKS50aGVuKGwsZCksRj1PYmplY3QuYXNzaWduKGIse19fYWJvcnRDb250cm9sbGVyOnMsX19zdGFsZVdoaWxlRmV0Y2hpbmc6byxfX3JldHVybmVkOnZvaWQgMH0pO3JldHVybiBuPT09dm9pZCAwPyh0aGlzLnNldChlLEYsey4uLmEub3B0aW9ucyxzdGF0dXM6dm9pZCAwfSksbj1jKHRoaXMsYXQpLmdldChlKSk6Yyh0aGlzLEwpW25dPUYsRn0sWT1uZXcgV2Vha1NldCxldD1mdW5jdGlvbihlKXtpZighYyh0aGlzLEp0KSlyZXR1cm4hMTtjb25zdCBuPWU7cmV0dXJuISFuJiZuIGluc3RhbmNlb2YgUHJvbWlzZSYmbi5oYXNPd25Qcm9wZXJ0eSgiX19zdGFsZVdoaWxlRmV0Y2hpbmciKSYmbi5fX2Fib3J0Q29udHJvbGxlciBpbnN0YW5jZW9mIGZufSxYZT1uZXcgV2Vha1NldCxocj1mdW5jdGlvbihlLG4pe2ModGhpcyx4dClbbl09ZSxjKHRoaXMsX3QpW2VdPW59LGxlPW5ldyBXZWFrU2V0LHFlPWZ1bmN0aW9uKGUpe2UhPT1jKHRoaXMsaHQpJiYoZT09PWModGhpcyxFdCk/Qyh0aGlzLEV0LGModGhpcyxfdClbZV0pOncodGhpcyxYZSxocikuY2FsbCh0aGlzLGModGhpcyx4dClbZV0sYyh0aGlzLF90KVtlXSksdyh0aGlzLFhlLGhyKS5jYWxsKHRoaXMsYyh0aGlzLGh0KSxlKSxDKHRoaXMsaHQsZSkpfTtjb25zdCB6aT1uZXcgaXIoe21heDoxZTN9KSxhMD0odCxlLG4pPT57Y29uc3Qgcj1KU09OLnN0cmluZ2lmeSh0LnByb3BlcnRpZXMpLGk9emkuZ2V0KHIpO2lmKGkpcmV0dXJuIGk7Y29uc3Qgbz0oKCk9Pntzd2l0Y2gocmUudHlwZXNbdC50eXBlXSl7Y2FzZSJQb2x5Z29uIjpyZXR1cm4icG9seWdvbiI7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4icG9seWxpbmUiO2Nhc2UiUG9pbnQiOnJldHVybiJtYXJrZXIiO2RlZmF1bHQ6cmV0dXJufX0pKCkscz0oKCk9PntpZigobj09bnVsbD92b2lkIDA6bi50eXBlKSE9PSJzaW1wbGUifHwhbylyZXR1cm47Y29uc3QgYT11MCgiIix0LGUsbyk7aWYoYSlyZXR1cm4gaG49PW51bGw/dm9pZCAwOmhuKG4sYSl9KSgpLHU9KCgpPT57aWYobz09PSJwb2x5Z29uIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlnb247cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEuZmlsbCk/PyEwKSYmKChhPT1udWxsP3ZvaWQgMDphLnNob3cpPz8hMCk/YT09bnVsbD92b2lkIDA6YS5maWxsQ29sb3I6InJnYmEoMCwwLDAsMCkiLHN0cm9rZVN0eWxlOmEhPW51bGwmJmEuc3Ryb2tlJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aCxsaW5lSm9pbjphPT1udWxsP3ZvaWQgMDphLmxpbmVKb2lufX1pZihvPT09InBvbHlsaW5lIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlsaW5lO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yKT8/ITApJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixzdHJva2VTdHlsZTphIT1udWxsJiZhLnN0cm9rZUNvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aH19aWYobz09PSJtYXJrZXIiKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMubWFya2VyO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3IpPz8hMCkmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcjoicmdiYSgwLDAsMCwwKSIsc3Ryb2tlU3R5bGU6YSE9bnVsbCYmYS5wb2ludENvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnBvaW50U2l6ZX19fSkoKTtyZXR1cm4gemkuc2V0KHIsdSksdX0sdTA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fTtmdW5jdGlvbiBjMCh0KXtyZXR1cm4gZjAodCk9PT1ibi5DT1VOVEVSX0NMT0NLV0lTRX1mdW5jdGlvbiBXaSh0LGUpe2NvbnN0IG49dC54LHI9dC55O2xldCBpPSExO2ZvcihsZXQgbz0wLHM9ZS5sZW5ndGgtMTtvPGUubGVuZ3RoO3M9bysrKXtjb25zdCB1PWVbb10ueCxhPWVbb10ueSxsPWVbc10ueCxkPWVbc10ueTthPnIhPWQ+ciYmbjwobC11KSooci1hKS8oZC1hKSt1JiYoaT0haSl9cmV0dXJuIGl9ZnVuY3Rpb24gaDAodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZihXaShlLHRbbl0pKXtsZXQgcj0hMTtmb3IoO24rMTx0Lmxlbmd0aCYmIWMwKHRbbisxXSk7KW4rKywhciYmV2koZSx0W25dKSYmKHI9ITApO2lmKCFyKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGYwKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49dFtlLTFdLngqKHRbMF0ueS10W2UtMl0ueSkrdFswXS54Kih0WzFdLnktdFtlLTFdLnkpO2ZvcihsZXQgcj0xO3I8PWUtMjtyKyspbis9dFtyXS54Kih0W3IrMV0ueS10W3ItMV0ueSk7aWYoaXNOYU4obikpdGhyb3cgbmV3IEVycm9yO3JldHVybiBuPjA/Ym4uQ09VTlRFUl9DTE9DS1dJU0U6Ym4uQ0xPQ0tXSVNFfWNvbnN0IEdlPTI1NjtjbGFzcyBsMHtjb25zdHJ1Y3RvcihlKXt2KHRoaXMsIl91cmxUZW1wbGF0ZSIpO3YodGhpcywiX3BhcnNlVGlsZSIpO3YodGhpcywiX3RpbGluZ1NjaGVtZSIpO3YodGhpcywiX2xheWVyTmFtZXMiKTt2KHRoaXMsIl90aWxlV2lkdGgiKTt2KHRoaXMsIl90aWxlSGVpZ2h0Iik7dih0aGlzLCJfdGlsZUNhY2hlcyIpO3RoaXMuX3BhcnNlVGlsZT1kMCx0aGlzLl91cmxUZW1wbGF0ZT1lLnVybFRlbXBsYXRlLHRoaXMuX3RpbGVXaWR0aD1HZSx0aGlzLl90aWxlSGVpZ2h0PUdlLHRoaXMuX2xheWVyTmFtZXM9ZS5sYXllck5hbWVzLHRoaXMuX3RpbGluZ1NjaGVtZT1uZXcga3R9YXN5bmMgcmVuZGVyKGUsbixyLGkpe2NvbnN0IG89WGkodGhpcy5fdXJsVGVtcGxhdGUsbik7YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAocz0+dGhpcy5fcmVuZGVyQ2FudmFzKG8sZSxuLHMscixpKSkpfWFzeW5jIF9yZW5kZXJDYW52YXMoZSxuLHIsaSxvLHMpe2lmKCFlKXJldHVybjtjb25zdCB1PWF3YWl0IHRoaXMuX2NhY2hlZFRpbGUoZSksbD1pLnNwbGl0KC8sICovKS5maWx0ZXIoQm9vbGVhbikubWFwKGQ9PnU9PW51bGw/dm9pZCAwOnUubGF5ZXJzW2RdKTtsJiYobi5zdHJva2VTdHlsZT0iYmxhY2siLG4uZmlsbFN0eWxlPSJibGFjayIsbi5saW5lV2lkdGg9MSxuLm1pdGVyTGltaXQ9MixuLnNldFRyYW5zZm9ybSh0aGlzLl90aWxlV2lkdGgqby9HZSwwLDAsdGhpcy5fdGlsZUhlaWdodCpvL0dlLDAsMCksbC5mb3JFYWNoKGQ9PntpZighZClyZXR1cm47Y29uc3QgXz1HZS9kLmV4dGVudDtmb3IobGV0IE89MDtPPGQubGVuZ3RoO08rKyl7Y29uc3QgYj1kLmZlYXR1cmUoTyksRj1hMChiLHIscyk7aWYoIUYpY29udGludWU7bi5maWxsU3R5bGU9Ri5maWxsU3R5bGU/P24uZmlsbFN0eWxlLG4uc3Ryb2tlU3R5bGU9Ri5zdHJva2VTdHlsZT8/bi5zdHJva2VTdHlsZSxuLmxpbmVXaWR0aD1GLmxpbmVXaWR0aD8/bi5saW5lV2lkdGgsbi5saW5lSm9pbj1GLmxpbmVKb2luPz9uLmxpbmVKb2luO2NvbnN0IFM9Yi5sb2FkR2VvbWV0cnkoKTtyZS50eXBlc1tiLnR5cGVdPT09IlBvbHlnb24iP3RoaXMuX3JlbmRlclBvbHlnb24obixTLF8sKEYubGluZVdpZHRoPz8xKT4wKTpyZS50eXBlc1tiLnR5cGVdPT09IlBvaW50Ij90aGlzLl9yZW5kZXJQb2ludChuLFMsXyk6cmUudHlwZXNbYi50eXBlXT09PSJMaW5lU3RyaW5nIj90aGlzLl9yZW5kZXJMaW5lU3RyaW5nKG4sUyxfKTpjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGdlb21ldHJ5IHR5cGU6ICR7Yi50eXBlfSBpbiByZWdpb24gbWFwIG9uIHRpbGUgJHtbci5sZXZlbCxyLngsci55XS5qb2luKCIvIil9YCl9fSkpfV9yZW5kZXJQb2x5Z29uKGUsbixyLGkpe2UuYmVnaW5QYXRoKCk7Y29uc3Qgbz0oKT0+e2kmJmUuc3Ryb2tlKCksZS5maWxsKCl9O2xldCBzPTA7Zm9yKGxldCB1PTA7dTxuLmxlbmd0aDt1Kyspe2NvbnN0IGE9blt1XTtzK2EubGVuZ3RoPjU0MDAmJihvKCkscz0wLGUuYmVnaW5QYXRoKCkpO2xldCBsPWFbMF07ZS5tb3ZlVG8obC54KnIsbC55KnIpO2ZvcihsZXQgZD0xO2Q8YS5sZW5ndGg7ZCsrKWw9YVtkXSxlLmxpbmVUbyhsLngqcixsLnkqcik7cys9YS5sZW5ndGh9cz4wJiZvKCl9X3JlbmRlclBvaW50KGUsbixyKXtlLmJlZ2luUGF0aCgpO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKXtjb25zdCBvPW5baV1bMF0sW3MsdV09W28ueCpyLG8ueSpyXSxhPWUubGluZVdpZHRoO2UuYmVnaW5QYXRoKCksZS5hcmMocyx1LGEsMCwyKk1hdGguUEkpLGUuZmlsbCgpfX1fcmVuZGVyTGluZVN0cmluZyhlLG4scil7ZS5iZWdpblBhdGgoKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyl7bGV0IG89bltpXVswXTtlLm1vdmVUbyhvLngqcixvLnkqcik7Zm9yKGxldCBzPTE7czxuW2ldLmxlbmd0aDtzKyspbz1uW2ldW3NdLGUubGluZVRvKG8ueCpyLG8ueSpyKX1lLnN0cm9rZSgpfXBpY2tGZWF0dXJlcyhlLG4scixpKXtjb25zdCBvPVhpKHRoaXMuX3VybFRlbXBsYXRlLGUpO3JldHVybiB0aGlzLl9waWNrRmVhdHVyZXNGcm9tTGF5ZXIobyxlLG4scixpKX1hc3luYyBfcGlja0ZlYXR1cmVzRnJvbUxheWVyKGUsbixyLGksbyl7dHJ5e2NvbnN0IHM9YXdhaXQgdGhpcy5fY2FjaGVkVGlsZShlKTtyZXR1cm4gcz8oYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAoYXN5bmMgYT0+e2NvbnN0IGw9cy5sYXllcnNbYV07aWYoIWwpcmV0dXJuW107Y29uc3QgZD1hd2FpdCB0aGlzLl9waWNrRmVhdHVyZXMobixyLGksbCxvKTtyZXR1cm4gZHx8W119KSkpLmZsYXQoKTpbXX1jYXRjaHtyZXR1cm5bXX19YXN5bmMgX3BpY2tGZWF0dXJlcyhlLG4scixpLG8pe2NvbnN0IHM9dGhpcy5fdGlsaW5nU2NoZW1lLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKGUueCxlLnksZS5sZXZlbCksdT1bcy53ZXN0LHMuZWFzdF0sYT1bcy5ub3J0aCxzLnNvdXRoXSxsPWZ1bmN0aW9uKEYsUyxOLGcsRyl7Y29uc3QgSz1uZXcgQTtBLnN1YnRyYWN0KEYsbmV3IEEoU1swXSxOWzBdKSxLKTtjb25zdCBWPW5ldyBBKChnWzFdLWdbMF0pLyhTWzFdLVNbMF0pLChHWzFdLUdbMF0pLyhOWzFdLU5bMF0pKTtyZXR1cm4gQS5hZGQoQS5tdWx0aXBseUNvbXBvbmVudHMoSyxWLG5ldyBBKSxuZXcgQShnWzBdLEdbMF0pLG5ldyBBKX0sZD1bXSxfPVswLGkuZXh0ZW50LTFdLE89bChBLmZyb21DYXJ0ZXNpYW4zKHRoaXMuX3RpbGluZ1NjaGVtZS5wcm9qZWN0aW9uLnByb2plY3QobmV3IEgobixyKSkpLHUsYSxfLF8pLGI9bmV3IFNyKE8ueCxPLnkpO2ZvcihsZXQgRj0wO0Y8aS5sZW5ndGg7RisrKXtjb25zdCBTPWkuZmVhdHVyZShGKTtpZihyZS50eXBlc1tTLnR5cGVdPT09IlBvbHlnb24iJiZoMChTLmxvYWRHZW9tZXRyeSgpLGIpKXtjb25zdCBOPXIwKFMsZSxvKTtOJiZkLnB1c2goTil9fXJldHVybiBkfWFzeW5jIF9jYWNoZWRUaWxlKGUpe3ZhciBuLHI7aWYoZSl7aWYoKG49dGhpcy5fdGlsZUNhY2hlcykhPW51bGwmJm4uaGFzKGUpKXJldHVybiB0aGlzLl90aWxlQ2FjaGVzLmdldChlKTt0cnl7Y29uc3QgaT1wMChhd2FpdCB0aGlzLl9wYXJzZVRpbGUoZSkpO3JldHVybiBpJiYoKHI9dGhpcy5fdGlsZUNhY2hlcyk9PW51bGx8fHIuc2V0KGUsaSkpLGl9Y2F0Y2h7cmV0dXJufX19Y2xlYXJDYWNoZSgpe3ZhciBlOyhlPXRoaXMuX3RpbGVDYWNoZXMpPT1udWxsfHxlLmNsZWFyKCl9fWNvbnN0IGQwPWFzeW5jIHQ9Pnt0cnl7Y29uc3QgZT1hd2FpdCBfMCh0KTtyZXR1cm4gZT9FMChlKTp2b2lkIDB9Y2F0Y2h7cmV0dXJufX0sRTA9dD0+bmV3IFhvKG5ldyBIbyh0KSksXzA9YXN5bmMgdD0+e2lmKCF0KXtjb25zb2xlLmVycm9yKCJmZXRjaCByZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIHJlcXVlc3QgdXJsIGlzIHVuZGVmaW5lZCIpO3JldHVybn10cnl7Y29uc3QgZT1hd2FpdCBmZXRjaCh0KTtyZXR1cm4gZS5vaz9hd2FpdCBlLmFycmF5QnVmZmVyKCk6dm9pZCAwfWNhdGNoe3JldHVybn19LHAwPXQ9Pnt2YXIgbjtpZighdClyZXR1cm47Y29uc3QgZT17fTtmb3IoY29uc3RbcixpXW9mIE9iamVjdC5lbnRyaWVzKHQubGF5ZXJzKSl7Y29uc3Qgbz1bXSxzPWk7Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDt1Kyspe2NvbnN0IGE9cy5mZWF0dXJlKHUpO2xldCBsO2NvbnN0IGQ9KG49YS5iYm94KT09bnVsbD92b2lkIDA6bi5jYWxsKGEpLF89ey4uLmEsaWQ6YS5pZCxsb2FkR2VvbWV0cnk6KCk9PihsfHwobD1hLmxvYWRHZW9tZXRyeSgpKSxsKSxiYm94OmQ/KCk9PmQ6dm9pZCAwLHRvR2VvSlNPTjphLnRvR2VvSlNPTn07by5wdXNoKF8pfWVbcl09ey4uLnMsZmVhdHVyZTp1PT5vW3VdfX1yZXR1cm57bGF5ZXJzOmV9fSxYaT0odCxlKT0+ZGVjb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoInt6fSIsU3RyaW5nKGUubGV2ZWwpKS5yZXBsYWNlKCJ7eH0iLFN0cmluZyhlLngpKS5yZXBsYWNlKCJ7eX0iLFN0cmluZyhlLnkpKSx5MD1uZXcgTWFwO2Z1bmN0aW9uIEEwKHt1cmxUZW1wbGF0ZTp0LG1heGltdW1MZXZlbDplfSl7cmV0dXJuYCR7dH06JHtlfWB9YXN5bmMgZnVuY3Rpb24gVDAodCl7Y29uc3QgZT1BMCh0KTtsZXQgbjtyZXR1cm4gbj09bnVsbCYmKG49bmV3IGwwKHQpLHkwLnNldChlLG4pKSxufW9vKHtyZW5kZXJUaWxlOmFzeW5jKHtyZXF1ZXN0ZWRUaWxlOnQsY2FudmFzOmUsc2NhbGVGYWN0b3I6biwuLi5yfSk9Pntjb25zdCBpPWUuZ2V0Q29udGV4dCgiMmQiKTtpZighaSlyZXR1cm47Y29uc3Qgbz1hd2FpdCBUMChyKTthd2FpdCBvLnJlbmRlcihpLHQsbixyLmN1cnJlbnRMYXllciksby5jbGVhckNhY2hlKCksYXdhaXQgbmV3IFByb21pc2Uocz0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShzKX0pfX0pfSkoKTsK",nc=typeof window<"u"&&window.Blob&&new Blob([atob(rd)],{type:"text/javascript;charset=utf-8"});function Cm(){const t=nc&&(window.URL||window.webkitURL).createObjectURL(nc);try{return t?new Worker(t):new Worker("data:application/javascript;base64,"+rd)}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}const xe=[];function Km(t){let n=xe.find(o=>o.layerId===t);return n==null&&(n=Ym(async()=>await Um(new Cm),{size:Math.ceil(navigator.hardwareConcurrency/4)}),n.layerId=t,xe.push(n)),n}function gm(t,n){return Km(n).queue(o=>t(o,n))}function Nm(t,n){const o=xe.find(s=>s.layerId===t);return o==null||o.taskQueue.length<n}async function Mm(t){const n=xe.findIndex(o=>o.layerId===t);n!==-1&&(await xe[n].terminate(!0),xe.splice(n,1))}async function Hm(t){var n;const{canvas:o,...s}=t,c=o.transferControlToOffscreen();await gm(async d=>{await d.renderTile(Jm({canvas:c,...s},[c]))},(n=t.currentLayer)==null?void 0:n.id)}let Be;const ki=class{constructor(t){Y(this,"taskCount",0),Y(this,"tileCache"),Y(this,"_minimumLevel"),Y(this,"_maximumLevel"),Y(this,"_credit"),Y(this,"_resolution"),Y(this,"_tilingScheme"),Y(this,"_tileWidth"),Y(this,"_tileHeight"),Y(this,"_rectangle"),Y(this,"_ready"),Y(this,"_readyPromise",Promise.resolve(!0)),Y(this,"_errorEvent",new Cesium$1.Event),Y(this,"_currentLayer"),Y(this,"_useWorker"),Y(this,"_urlTemplate"),Y(this,"_layerNames"),this._minimumLevel=t.minimumLevel??0,this._maximumLevel=t.maximumLevel??24,this._credit=t.credit,this._resolution=t.resolution??10,this._tilingScheme=new Cesium$1.WebMercatorTilingScheme,this._tileWidth=ue,this._tileHeight=ue,this._rectangle=this._tilingScheme.rectangle,this._ready=!0,this._urlTemplate=t.urlTemplate,this._layerNames=t.layerName.split(/, */).filter(Boolean),this._currentLayer=t.layer,this._useWorker=t.worker??!1}get tileWidth(){return this._tileWidth}get tileHeight(){return this._tileHeight}get maximumLevel(){return this._maximumLevel}get minimumLevel(){return this._minimumLevel}get tilingScheme(){return this._tilingScheme}get rectangle(){return this._rectangle}get errorEvent(){return this._errorEvent}get ready(){return this._ready}get hasAlphaChannel(){return!0}get credit(){return this._credit?new Cesium$1.Credit(this._credit):void 0}get defaultNightAlpha(){}get defaultDayAlpha(){}get defaultAlpha(){}get defaultBrightness(){}get defaultContrast(){}get defaultHue(){}get defaultSaturation(){}get defaultGamma(){}get defaultMinificationFilter(){}get defaultMagnificationFilter(){}get readyPromise(){return this._readyPromise}get tileDiscardPolicy(){}get proxy(){}getTileCredits(t,n,o){return[]}requestImage(t,n,o,s){var c;const d=this._currentLayer;if(!d||(Be&&d&&!Fr(Be,d)&&Be.id===d.id&&Mm(Be.id),Be=d,this._useWorker&&(this.taskCount>=ki.maximumTasksPerImagery||!Nm(d==null?void 0:d.id,ki.maximumTasks))))return;const h=`${t}/${n}/${o}`;if(((c=this.tileCache)==null?void 0:c.has(h))===!0){const z=this.tileCache.get(h);return Promise.resolve(z)}const p=document.createElement("canvas"),y={x:t,y:n,level:o},E=(o>=this.maximumLevel?this._resolution:void 0)??1;p.width=this._tileWidth*E,p.height=this._tileHeight*E;const L=this._urlTemplate,F=this._layerNames,N=this._maximumLevel;return++this.taskCount,Hm({canvas:p,requestedTile:y,scaleFactor:E,urlTemplate:L,layerNames:F,maximumLevel:N,currentLayer:d}).then(()=>{var z;return(z=this.tileCache)==null||z.set(h,p),p}).catch(z=>{if(z instanceof Error&&z.message.startsWith("Unimplemented type"))return p;throw z}).finally(()=>{--this.taskCount})}async pickFeatures(t,n,o,s,c){const d={x:t,y:n,level:o},h=this._currentLayer,p=this._urlTemplate,y=this._layerNames;return await new lb({urlTemplate:p,layerNames:y}).pickFeatures(d,s,c,h)??[]}};let Gi=ki;Y(Gi,"maximumTasks",50),Y(Gi,"maximumTasksPerImagery",6);const useImageryProvider=(t,n,o)=>{const{hideIndicator:s}=o??{},{viewer:c}=$e$1(),d=o==null?void 0:o.alpha;React.useEffect(()=>{if(!t||!c)return;const h=c.imageryLayers,p=h.addImageryProvider(t);return Object.assign(p,{bringToFront:()=>{h.raiseToTop(p)},sendToBack:()=>{h.lowerToBottom(p)}}),d!==void 0&&typeof d=="number"&&(p.alpha=d),attachTag(p,{layerId:n,hideIndicator:s}),()=>{h.remove(p)}},[t,c,n,d,s])},useData$1=t=>React.useMemo(()=>{const n=extractSimpleLayerData(t);return{type:n==null?void 0:n.type,url:n==null?void 0:n.url,layers:n!=null&&n.layers?Array.isArray(n.layers)?n.layers.join(","):n==null?void 0:n.layers:void 0,parameters:n==null?void 0:n.parameters}},[t]);function normalizeUrl(t,n){if(!t)return"";let o=t.replace("/%7Bz%7D","/{z}").replace("/%7Bx%7D","/{x}").replace("/%7By%7D","/{y}");return o.includes("/{z}/{x}/{y}.")||(o[o.length-1]!=="/"&&(o+="/"),o+="{z}/{x}/{y}."+n),o}const useMVT=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y,layers:E}=useData$1(o),L=extractSimpleLayer(o)||void 0,F=React.useMemo(()=>{if(!(!t||!s||!y||!E||p!=="mvt"))return new Gi({minimumLevel:c,maximumLevel:d,credit:h,urlTemplate:normalizeUrl(y,"mvt"),layerName:E,layer:L,worker:!0})},[t,s,y,E,p,c,d,h,L]);useImageryProvider(F,o==null?void 0:o.id,n)},useTiles=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y}=useData$1(o),E=React.useMemo(()=>{if(!(!t||!s||!y||p!=="tiles"))return new Cesium$1.UrlTemplateImageryProvider({url:normalizeUrl(y,"png"),minimumLevel:c,maximumLevel:d,credit:h})},[t,s,y,p,c,d,h]);useImageryProvider(E,o==null?void 0:o.id,n)},useTMS=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y}=useData$1(o),[E,L]=React.useState();React.useEffect(()=>{if(!t||!s||!y||p!=="tms")return;(async()=>{L(await Cesium$1.TileMapServiceImageryProvider.fromUrl(y,{minimumLevel:c,maximumLevel:d,credit:h}))})()},[t,s,y,p,c,d,h]),useImageryProvider(E,o==null?void 0:o.id,n)},useWMS=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y,layers:E,parameters:L}=useData$1(o),F=React.useMemo(()=>{if(!(!t||!s||!y||!E||p!=="wms"))return new Cesium$1.WebMapServiceImageryProvider({url:y,layers:E,minimumLevel:c,maximumLevel:d,credit:h,parameters:L})},[t,s,y,E,p,c,d,h,L]);useImageryProvider(F,o==null?void 0:o.id,n)};function Raster({isVisible:t,layer:n,property:o}){return useWMS({isVisible:t,layer:n,property:o}),useTiles({isVisible:t,layer:n,property:o}),useTMS({isVisible:t,layer:n,property:o}),useMVT({isVisible:t,layer:n,property:o}),null}const Raster$1=React.memo(Raster,(t,n)=>{var o,s,c,d,h,p;return isEqual((o=extractSimpleLayer(t.layer))==null?void 0:o.polygon,(s=extractSimpleLayer(n.layer))==null?void 0:s.polygon)&&isEqual((c=extractSimpleLayer(t.layer))==null?void 0:c.polyline,(d=extractSimpleLayer(n.layer))==null?void 0:d.polyline)&&isEqual((h=extractSimpleLayer(t.layer))==null?void 0:h.marker,(p=extractSimpleLayer(n.layer))==null?void 0:p.marker)&&isEqual(extractSimpleLayerData(t.layer),extractSimpleLayerData(n.layer))&&isEqual(t.property,n.property)&&t.isVisible===n.isVisible&&t.evalFeature===n.evalFeature&&t.onComputedFeatureFetch===n.onComputedFeatureFetch}),config$3={noFeature:!0};function getMarkerCoordinates(t,n){var s;const o=(s=t.position)==null?void 0:s.getValue(n);return[(o==null?void 0:o.x)??0,(o==null?void 0:o.y)??0,(o==null?void 0:o.z)??0]}function getGeometryFromEntity(t,n){var o,s,c,d,h;if(n.point||n.billboard||n.label)return{type:"Point",coordinates:getMarkerCoordinates(n,t)};if(n.polyline){const p=(s=(o=n.polyline)==null?void 0:o.positions)==null?void 0:s.getValue(t);return{type:"LineString",coordinates:p==null?void 0:p.map(L=>[(L==null?void 0:L.x)??0,(L==null?void 0:L.y)??0,(L==null?void 0:L.z)??0])}}if(n.polygon){const p=(d=(c=n.polygon)==null?void 0:c.hierarchy)==null?void 0:d.getValue(t);return{type:"Polygon",coordinates:[(h=p==null?void 0:p.positions)==null?void 0:h.map(L=>[(L==null?void 0:L.x)??0,(L==null?void 0:L.y)??0,(L==null?void 0:L.z)??0])]}}}function overrideOriginalProperties(t,n,o,s){const c=(n==null?void 0:n.originalProperties)||{};attachTag(t,{...n||{},originalProperties:{...c,[o]:{...c[o],...s}}})}function attachProperties(t,n,o,s){const[c,d]=o,h=t[d]??{};if(!t[d])return;const p=getTag(t),E=((p==null?void 0:p.originalProperties)||{})[c];let L=!1;Object.entries(s).forEach(([F,N])=>{var nt;const z=N.name,oe=N.type;let W=N.override??((nt=n==null?void 0:n[c])==null?void 0:nt[z]);const lt=W==null&&!!N.default;if(W=W??N.default,!((W==null||lt)&&!E)){switch(L=!0,oe){case"color":W=toColor$1(W);break;case"shadows":W=shadowMode(W);break;case"heightReference":W=heightReference(W)}W!==t[d][F]&&(t[d][F]=W??h[F])}}),overrideOriginalProperties(t,p,c,L)}const hasAppearance=(t,n,o)=>{var s;return!!((s=extractSimpleLayer(t))!=null&&s[o[0]]&&n[o[1]])},makeFeatureId$1=t=>String(t.id),attachStyle=(t,n,o,s)=>{var p,y,E,L,F,N,z,oe;if(!n)return;const c=hasAppearance(n,t,["marker","point"]),d=hasAppearance(n,t,["marker","billboard"]),h=hasAppearance(n,t,["marker","label"]);if(t.point||t.billboard||t.label){const W=getMarkerCoordinates(t,s),lt=getGeometryFromEntity(s,t),nt={type:"feature",id:makeFeatureId$1(t),geometry:lt,properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:W[0],y:W[1],z:W[2]}},Ee=o(n.layer,nt);return Ee?(c&&(((p=Ee==null?void 0:Ee.marker)==null?void 0:p.style)==="point"&&!t.point&&(t.point=new Cesium$1.PointGraphics,t.billboard=void 0),attachProperties(t,Ee,["marker","point"],{show:{name:"show",...(y=Ee==null?void 0:Ee.marker)!=null&&y.style?{override:((E=Ee==null?void 0:Ee.marker)==null?void 0:E.style)==="point"&&((Ee==null?void 0:Ee.marker.show)??!0)}:{}},pixelSize:{name:"pointSize"},color:{name:"pointColor",type:"color"},outlineColor:{name:"pointOutlineColor",type:"color"},outlineWidth:{name:"pointOutlineWidth"},heightReference:{name:"heightReference",type:"heightReference"}})),d&&(((L=Ee==null?void 0:Ee.marker)==null?void 0:L.style)==="image"&&!t.billboard&&(t.billboard=new Cesium$1.BillboardGraphics,t.point=void 0),attachProperties(t,Ee,["marker","billboard"],{show:{name:"show",...(F=Ee==null?void 0:Ee.marker)!=null&&F.style?{override:((N=Ee==null?void 0:Ee.marker)==null?void 0:N.style)==="image"&&((Ee==null?void 0:Ee.marker.show)??!0)}:{}},image:{name:"image"},color:{name:"imageColor",type:"color"},scale:{name:"imageSize"},sizeInMeters:{name:"imageSizeInMeters"},heightReference:{name:"heightReference",type:"heightReference"},horizontalOrigin:{name:"imageHorizontalOrigin"},verticalOrigin:{name:"imageVerticalOrigin"}}),h&&attachProperties(t,Ee,["marker","label"],{show:{name:"show",default:!0},text:{name:"labelText"},backgroundColor:{name:"labelBackground",type:"color"},heightReference:{name:"heightReference",type:"heightReference"}})),[nt,Ee]):void 0}if(t.polyline){const W=(z=t.position)==null?void 0:z.getValue(s),lt=getGeometryFromEntity(s,t),nt={type:"feature",id:makeFeatureId$1(t),geometry:lt,properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:(W==null?void 0:W.x)??0,y:(W==null?void 0:W.y)??0,z:(W==null?void 0:W.z)??0}},Ee=o(n.layer,nt);return Ee?(hasAppearance(n,t,["polyline","polyline"])&&attachProperties(t,Ee,["polyline","polyline"],{show:{name:"show",default:!0},width:{name:"strokeWidth"},material:{name:"strokeColor",type:"color"},shadows:{name:"shadows",type:"shadows"},clampToGround:{name:"clampToGround"}}),[nt,Ee]):void 0}if(t.polygon){const W=(oe=t.position)==null?void 0:oe.getValue(s),lt=getGeometryFromEntity(s,t),nt={type:"feature",id:makeFeatureId$1(t),geometry:lt,properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:(W==null?void 0:W.x)??0,y:(W==null?void 0:W.y)??0,z:(W==null?void 0:W.z)??0}},Ee=o(n.layer,nt);return Ee?(hasAppearance(n,t,["polygon","polygon"])&&attachProperties(t,Ee,["polygon","polygon"],{show:{name:"show",default:!0},fill:{name:"fill"},material:{name:"fillColor",type:"color"},outline:{name:"stroke"},outlineColor:{name:"strokeColor",type:"color"},outlineWidth:{name:"strokeWidth"},shadows:{name:"shadows",type:"shadows"},heightReference:{name:"heightReference",type:"heightReference"},extrudedHeight:{name:"extrudedHeight"}}),[nt,Ee]):void 0}},types={kml:"kml",geojson:"geojson",czml:"czml"},comps={kml:Ys$1,czml:Bs$1,geojson:Us$1};function Resource({isVisible:t,property:n,layer:o,onComputedFeatureFetch:s,onComputedFeatureDelete:c}){var mt,fa,Wa,sl,Vd,Xd;const{show:d=!0,clampToGround:h,stroke:p,strokeWidth:y,markerColor:E,markerSize:L,fill:F,hideIndicator:N}=n??{},[z,oe,W]=React.useMemo(()=>{var Gd;const pu=extractSimpleLayerData(o),gl=n==null?void 0:n.type,md=n==null?void 0:n.url;return[gl??(pu==null?void 0:pu.type),md??(pu==null?void 0:pu.url),((Gd=pu==null?void 0:pu.time)==null?void 0:Gd.updateClockOnLoad)??!0]},[n,o]),{viewer:lt}=$e$1(),nt=React.useRef([]),Ee=React.useRef(new Set),yt=React.useMemo(()=>!z||z==="auto"?guessType(oe):void 0,[z,oe]),Ai=yt?types[yt]:z!=="auto"?z:void 0,zi=Ai?comps[Ai]:void 0,{requestRender:ha,timelineManagerRef:ba}=useContext(),Sa=React.useCallback(pu=>{if(!lt)return;const gl=[],md=[];pu.entities.values.forEach(Gd=>{var ff;const tf=attachStyle(Gd,o,evalFeature,lt.clock.currentTime),[nf,lf]=tf||[];attachTag(Gd,{layerId:o==null?void 0:o.id,featureId:nf==null?void 0:nf.id,hideIndicator:(ff=lf==null?void 0:lf.resource)==null?void 0:ff.hideIndicator}),nf&&!Ee.current.has(nf.id)&&(gl.push(nf),nt.current.push({feature:nf,raw:Gd}),Ee.current.add(nf.id)),lf&&md.push(lf)}),z!=="geojson"&&(s==null||s(gl,md)),ha==null||ha()},[o,lt,s,z,ha]),ya=React.useRef({start:(fa=(mt=ba==null?void 0:ba.current)==null?void 0:mt.timeline)==null?void 0:fa.start,stop:(sl=(Wa=ba==null?void 0:ba.current)==null?void 0:Wa.timeline)==null?void 0:sl.stop,current:(Xd=(Vd=ba==null?void 0:ba.current)==null?void 0:Vd.timeline)==null?void 0:Xd.current}),ms=React.useCallback(pu=>{var gl,md;if(pu.entities.values.forEach(Gd=>requestAnimationFrame(()=>{const tf=getTag(Gd);attachTag(Gd,{layerId:o==null?void 0:o.id,featureId:makeFeatureId$1(Gd),hideIndicator:N??(tf==null?void 0:tf.hideIndicator)})})),!W){ya.current.current&&ya.current.start&&ya.current.stop&&((gl=ba==null?void 0:ba.current)==null||gl.commit({cmd:"SET_TIME",payload:{start:ya.current.start,stop:ya.current.stop,current:ya.current.current},committer:{source:"featureResource",id:o==null?void 0:o.id}}));return}pu.clock&&((md=ba==null?void 0:ba.current)==null||md.commit({cmd:"SET_TIME",payload:{start:Cesium$1.JulianDate.toDate(pu.clock.startTime),stop:Cesium$1.JulianDate.toDate(pu.clock.stopTime),current:Cesium$1.JulianDate.toDate(pu.clock.currentTime)},committer:{source:"featureResource",id:o==null?void 0:o.id}})),ha==null||ha()},[W,ba,o==null?void 0:o.id,ha,N]),bs=React.useMemo(()=>p?Cesium$1.Color.fromCssColorString(p):void 0,[p]),Ra=React.useMemo(()=>F?Cesium$1.Color.fromCssColorString(F):void 0,[F]),pi=React.useMemo(()=>E?Cesium$1.Color.fromCssColorString(E):void 0,[E]);return React.useEffect(()=>{lt&&nt.current.forEach(pu=>{attachStyle(pu.raw,o,evalFeature,lt.clock.currentTime)})},[o,lt]),React.useEffect(()=>()=>{requestIdleCallbackWithRequiredWork(()=>{c==null||c(Array.from(Ee.current.values()))})},[]),!t||!d||!zi||!oe?null:jsxRuntimeExports.jsx(zi,{data:oe,show:!0,clampToGround:h,onChange:Sa,onLoad:ms,stroke:bs,fill:Ra,strokeWidth:y,markerSize:L,markerColor:pi})}const config$2={noFeature:!0},DEFAULT_CLIPPING_POLYGON_STYLE={fill:!0,fillColor:"#FFFFFF22",stroke:!0,strokeColor:"#FFFFFF",strokeWidth:1},DrawClippingPolygon=({coordiantes:t,top:n=0,bottom:o=0,visible:s,style:c,ready:d})=>{const h=useCustomCompareMemo(()=>t?new Cesium$1.PolygonHierarchy(t.map(y=>Cesium$1.Cartesian3.fromDegrees(y[0],y[1],y[2]??0))):void 0,[t??[]],isEqual),p=React.useMemo(()=>({...DEFAULT_CLIPPING_POLYGON_STYLE,...c,fillColor:toColor((c==null?void 0:c.fillColor)??DEFAULT_CLIPPING_POLYGON_STYLE.fillColor),strokeColor:toColor((c==null?void 0:c.strokeColor)??DEFAULT_CLIPPING_POLYGON_STYLE.strokeColor)}),[c]);return jsxRuntimeExports.jsx(EntityExt,{hideIndicator:!0,children:jsxRuntimeExports.jsx(aa$1,{hierarchy:h,fill:p.fill,material:p.fillColor,outline:p.stroke,outlineColor:p.strokeColor,outlineWidth:p.strokeWidth,height:o,extrudedHeight:n,show:s&&d})})},useRefValue=t=>{const n=React.useRef(t);return n.current=t,n},useImmutableFunction=t=>{const n=React.useRef(t),o=React.useCallback(()=>n.current,[]);return React.useEffect(()=>{n.current=t},[t]),o};class FeatureIndex{constructor(){Vf(this,"records",new Map)}has(n){return this.records.has(n)}find(n){}}class TilesetFeatureIndex extends FeatureIndex{has(n){return this.records.has(n)}find(n){const o=this.records.get(n);if(o!=null)return o.map(({content:s,batchId:c})=>s.getFeature(c))}addFeature(n,o,s){if(s==null)return;const c=this.records.get(s);c==null?this.records.set(s,[{content:n,batchId:o}]):c.push({content:n,batchId:o})}deleteFeature(n){n!=null&&this.records.has(n)&&this.records.delete(n)}}const BUILTIN_BOX_SIDE_PLANES=[{normal:{x:0,y:0,z:1},distance:.5},{normal:{x:0,y:0,z:-1},distance:.5},{normal:{x:0,y:1,z:0},distance:.5},{normal:{x:0,y:-1,z:0},distance:.5},{normal:{x:1,y:0,z:0},distance:.5},{normal:{x:-1,y:0,z:0},distance:.5}],useClippingBox=({clipping:t,boxId:n})=>{const{useBuiltinBox:o,visible:s,allowEnterGround:c,coordinates:d,width:h,height:p,length:y,heading:E,pitch:L,roll:F,disabledSelection:N}=t||{},{viewer:z}=$e$1(),oe=React.useRef(!1),W=React.useRef(!1),lt=React.useRef(),[nt,Ee]=React.useState(d);React.useEffect(()=>{o&&!nt&&Ee(d)},[nt,d,o]);const[yt,Ai]=React.useState({width:h,height:p,length:y,heading:E,pitch:L,roll:F});React.useEffect(()=>{o&&!yt&&Ai({width:h,height:p,length:y,heading:E,pitch:L,roll:F})},[yt,h,p,y,E,L,F,o]);const[zi,ha]=React.useState({activeBox:!1,activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1,cursor:"default"}),ba=React.useCallback(pu=>{ha(gl=>({...gl,...pu}))},[]),Sa=React.useCallback(pu=>{if(!z||!N)return;const gl=z.scene.pick(pu.position),md=getLayerId$1(gl);if(md!=null&&md.startsWith(`${n}-scale-point`)){const Gd=Number(md.split("-").slice(-1)[0]);ba({cursor:"nesw-resize",activeScalePointIndex:Gd,isScalePointClicked:!0})}if(md!=null&&md.startsWith(`${n}-edge-draggable`)){const Gd=Number(md.split("-").slice(-1)[0]);ba({cursor:"grabbing",activeEdgeIndex:Gd,isEdgeClicked:!0})}if(md!=null&&md.startsWith(`${n}-plane`)&&(oe.current=!0,W.current=md.endsWith("top")||md.endsWith("bottom")),oe.current){const Gd=getCamera(z);lt.current=Gd,updateMapController(z,!1),(!zi.isScalePointClicked||!zi.isEdgeClicked)&&ba({cursor:"grabbing",activeBox:!0})}},[n,zi,ba,z,N]),ya=React.useCallback(()=>{!z||!N||((zi.activeScalePointIndex||zi.activeEdgeIndex)&&ba({cursor:"default",activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1}),oe.current&&(updateMapController(z,!0),lt.current=void 0,oe.current=!1,W.current=!1,zi.activeBox=!1,zi.cursor="default",ba({activeBox:!1,cursor:"default"})))},[zi,ba,z,N]),ms=React.useRef(0),bs=React.useCallback(async pu=>{if(!oe.current||!z||!N)return;const gl=Cesium$1.Cartesian3.fromDegrees((nt==null?void 0:nt[0])||0,(nt==null?void 0:nt[1])||0,nt==null?void 0:nt[2]);if(W.current){const md=(nt==null?void 0:nt[2])||0,Gd=(()=>{if(!c){const vf=md-((yt==null?void 0:yt.height)||0)/2,Mf=ms.current;if(vf<Mf)return md+(Mf-vf)}})(),tf=new Cesium$1.Cartesian2(pu.startPosition.x,pu.startPosition.y),nf=new Cesium$1.Cartesian2(pu.endPosition.x,pu.endPosition.y),lf=Cesium$1.Cartesian2.subtract(nf,tf,new Cesium$1.Cartesian2),ff=new Cesium$1.Cartesian3(0,0,lf.y<0?-1:1),{moveAmount:_f}=computeMoveAmount(z.scene,{startPosition:tf,endPosition:nf},gl,ff),pf=Cesium$1.Cartesian3.multiplyByScalar(ff,_f,new Cesium$1.Cartesian3);Ee(vf=>[(vf==null?void 0:vf[0])||0,(vf==null?void 0:vf[1])||0,(Gd||(vf==null?void 0:vf[2])||0)+pf.z])}else{const md=pu.endPosition?getLocationFromScreen(z.scene,pu.endPosition.x,pu.endPosition.y,!c):void 0;Ee(Gd=>[(md==null?void 0:md.lng)||0,(md==null?void 0:md.lat)||0,(c?Gd==null?void 0:Gd[2]:md==null?void 0:md.height)||0]),sampleTerrainHeight(z.scene,(nt==null?void 0:nt[0])||0,(nt==null?void 0:nt[1])||0).then(Gd=>{ms.current=Gd||0})}},[c,nt,yt==null?void 0:yt.height,z,N]),Ra=React.useCallback(({layerId:pu}={})=>{const gl=!zi.isScalePointClicked&&!zi.isEdgeClicked&&!oe.current;if(pu!=null&&pu.startsWith(`${n}-scale-point`)&&gl){const md=Number(pu.split("-").slice(-1)[0]);ba({cursor:"nesw-resize",activeScalePointIndex:md})}if(pu!=null&&pu.startsWith(`${n}-edge-draggable`)&&gl){const md=Number(pu.split("-").slice(-1)[0]);ba({cursor:"grab",activeEdgeIndex:md})}pu!=null&&pu.startsWith(`${n}-plane`)&&gl&&ba({cursor:"grab",activeBox:!0})},[n,zi.isEdgeClicked,zi.isScalePointClicked,ba]),pi=React.useCallback(({layerId:pu}={})=>{const gl=!zi.isScalePointClicked&&!zi.isEdgeClicked&&!oe.current;pu!=null&&pu.startsWith(`${n}-scale-point`)&&gl&&ba({cursor:"default",activeScalePointIndex:void 0}),pu!=null&&pu.startsWith(`${n}-edge-draggable`)&&gl&&ba({cursor:"default",activeEdgeIndex:void 0}),pu!=null&&pu.startsWith(`${n}-plane`)&&gl&&ba({cursor:"default",activeBox:!1})},[n,zi.isEdgeClicked,zi.isScalePointClicked,ba]),mt=React.useRef(),fa=React.useCallback(pu=>{const gl=z==null?void 0:z.scene.pick(pu.endPosition);if(mt.current!==gl){if(mt.current){const md=getLayerId$1(mt.current);pi({layerId:md}),pi()}if(gl){const md=getLayerId$1(gl);Ra({layerId:md}),Ra()}}bs(pu),mt.current=gl},[Ra,pi,bs,z==null?void 0:z.scene]),Wa=React.useCallback(pu=>{var gl,md;if((gl=pu.layerId)!=null&&gl.startsWith(`${n}-scale-point`)&&pu.scale){const Gd=pu.scale;Ai(tf=>({...tf,width:Gd.width,height:Gd.height,length:Gd.length})),Ee([Gd.location.lng,Gd.location.lat,Gd.location.height])}if((md=pu.layerId)!=null&&md.startsWith(`${n}-edge-draggable`)&&pu.rotate){const Gd=pu.rotate;Ai(tf=>({...tf,heading:Gd.heading,pitch:Gd.pitch,roll:Gd.roll}))}},[n]),sl=React.useMemo(()=>new Cesium$1.ScreenSpaceEventHandler(z==null?void 0:z.scene.canvas),[z]);React.useEffect(()=>{sl.setInputAction(Sa,Cesium$1.ScreenSpaceEventType.LEFT_DOWN),sl.setInputAction(fa,Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),sl.setInputAction(ya,Cesium$1.ScreenSpaceEventType.LEFT_UP)},[sl,Sa,fa,ya]),React.useEffect(()=>()=>{requestAnimationFrame(()=>{sl.isDestroyed()||sl.destroy()})},[sl]);const Vd=React.useMemo(()=>({...zi,...yt,allowEnterGround:c}),[zi,yt,c]),Xd=React.useMemo(()=>o?{visible:s,handleLayerEdit:Wa,geometry:{type:"Point",coordinates:nt||d||[0,0,0]},property:Vd}:void 0,[Vd,d,nt,Wa,o,s]);return{...t,planes:o?BUILTIN_BOX_SIDE_PLANES:t==null?void 0:t.planes,width:o?yt==null?void 0:yt.width:t==null?void 0:t.width,height:o?yt==null?void 0:yt.height:t==null?void 0:t.height,length:o?yt==null?void 0:yt.length:t==null?void 0:t.length,heading:o?yt==null?void 0:yt.heading:t==null?void 0:t.heading,pitch:o?yt==null?void 0:yt.pitch:t==null?void 0:t.pitch,roll:o?yt==null?void 0:yt.roll:t==null?void 0:t.roll,coordinates:o?nt:t==null?void 0:t.coordinates,builtinBoxProps:Xd}};function getLayerId$1(t){var n,o;if(t&&"id"in t&&t.id instanceof Cesium$1.Entity)return(n=getTag(t.id))==null?void 0:n.layerId;if(t&&t instanceof Cesium$1.Cesium3DTileFeature)return(o=getTag(t.tileset))==null?void 0:o.layerId}const useDrawClipping=({enabled:t,surfacePoints:n,direction:o="inside",top:s,bottom:c,visible:d=!0,style:h,tilesetRef:p,viewer:y,clippingPlanes:E,isTilesetReady:L})=>{const[F,N]=React.useState(0),z=React.useMemo(()=>s??100,[s]),oe=React.useMemo(()=>c??10,[c]),[W,lt]=React.useState(!1),{requestRender:nt}=useContext();React.useEffect(()=>{(async()=>{if(!(p!=null&&p.current)||!L)return;if(!t||!n||(n==null?void 0:n.length)<2){E.removeAll(),N(0),nt==null||nt();return}E.modelMatrix=Cesium$1.Matrix4.IDENTITY.clone(),lt(!1);const Ai=polygon([n.map(ya=>[ya.lng,ya.lat])]),zi=centroid(Ai),ha=y!=null&&y.scene?await sampleTerrainHeight(y==null?void 0:y.scene,zi.geometry.coordinates[0],zi.geometry.coordinates[1])??0:0;N(ha);const ba=Cesium$1.Matrix4.inverse(Cesium$1.Transforms.eastNorthUpToFixedFrame(p.current.boundingSphere.center),new Cesium$1.Matrix4);let Sa=0;for(let ya=0;ya<n.length;ya++){const ms=n[ya],bs=n[(ya+1)%n.length];Sa+=(bs.lng-ms.lng)*(bs.lat+ms.lat)}Sa>0&&n.reverse(),E.removeAll();for(let ya=0;ya<n.length-1;ya++){const ms=n[ya],bs=n[ya+1];E.add(createSidePlane(ms,bs,ba,o))}E.add(createHorizontalPlane(n[0],ha+z,ba,o==="inside"?1:-1)),E.add(createHorizontalPlane(n[0],ha-oe,ba,o==="inside"?-1:1)),lt(!0)})()},[n,p,E,z,oe,t,o,y,L,nt]),React.useEffect(()=>{E.unionClippingRegions=o==="outside"},[E,o,t]);const Ee=React.useMemo(()=>({coordiantes:(n==null?void 0:n.map(yt=>[yt.lng,yt.lat]))??[],top:F+z,bottom:F-oe,visible:d,style:h,ready:W}),[n,F,z,oe,d,h,W]);return{drawClippingEnabled:t,drawClippingEdgeProps:Ee}},getOriginCoordinateSystemPoint=(t,n,o)=>{const s=Cesium$1.Cartesian3.fromDegrees(t.lng,t.lat,o);return Cesium$1.Matrix4.multiplyByPoint(n,s,new Cesium$1.Cartesian3)},createSidePlane=(t,n,o,s)=>{const c=getOriginCoordinateSystemPoint(t,o),d=getOriginCoordinateSystemPoint(n,o),h=new Cesium$1.Cartesian3(0,0,1),p=new Cesium$1.Cartesian3(0,0,-1),y=Cesium$1.Cartesian3.subtract(d,c,new Cesium$1.Cartesian3),E=s==="inside"?Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(y,h,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3):Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(y,p,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),L=Cesium$1.Plane.fromPointNormal(c,E);return Cesium$1.ClippingPlane.fromPlane(L)},createHorizontalPlane=(t,n,o,s)=>{const c=getOriginCoordinateSystemPoint(t,o,n),d=new Cesium$1.Cartesian3(0,0,s),h=Cesium$1.Plane.fromPointNormal(c,d);return Cesium$1.ClippingPlane.fromPlane(h)},DEFAULT_FEATURE_COLOR=Cesium$1.Color.WHITE,useData=t=>React.useMemo(()=>{var o;const n=extractSimpleLayerData(t);return{type:n==null?void 0:n.type,url:n==null?void 0:n.url,idProperty:n==null?void 0:n.idProperty,layers:n!=null&&n.layers?Array.isArray(n.layers)?n.layers.join(","):n==null?void 0:n.layers:void 0,googleMapApiKey:(o=n==null?void 0:n.serviceTokens)==null?void 0:o.googleMapApiKey}},[t]),makeFeatureId=(t,n,o)=>{const s=n.tile.boundingSphere.center,c=o&&!(t instanceof Cesium$1.Model)?t.getProperty(o):void 0;if(c)return c;const d=getBuiltinFeatureId(t);return generateIDWithMD5(`${s.x}-${s.y}-${s.z}-${d}-${t instanceof Cesium$1.Model?"":JSON.stringify(Object.entries(convertCesium3DTileFeatureProperties(t)).filter((h,p)=>typeof p=="string"||typeof p=="number").map(([h,p])=>`${h}${p}`))}`)},makeFeatureFrom3DTile=(t,n,o)=>{const s=n.tile.boundingSphere.center;return{type:"feature",id:makeFeatureId(t,n,o),geometry:{type:"Point",coordinates:[s.x,s.y,s.z]},range:{x:s.x,y:s.y,z:s.z}}},getBuiltinFeatureId=t=>(t instanceof Cesium$1.Model?t.id:t instanceof Cesium$1.Cesium3DTileFeature?t.featureId:"")??"",MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES=5e3,COMMON_STYLE_PROPERTIES=[{name:"color",convert:"color"},{name:"show"}],MODEL_STYLE_PROPERTIES=[{name:"color",convert:"colorFunctionString"},{name:"show"},{name:"pointSize"},{name:"meta"}],POINT_STYLE_PROPERTIES=[{name:"pointSize"}],TILESET_APPEARANCE_FIELDS=["show","color","pointSize","meta"],convertStyle=(t,n)=>n==="color"?toColor(t):n==="colorFunctionString"?t===void 0?t:`color("${t}")`:t,useFeature=({id:t,tileset:n,idProperty:o,layer:s,viewer:c,featureIndex:d,selectedFeatureIdsRef:h,evalFeature:p,onComputedFeatureFetch:y,shouldUseFeatureIndex:E,isTilesetReady:L})=>{const F=React.useRef([]),N=React.useRef(s),z=React.useRef(new Set),oe=(s==null?void 0:s.id)||t,W=useRefValue(oe),lt=React.useCallback(async pi=>{var fa;const mt=(fa=N==null?void 0:N.current)==null?void 0:fa.layer;if((mt==null?void 0:mt.type)==="simple"&&(pi!=null&&pi.feature)){const Wa=pi.raw,sl=getTag(Wa),Vd=c&&!(Wa instanceof Cesium$1.Model)?convertCesium3DTileFeatureProperties(Wa):{},Xd=E?h.current.includes((sl==null?void 0:sl.featureId)??""):sl==null?void 0:sl.isFeatureSelected,pu=p(mt,{...pi==null?void 0:pi.feature,properties:Vd}),gl=pu==null?void 0:pu["3dtiles"];return COMMON_STYLE_PROPERTIES.forEach(({name:md,convert:Gd})=>{var nf,lf;if(md==="color"){if(Xd){Wa.color=typeof((nf=mt["3dtiles"])==null?void 0:nf.selectedFeatureColor)=="string"?toColor((lf=mt["3dtiles"])==null?void 0:lf.selectedFeatureColor)??Wa.color:Wa.color;return}Wa.color=DEFAULT_FEATURE_COLOR}const tf=convertStyle(gl==null?void 0:gl[md],Gd);tf!==void 0&&(Wa[md]=tf)}),Wa instanceof Cesium$1.Cesium3DTilePointFeature&&POINT_STYLE_PROPERTIES.forEach(({name:md,convert:Gd})=>{const tf=convertStyle(gl==null?void 0:gl[md],Gd);tf!==void 0&&(Wa[md]=tf)}),"style"in Wa&&(Wa.style=new Cesium$1.Cesium3DTileStyle(MODEL_STYLE_PROPERTIES.reduce((md,{name:Gd,convert:tf})=>{const nf=convertStyle(gl==null?void 0:gl[Gd],tf);return nf===void 0?md:{...md,[Gd]:nf}},{}))),attachTag(pi.raw,{layerId:oe,featureId:pi.feature.id,computedFeature:pu,isFeatureSelected:sl==null?void 0:sl.isFeatureSelected}),pu}},[p,oe,c,E,h]),nt=React.useCallback(async pi=>{if(pi.tileset.isDestroyed())return;const mt=new Set;await lookupFeatures(pi.content,async(fa,Wa,sl)=>{const Vd={feature:makeFeatureFrom3DTile(fa,Wa,o),raw:fa};attachTag(Vd.raw,{layerId:W.current,featureId:Vd.feature.id}),sl!=null&&E&&d.addFeature(Wa,sl,Vd.feature.id),await lt(Vd),F.current.push(Vd),z.current.add(Vd.feature.id),mt.add(pick(Vd.feature,["id","type","range"]))}),y==null||y(Array.from(mt.values()),[])},[F,lt,y,o,d,E,W]),Ee=React.useRef(nt);Ee.current=nt,React.useEffect(()=>{var pi;return(pi=n.current)==null?void 0:pi.tileLoad.addEventListener(mt=>Ee.current(mt))},[n,L]);const yt=React.useCallback(async pi=>{pi.tileset.isDestroyed()||!E||await lookupFeatures(pi.content,async(mt,fa)=>{d.deleteFeature(makeFeatureId(mt,fa,o))})},[o,d,E]),Ai=React.useRef(yt);Ai.current=yt,React.useEffect(()=>{var pi;return(pi=n.current)==null?void 0:pi.tileUnload.addEventListener(mt=>Ai.current(mt))},[n,L]),React.useEffect(()=>{N.current=s},[s]);const zi=React.useMemo(()=>{var pi;return(pi=extractSimpleLayer(s))==null?void 0:pi["3dtiles"]},[s]),ha=usePick(zi,TILESET_APPEARANCE_FIELDS),ba=E?0:s==null?void 0:s.layer._updateStyle,Sa=React.useRef(ba),ya=React.useRef();React.useEffect(()=>{ya.current=Date.now()},[ha,ba]);const ms=React.useCallback(async(pi,mt)=>new Promise(fa=>requestAnimationFrame(()=>{if(ya.current&&ya.current>mt){fa(void 0);return}(ha||ba)&<(pi),fa(void 0)})),[ha,lt,ba]),bs=React.useCallback(async pi=>{const mt=[];let fa=!1;for(const Wa of F.current){if(ya.current&&ya.current>pi){fa=!0;break}mt.push(ms(Wa,pi)),mt.length>MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES&&(await Promise.all(mt),mt.length=0)}fa||await Promise.all(mt),Sa.current=ba,mt.length=0},[ms,ba]),{requestRender:Ra}=useContext();React.useEffect(()=>{(async()=>{const mt=Date.now();await bs(mt),Ra==null||Ra()})()},[bs,Ra,ba])},useHooks$2=({id:t,boxId:n,isVisible:o,property:s,viewerProperty:c,layer:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E})=>{var Nf,Jf,qf,Bf,zm,Tf;const{viewer:L}=$e$1(),F=React.useRef(),{onLayerLoad:N,updateCredits:z}=useContext(),oe=React.useRef(d==null?void 0:d.id);oe.current=d==null?void 0:d.id;const{tileset:W,styleUrl:lt,edgeColor:nt,edgeWidth:Ee,experimental_clipping:yt,selectedFeatureColor:Ai,disableIndexingFeature:zi}=s??{},{width:ha,height:ba,length:Sa,location:ya,coordinates:ms,heading:bs,roll:Ra,pitch:pi,planes:mt,visible:fa=!0,direction:Wa="inside",builtinBoxProps:sl,allowEnterGround:Vd}=useClippingBox({clipping:yt,boxId:n}),[Xd,pu]=React.useState(),{url:gl,type:md,idProperty:Gd,googleMapApiKey:tf}=useData(d),nf=!zi&&!!Gd,[lf,ff]=React.useState(!1),_f=React.useRef(mt),pf=React.useMemo(()=>{var Cf,Df;return(!((Cf=_f.current)!=null&&Cf.length)||!((Df=_f.current)!=null&&Df.every((Wf,$f)=>{var Em,Qf,Am,wm,_m,xf;return((Em=Wf.normal)==null?void 0:Em.x)===((Qf=mt==null?void 0:mt[$f].normal)==null?void 0:Qf.x)&&((Am=Wf.normal)==null?void 0:Am.y)===((wm=mt==null?void 0:mt[$f].normal)==null?void 0:wm.y)&&((_m=Wf.normal)==null?void 0:_m.z)===((xf=mt==null?void 0:mt[$f].normal)==null?void 0:xf.z)&&Wf.distance===(mt==null?void 0:mt[$f].distance)})))&&(_f.current=mt),_f.current},[mt]),vf=Wa==="inside"?-1:1,[Mf,Af]=React.useState(()=>new Cesium$1.ClippingPlaneCollection({planes:pf==null?void 0:pf.map(Cf=>{var Df,Wf,$f;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Df=Cf.normal)==null?void 0:Df.x,(Wf=Cf.normal)==null?void 0:Wf.y,($f=Cf.normal)==null?void 0:$f.z),(Cf.distance||0)*vf)}),unionClippingRegions:Wa==="outside",edgeWidth:Ee,edgeColor:toColor(nt)}));React.useEffect(()=>()=>{Af(new Cesium$1.ClippingPlaneCollection({planes:pf==null?void 0:pf.map(Cf=>{var Df,Wf,$f;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Df=Cf.normal)==null?void 0:Df.x,(Wf=Cf.normal)==null?void 0:Wf.y,($f=Cf.normal)==null?void 0:$f.z),(Cf.distance||0)*vf)}),unionClippingRegions:Wa==="outside",edgeWidth:Ee,edgeColor:toColor(nt)}))},[]);const{drawClippingEnabled:Lf,drawClippingEdgeProps:Wc}=useDrawClipping({...yt==null?void 0:yt.draw,tilesetRef:F,viewer:L,clippingPlanes:Mf,isTilesetReady:lf}),[uf]=React.useState(()=>new TilesetFeatureIndex),rf=React.useCallback(Cf=>{Cf!=null&&Cf.cesiumElement&&attachTag(Cf.cesiumElement,{layerId:(d==null?void 0:d.id)||t,featureIndex:nf?uf:void 0,appearanceType:"3dtiles"}),d!=null&&d.id&&(Cf!=null&&Cf.cesiumElement)&&((Cf==null?void 0:Cf.cesiumElement)[layerIdField]=d.id),F.current=Cf==null?void 0:Cf.cesiumElement},[t,d==null?void 0:d.id,uf,nf]),ef=React.useRef([]),Zd=React.useRef(Ai);Zd.current=Ai;const[of]=React.useState(()=>new Map);React.useEffect(()=>{!F.current||!nf||!lf||Object.assign(F.current,{onSelectFeature:Cf=>{const Df=getTag(Cf);Df!=null&&Df.featureId&&(ef.current.push(Df.featureId),of.set(Df.featureId,Cf.color)),Zd.current&&(Cf.color=toColor(Zd.current)??Cf.color)},onUnselectFeature:Cf=>{const Df=getTag(Cf);Df!=null&&Df.featureId&&(ef.current=ef.current.filter(Wf=>Wf!==Df.featureId)),Cf.color=of.get((Df==null?void 0:Df.featureId)??"")??DEFAULT_FEATURE_COLOR}})},[of,uf,nf,lf]),useFeature({id:t,tileset:F,layer:d,idProperty:Gd,viewer:L,evalFeature:p,onComputedFeatureFetch:y,featureIndex:uf,selectedFeatureIdsRef:ef,shouldUseFeatureIndex:nf,isTilesetReady:lf});const[hf,df]=React.useState(0),cf=React.useRef(!1),gf=React.useCallback(Cf=>{cf.current||!L||Vd||(cf.current=!0,sampleTerrainHeightFromCartesian(L.scene,Cf).then(Df=>{df(Df??0),cf.current=!1}))},[Vd,L]);React.useEffect(()=>{if(yt!=null&&yt.draw)return;const Cf=ms||(ya?[ya.lng,ya.lat,ya.height??0]:void 0),Df=Cesium$1.Cartesian3.fromDegrees((Cf==null?void 0:Cf[0])||0,(Cf==null?void 0:Cf[1])||0,(Cf==null?void 0:Cf[2])||0);(async()=>{if(!F.current||!lf)return;const $f=F.current.clippingPlanesOriginMatrix.clone(),Em=new Cesium$1.Cartesian3(ha||100,Sa||100,ba||100);if(!Vd){const _m=new Cesium$1.TranslationRotationScale(Df,void 0,Em);translationWithClamping(_m,!!Vd,hf),Df.x=_m.translation.x,Df.y=_m.translation.y,Df.z=_m.translation.z}const Qf=bs&&pi&&Ra?new Cesium$1.HeadingPitchRoll(bs,pi,Ra):void 0,Am=Cesium$1.Matrix4.multiply(Qf?Cesium$1.Matrix4.fromRotationTranslation(Cesium$1.Matrix3.fromHeadingPitchRoll(Qf),Df):Cesium$1.Transforms.eastNorthUpToFixedFrame(Df),Cesium$1.Matrix4.fromScale(Em,new Cesium$1.Matrix4),new Cesium$1.Matrix4),wm=Cesium$1.Matrix4.inverse($f,new Cesium$1.Matrix4);Cesium$1.Matrix4.multiply(wm,Am,Mf.modelMatrix)})(),Vd||gf(Df)},[ha,Sa,ba,bs,pi,Ra,ya,ms,Mf.modelMatrix,gf,Vd,hf,yt==null?void 0:yt.draw,lf]),React.useEffect(()=>{yt!=null&&yt.draw||(Mf.enabled=fa)},[Mf,fa,yt==null?void 0:yt.draw]),React.useEffect(()=>{yt!=null&&yt.draw||(Mf.unionClippingRegions=Wa==="outside")},[Mf,Wa,yt==null?void 0:yt.draw]),React.useEffect(()=>{yt!=null&&yt.draw||(Mf.removeAll(),pf==null||pf.forEach(Cf=>{var Df,Wf,$f;return Mf.add(new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Df=Cf.normal)==null?void 0:Df.x,(Wf=Cf.normal)==null?void 0:Wf.y,($f=Cf.normal)==null?void 0:$f.z),(Cf.distance||0)*vf))}))},[pf,Mf,vf,yt==null?void 0:yt.draw]),React.useEffect(()=>{if(!lt){pu(void 0);return}(async()=>{const Cf=await fetch(lt);Cf.ok&&pu(new Cesium$1.Cesium3DTileStyle(await Cf.json()))})()},[lt]);const Sf=React.useMemo(()=>md!=="google-photorealistic"||!o?null:(async()=>{try{return(await Cesium$1.createGooglePhotorealistic3DTileset(tf)).resource}catch(Df){throw console.error(`Error loading Photorealistic 3D Tiles tileset: ${Df}`),Df}})(),[md,o,tf]),bf=React.useMemo(()=>md==="osm-buildings"&&o?Cesium$1.IonResource.fromAssetId(96188,{accessToken:h==null?void 0:h.cesiumIonAccessToken}):Sf&&o?Sf:md==="3dtiles"&&o?gl??W:null,[md,o,h==null?void 0:h.cesiumIonAccessToken,Sf,gl,W]),Pf=React.useMemo(()=>{var Em,Qf,Am,wm,_m,xf,zf,wf,yf,Of;if(!(s!=null&&s.specularEnvironmentMaps)&&!(s!=null&&s.sphericalHarmonicCoefficients)&&!((Qf=(Em=c==null?void 0:c.scene)==null?void 0:Em.imageBasedLighting)!=null&&Qf.specularEnvironmentMaps)&&!((wm=(Am=c==null?void 0:c.scene)==null?void 0:Am.imageBasedLighting)!=null&&wm.sphericalHarmonicCoefficients))return;const Cf=new Cesium$1.ImageBasedLighting,Df=(s==null?void 0:s.specularEnvironmentMaps)??((xf=(_m=c==null?void 0:c.scene)==null?void 0:_m.imageBasedLighting)==null?void 0:xf.specularEnvironmentMaps),Wf=(s==null?void 0:s.imageBasedLightIntensity)??((wf=(zf=c==null?void 0:c.scene)==null?void 0:zf.imageBasedLighting)==null?void 0:wf.intensity),$f=arrayToCartecian3((s==null?void 0:s.sphericalHarmonicCoefficients)??((Of=(yf=c==null?void 0:c.scene)==null?void 0:yf.imageBasedLighting)==null?void 0:Of.sphericalHarmonicCoefficients),Wf);return Df&&(Cf.specularEnvironmentMaps=Df),$f&&(Cf.sphericalHarmonicCoefficients=$f),Cf},[s==null?void 0:s.specularEnvironmentMaps,s==null?void 0:s.sphericalHarmonicCoefficients,s==null?void 0:s.imageBasedLightIntensity,(Jf=(Nf=c==null?void 0:c.scene)==null?void 0:Nf.imageBasedLighting)==null?void 0:Jf.specularEnvironmentMaps,(Bf=(qf=c==null?void 0:c.scene)==null?void 0:qf.imageBasedLighting)==null?void 0:Bf.sphericalHarmonicCoefficients,(Tf=(zm=c==null?void 0:c.scene)==null?void 0:zm.imageBasedLighting)==null?void 0:Tf.intensity]),If=React.useCallback(Cf=>{ff(!0),E==null||E({properties:Cf.properties}),N==null||N({layerId:oe.current})},[E,N]);return React.useEffect(()=>(z==null||z(),()=>{z==null||z()}),[md,z]),{tilesetUrl:bf,ref:rf,style:Xd,clippingPlanes:Mf,drawClippingEnabled:Lf,drawClippingEdgeProps:Wc,builtinBoxProps:sl,imageBasedLighting:Pf,handleReady:If}};function Tileset({id:t,isVisible:n,property:o,layer:s,feature:c,viewerProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E,...L}){const{shadows:F,colorBlendMode:N,pbr:z,showWireframe:oe,showBoundingVolume:W,cacheBytes:lt}=o??{},nt=`${s==null?void 0:s.id}_box`,{tilesetUrl:Ee,ref:yt,style:Ai,clippingPlanes:zi,drawClippingEnabled:ha,drawClippingEdgeProps:ba,builtinBoxProps:Sa,imageBasedLighting:ya,handleReady:ms}=useHooks$2({id:t,boxId:nt,isVisible:n,layer:s,feature:c,property:o,viewerProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E}),bs=React.useMemo(()=>{var pi,mt;return{...((pi=s==null?void 0:s.layer)==null?void 0:pi.type)==="simple"?(mt=s==null?void 0:s.layer)==null?void 0:mt.box:{},...(Sa==null?void 0:Sa.property)||{}}},[s==null?void 0:s.layer,Sa==null?void 0:Sa.property]),Ra=React.useMemo(()=>({...s,id:nt}),[s,nt]);return!n||!Ee?null:jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(Ds$1,{ref:yt,url:Ee,customShader:z===!1?NonPBRLightingShader:z==="withTexture"?NonPBRWithTextureLightingShader:void 0,cacheBytes:lt,style:Ai,shadows:shadowMode(F),clippingPlanes:zi,colorBlendMode:colorBlendModeFor3DTile(N),imageBasedLighting:ya,onReady:ms,debugWireframe:oe,debugShowBoundingVolume:W}),Sa&&jsxRuntimeExports.jsx(Box,{...L,id:nt,viewerProperty:d,property:bs,geometry:Sa.geometry,feature:c,layer:Ra,isVisible:Sa.visible,evalFeature:p,onLayerEdit:Sa.handleLayerEdit}),ha&&jsxRuntimeExports.jsx(DrawClippingPolygon,{...ba})]})}const Tileset$1=React.memo(Tileset,(t,n)=>{var o,s;return t.id===n.id&&t.isVisible===n.isVisible&&t.property===n.property&&((o=t.layer)==null?void 0:o.layer)===((s=n.layer)==null?void 0:s.layer)&&t.viewerProperty===n.viewerProperty&&t.meta===n.meta&&t.evalFeature===n.evalFeature&&t.onComputedFeatureFetch===n.onComputedFeatureFetch&&t.onFeatureDelete===n.onFeatureDelete}),config$1={noFeature:!0},NON_RENDERABLE_APPEARANCE=["transition"],isRenderableAppearance=t=>!NON_RENDERABLE_APPEARANCE.includes(t),components={marker:[Marker,config$8],polyline:[Polyline,config$4],polygon:[Polygon,config$5],ellipsoid:[Ellipsoid,config$b],ellipse:[Ellipse,config$c],model:[Model,config$7],"3dtiles":[Tileset$1,config$1],box:[Box,config$d],photooverlay:[PhotoOverlay,config$6],resource:[Resource,config$2],raster:[Raster$1,config$3],heatMap:[HeatMap,config$9],frustum:[Frustum,config$a]},displayConfig={geojson:"auto",csv:"auto",czml:["resource"],kml:["resource"],wms:["raster"],mvt:["raster"],tms:["raster"],"3dtiles":["3dtiles"],"osm-buildings":["3dtiles"],"google-photorealistic":["3dtiles"],gpx:"auto",shapefile:"auto",gtfs:"auto",georss:[],gml:[],gltf:["model"],tiles:["raster"],heatMap:["heatMap"]},PICKABLE_APPEARANCE=["raster","3dtiles"],pickProperty=(t,n)=>{if(PICKABLE_APPEARANCE.includes(t)&&n.layer.type==="simple")return n.layer[t]},CACHED_COMPONENTS=new LRUCache({max:1e4}),FEATURE_DELEGATE_THRESHOLD=6e3;function Feature$1({layer:t,isHidden:n,sketchEditingFeature:o,...s}){var oe,W,lt;const c=extractSimpleLayerData(t),d=!(c!=null&&c.type)||c.type==="auto"?guessType(c==null?void 0:c.url):void 0;let h=(c==null?void 0:c.type)&&displayConfig[d??c.type];(((oe=t.features)==null?void 0:oe.length)>FEATURE_DELEGATE_THRESHOLD||(W=c==null?void 0:c.geojson)!=null&&W.useAsResource)&&(h=["resource"]);const p=Array.isArray(h)&&h.every(nt=>components[nt][1].noFeature&&!components[nt][1].noLayer),y=!!((lt=t==null?void 0:t.transition)!=null&<.useTransition),E=!(c!=null&&c.updateInterval)&&!y,L=React.useMemo(()=>c!=null&&c.url?generateIDWithMD5(c.url):"",[c==null?void 0:c.url]),{requestRender:F}=useContext();React.useEffect(()=>{setTimeout(()=>{F==null||F()},300)}),React.useEffect(()=>()=>F==null?void 0:F(),[F]);const N=(nt,Ee)=>{var ba,Sa,ya,ms,bs,Ra,pi;if(!isRenderableAppearance(nt))return null;const yt=!!((ya=(Sa=(ba=s.viewerProperty)==null?void 0:ba.scene)==null?void 0:Sa.imageBasedLighting)!=null&&ya.sphericalHarmonicCoefficients),Ai=!!((Ra=(bs=(ms=s.viewerProperty)==null?void 0:ms.scene)==null?void 0:bs.imageBasedLighting)!=null&&Ra.specularEnvironmentMaps),zi=t.layer.visible!==!1&&!n&&!((o==null?void 0:o.layerId)===t.id&&((pi=o==null?void 0:o.feature)==null?void 0:pi.id)===(Ee==null?void 0:Ee.id)),ha=L+generateIDWithMD5(`${t.id}_${(Ee==null?void 0:Ee.id)??""}_${nt}_${zi}_${yt}_${Ai}_${JSON.stringify(Ee==null?void 0:Ee[nt])??""}_${JSON.stringify(t.transition)??""}_${JSON.stringify(Ee==null?void 0:Ee.geometry)??""}`);if(E){const mt=CACHED_COMPONENTS.get(ha);if(E&&mt)return mt}try{const[mt,fa]=components[nt]??[];if(!mt||Ee&&!Ee[nt]||fa.noLayer&&!Ee||fa.noFeature&&Ee||Array.isArray(h)&&!h.includes(nt)||!Array.isArray(h)&&h!=="auto"||(c==null?void 0:c.type)==="geojson"&&h==="auto"&&nt==="resource")return null;const Wa=React.createElement(mt,{...s,key:y?void 0:ha,id:y?(Ee==null?void 0:Ee.id)??t.id:ha,property:Ee?Ee[nt]:t[nt]||pickProperty(nt,t),geometry:Ee==null?void 0:Ee.geometry,feature:Ee,layer:t,isVisible:zi});return E&&CACHED_COMPONENTS.set(ha,Wa),Wa}catch(mt){return console.error(`Error rendering component ${ha}`,mt),null}},z=React.useMemo(()=>!p||!h||!Array.isArray(h)?null:jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:h.map(nt=>{var ya,ms,bs,Ra,pi,mt,fa,Wa,sl,Vd,Xd,pu;const[Ee]=components[nt]??[],yt=t.layer.visible!==!1&&!n,Ai=!!((bs=(ms=(ya=s.viewerProperty)==null?void 0:ya.scene)==null?void 0:ms.imageBasedLighting)!=null&&bs.sphericalHarmonicCoefficients),zi=!!((mt=(pi=(Ra=s.viewerProperty)==null?void 0:Ra.scene)==null?void 0:pi.imageBasedLighting)!=null&&mt.specularEnvironmentMaps),ha=((fa=t==null?void 0:t.layer)==null?void 0:fa.type)==="simple"&&!!((sl=(Wa=t==null?void 0:t.layer)==null?void 0:Wa["3dtiles"])!=null&&sl.sphericalHarmonicCoefficients),ba=((Vd=t==null?void 0:t.layer)==null?void 0:Vd.type)==="simple"&&!!((pu=(Xd=t==null?void 0:t.layer)==null?void 0:Xd["3dtiles"])!=null&&pu.specularEnvironmentMaps),Sa=L+generateIDWithMD5(`${(t==null?void 0:t.id)||""}_${nt}_${yt}_${Ai}_${zi}_${ha}}_${ba}`);return React.createElement(Ee,{...s,key:Sa,id:`${t.id}_${nt}`,property:pickProperty(nt,t)||t[nt],layer:t,isVisible:yt})})}),[p,h,t,n,L,s]);return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:z||[void 0,...t.features].flatMap(nt=>Object.keys(components).map(Ee=>N(Ee,nt)))})}function e2eAccessToken(){return window.REEARTH_E2E_ACCESS_TOKEN}function setE2ECesiumViewer(t){t?window.REEARTH_E2E_CESIUM_VIEWER=t:delete window.REEARTH_E2E_CESIUM_VIEWER}const targetWidth=1e6,targetLength=1e6;function useCameraLimiter(t,n,o){var p,y;const s=React.useMemo(()=>{var L,F;const E=(L=t.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()||!(o!=null&&o.enabled)||!((F=o.targetArea)!=null&&F.lng)||!o.targetArea.lat))return getGeodesic(E,o.targetArea.lng,o.targetArea.lat)},[t,o==null?void 0:o.enabled,(p=o==null?void 0:o.targetArea)==null?void 0:p.lng,(y=o==null?void 0:o.targetArea)==null?void 0:y.lat]),c=React.useMemo(()=>{if(!s)return;const E=typeof(o==null?void 0:o.targetWidth)=="number"?o.targetWidth:targetWidth,L=typeof(o==null?void 0:o.targetLength)=="number"?o.targetLength:targetLength,{cartesianArray:F,cartographicDimensions:N}=calcBoundaryBox(s,L/2,E/2);return{cartographicDimensions:N,cartesianArray:F}},[o==null?void 0:o.targetWidth,o==null?void 0:o.targetLength,s]),[d,h]=React.useState();return React.useEffect(()=>{var nt;const E=(nt=t.current)==null?void 0:nt.cesiumElement;if(!E||E.isDestroyed()||!(o!=null&&o.targetArea)||!s)return;const L=new Cesium$1.Camera(E.scene);L.setView({destination:Cesium$1.Cartesian3.fromDegrees(o.targetArea.lng,o.targetArea.lat,o.targetArea.height),orientation:{heading:o==null?void 0:o.targetArea.heading,pitch:o==null?void 0:o.targetArea.pitch,roll:o==null?void 0:o.targetArea.roll,up:L.up}});const F=L.computeViewRectangle();if(!F)return;const N=Cesium$1.Rectangle.computeWidth(F)*Cesium$1.Math.PI*1e6,z=Cesium$1.Rectangle.computeHeight(F)*Cesium$1.Math.PI*1e6,{targetWidth:oe=targetWidth,targetLength:W=targetLength}=o??{},{cartesianArray:lt}=calcBoundaryBox(s,W/2+z,oe/2+N);h(lt)},[t,o,s]),React.useEffect(()=>{var F,N;const E=(F=t==null?void 0:t.current)==null?void 0:F.cesiumElement,L=getCamera((N=t==null?void 0:t.current)==null?void 0:N.cesiumElement);!E||E.isDestroyed()||!L||!(o!=null&&o.enabled)||!c||E.camera.setView({destination:getAllowedCameraDestination(L,c),orientation:{heading:E.camera.heading,pitch:E.camera.pitch,roll:E.camera.roll,up:E.camera.up}})},[n,t,o,c]),{cameraViewBoundaries:c==null?void 0:c.cartesianArray,cameraViewOuterBoundaries:d,cameraViewBoundariesMaterial}}const cameraViewBoundariesMaterial=new Cesium$1.PolylineDashMaterialProperty({color:Cesium$1.Color.RED}),getGeodesic=(t,n,o)=>{const s=t.scene.globe.ellipsoid,c=Cesium$1.Cartesian3.fromDegrees(n,o,0),d=Cesium$1.Cartographic.fromCartesian(c),h=s.geodeticSurfaceNormal(c),p=Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(Cesium$1.Cartesian3.UNIT_Z,h,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),y=Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(h,p,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),E=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(y),s),L=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(p),s);return{vertical:E,horizontal:L}},calcBoundaryBox=(t,n,o)=>{const s=t.vertical.interpolateUsingSurfaceDistance(n),c=t.vertical.interpolateUsingSurfaceDistance(-n),d=t.horizontal.interpolateUsingSurfaceDistance(o),h=t.horizontal.interpolateUsingSurfaceDistance(-o),p=new Cesium$1.Cartographic(d.longitude,s.latitude,0),y=new Cesium$1.Cartographic(h.longitude,s.latitude,0),E=new Cesium$1.Cartographic(d.longitude,c.latitude,0),L=new Cesium$1.Cartographic(h.longitude,c.latitude,0);return{cartographicDimensions:{rightDimension:d,leftDimension:h,topDimension:s,bottomDimension:c},cartesianArray:[Cesium$1.Cartographic.toCartesian(p),Cesium$1.Cartographic.toCartesian(y),Cesium$1.Cartographic.toCartesian(L),Cesium$1.Cartographic.toCartesian(E),Cesium$1.Cartographic.toCartesian(p)]}},getAllowedCameraDestination=(t,n)=>{const o=Cesium$1.Cartographic.fromDegrees(t==null?void 0:t.lng,t==null?void 0:t.lat,t==null?void 0:t.height),s=new Cesium$1.Cartographic(Cesium$1.Math.clamp(o.longitude,n.cartographicDimensions.leftDimension.longitude,n.cartographicDimensions.rightDimension.longitude),Cesium$1.Math.clamp(o.latitude,n.cartographicDimensions.bottomDimension.latitude,n.cartographicDimensions.topDimension.latitude),o.height);return Cesium$1.Cartographic.toCartesian(s)},useCamera=({cesium:t,property:n,camera:o,featureFlags:s,engineAPI:c,cameraForceHorizontalRoll:d=!1,onCameraChange:h})=>{var Ee,yt,Ai;const p=React.useRef([]),y=React.useCallback(()=>{var ba;const zi=(ba=t==null?void 0:t.current)==null?void 0:ba.cesiumElement;if(!zi||zi.isDestroyed()||!h)return;const ha=getCamera(zi);ha&&!isEqual(ha,o)&&(p.current.push(ha),p.current.length>10&&p.current.shift(),h==null||h(ha))},[t,o,h]),E=React.useCallback(()=>{y()},[y]),L=React.useCallback(()=>{y()},[y]);React.useEffect(()=>{o&&!p.current.includes(o)&&(c.flyTo(o,{duration:0}),p.current=[])},[o,c]),React.useEffect(()=>{var ya;if(!((ya=t.current)!=null&&ya.cesiumElement))return;const zi=!!(s&FEATURE_FLAGS.CAMERA_MOVE),ha=!!(s&FEATURE_FLAGS.CAMERA_ZOOM),ba=!!(s&FEATURE_FLAGS.CAMERA_TILT),Sa=!!(s&FEATURE_FLAGS.CAMERA_LOOK);t.current.cesiumElement.scene.screenSpaceCameraController.enableTranslate=zi,t.current.cesiumElement.scene.screenSpaceCameraController.enableRotate=zi,t.current.cesiumElement.scene.screenSpaceCameraController.enableLook=Sa,t.current.cesiumElement.scene.screenSpaceCameraController.enableTilt=ba,t.current.cesiumElement.scene.screenSpaceCameraController.enableZoom=ha},[t,s]);const F=React.useRef(!1),N=useCustomCompareCallback(()=>{var zi,ha,ba,Sa,ya,ms;F.current||(F.current=!0,(ha=(zi=n==null?void 0:n.camera)==null?void 0:zi.limiter)!=null&&ha.enabled&&((Sa=(ba=n==null?void 0:n.camera)==null?void 0:ba.limiter)!=null&&Sa.targetArea)?c.flyTo((ms=(ya=n==null?void 0:n.camera)==null?void 0:ya.limiter)==null?void 0:ms.targetArea,{duration:0}):o&&c.flyTo(o,{duration:0}))},[c,(yt=(Ee=n==null?void 0:n.camera)==null?void 0:Ee.limiter)==null?void 0:yt.enabled],(zi,ha)=>zi[0]===ha[0]&&zi[1]===ha[1]),z=React.useCallback(()=>{F.current=!1},[]),{cameraViewBoundaries:oe,cameraViewOuterBoundaries:W,cameraViewBoundariesMaterial:lt}=useCameraLimiter(t,o,(Ai=n==null?void 0:n.camera)==null?void 0:Ai.limiter),nt=React.useCallback(zi=>{!zi.camera||!d||Math.abs(Cesium$1.Math.negativePiToPi(zi.camera.roll))>Math.PI/86400&&zi.camera.setView({orientation:{heading:zi.camera.heading,pitch:zi.camera.pitch,roll:0}})},[d]);return React.useEffect(()=>{var ha;const zi=(ha=t.current)==null?void 0:ha.cesiumElement;if(zi)return zi.scene.preRender.addEventListener(nt)},[t,nt]),{cameraViewBoundaries:oe,cameraViewOuterBoundaries:W,cameraViewBoundariesMaterial:lt,mountCamera:N,unmountCamera:z,handleCameraChange:E,handleCameraMoveEnd:L}},colorScratch=new Cesium$1.Color;function pickFramebufferEnd(t){const n=t.width??1,o=t.height??1,s=this._context,c=s.readPixels({x:t.x,y:t.y,width:n,height:o,framebuffer:this._fb.framebuffer}),d=new Set;for(let h=0;h<c.length;h+=4)try{colorScratch.red=Cesium$1.Color.byteToFloat(c[h]),colorScratch.green=Cesium$1.Color.byteToFloat(c[h+1]),colorScratch.blue=Cesium$1.Color.byteToFloat(c[h+2]),colorScratch.alpha=Cesium$1.Color.byteToFloat(c[h+3]);const p=s.getObjectByPickColor(colorScratch);p!=null&&d.add(p)}catch(p){console.error(p)}return Array.from(d.values())}const pickingFrustumScratch=new Cesium$1.PerspectiveOffCenterFrustum,pixelSizeScratch=new Cesium$1.Cartesian2;function getPickCullingVolume(t,n,o,s,c){const d=t.camera,h=d.frustum;invariant$1(h instanceof Cesium$1.PerspectiveFrustum);const p=h.near,y=Math.tan(h.fovy/2),E=h.aspectRatio*y,L=n.x,F=n.y,N=2*(L-c.x)/c.width-1,z=2*(c.height-F-c.y)/c.height-1,oe=N*p*E,W=z*p*y,lt=h.getPixelDimensions(c.width,c.height,p,getPixelRatio(t),pixelSizeScratch),nt=lt.x*o/2,Ee=lt.y*s/2,yt=pickingFrustumScratch;return yt.top=W+Ee,yt.bottom=W-Ee,yt.right=oe+nt,yt.left=oe-nt,yt.near=p,yt.far=h.far,yt.computeCullingVolume(d.positionWC,d.directionWC,d.upWC)}function getIntersection(t,n,o=new Cesium$1.BoundingRectangle){invariant$1(t.width>=0&&t.height>=0),invariant$1(n.width>=0&&n.height>=0);const s=Math.max(t.x,n.x),c=Math.min(t.x+t.width,n.x+n.width),d=Math.max(t.y,n.y),h=Math.min(t.y+t.height,n.y+n.height);if(!(s>=c||d>=h))return o.x=s,o.y=d,o.width=c-s,o.height=h-d,o.clone(new Cesium$1.BoundingRectangle)}const pickTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.PICK}),zeroColor=new Cesium$1.Color(0,0,0,0),positionScratch=new Cesium$1.Cartesian2,rectangleScratch=new Cesium$1.BoundingRectangle;function pickManyFromViewport(t,n,o,s){const c=t.groundPrimitives.show;t.groundPrimitives.show=!1,invariant$1(o>0&&s>0);const d=t.context,h=t.defaultView;t.view=h;const p=h.viewport;p.x=0,p.y=0,p.width=d.drawingBufferWidth,p.height=d.drawingBufferHeight,h.passState.viewport=Cesium$1.BoundingRectangle.clone(p,h.passState.viewport),t.jobScheduler.disableThisFrame(),t.updateFrameState();const y=SceneTransforms.transformWindowToDrawingBuffer(t,n,positionScratch),E=getPixelRatio(t),L=o*E,F=s*E,N=t.frameState;N.cullingVolume=getPickCullingVolume(t,y,L,F,p),N.invertClassification=!1,N.passes.pick=!0,N.tilesetPassState=pickTilesetPassState,d.uniformState.update(N),t.updateEnvironment(),rectangleScratch.x=y.x-L/2,rectangleScratch.y=t.drawingBufferHeight-y.y-F/2,rectangleScratch.height=F,rectangleScratch.width=L;const z=getIntersection(rectangleScratch,h.viewport,rectangleScratch);invariant$1(z!=null);const oe=h.pickFramebuffer.begin(z,h.viewport);t.updateAndExecuteCommands(oe,zeroColor),t.resolveFramebuffers(oe);const W=pickFramebufferEnd.apply(h.pickFramebuffer,[rectangleScratch]);return d.endFrame(),t.groundPrimitives.show=c,W}const pickManyFromViewportAsFeature=(t,n,o,s,c)=>{const d=pickManyFromViewport(t.scene,n,o,s),h=[];for(const p of d){const[y,E]=convertObjToComputedFeature(t.clock.currentTime,p)??[],L=E?{...E,layerId:y}:void 0;!L||c&&!c(L)||h.push(L)}return h},cartographicScratch=new Cartographic,cartesianScratch1$2=new Cartesian3,cartesianScratch2=new Cartesian3;function createPoint(t,n){if(t.length===1)try{const o=Cartographic.fromCartesian(t[0],n,cartographicScratch);return point([CesiumMath.toDegrees(o.longitude),CesiumMath.toDegrees(o.latitude)]).geometry}catch(o){console.error(o)}}function createCircle(t,n){if(t.length!==2)return;const o=Cartesian3.distance(t[0],t[1]);if(o!==0)try{const s=Cartographic.fromCartesian(t[0],n,cartographicScratch);return ellipse([CesiumMath.toDegrees(s.longitude),CesiumMath.toDegrees(s.latitude)],o,o,{units:"meters"}).geometry}catch(s){console.error(s)}}function createRectangle(t,n){if(!(t.length!==2&&t.length!==3))try{if(t.length===2)return lineString(t.map(F=>{const N=Cartographic.fromCartesian(F,n,cartographicScratch);return[CesiumMath.toDegrees(N.longitude),CesiumMath.toDegrees(N.latitude)]})).geometry;const[o,s,c]=t,d=Cartesian3.projectVector(Cartesian3.subtract(c,o,cartesianScratch1$2),Cartesian3.subtract(s,o,cartesianScratch2),cartesianScratch1$2),h=Cartesian3.subtract(c,Cartesian3.add(o,d,cartesianScratch1$2),cartesianScratch2),p=Cartesian3.add(o,h,cartesianScratch1$2),y=Cartesian3.add(s,h,cartesianScratch2);return polygon([[o,s,y,p,o].map(L=>{const F=Cartographic.fromCartesian(L,n,cartographicScratch);return[CesiumMath.toDegrees(F.longitude),CesiumMath.toDegrees(F.latitude)]})]).geometry}catch(o){console.error(o)}}function createPolyline(t,n){if(!(t.length<2))try{return lineString(t.map(s=>{const c=Cartographic.fromCartesian(s,n,cartographicScratch);return[CesiumMath.toDegrees(c.longitude),CesiumMath.toDegrees(c.latitude)]})).geometry}catch(o){console.error(o)}}function createPolygon(t,n){if(!(t.length<2))try{return t.length===2?lineString(t.map(c=>{const d=Cartographic.fromCartesian(c,n,cartographicScratch);return[CesiumMath.toDegrees(d.longitude),CesiumMath.toDegrees(d.latitude)]})).geometry:polygon([[...t,t[0]].map(s=>{const c=Cartographic.fromCartesian(s,n,cartographicScratch);return[CesiumMath.toDegrees(c.longitude),CesiumMath.toDegrees(c.latitude)]})]).geometry}catch(o){console.error(o)}}function createGeometry({type:t,controlPoints:n}){switch(t){case"marker":return createPoint(n);case"polyline":return createPolyline(n);case"circle":case"extrudedCircle":return createCircle(n);case"rectangle":case"extrudedRectangle":return createRectangle(n);case"polygon":case"extrudedPolygon":return createPolygon(n);default:return}}function useEngineRef(t,n){const o=React.useRef(),s=React.useRef({click:[],doubleClick:[],mouseDown:[],mouseUp:[],rightClick:[],rightDown:[],rightUp:[],middleClick:[],middleDown:[],middleUp:[],mouseMove:[],mouseEnter:[],mouseLeave:[],wheel:[]}),c=React.useRef([]),d=React.useMemo(()=>({name:"cesium",requestRender:()=>{var p,y;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(y=h.scene)==null||y.requestRender()},getCamera:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return getCamera(h)},getLocationFromScreen:(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()))return getLocationFromScreen(E.scene,h,p,y)},getCameraFovInfo:({withTerrain:h,calcViewSize:p})=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))try{let L,F,N;return h&&(F=getCameraTerrainIntersection(y.scene),F&&(L=cartesianToLatLngHeight(F,y.scene))),L||(F=new Cesium__namespace.Cartesian3,getCameraEllipsoidIntersection(y.scene,F),L=cartesianToLatLngHeight(F,y.scene)),p&&F&&y.scene.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(N=Cesium__namespace.Cartesian3.distance(y.scene.camera.positionWC,F)*Math.tan(y.scene.camera.frustum.fov/2)),{center:L,viewSize:N}}catch{return}},sampleTerrainHeight:async(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return await sampleTerrainHeight(y.scene,h,p)},computeGlobeHeight:(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()))return E.scene.globe.getHeight(Cesium__namespace.Cartographic.fromDegrees(h,p,y))},getGlobeHeight:()=>{var E;const h=(E=n.current)==null?void 0:E.cesiumElement;if(!h||h.isDestroyed())return;const p=h.scene,{globeHeight:y}=p;if(!(!p||y==null))return y},toXYZ:(h,p,y,E)=>{var N;const L=(N=n.current)==null?void 0:N.cesiumElement;if(!L||L.isDestroyed())return;const F=Cesium__namespace.Cartesian3.fromDegrees(h,p,y,E!=null&&E.useGlobeEllipsoid?L.scene.globe.ellipsoid:void 0);return[F.x,F.y,F.z]},toLngLatHeight:(h,p,y,E)=>{var N;const L=(N=n.current)==null?void 0:N.cesiumElement;if(!L||L.isDestroyed())return;const F=Cesium__namespace.Cartographic.fromCartesian(Cesium__namespace.Cartesian3.fromElements(h,p,y),E!=null&&E.useGlobeEllipsoid?L.scene.globe.ellipsoid:void 0);return[Cesium$1.Math.toDegrees(F.longitude),Cesium$1.Math.toDegrees(F.latitude),F.height]},toWindowPosition:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=Cesium__namespace.SceneTransforms.wgs84ToWindowCoordinates(p.scene,Cesium__namespace.Cartesian3.fromElements(...h));return[y.x,y.y]},convertScreenToPositionOffset:(h,p)=>{var ya;const y=(ya=n.current)==null?void 0:ya.cesiumElement;if(!y||y.isDestroyed())return;const E=Cesium__namespace.Cartesian3.fromElements(...h),L=new Cesium__namespace.Cartesian3,F=new Cesium__namespace.Cartographic,N=new Cesium__namespace.Cartesian3,z=new Cesium__namespace.Ellipsoid,oe=new Cesium__namespace.Ray,W=new Cesium__namespace.Cartesian3,lt=y.scene,nt=lt.globe.ellipsoid;let Ee;try{Ee=Cesium__namespace.Cartographic.fromCartesian(E,nt,F)}catch{return}N.x=nt.radii.x+Ee.height,N.y=nt.radii.y+Ee.height,N.z=nt.radii.z+Ee.height;const yt=Cesium__namespace.Ellipsoid.fromCartesian3(N,z),Ai=new Cesium__namespace.Cartesian2;try{[Ai.x,Ai.y]=d.toWindowPosition(h)??[0,0]}catch{return}Ai.x+=p[0],Ai.y+=p[1];const zi=lt.camera.getPickRay(Ai,oe);if(zi==null)return;const ha=Cesium__namespace.IntersectionTests.rayEllipsoid(zi,yt);if(ha==null)return;const ba=Cesium__namespace.Ray.getPoint(zi,ha.start,W),Sa=Cesium__namespace.Cartesian3.subtract(ba,E,L);return[Sa.x,Sa.y,Sa.z]},isPositionVisible:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return!1;const y=new EllipsoidalOccluder(Cesium__namespace.Ellipsoid.WGS84,Cesium__namespace.Cartesian3.ZERO);return y.cameraPosition=p.scene.camera.position,y.isPointVisible(Cesium__namespace.Cartesian3.fromElements(...h))},setView:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed()||h.lat===void 0||h.lng===void 0||h.height===void 0)return!1;const y=p.scene;if(h.lng||h.lat||h.height){const L=Cesium__namespace.Cartesian3.fromDegrees(h.lng,h.lat,h.height);y.camera.position.x=L.x,y.camera.position.y=L.y,y.camera.position.z=L.z}(h.heading||h.pitch)&&y.camera.setView({orientation:{heading:h.heading,pitch:h.pitch}}),h.fov&&y.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(y.camera.frustum.fov=h.fov)},getExtrudedHeight:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return getExtrudedHeight(y.scene,new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian2(p[0],p[1]))},getExtrudedPoint:(h,p)=>{var z,oe;if(!h||!p)return;const y=(z=n.current)==null?void 0:z.cesiumElement;if(!y||y.isDestroyed())return;const E=new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),L=new Cesium__namespace.Cartesian3,F=(oe=y.scene)==null?void 0:oe.globe.ellipsoid.geodeticSurfaceNormal(E,L);if(!F)return;const N=Cesium__namespace.Cartesian3.add(E,Cesium__namespace.Cartesian3.multiplyByScalar(F,p,L),L);return[N.x,N.y,N.z]},getSurfaceDistance:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=y.scene,L=new Cesium__namespace.EllipsoidGeodesic(void 0,void 0,E.globe.ellipsoid);return L.setEndPoints(Cesium__namespace.Cartographic.fromCartesian(h,E.globe.ellipsoid,new Cesium__namespace.Cartographic),Cesium__namespace.Cartographic.fromCartesian(p,E.globe.ellipsoid,new Cesium__namespace.Cartographic)),L.surfaceDistance},equalsEpsilon2d:(h,p,y=0,E=0)=>Cesium__namespace.Cartesian2.equalsEpsilon(new Cesium__namespace.Cartesian2(h[0],h[1]),new Cesium__namespace.Cartesian2(p[0],p[1]),y,E),equalsEpsilon3d:(h,p,y=0,E=0)=>Cesium__namespace.Cartesian3.equalsEpsilon(new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian3(p[0],p[1],p[2]),y,E),createGeometry:({type:h,controlPoints:p})=>createGeometry({type:h,controlPoints:p.map(y=>new Cesium__namespace.Cartesian3(...y))}),setCursor:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;if(!(!p||p.isDestroyed()))return p.canvas.style.cursor=h??"auto",null},flyTo:(h,p)=>{var y,E,L,F,N;if(h&&typeof h=="object"){const z=(y=n.current)==null?void 0:y.cesiumElement;if(!z||z.isDestroyed())return;(E=o.current)==null||E.call(o),o.current=flyTo((L=z.scene)==null?void 0:L.camera,{...getCamera(z),...h},p)}if(h&&typeof h=="string"){const z=(F=n.current)==null?void 0:F.cesiumElement;if(!z||z.isDestroyed())return;const oe=h,W=findEntity(z,oe,oe,!0),lt=getTag(W);if(W instanceof Cesium__namespace.Primitive){z.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(W.modelMatrix));return}if(W instanceof Cesium__namespace.GroundPrimitive){z.scene.camera.flyToBoundingSphere(lt==null?void 0:lt.originalProperties);return}if(W&&!(W instanceof Cesium__namespace.Cesium3DTileFeature||W instanceof Cesium__namespace.Cesium3DTilePointFeature||W instanceof Cesium__namespace.Model||W instanceof Cesium__namespace.Primitive||W instanceof Cesium__namespace.GroundPrimitive))z.flyTo(W,p);else{for(const yt of[z.dataSourceDisplay.dataSources,z.dataSources])for(let Ai=0;Ai<yt.length;Ai++){const zi=yt.get(Ai);if(zi.entities.values.find(Sa=>{var ya;return((ya=getTag(Sa))==null?void 0:ya.layerId)===oe})){z.flyTo(zi,p);return}}const nt=[];for(const yt of z.entities.values)((N=getTag(yt))==null?void 0:N.layerId)===oe&&nt.push(yt);if(nt.length){z.flyTo(nt,p);return}const Ee=findEntity(z,oe);if(Ee instanceof Cesium__namespace.Primitive){z.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(Ee.modelMatrix));return}Ee&&!(Ee instanceof Cesium__namespace.Cesium3DTileFeature||Ee instanceof Cesium__namespace.Cesium3DTilePointFeature||Ee instanceof Cesium__namespace.Model||Ee instanceof Cesium__namespace.Primitive||Ee instanceof Cesium__namespace.GroundPrimitive)&&z.flyTo(Ee,p)}}},flyToBBox:(h,p)=>{var F,N;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;(N=o.current)==null||N.call(o);const E=Cesium__namespace.BoundingSphere.fromRectangle3D(Cesium__namespace.Rectangle.fromDegrees(...h)),L=y.scene.camera;y.camera.flyToBoundingSphere(E,{offset:{heading:p!=null&&p.heading?Cesium$1.Math.toDegrees(p.heading):y.scene.camera.heading,pitch:p!=null&&p.pitch?Cesium$1.Math.toDegrees(p.pitch):L.pitch,range:(p==null?void 0:p.range)??0},duration:p==null?void 0:p.duration}),o.current=()=>{L==null||L.cancelFlight()}},rotateOnCenter:h=>{var L;const p=(L=n.current)==null?void 0:L.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=getCameraEllipsoidIntersection(y,new Cesium__namespace.Cartesian3);E&&y.camera.rotate(E,h)},overrideScreenSpaceController:h=>{var L,F;const p=(L=n.current)==null?void 0:L.cesiumElement;if(!p||p.isDestroyed())return;const y=(F=p.scene)==null?void 0:F.screenSpaceCameraController,E=getOverriddenScreenSpaceCameraOptions(h);Object.assign(y,E)},lookAt:(h,p)=>{var E,L,F;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed())){if(p!=null&&p.withoutAnimation)return lookAtWithoutAnimation(y.scene,{...getCamera(y),...h});(L=o.current)==null||L.call(o),o.current=lookAt((F=y.scene)==null?void 0:F.camera,{...getCamera(y),...h},p)}},lookAtLayer:h=>{var oe,W;const p=(oe=n.current)==null?void 0:oe.cesiumElement;if(!p||p.isDestroyed())return;const y=p.entities.getById(h);if(!y)return;const E=(W=y.position)==null?void 0:W.getValue(p.clock.currentTime);if(!E)return;const L=p.camera.positionWC,F=Cesium__namespace.Cartesian3.distance(E,L);if(Math.round(F*1e3)/1e3===5e3)return;const N=getCamera(p),z=new Cesium__namespace.HeadingPitchRange((N==null?void 0:N.heading)??0,(N==null?void 0:N.pitch)??-90,5e3);p.zoomTo(y,z)},getViewport:()=>{var y;const h=(y=n.current)==null?void 0:y.cesiumElement;if(!h||h.isDestroyed())return;const p=h.camera.computeViewRectangle();return p?{north:Cesium$1.Math.toDegrees(p.north),south:Cesium$1.Math.toDegrees(p.south),west:Cesium$1.Math.toDegrees(p.west),east:Cesium$1.Math.toDegrees(p.east)}:void 0},zoomIn:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:1/h},p)},zoomOut:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:h},p)},orbit:h=>{var lt;const p=(lt=n.current)==null?void 0:lt.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=y.camera,L=.02,F=h+Cesium$1.Math.PI_OVER_TWO,N=Math.cos(F)*L,z=Math.sin(F)*L,oe=Cesium__namespace.Matrix4.clone(E.transform),W=getCenterCamera({camera:E,scene:y});if(W||E.positionWC){const nt=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(W||E.positionWC,y.globe.ellipsoid);E.lookAtTransform(nt)}p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?E.move(new Cesium__namespace.Cartesian3(N,z,0),Math.max(y.canvas.clientWidth,y.canvas.clientHeight)/100*E.positionCartographic.height*L):W?(E.rotateLeft(N),E.rotateUp(z)):(E.look(Cesium__namespace.Cartesian3.UNIT_Z,N),E.look(E.right,z)),E.lookAtTransform(oe)},rotateRight:h=>{var N;const p=(N=n.current)==null?void 0:N.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=y.camera,L=Cesium__namespace.Matrix4.clone(E.transform),F=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(E.positionWC,y.globe.ellipsoid);p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?(E.twistRight(h- -E.heading),E.twistLeft(h- -E.heading)):(E.lookAtTransform(F),E.rotateRight(h- -E.heading),E.lookAtTransform(L))},changeSceneMode:(h,p=2)=>{var E,L,F,N;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()||!y.scene))switch(h){case"2d":(L=y==null?void 0:y.scene)==null||L.morphTo2D(p);break;case"columbus":(F=y==null?void 0:y.scene)==null||F.morphToColumbusView(p);break;case"3d":default:(N=y==null?void 0:y.scene)==null||N.morphTo3D(p);break}},getClock:()=>{var y;const h=(y=n.current)==null?void 0:y.cesiumElement;if(!h||h.isDestroyed()||!h.clock)return;const p=h.clock;return getClock(p)},captureScreen:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return y.scene.requestRender(),y.render(),y.canvas.toDataURL(h,p)},enableScreenSpaceCameraController:(h=!0)=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed()||!p.scene)return;const y=!!h;p.scene.screenSpaceCameraController.enableRotate=y,p.scene.screenSpaceCameraController.enableTranslate=y,p.scene.screenSpaceCameraController.enableZoom=y,p.scene.screenSpaceCameraController.enableTilt=y,p.scene.screenSpaceCameraController.enableLook=y},lookHorizontal:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||lookHorizontal(p.scene,h)},lookVertical:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||lookVertical(p.scene,h)},moveForward:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveForward(p.scene,h)},moveBackward:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveBackward(p.scene,h)},moveUp:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveUp(p.scene,h)},moveDown:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveDown(p.scene,h)},moveLeft:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveLeft(p.scene,h)},moveRight:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveRight(p.scene,h)},moveOverTerrain:async h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||moveOverTerrain(p,h)},flyToGround:async(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;!E||E.isDestroyed()||flyToGround(E,o,h,p,y)},onClick:h=>{s.current.click.push(h)},onDoubleClick:h=>{s.current.doubleClick.push(h)},onMouseDown:h=>{s.current.mouseDown.push(h)},onMouseUp:h=>{s.current.mouseUp.push(h)},onRightClick:h=>{s.current.rightClick.push(h)},onRightDown:h=>{s.current.rightDown.push(h)},onRightUp:h=>{s.current.rightUp.push(h)},onMiddleClick:h=>{s.current.middleClick.push(h)},onMiddleDown:h=>{s.current.middleDown.push(h)},onMiddleUp:h=>{s.current.middleUp.push(h)},onMouseMove:h=>{s.current.mouseMove.push(h)},onMouseEnter:h=>{s.current.mouseEnter.push(h)},onMouseLeave:h=>{s.current.mouseLeave.push(h)},onWheel:h=>{s.current.wheel.push(h)},mouseEventCallbacks:s.current,changeSpeed:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.multiplier=h,p.clock.clockStep=Cesium$1.ClockStep.SYSTEM_CLOCK_MULTIPLIER)},changeTime:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.currentTime=Cesium$1.JulianDate.fromDate(h))},pause:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(h.clock.shouldAnimate=!1)},play:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(h.clock.shouldAnimate=!0)},tick:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return Cesium$1.JulianDate.toDate(h.clock.tick())},changeStart:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.startTime=Cesium$1.JulianDate.fromDate(h))},changeStop:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.stopTime=Cesium$1.JulianDate.fromDate(h))},inViewport:h=>{const p=d.getViewport();return!!(p&&h&&typeof h.lng=="number"&&typeof h.lat=="number"&&Cesium__namespace.Rectangle.contains(new Cesium__namespace.Rectangle(Cesium$1.Math.toRadians(p.west),Cesium$1.Math.toRadians(p.south),Cesium$1.Math.toRadians(p.east),Cesium$1.Math.toRadians(p.north)),Cesium__namespace.Cartographic.fromDegrees(h.lng,h.lat)))},findFeatureById:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=findEntity(y,h,p),L=getTag(E);if(L!=null&&L.featureId){if(E instanceof Cesium__namespace.Entity)return{type:"feature",id:L.featureId,properties:convertEntityProperties(y.clock.currentTime,E),metaData:{description:convertEntityDescription(y.clock.currentTime,E)}};if(E instanceof Cesium__namespace.Cesium3DTileFeature||E instanceof Cesium__namespace.Cesium3DTilePointFeature)return{type:"feature",id:L.featureId,properties:convertCesium3DTileFeatureProperties(E)}}},findFeaturesByIds:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,L=>{var N;const F=(N=convertObjToComputedFeature(y.clock.currentTime,L))==null?void 0:N[1];return F?{...F,type:"feature"}:void 0})},findComputedFeatureById:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=findEntity(y,h,p),L=getTag(E);if(L!=null&&L.featureId){if(E instanceof Cesium__namespace.Entity)return L.computedFeature??{type:"computedFeature",id:L.featureId,geometry:getGeometryFromEntity(y.clock.currentTime,E),properties:convertEntityProperties(y.clock.currentTime,E),metaData:{description:convertEntityDescription(y.clock.currentTime,E)}};if(E instanceof Cesium__namespace.Cesium3DTileFeature||E instanceof Cesium__namespace.Cesium3DTilePointFeature)return L.computedFeature??{type:"computedFeature",id:L.featureId,properties:convertCesium3DTileFeatureProperties(E)}}},findComputedFeaturesByIds:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,L=>{var F;return(F=convertObjToComputedFeature(y.clock.currentTime,L))==null?void 0:F[1]})},bringToFront:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"bringToFront"in y&&typeof y.bringToFront=="function"&&y.bringToFront()},sendToBack:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"sendToBack"in y&&typeof y.sendToBack=="function"&&y.sendToBack()},selectFeatures:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(L,F)=>{F&&"onSelectFeature"in F&&typeof F.onSelectFeature=="function"&&F.onSelectFeature(L);const z={...getTag(L)??{},isFeatureSelected:!0};return attachTag(L,z),L})},unselectFeatures:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(L,F)=>{F&&"onUnselectFeature"in F&&typeof F.onUnselectFeature=="function"&&F.onUnselectFeature(L);const N=getTag(L)??{};return N.isFeatureSelected=!1,attachTag(L,N),L})},pickManyFromViewport:(h,p,y,E)=>{var F;const L=(F=n.current)==null?void 0:F.cesiumElement;if(!(!L||L.isDestroyed()))return pickManyFromViewportAsFeature(L,new Cesium__namespace.Cartesian2(h[0],h[1]),p,y,E)},onTick:h=>{c.current.push(h)},removeTickEventListener:h=>{c.current=c.current.filter(p=>p!==h)||[]},tickEventCallback:c,calcRectangleControlPoint:(h,p,y)=>{const E=new Cesium__namespace.Cartesian3(...h),L=new Cesium__namespace.Cartesian3(...p),F=new Cesium__namespace.Cartesian3(...y),N=new Cesium__namespace.Cartesian3,z=new Cesium__namespace.Cartesian3,oe=Cesium__namespace.Cartesian3.projectVector(Cesium__namespace.Cartesian3.subtract(F,E,N),Cesium__namespace.Cartesian3.subtract(L,E,z),N),W=Cesium__namespace.Cartesian3.subtract(F,Cesium__namespace.Cartesian3.add(E,oe,N),z),lt=Cesium__namespace.Cartesian3.midpoint(E,L,N),nt=Cesium__namespace.Cartesian3.add(lt,W,z),Ee=[nt.x,nt.y,nt.z];return[h,p,Ee]},getCredits:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return getCredits(h)}}),[n]);return React.useImperativeHandle(t,()=>d,[d]),d}const useExplicitRender=({cesium:t,requestingRenderMode:n,isLayerDragging:o,shouldRender:s,property:c})=>{const d=React.useCallback(()=>{var y;const p=(y=t.current)==null?void 0:y.cesiumElement;!(n!=null&&n.current)||!p||p.isDestroyed()||(p.scene.requestRender(),n.current===REQUEST_RENDER_ONCE&&(n.current=NO_REQUEST_RENDER))},[t,n]),h=React.useRef();React.useEffect(()=>{h.current=d},[d]),React.useEffect(()=>{var y;const p=(y=t.current)==null?void 0:y.cesiumElement;if(!(!p||p.isDestroyed()))return p.scene.postUpdate.addEventListener(()=>{var E;(E=h.current)==null||E.call(h)})},[t]),React.useEffect(()=>{n&&(n.current=REQUEST_RENDER_ONCE)},[c,n]),React.useEffect(()=>{var y;const p=(y=t.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||n&&(n.current=o||s?FORCE_REQUEST_RENDER:n.current===REQUEST_RENDER_ONCE?REQUEST_RENDER_ONCE:NO_REQUEST_RENDER)},[t,o,s,n])};var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(t,n,o)=>n in t?__defProp(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o,__spreadValues=(t,n)=>{for(var o in n||(n={}))__hasOwnProp.call(n,o)&&__defNormalProp(t,o,n[o]);if(__getOwnPropSymbols)for(var o of __getOwnPropSymbols(n))__propIsEnum.call(n,o)&&__defNormalProp(t,o,n[o]);return t},__spreadProps=(t,n)=>__defProps(t,__getOwnPropDescs(n));class CesiumDnD{constructor(n,o){this._initialEnableRotate=!0,this._initialEnableTranslate=!0,this._callbackProperty=new Cesium$1.CallbackProperty(()=>{var s;return(s=this._position)!=null?s:this._initialPosition},!1),this.cancelDragging=()=>{clearTimeout(this._timeout),this._entity&&(this._entity.position=this._initialPosition),this._entity=void 0,this._initialPosition=void 0,this._initialScreenPosition=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging)},this._handleDrag=s=>{var c;if(this._entity||this.viewer.isDestroyed()||!(s!=null&&s.position))return;const d=this._pick(s.position);if(!d)return;const h=()=>{var p,y,E;if(this._entity||this.viewer.isDestroyed())return;this._timeout=void 0,this._initialPosition=d.position,this._initialScreenPosition=s.position.clone();const L=(p=d.position)==null?void 0:p.getValue(this.viewer.clock.currentTime);if(L){const z=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(L).height;this._ellipsoid=CesiumDnD.enlargeEllipsoid(this.viewer.scene.globe.ellipsoid,z),this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW?this._initialHeight=z:this._initialHeight=void 0}const F=this._resetHeight(this._convertCartesian2ToPosition(s.position)),N=this._context(F,s.position);if(N&&((E=(y=this.options)==null?void 0:y.onDrag)==null?void 0:E.call(y,d,F,N))===!1){this._initialPosition=void 0,this._initialScreenPosition=void 0,this._ellipsoid=void 0;return}this._position=F,this._entity=d,this._initialEnableRotate=this.viewer.scene.screenSpaceCameraController.enableRotate,this._initialEnableTranslate=this.viewer.scene.screenSpaceCameraController.enableTranslate,this.viewer.scene.mode===Cesium$1.SceneMode.SCENE3D?this.viewer.scene.screenSpaceCameraController.enableRotate=!1:this.viewer.scene.screenSpaceCameraController.enableTranslate=!1,this.viewer.canvas.addEventListener("blur",this.cancelDragging),d.position=this._callbackProperty};if(window.clearTimeout(this._timeout),typeof((c=this.options)==null?void 0:c.dragDelay)>"u"){h();return}this._timeout=window.setTimeout(h,this.options.dragDelay)},this._handleDragging=s=>{var c,d;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!(s!=null&&s.endPosition))return;const h=this._resetHeight(this._convertCartesian2ToPosition(s.endPosition)),p=this._context(h,s.endPosition);if(!p)return;const y=(d=(c=this.options)==null?void 0:c.onDragging)==null?void 0:d.call(c,this._entity,h,__spreadProps(__spreadValues({},p),{previousScreenPosition:s.startPosition}));y!==!1&&(typeof y<"u"?this._position=y:h&&(this._position=h))},this._handleDrop=s=>{var c,d;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!(s!=null&&s.position))return;const h=this._entity;h.position=this._initialPosition,this._position=void 0,this._entity=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging);const p=this._resetHeight(this._convertCartesian2ToPosition(s.position)),y=this._context(p,s.position);this._initialPosition=void 0,this._initialScreenPosition=void 0,this._initialHeight=void 0,this._ellipsoid=void 0,y&&((d=(c=this.options)==null?void 0:c.onDrop)==null?void 0:d.call(c,h,p,y))!==!1&&p&&(h.position=p)},this.viewer=n,this.options=o,o!=null&&o.initialDisabled||this.enable()}get isDragging(){return!!this._entity}enable(){var n,o,s,c,d,h;this._handler=new Cesium$1.ScreenSpaceEventHandler(this.viewer.canvas),this._handler.setInputAction(this._handleDrag,(o=(n=this.options)==null?void 0:n.dragInputType)!=null?o:Cesium$1.ScreenSpaceEventType.LEFT_DOWN),this._handler.setInputAction(this._handleDragging,(c=(s=this.options)==null?void 0:s.draggingInputType)!=null?c:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),this._handler.setInputAction(this._handleDrop,(h=(d=this.options)==null?void 0:d.dropInputType)!=null?h:Cesium$1.ScreenSpaceEventType.LEFT_UP)}disable(){var n;this.cancelDragging(),(n=this._handler)==null||n.destroy(),this._handler=void 0}get isActive(){return!!this._handler}_pick(n){var o;return(o=this.viewer.scene.pick(n))==null?void 0:o.id}_context(n,o){if(this._initialScreenPosition)return{position:n,screenPosition:o,initialPosition:this._initialPosition,initialScreenPosition:this._initialScreenPosition}}_convertCartesian2ToPosition(n){var o;return this.viewer.scene.camera.pickEllipsoid(n,(o=this._ellipsoid)!=null?o:this.viewer.scene.globe.ellipsoid)}_resetHeight(n){if(n&&(this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW)&&this._initialHeight){const o=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(n);return Cesium$1.Cartesian3.fromRadians(o.longitude,o.latitude,this._initialHeight)}return n}static enlargeEllipsoid(n,o){return new Cesium$1.Ellipsoid(n.radii.x+o,n.radii.y+o,n.radii.z+o)}}const useLayerDragDrop=({cesium:t,isLayerDraggable:n,onLayerDrag:o,onLayerDrop:s})=>{const c=React.useCallback((p,y,E)=>{var z,oe;const L=(z=t.current)==null?void 0:z.cesiumElement;if(!L||L.isDestroyed()||!isSelectable(p)||!isDraggable(p))return!1;const F=convertCartesian3ToPosition((oe=t.current)==null?void 0:oe.cesiumElement,y);if(!F)return!1;const N=getTag(p);if(!N)return!1;o==null||o(N.layerId||"",N.featureId,F)},[t,o]),d=React.useCallback((p,y)=>{var N,z;const E=(N=t.current)==null?void 0:N.cesiumElement;if(!E||E.isDestroyed())return!1;const L=getTag(p),F=convertCartesian3ToPosition((z=t.current)==null?void 0:z.cesiumElement,y);return s==null||s((L==null?void 0:L.layerId)||"",(L==null?void 0:L.featureId)||"",F),!1},[t,s]),h=React.useRef();return React.useEffect(()=>{var y;const p=(y=t.current)==null?void 0:y.cesiumElement;if(!(!p||p.isDestroyed()))return h.current=new CesiumDnD(p,{onDrag:c,onDrop:d,dragDelay:1e3,initialDisabled:!n}),()=>{var E;!p||p.isDestroyed()||(E=h.current)==null||E.disable()}},[t,n,c,d]),{handleLayerDrag:c,handleLayerDrop:d}},makeMouseEventProps=(t,n)=>{if(!t||t.isDestroyed())return;const o=n.position||n.startPosition;return{x:o==null?void 0:o.x,y:o==null?void 0:o.y,...o?getLocationFromScreen(t.scene,o.x,o.y,!0)??{}:{}}},useLayerSelectWithRect=({cesium:t,engineAPI:n,featureFlags:o,onLayerSelectWithRectStart:s,onLayerSelectWithRectMove:c,onLayerSelectWithRectEnd:d})=>{const h=React.useRef([0,0]),p=React.useRef(!1),y=React.useRef(!1),E=React.useCallback((z,oe)=>{var lt;if(p.current||y.current||o!==INTERACTION_MODES.selection||!((lt=t.current)!=null&<.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const W=makeMouseEventProps(t.current.cesiumElement,z)??{};h.current=[W.x??0,W.y??0],y.current=!0,p.current=!1,s==null||s({...W,pressedKey:oe})},[s,t,o]),L=React.useCallback((z,oe,W)=>{var ha;if(!y.current||!((ha=t.current)!=null&&ha.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const lt=makeMouseEventProps(t.current.cesiumElement,z)??{};let[nt,Ee]=h.current,[yt,Ai]=[lt.x??0,lt.y??0];if(yt-nt===0&&Ai-Ee===0)return lt;W||(p.current=!0),nt>yt&&([yt,nt]=[nt,yt]),Ee>Ai&&([Ai,Ee]=[Ee,Ai]);const zi={...lt,pressedKey:oe,x:yt,y:Ai,startX:nt,startY:Ee,width:yt-nt,height:Ai-Ee};return c==null||c(zi),zi},[c,t]),F=React.useCallback((z,oe)=>{var ya;if(!y.current||!((ya=t.current)!=null&&ya.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const W=L(z,oe,!0),{startX:lt=0,startY:nt=0,x:Ee=0,y:yt=0,width:Ai=0,height:zi=0}=W??{},[ha,ba]=[lt+Ai/2,nt+zi/2],Sa=p.current?n.pickManyFromViewport([ha,ba],Ai,zi):n.pickManyFromViewport([Ee,yt],1,1);d==null||d({...W,pressedKey:oe,features:Sa??[],isClick:!p.current}),p.current=!1,y.current=!1},[d,t,n,L]);return React.useMemo(()=>Object.fromEntries(Object.entries({start:{handler:E,keys:["shift"]},move:{handler:L,keys:["shift"]},end:{handler:F,keys:["shift"]}}).map(([oe,W])=>[oe,{handler:W.handler,...Object.fromEntries(W.keys.map(lt=>[lt,nt=>W.handler(nt,lt)]))}])),[F,L,E])},GlobeFSDefinitions=`uniform vec3 u_reearth_sphericalHarmonicCoefficients[9];
|
|
6102
|
+
Original error:`,ya)}}function ba(ya,ms,bs){return n(this,void 0,void 0,function*(){let Ra;try{Ra=ms(...bs)}catch(mt){return yt(ya,mt)}const pi=oe(Ra)?"observable":"promise";if(zi(ya,pi),oe(Ra)){const mt=Ra.subscribe(fa=>Ai(ya,!1,c.serialize(fa)),fa=>{yt(ya,c.serialize(fa)),F.delete(ya)},()=>{Ai(ya,!0),F.delete(ya)});F.set(ya,mt)}else try{const mt=yield Ra;Ai(ya,!0,c.serialize(mt))}catch(mt){yt(ya,c.serialize(mt))}})}function Sa(ya){if(!p.default.isWorkerRuntime())throw Error("expose() called in the master thread.");if(L)throw Error("expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.");if(L=!0,typeof ya=="function")p.default.subscribeToMasterMessages(ms=>{z(ms)&&!ms.method&&ba(ms.uid,ya,ms.args.map(c.deserialize))}),nt();else if(typeof ya=="object"&&ya){p.default.subscribeToMasterMessages(bs=>{z(bs)&&bs.method&&ba(bs.uid,ya[bs.method],bs.args.map(c.deserialize))});const ms=Object.keys(ya).filter(bs=>typeof ya[bs]=="function");Ee(ms)}else throw Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${ya}`);p.default.subscribeToMasterMessages(ms=>{if(N(ms)){const bs=ms.uid,Ra=F.get(bs);Ra&&(Ra.unsubscribe(),F.delete(bs))}})}t.expose=Sa,typeof self<"u"&&typeof self.addEventListener=="function"&&p.default.isWorkerRuntime()&&(self.addEventListener("error",ya=>{setTimeout(()=>ha(ya.error||ya),250)}),self.addEventListener("unhandledrejection",ya=>{const ms=ya.reason;ms&&typeof ms.message=="string"&&setTimeout(()=>ha(ms),250)})),typeof process<"u"&&typeof process.on=="function"&&p.default.isWorkerRuntime()&&(process.on("uncaughtException",ya=>{setTimeout(()=>ha(ya),250)}),process.on("unhandledRejection",ya=>{ya&&typeof ya.message=="string"&&setTimeout(()=>ha(ya),250)}))}(ud),function(t){var n=rt&&rt.__createBinding||(Object.create?function(p,y,E,L){L===void 0&&(L=E),Object.defineProperty(p,L,{enumerable:!0,get:function(){return y[E]}})}:function(p,y,E,L){L===void 0&&(L=E),p[L]=y[E]}),o=rt&&rt.__exportStar||function(p,y){for(var E in p)E!=="default"&&!Object.prototype.hasOwnProperty.call(y,E)&&n(y,p,E)};Object.defineProperty(t,"__esModule",{value:!0}),t.Transfer=t.DefaultSerializer=t.expose=t.registerSerializer=void 0;var s=xt;Object.defineProperty(t,"registerSerializer",{enumerable:!0,get:function(){return s.registerSerializer}}),o(Dc,t);var c=ud;Object.defineProperty(t,"expose",{enumerable:!0,get:function(){return c.expose}});var d=Xe;Object.defineProperty(t,"DefaultSerializer",{enumerable:!0,get:function(){return d.DefaultSerializer}});var h=Ot;Object.defineProperty(t,"Transfer",{enumerable:!0,get:function(){return h.Transfer}})}(jc);const de=Cr(jc);de.registerSerializer;const Um=de.spawn;de.BlobWorker,de.DefaultSerializer;const Ym=de.Pool;de.Thread;const Jm=de.Transfer;de.Worker;const rd="dmFyIHgwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgTzA9KFgsayxudCk9PmsgaW4gWD94MChYLGsse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm50fSk6WFtrXT1udDt2YXIgdj0oWCxrLG50KT0+KE8wKFgsdHlwZW9mIGshPSJzeW1ib2wiP2srIiI6ayxudCksbnQpLGFyPShYLGssbnQpPT57aWYoIWsuaGFzKFgpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbnQpfTt2YXIgYz0oWCxrLG50KT0+KGFyKFgsaywicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxudD9udC5jYWxsKFgpOmsuZ2V0KFgpKSxVPShYLGssbnQpPT57aWYoay5oYXMoWCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7ayBpbnN0YW5jZW9mIFdlYWtTZXQ/ay5hZGQoWCk6ay5zZXQoWCxudCl9LEM9KFgsayxudCxFZSk9PihhcihYLGssIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxFZT9FZS5jYWxsKFgsbnQpOmsuc2V0KFgsbnQpLG50KSx5bj0oWCxrLG50LEVlKT0+KHtzZXQgXyh3dCl7QyhYLGssd3QsbnQpfSxnZXQgXygpe3JldHVybiBjKFgsayxFZSl9fSksdz0oWCxrLG50KT0+KGFyKFgsaywiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksbnQpOyhmdW5jdGlvbigpe3ZhciBIaSxGZSxJdCxSdCxOdCxNdCxJZSx1dCxDdCxhdCx0dCxMLF90LHh0LEV0LGh0LHZ0LGZ0LER0LEx0LE90LFB0LEp0LHB0LCRlLHVyLGhlLEh0LFZlLGJ0LEVuLHFpLGZlLE5lLHplLCR0LHRlLFZ0LGVlLFdlLGNyLFIwLE1lLEFuLENlLFRuLFksZXQsWGUsaHIsbGUscWU7InVzZSBzdHJpY3QiO3ZhciBYPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6e307ZnVuY3Rpb24gayh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBudD17fSxFZT10PT50P3R5cGVvZiBTeW1ib2wub2JzZXJ2YWJsZT09InN5bWJvbCImJnR5cGVvZiB0W1N5bWJvbC5vYnNlcnZhYmxlXT09ImZ1bmN0aW9uIj90PT09dFtTeW1ib2wub2JzZXJ2YWJsZV0oKTp0eXBlb2YgdFsiQEBvYnNlcnZhYmxlIl09PSJmdW5jdGlvbiI/dD09PXRbIkBAb2JzZXJ2YWJsZSJdKCk6ITE6ITEsd3Q9e30sX2U9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KF9lLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxfZS5EZWZhdWx0U2VyaWFsaXplcj1fZS5leHRlbmRTZXJpYWxpemVyPXZvaWQgMDtmdW5jdGlvbiBraSh0LGUpe2NvbnN0IG49dC5kZXNlcmlhbGl6ZS5iaW5kKHQpLHI9dC5zZXJpYWxpemUuYmluZCh0KTtyZXR1cm57ZGVzZXJpYWxpemUoaSl7cmV0dXJuIGUuZGVzZXJpYWxpemUoaSxuKX0sc2VyaWFsaXplKGkpe3JldHVybiBlLnNlcmlhbGl6ZShpLHIpfX19X2UuZXh0ZW5kU2VyaWFsaXplcj1raTtjb25zdCBmcj17ZGVzZXJpYWxpemUodCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IodC5tZXNzYWdlKSx7bmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFja30pfSxzZXJpYWxpemUodCl7cmV0dXJue19fZXJyb3JfbWFya2VyOiIkJGVycm9yIixtZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrfX19LFlpPXQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIl9fZXJyb3JfbWFya2VyImluIHQmJnQuX19lcnJvcl9tYXJrZXI9PT0iJCRlcnJvciI7X2UuRGVmYXVsdFNlcmlhbGl6ZXI9e2Rlc2VyaWFsaXplKHQpe3JldHVybiBZaSh0KT9mci5kZXNlcmlhbGl6ZSh0KTp0fSxzZXJpYWxpemUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcj9mci5zZXJpYWxpemUodCk6dH19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksd3Quc2VyaWFsaXplPXd0LmRlc2VyaWFsaXplPXd0LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3QgbHI9X2U7bGV0IGtlPWxyLkRlZmF1bHRTZXJpYWxpemVyO2Z1bmN0aW9uIEtpKHQpe2tlPWxyLmV4dGVuZFNlcmlhbGl6ZXIoa2UsdCl9d3QucmVnaXN0ZXJTZXJpYWxpemVyPUtpO2Z1bmN0aW9uIFppKHQpe3JldHVybiBrZS5kZXNlcmlhbGl6ZSh0KX13dC5kZXNlcmlhbGl6ZT1aaTtmdW5jdGlvbiBRaSh0KXtyZXR1cm4ga2Uuc2VyaWFsaXplKHQpfXd0LnNlcmlhbGl6ZT1RaTt2YXIgbmU9e30sU3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxTdC4kd29ya2VyPVN0LiR0cmFuc2ZlcmFibGU9U3QuJHRlcm1pbmF0ZT1TdC4kZXZlbnRzPVN0LiRlcnJvcnM9dm9pZCAwLFN0LiRlcnJvcnM9U3ltYm9sKCJ0aHJlYWQuZXJyb3JzIiksU3QuJGV2ZW50cz1TeW1ib2woInRocmVhZC5ldmVudHMiKSxTdC4kdGVybWluYXRlPVN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpLFN0LiR0cmFuc2ZlcmFibGU9U3ltYm9sKCJ0aHJlYWQudHJhbnNmZXJhYmxlIiksU3QuJHdvcmtlcj1TeW1ib2woInRocmVhZC53b3JrZXIiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG5lLlRyYW5zZmVyPW5lLmlzVHJhbnNmZXJEZXNjcmlwdG9yPXZvaWQgMDtjb25zdCBkcj1TdDtmdW5jdGlvbiBKaSh0KXtyZXR1cm4hKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCImJnRbZHIuJHRyYW5zZmVyYWJsZV19bmUuaXNUcmFuc2ZlckRlc2NyaXB0b3I9dG87ZnVuY3Rpb24gZW8odCxlKXtpZighZSl7aWYoIUppKHQpKXRocm93IEVycm9yKCk7ZT1bdF19cmV0dXJue1tkci4kdHJhbnNmZXJhYmxlXTohMCxzZW5kOnQsdHJhbnNmZXJhYmxlczplfX1uZS5UcmFuc2Zlcj1lbzt2YXIgRXI9e307KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lldvcmtlck1lc3NhZ2VUeXBlPXQuTWFzdGVyTWVzc2FnZVR5cGU9dm9pZCAwLGZ1bmN0aW9uKGUpe2UuY2FuY2VsPSJjYW5jZWwiLGUucnVuPSJydW4ifSh0Lk1hc3Rlck1lc3NhZ2VUeXBlfHwodC5NYXN0ZXJNZXNzYWdlVHlwZT17fSkpLGZ1bmN0aW9uKGUpe2UuZXJyb3I9ImVycm9yIixlLmluaXQ9ImluaXQiLGUucmVzdWx0PSJyZXN1bHQiLGUucnVubmluZz0icnVubmluZyIsZS51bmNhdWdodEVycm9yPSJ1bmNhdWdodEVycm9yIn0odC5Xb3JrZXJNZXNzYWdlVHlwZXx8KHQuV29ya2VyTWVzc2FnZVR5cGU9e30pKX0pKEVyKTt2YXIgUm49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFJuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBubz1mdW5jdGlvbigpe2NvbnN0IGU9dHlwZW9mIHNlbGY8InUiJiZ0eXBlb2YgV2luZG93PCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdpbmRvdztyZXR1cm4hISh0eXBlb2Ygc2VsZjwidSImJnNlbGYucG9zdE1lc3NhZ2UmJiFlKX0scm89ZnVuY3Rpb24oZSxuKXtzZWxmLnBvc3RNZXNzYWdlKGUsbil9LGlvPWZ1bmN0aW9uKGUpe2NvbnN0IG49aT0+e2UoaS5kYXRhKX0scj0oKT0+e3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHJ9O1JuLmRlZmF1bHQ9e2lzV29ya2VyUnVudGltZTpubyxwb3N0TWVzc2FnZVRvTWFzdGVyOnJvLHN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXM6aW99LGZ1bmN0aW9uKHQpe3ZhciBlPVgmJlguX19hd2FpdGVyfHxmdW5jdGlvbihULEIsJCxEKXtmdW5jdGlvbiB5dChvdCl7cmV0dXJuIG90IGluc3RhbmNlb2YgJD9vdDpuZXcgJChmdW5jdGlvbihndCl7Z3Qob3QpfSl9cmV0dXJuIG5ldygkfHwoJD1Qcm9taXNlKSkoZnVuY3Rpb24ob3QsZ3Qpe2Z1bmN0aW9uIF9uKGRlKXt0cnl7SGUoRC5uZXh0KGRlKSl9Y2F0Y2goc3Ipe2d0KHNyKX19ZnVuY3Rpb24gcG4oZGUpe3RyeXtIZShELnRocm93KGRlKSl9Y2F0Y2goc3Ipe2d0KHNyKX19ZnVuY3Rpb24gSGUoZGUpe2RlLmRvbmU/b3QoZGUudmFsdWUpOnl0KGRlLnZhbHVlKS50aGVuKF9uLHBuKX1IZSgoRD1ELmFwcGx5KFQsQnx8W10pKS5uZXh0KCkpfSl9LG49WCYmWC5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKFQpe3JldHVybiBUJiZULl9fZXNNb2R1bGU/VDp7ZGVmYXVsdDpUfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZXhwb3NlPXQuaXNXb3JrZXJSdW50aW1lPXQuVHJhbnNmZXI9dC5yZWdpc3RlclNlcmlhbGl6ZXI9dm9pZCAwO2NvbnN0IHI9bihFZSksaT13dCxvPW5lLHM9RXIsdT1uKFJuKTt2YXIgYT13dDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJTZXJpYWxpemVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5yZWdpc3RlclNlcmlhbGl6ZXJ9fSk7dmFyIGw9bmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlRyYW5zZmVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5UcmFuc2Zlcn19KSx0LmlzV29ya2VyUnVudGltZT11LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lO2xldCBkPSExO2NvbnN0IF89bmV3IE1hcCxPPVQ9PlQmJlQudHlwZT09PXMuTWFzdGVyTWVzc2FnZVR5cGUuY2FuY2VsLGI9VD0+VCYmVC50eXBlPT09cy5NYXN0ZXJNZXNzYWdlVHlwZS5ydW4sRj1UPT5yLmRlZmF1bHQoVCl8fFMoVCk7ZnVuY3Rpb24gUyhUKXtyZXR1cm4gVCYmdHlwZW9mIFQ9PSJvYmplY3QiJiZ0eXBlb2YgVC5zdWJzY3JpYmU9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gTihUKXtyZXR1cm4gby5pc1RyYW5zZmVyRGVzY3JpcHRvcihUKT97cGF5bG9hZDpULnNlbmQsdHJhbnNmZXJhYmxlczpULnRyYW5zZmVyYWJsZXN9OntwYXlsb2FkOlQsdHJhbnNmZXJhYmxlczp2b2lkIDB9fWZ1bmN0aW9uIGcoKXtjb25zdCBUPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUuaW5pdCxleHBvc2VkOnt0eXBlOiJmdW5jdGlvbiJ9fTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihUKX1mdW5jdGlvbiBHKFQpe2NvbnN0IEI9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LGV4cG9zZWQ6e3R5cGU6Im1vZHVsZSIsbWV0aG9kczpUfX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9ZnVuY3Rpb24gSyhULEIpe2NvbnN0e3BheWxvYWQ6JCx0cmFuc2ZlcmFibGVzOkR9PU4oQikseXQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5lcnJvcix1aWQ6VCxlcnJvcjppLnNlcmlhbGl6ZSgkKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoeXQsRCl9ZnVuY3Rpb24gVihULEIsJCl7Y29uc3R7cGF5bG9hZDpELHRyYW5zZmVyYWJsZXM6eXR9PU4oJCksb3Q9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5yZXN1bHQsdWlkOlQsY29tcGxldGU6Qj8hMDp2b2lkIDAscGF5bG9hZDpEfTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihvdCx5dCl9ZnVuY3Rpb24gaXQoVCxCKXtjb25zdCAkPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUucnVubmluZyx1aWQ6VCxyZXN1bHRUeXBlOkJ9O3UuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKCQpfWZ1bmN0aW9uIGx0KFQpe3RyeXtjb25zdCBCPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvcixlcnJvcjppLnNlcmlhbGl6ZShUKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9Y2F0Y2goQil7Y29uc29sZS5lcnJvcihgTm90IHJlcG9ydGluZyB1bmNhdWdodCBlcnJvciBiYWNrIHRvIG1hc3RlciB0aHJlYWQgYXMgaXQgb2NjdXJlZCB3aGlsZSByZXBvcnRpbmcgYW4gdW5jYXVnaHQgZXJyb3IgYWxyZWFkeS4KTGF0ZXN0IGVycm9yOmAsQixgCk9yaWdpbmFsIGVycm9yOmAsVCl9fWZ1bmN0aW9uIHJ0KFQsQiwkKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IEQ7dHJ5e0Q9QiguLi4kKX1jYXRjaChvdCl7cmV0dXJuIEsoVCxvdCl9Y29uc3QgeXQ9RihEKT8ib2JzZXJ2YWJsZSI6InByb21pc2UiO2lmKGl0KFQseXQpLEYoRCkpe2NvbnN0IG90PUQuc3Vic2NyaWJlKGd0PT5WKFQsITEsaS5zZXJpYWxpemUoZ3QpKSxndD0+e0soVCxpLnNlcmlhbGl6ZShndCkpLF8uZGVsZXRlKFQpfSwoKT0+e1YoVCwhMCksXy5kZWxldGUoVCl9KTtfLnNldChULG90KX1lbHNlIHRyeXtjb25zdCBvdD15aWVsZCBEO1YoVCwhMCxpLnNlcmlhbGl6ZShvdCkpfWNhdGNoKG90KXtLKFQsaS5zZXJpYWxpemUob3QpKX19KX1mdW5jdGlvbiBCdChUKXtpZighdS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKXRocm93IEVycm9yKCJleHBvc2UoKSBjYWxsZWQgaW4gdGhlIG1hc3RlciB0aHJlYWQuIik7aWYoZCl0aHJvdyBFcnJvcigiZXhwb3NlKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiBUaGlzIGlzIG5vdCBwb3NzaWJsZS4gUGFzcyBhbiBvYmplY3QgdG8gZXhwb3NlKCkgaWYgeW91IHdhbnQgdG8gZXhwb3NlIG11bHRpcGxlIGZ1bmN0aW9ucy4iKTtpZihkPSEwLHR5cGVvZiBUPT0iZnVuY3Rpb24iKXUuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntiKEIpJiYhQi5tZXRob2QmJnJ0KEIudWlkLFQsQi5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KSxnKCk7ZWxzZSBpZih0eXBlb2YgVD09Im9iamVjdCImJlQpe3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKCQ9PntiKCQpJiYkLm1ldGhvZCYmcnQoJC51aWQsVFskLm1ldGhvZF0sJC5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KTtjb25zdCBCPU9iamVjdC5rZXlzKFQpLmZpbHRlcigkPT50eXBlb2YgVFskXT09ImZ1bmN0aW9uIik7RyhCKX1lbHNlIHRocm93IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBleHBvc2UoKS4gRXhwZWN0ZWQgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QsIGdvdDogJHtUfWApO3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntpZihPKEIpKXtjb25zdCAkPUIudWlkLEQ9Xy5nZXQoJCk7RCYmKEQudW5zdWJzY3JpYmUoKSxfLmRlbGV0ZSgkKSl9fSl9dC5leHBvc2U9QnQsdHlwZW9mIHNlbGY8InUiJiZ0eXBlb2Ygc2VsZi5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixUPT57c2V0VGltZW91dCgoKT0+bHQoVC5lcnJvcnx8VCksMjUwKX0pLHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigidW5oYW5kbGVkcmVqZWN0aW9uIixUPT57Y29uc3QgQj1ULnJlYXNvbjtCJiZ0eXBlb2YgQi5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoQiksMjUwKX0pKSx0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZiBwcm9jZXNzLm9uPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsVD0+e3NldFRpbWVvdXQoKCk9Pmx0KFQpLDI1MCl9KSxwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLFQ9PntUJiZ0eXBlb2YgVC5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoVCksMjUwKX0pKX0obnQpO3ZhciB4bj1rKG50KTtjb25zdCBvbz14bi5leHBvc2U7eG4ucmVnaXN0ZXJTZXJpYWxpemVyLHhuLlRyYW5zZmVyO2Z1bmN0aW9uIG0odCxlKXtyZXR1cm4gdD8/ZX1tLkVNUFRZX09CSkVDVD1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBwKHQpe3JldHVybiB0IT1udWxsfWZ1bmN0aW9uIHgodCl7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXAoT2JqZWN0LmNyZWF0ZSkmJih4LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSkseC5wcm90b3R5cGUuY29uc3RydWN0b3I9eCkseC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBwKHRoaXMuc3RhY2spJiYodCs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSx0fSx4LnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IHgoIlRoaXMgZnVuY3Rpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiIpfTtjb25zdCBzdD17fTtzdC50eXBlT2Y9e307ZnVuY3Rpb24gc28odCl7cmV0dXJuYCR7dH0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiBwZSh0LGUsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7ZX0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7dH1gfXN0LmRlZmluZWQ9ZnVuY3Rpb24odCxlKXtpZighcChlKSl0aHJvdyBuZXcgeChzbyh0KSl9LHN0LnR5cGVPZi5mdW5jPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImZ1bmN0aW9uIix0KSl9LHN0LnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsInN0cmluZyIsdCkpfSxzdC50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyB4KHBlKHR5cGVvZiBlLCJudW1iZXIiLHQpKX0sc3QudHlwZU9mLm51bWJlci5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU+PW4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKHN0LnR5cGVPZi5udW1iZXIodCxlKSxlPm4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZihzdC50eXBlT2YubnVtYmVyKHQsZSksZTw9bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU8bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsIm9iamVjdCIsdCkpfSxzdC50eXBlT2YuYm9vbD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImJvb2xlYW4iLHQpKX0sc3QudHlwZU9mLmJpZ2ludD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYmlnaW50Iil0aHJvdyBuZXcgeChwZSh0eXBlb2YgZSwiYmlnaW50Iix0KSl9LHN0LnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHN0LnR5cGVPZi5udW1iZXIodCxuKSxzdC50eXBlT2YubnVtYmVyKGUsciksbiE9PXIpdGhyb3cgbmV3IHgoYCR7dH0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHtufSBhbmQgJHtyfWApfTt2YXIgaD1zdCx6dD1mdW5jdGlvbih0KXt0PT1udWxsJiYodD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHQuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheSh0LHQubGVuZ3RoKTp0aGlzLmluaXRfc2VlZCh0KX07enQucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbih0KXtmb3IodGhpcy5tdFswXT10Pj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgdD10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKCh0JjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsodCY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0senQucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEscj0wLGk9dGhpcy5OPmU/dGhpcy5OOmU7aTtpLS0pe3ZhciBvPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKG8mNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhvJjY1NTM1KSoxNjY0NTI1KSt0W3JdK3IsdGhpcy5tdFtuXT4+Pj0wLG4rKyxyKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLHI+PWUmJihyPTApfWZvcihpPXRoaXMuTi0xO2k7aS0tKXt2YXIgbz10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChvJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsobyY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LHp0LnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIHQsZT1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV50Pj4+MV5lW3QmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV50Pj4+MV5lW3QmMV07dD10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1edD4+PjFeZVt0JjFdLHRoaXMubXRpPTB9cmV0dXJuIHQ9dGhpcy5tdFt0aGlzLm10aSsrXSx0Xj10Pj4+MTEsdF49dDw8NyYyNjM2OTI4NjQwLHRePXQ8PDE1JjQwMjI3MzA3NTIsdF49dD4+PjE4LHQ+Pj4wfSx6dC5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX0senQucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfSx6dC5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfSx6dC5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfSx6dC5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmRvbV9pbnQoKT4+PjUsZT10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKHQqNjcxMDg4NjQrZSkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3ZhciBfcj16dDtjb25zdCB5PXt9O3kuRVBTSUxPTjE9LjEseS5FUFNJTE9OMj0uMDEseS5FUFNJTE9OMz0uMDAxLHkuRVBTSUxPTjQ9MWUtNCx5LkVQU0lMT041PTFlLTUseS5FUFNJTE9ONj0xZS02LHkuRVBTSUxPTjc9MWUtNyx5LkVQU0lMT044PTFlLTgseS5FUFNJTE9OOT0xZS05LHkuRVBTSUxPTjEwPTFlLTEwLHkuRVBTSUxPTjExPTFlLTExLHkuRVBTSUxPTjEyPTFlLTEyLHkuRVBTSUxPTjEzPTFlLTEzLHkuRVBTSUxPTjE0PTFlLTE0LHkuRVBTSUxPTjE1PTFlLTE1LHkuRVBTSUxPTjE2PTFlLTE2LHkuRVBTSUxPTjE3PTFlLTE3LHkuRVBTSUxPTjE4PTFlLTE4LHkuRVBTSUxPTjE5PTFlLTE5LHkuRVBTSUxPTjIwPTFlLTIwLHkuRVBTSUxPTjIxPTFlLTIxLHkuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTUseS5TT0xBUl9SQURJVVM9Njk1NWU1LHkuTFVOQVJfUkFESVVTPTE3Mzc0MDAseS5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0LHkuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNCx5LnNpZ249bShNYXRoLnNpZ24sZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PTB8fGUhPT1lP2U6ZT4wPzE6LTF9KSx5LnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX0seS50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9bShlLDI1NSksTWF0aC5yb3VuZCgoeS5jbGFtcCh0LC0xLDEpKi41Ky41KSplKX0seS5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1tKGUsMjU1KSx5LmNsYW1wKHQsMCxlKS9lKjItMX0seS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPU1hdGgubWF4KG4tZSwwKSxuPT09MD8wOnkuY2xhbXAoKHQtZSkvbiwwLDEpfSx5LnNpbmg9bShNYXRoLnNpbmgsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpLU1hdGguZXhwKC1lKSkvMn0pLHkuY29zaD1tKE1hdGguY29zaCxmdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfSkseS5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX0seS5QST1NYXRoLlBJLHkuT05FX09WRVJfUEk9MS9NYXRoLlBJLHkuUElfT1ZFUl9UV089TWF0aC5QSS8yLHkuUElfT1ZFUl9USFJFRT1NYXRoLlBJLzMseS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80LHkuUElfT1ZFUl9TSVg9TWF0aC5QSS82LHkuVEhSRUVfUElfT1ZFUl9UV089MypNYXRoLlBJLzIseS5UV09fUEk9MipNYXRoLlBJLHkuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSkseS5SQURJQU5TX1BFUl9ERUdSRUU9TWF0aC5QSS8xODAseS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEkseS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9eS5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMCx5LnRvUmFkaWFucz1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZGVncmVlcyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdCp5LlJBRElBTlNfUEVSX0RFR1JFRX0seS50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqeS5ERUdSRUVTX1BFUl9SQURJQU59LHkuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtjb25zdCBlPXkuVFdPX1BJLG49dC1NYXRoLmZsb29yKHQvZSkqZTtyZXR1cm4gbjwtTWF0aC5QST9uK2U6bj49TWF0aC5QST9uLWU6bn0seS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHkuY2xhbXAodCwtMSp5LlBJX09WRVJfVFdPLHkuUElfT1ZFUl9UV08pfSx5Lm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49LXkuUEkmJnQ8PXkuUEk/dDp5Lnplcm9Ub1R3b1BpKHQreS5QSSkteS5QSX0seS56ZXJvVG9Ud29QaT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYodD49MCYmdDw9eS5UV09fUEkpcmV0dXJuIHQ7Y29uc3QgZT15Lm1vZCh0LHkuVFdPX1BJKTtyZXR1cm4gTWF0aC5hYnMoZSk8eS5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPnkuRVBTSUxPTjE0P3kuVFdPX1BJOmV9LHkubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoIm0gaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IHgoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIHkuc2lnbih0KT09PXkuc2lnbihlKSYmTWF0aC5hYnModCk8TWF0aC5hYnMoZSk/dDoodCVlK2UpJWV9LHkuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixyKXtpZighcCh0KSl0aHJvdyBuZXcgeCgibGVmdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmlnaHQgaXMgcmVxdWlyZWQuIik7bj1tKG4sMCkscj1tKHIsbik7Y29uc3QgaT1NYXRoLmFicyh0LWUpO3JldHVybiBpPD1yfHxpPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX0seS5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIXAodCkpdGhyb3cgbmV3IHgoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFwKGUpKXRocm93IG5ldyB4KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIXAobikpdGhyb3cgbmV3IHgoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPC1ufSx5Lmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFwKHQpKXRocm93IG5ldyB4KCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufSx5LmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn0seS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+LW59O2NvbnN0IFllPVsxXTt5LmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgeCgiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7Y29uc3QgZT1ZZS5sZW5ndGg7aWYodD49ZSl7bGV0IG49WWVbZS0xXTtmb3IobGV0IHI9ZTtyPD10O3IrKyl7Y29uc3QgaT1uKnI7WWUucHVzaChpKSxuPWl9fXJldHVybiBZZVt0XX0seS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPW0obiwwKSwhcCh0KSl0aHJvdyBuZXcgeCgibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyB4KCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9LHkuaXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQhPT0wJiYodCZ0LTEpPT09MH0seS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD4yMTQ3NDgzNjQ4KXRocm93IG5ldyB4KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuIik7cmV0dXJuLS10LHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsKyt0LHR9LHkucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH0seS5jbGFtcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLGgudHlwZU9mLm51bWJlcigibWluIixlKSxoLnR5cGVPZi5udW1iZXIoIm1heCIsbiksdDxlP2U6dD5uP246dH07bGV0IHByPW5ldyBfcjt5LnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInNlZWQgaXMgcmVxdWlyZWQuIik7cHI9bmV3IF9yKHQpfSx5Lm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gcHIucmFuZG9tKCl9LHkucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB5Lm5leHRSYW5kb21OdW1iZXIoKSooZS10KSt0fSx5LmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKHkuY2xhbXAodCwtMSwxKSl9LHkuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmFzaW4oeS5jbGFtcCh0LC0xLDEpKX0seS5jaG9yZExlbmd0aD1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmFkaXVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiAyKmUqTWF0aC5zaW4odCouNSl9LHkubG9nQmFzZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJudW1iZXIgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoImJhc2UgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGgubG9nKHQpL01hdGgubG9nKGUpfSx5LmNicnQ9bShNYXRoLmNicnQsZnVuY3Rpb24oZSl7Y29uc3Qgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufSkseS5sb2cyPW0oTWF0aC5sb2cyLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfSkseS5mb2c9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigieCIsdCksdCooLS4xNzg0Kk1hdGguYWJzKHQpLS4wNjYzKnQqdCsxLjAzMDEpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2YubnVtYmVyKCJ4Iix0KSxoLnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLHI9TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtjb25zdCBpPU1hdGgubWF4KHIsbik7bj1NYXRoLm1pbihyLG4pO2NvbnN0IG89bi9pO2lmKGlzTmFOKG8pKXRocm93IG5ldyB4KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpO3JldHVybiByPXkuZmFzdEFwcHJveGltYXRlQXRhbihvKSxyPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP3kuUElfT1ZFUl9UV08tcjpyLHI9dDwwP3kuUEktcjpyLHI9ZTwwPy1yOnIscn07dmFyIFI9eTtmdW5jdGlvbiBBKHQsZSl7dGhpcy54PW0odCwwKSx0aGlzLnk9bShlLDApfUEuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcChuKT8obi54PXQsbi55PWUsbik6bmV3IEEodCxlKX0sQS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcgQSh0LngsdC55KX0sQS5mcm9tQ2FydGVzaWFuMz1BLmNsb25lLEEuZnJvbUNhcnRlc2lhbjQ9QS5jbG9uZSxBLnBhY2tlZExlbmd0aD0yLEEucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGguZGVmaW5lZCgiYXJyYXkiLGUpLG49bShuLDApLGVbbisrXT10LngsZVtuXT10LnksZX0sQS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLmRlZmluZWQoImFycmF5Iix0KSxlPW0oZSwwKSxwKG4pfHwobj1uZXcgQSksbi54PXRbZSsrXSxuLnk9dFtlXSxufSxBLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjI7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMiBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpQS5wYWNrKHRbaV0sZSxpKjIpO3JldHVybiBlfSxBLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMiksdC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8yOmU9bmV3IEFycmF5KG4vMik7Zm9yKGxldCByPTA7cjxuO3IrPTIpe2NvbnN0IGk9ci8yO2VbaV09QS51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxBLmZyb21BcnJheT1BLnVucGFjayxBLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55KX0sQS5taW5pbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5taW4odC54LHQueSl9LEEubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59LEEubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG59LEEuY2xhbXA9ZnVuY3Rpb24odCxlLG4scil7aC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLGgudHlwZU9mLm9iamVjdCgibWF4IixuKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIscik7Y29uc3QgaT1SLmNsYW1wKHQueCxlLngsbi54KSxvPVIuY2xhbXAodC55LGUueSxuLnkpO3JldHVybiByLng9aSxyLnk9byxyfSxBLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0Lnl9LEEubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoQS5tYWduaXR1ZGVTcXVhcmVkKHQpKX07Y29uc3QgS2U9bmV3IEE7QS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLEEuc3VidHJhY3QodCxlLEtlKSxBLm1hZ25pdHVkZShLZSl9LEEuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5zdWJ0cmFjdCh0LGUsS2UpLEEubWFnbml0dWRlU3F1YXJlZChLZSl9LEEubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtjb25zdCBuPUEubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24saXNOYU4oZS54KXx8aXNOYU4oZS55KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LEEuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55fSxBLmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fSxBLm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG59LEEuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG59LEEuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn0sQS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG59LEEubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbn0sQS5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn0sQS5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlfSxBLmFicz1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGV9O2NvbnN0IHlyPW5ldyBBO0EubGVycD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCksaC50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLGgudHlwZU9mLm51bWJlcigidCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLEEubXVsdGlwbHlCeVNjYWxhcihlLG4seXIpLHI9QS5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLHIpLEEuYWRkKHlyLHIscil9O2NvbnN0IEFyPW5ldyBBLFRyPW5ldyBBO0EuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5ub3JtYWxpemUodCxBciksQS5ub3JtYWxpemUoZSxUciksUi5hY29zQ2xhbXBlZChBLmRvdChBcixUcikpfTtjb25zdCBhbz1uZXcgQTtBLm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7Y29uc3Qgbj1BLm5vcm1hbGl6ZSh0LGFvKTtyZXR1cm4gQS5hYnMobixuKSxuLng8PW4ueT9lPUEuY2xvbmUoQS5VTklUX1gsZSk6ZT1BLmNsb25lKEEuVU5JVF9ZLGUpLGV9LEEuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxwKHQpJiZwKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueX0sQS5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX0sQS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKX0sQS5aRVJPPU9iamVjdC5mcmVlemUobmV3IEEoMCwwKSksQS5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgQSgxLDEpKSxBLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBBKDEsMCkpLEEuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IEEoMCwxKSksQS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEEuY2xvbmUodGhpcyx0KX0sQS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBBLmVxdWFscyh0aGlzLHQpfSxBLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQS5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfSxBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0pYH07ZnVuY3Rpb24gZih0LGUsbil7dGhpcy54PW0odCwwKSx0aGlzLnk9bShlLDApLHRoaXMuej1tKG4sMCl9Zi5mcm9tU3BoZXJpY2FsPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQuY2xvY2sscj10LmNvbmUsaT1tKHQubWFnbml0dWRlLDEpLG89aSpNYXRoLnNpbihyKTtyZXR1cm4gZS54PW8qTWF0aC5jb3MobiksZS55PW8qTWF0aC5zaW4obiksZS56PWkqTWF0aC5jb3MociksZX0sZi5mcm9tRWxlbWVudHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHAocik/KHIueD10LHIueT1lLHIuej1uLHIpOm5ldyBmKHQsZSxuKX0sZi5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBmKHQueCx0LnksdC56KX0sZi5mcm9tQ2FydGVzaWFuND1mLmNsb25lLGYucGFja2VkTGVuZ3RoPTMsZi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1tKG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbl09dC56LGV9LGYudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJhcnJheSIsdCksZT1tKGUsMCkscChuKXx8KG49bmV3IGYpLG4ueD10W2UrK10sbi55PXRbZSsrXSxuLno9dFtlXSxufSxmLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjM7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpZi5wYWNrKHRbaV0sZSxpKjMpO3JldHVybiBlfSxmLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMyksdC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCByPTA7cjxuO3IrPTMpe2NvbnN0IGk9ci8zO2VbaV09Zi51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxmLmZyb21BcnJheT1mLnVucGFjayxmLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55LHQueil9LGYubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX0sZi5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSxoLnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG59LGYubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG4uej1NYXRoLm1heCh0LnosZS56KSxufSxmLmNsYW1wPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGgudHlwZU9mLm9iamVjdCgibWluIixlKSxoLnR5cGVPZi5vYmplY3QoIm1heCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpO2NvbnN0IGk9Ui5jbGFtcCh0LngsZS54LG4ueCksbz1SLmNsYW1wKHQueSxlLnksbi55KSxzPVIuY2xhbXAodC56LGUueixuLnopO3JldHVybiByLng9aSxyLnk9byxyLno9cyxyfSxmLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0LnkrdC56KnQuen0sZi5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChmLm1hZ25pdHVkZVNxdWFyZWQodCkpfTtjb25zdCBaZT1uZXcgZjtmLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5zdWJ0cmFjdCh0LGUsWmUpLGYubWFnbml0dWRlKFplKX0sZi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxmLnN1YnRyYWN0KHQsZSxaZSksZi5tYWduaXR1ZGVTcXVhcmVkKFplKX0sZi5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5tYWduaXR1ZGUodCk7aWYoZS54PXQueC9uLGUueT10LnkvbixlLno9dC56L24saXNOYU4oZS54KXx8aXNOYU4oZS55KXx8aXNOYU4oZS56KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LGYuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9LGYubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbn0sZi5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbi56PXQuei9lLnosbn0sZi5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufSxmLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbn0sZi5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxuLno9dC56KmUsbn0sZi5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59LGYubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZX0sZi5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlfTtjb25zdCBScj1uZXcgZjtmLmxlcnA9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLGgudHlwZU9mLm9iamVjdCgiZW5kIixlKSxoLnR5cGVPZi5udW1iZXIoInQiLG4pLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKSxmLm11bHRpcGx5QnlTY2FsYXIoZSxuLFJyKSxyPWYubXVsdGlwbHlCeVNjYWxhcih0LDEtbixyKSxmLmFkZChScixyLHIpfTtjb25zdCBRZT1uZXcgZixPbj1uZXcgZjtmLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5ub3JtYWxpemUodCxRZSksZi5ub3JtYWxpemUoZSxPbik7Y29uc3Qgbj1mLmRvdChRZSxPbikscj1mLm1hZ25pdHVkZShmLmNyb3NzKFFlLE9uLFFlKSk7cmV0dXJuIE1hdGguYXRhbjIocixuKX07Y29uc3QgdW89bmV3IGY7Zi5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5ub3JtYWxpemUodCx1byk7cmV0dXJuIGYuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1mLmNsb25lKGYuVU5JVF9YLGUpOmU9Zi5jbG9uZShmLlVOSVRfWixlKTpuLnk8PW4uej9lPWYuY2xvbmUoZi5VTklUX1ksZSk6ZT1mLmNsb25lKGYuVU5JVF9aLGUpLGV9LGYucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhIix0KSxoLmRlZmluZWQoImIiLGUpLGguZGVmaW5lZCgicmVzdWx0IixuKTtjb25zdCByPWYuZG90KHQsZSkvZi5kb3QoZSxlKTtyZXR1cm4gZi5tdWx0aXBseUJ5U2NhbGFyKGUscixuKX0sZi5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQueD09PWUueCYmdC55PT09ZS55JiZ0Lno9PT1lLnp9LGYuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX0sZi5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueixlLnosbixyKX0sZi5jcm9zcz1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7Y29uc3Qgcj10LngsaT10Lnksbz10Lnoscz1lLngsdT1lLnksYT1lLnosbD1pKmEtbyp1LGQ9bypzLXIqYSxfPXIqdS1pKnM7cmV0dXJuIG4ueD1sLG4ueT1kLG4uej1fLG59LGYubWlkcG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9KHQueCtlLngpKi41LG4ueT0odC55K2UueSkqLjUsbi56PSh0LnorZS56KSouNSxufSxmLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksZi5mcm9tUmFkaWFucyh0LGUsbixyLGkpfTtsZXQgbXQ9bmV3IGYseWU9bmV3IGY7Y29uc3QgY289bmV3IGYoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO2YuZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXtoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1tKG4sMCk7Y29uc3Qgbz1wKHIpP3IucmFkaWlTcXVhcmVkOmNvLHM9TWF0aC5jb3MoZSk7bXQueD1zKk1hdGguY29zKHQpLG10Lnk9cypNYXRoLnNpbih0KSxtdC56PU1hdGguc2luKGUpLG10PWYubm9ybWFsaXplKG10LG10KSxmLm11bHRpcGx5Q29tcG9uZW50cyhvLG10LHllKTtjb25zdCB1PU1hdGguc3FydChmLmRvdChtdCx5ZSkpO3JldHVybiB5ZT1mLmRpdmlkZUJ5U2NhbGFyKHllLHUseWUpLG10PWYubXVsdGlwbHlCeVNjYWxhcihtdCxuLG10KSxwKGkpfHwoaT1uZXcgZiksZi5hZGQoeWUsbXQsaSl9LGYuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoaC5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtjb25zdCByPXQubGVuZ3RoO3Aobik/bi5sZW5ndGg9ci8yOm49bmV3IEFycmF5KHIvMik7Zm9yKGxldCBpPTA7aTxyO2krPTIpe2NvbnN0IG89dFtpXSxzPXRbaSsxXSx1PWkvMjtuW3VdPWYuZnJvbURlZ3JlZXMobyxzLDAsZSxuW3VdKX1yZXR1cm4gbn0sZi5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzI6bj1uZXcgQXJyYXkoci8yKTtmb3IobGV0IGk9MDtpPHI7aSs9Mil7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9aS8yO25bdV09Zi5mcm9tUmFkaWFucyhvLHMsMCxlLG5bdV0pfXJldHVybiBufSxmLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tRGVncmVlcyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tUmFkaWFucyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgZigwLDAsMCkpLGYuT05FPU9iamVjdC5mcmVlemUobmV3IGYoMSwxLDEpKSxmLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBmKDEsMCwwKSksZi5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgZigwLDEsMCkpLGYuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IGYoMCwwLDEpKSxmLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gZi5jbG9uZSh0aGlzLHQpfSxmLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGYuZXF1YWxzKHRoaXMsdCl9LGYucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9LGYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9KWB9O2NvbnN0IGhvPW5ldyBmLGZvPW5ldyBmO2Z1bmN0aW9uIHhyKHQsZSxuLHIsaSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFwKHIpKXRocm93IG5ldyB4KCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2NvbnN0IG89dC54LHM9dC55LHU9dC56LGE9ZS54LGw9ZS55LGQ9ZS56LF89bypvKmEqYSxPPXMqcypsKmwsYj11KnUqZCpkLEY9XytPK2IsUz1NYXRoLnNxcnQoMS9GKSxOPWYubXVsdGlwbHlCeVNjYWxhcih0LFMsaG8pO2lmKEY8cilyZXR1cm4gaXNGaW5pdGUoUyk/Zi5jbG9uZShOLGkpOnZvaWQgMDtjb25zdCBnPW4ueCxHPW4ueSxLPW4ueixWPWZvO1YueD1OLngqZyoyLFYueT1OLnkqRyoyLFYuej1OLnoqSyoyO2xldCBpdD0oMS1TKSpmLm1hZ25pdHVkZSh0KS8oLjUqZi5tYWduaXR1ZGUoVikpLGx0PTAscnQsQnQsVCxCLCQsRCx5dCxvdCxndCxfbixwbjtkb3tpdC09bHQsVD0xLygxK2l0KmcpLEI9MS8oMStpdCpHKSwkPTEvKDEraXQqSyksRD1UKlQseXQ9QipCLG90PSQqJCxndD1EKlQsX249eXQqQixwbj1vdCokLHJ0PV8qRCtPKnl0K2Iqb3QtMSxCdD1fKmd0KmcrTypfbipHK2IqcG4qSztjb25zdCBIZT0tMipCdDtsdD1ydC9IZX13aGlsZShNYXRoLmFicyhydCk+Ui5FUFNJTE9OMTIpO3JldHVybiBwKGkpPyhpLng9bypULGkueT1zKkIsaS56PXUqJCxpKTpuZXcgZihvKlQscypCLHUqJCl9ZnVuY3Rpb24gSCh0LGUsbil7dGhpcy5sb25naXR1ZGU9bSh0LDApLHRoaXMubGF0aXR1ZGU9bShlLDApLHRoaXMuaGVpZ2h0PW0obiwwKX1ILmZyb21SYWRpYW5zPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1tKG4sMCkscChyKT8oci5sb25naXR1ZGU9dCxyLmxhdGl0dWRlPWUsci5oZWlnaHQ9bixyKTpuZXcgSCh0LGUsbil9LEguZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksSC5mcm9tUmFkaWFucyh0LGUsbixyKX07Y29uc3QgbG89bmV3IGYsRW89bmV3IGYsX289bmV3IGYscG89bmV3IGYoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpLHlvPW5ldyBmKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKSxBbz1SLkVQU0lMT04xO0guZnJvbUNhcnRlc2lhbj1mdW5jdGlvbih0LGUsbil7Y29uc3Qgcj1wKGUpP2Uub25lT3ZlclJhZGlpOnBvLGk9cChlKT9lLm9uZU92ZXJSYWRpaVNxdWFyZWQ6eW8sbz1wKGUpP2UuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ6QW8scz14cih0LHIsaSxvLEVvKTtpZighcChzKSlyZXR1cm47bGV0IHU9Zi5tdWx0aXBseUNvbXBvbmVudHMocyxpLGxvKTt1PWYubm9ybWFsaXplKHUsdSk7Y29uc3QgYT1mLnN1YnRyYWN0KHQscyxfbyksbD1NYXRoLmF0YW4yKHUueSx1LngpLGQ9TWF0aC5hc2luKHUueiksXz1SLnNpZ24oZi5kb3QoYSx0KSkqZi5tYWduaXR1ZGUoYSk7cmV0dXJuIHAobik/KG4ubG9uZ2l0dWRlPWwsbi5sYXRpdHVkZT1kLG4uaGVpZ2h0PV8sbik6bmV3IEgobCxkLF8pfSxILnRvQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWMiLHQpLGYuZnJvbVJhZGlhbnModC5sb25naXR1ZGUsdC5sYXRpdHVkZSx0LmhlaWdodCxlLG4pfSxILmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYocCh0KSlyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBIKHQubG9uZ2l0dWRlLHQubGF0aXR1ZGUsdC5oZWlnaHQpfSxILmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC5sb25naXR1ZGU9PT1lLmxvbmdpdHVkZSYmdC5sYXRpdHVkZT09PWUubGF0aXR1ZGUmJnQuaGVpZ2h0PT09ZS5oZWlnaHR9LEguZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49bShuLDApLHQ9PT1lfHxwKHQpJiZwKGUpJiZNYXRoLmFicyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSk8PW4mJk1hdGguYWJzKHQubGF0aXR1ZGUtZS5sYXRpdHVkZSk8PW4mJk1hdGguYWJzKHQuaGVpZ2h0LWUuaGVpZ2h0KTw9bn0sSC5aRVJPPU9iamVjdC5mcmVlemUobmV3IEgoMCwwLDApKSxILnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gSC5jbG9uZSh0aGlzLHQpfSxILnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEguZXF1YWxzKHRoaXMsdCl9LEgucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gSC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX0sSC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5sb25naXR1ZGV9LCAke3RoaXMubGF0aXR1ZGV9LCAke3RoaXMuaGVpZ2h0fSlgfTtmdW5jdGlvbiBPcih0LGUsbixyKXtlPW0oZSwwKSxuPW0obiwwKSxyPW0ociwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieCIsZSwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieSIsbiwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieiIsciwwKSx0Ll9yYWRpaT1uZXcgZihlLG4sciksdC5fcmFkaWlTcXVhcmVkPW5ldyBmKGUqZSxuKm4scipyKSx0Ll9yYWRpaVRvVGhlRm91cnRoPW5ldyBmKGUqZSplKmUsbipuKm4qbixyKnIqcipyKSx0Ll9vbmVPdmVyUmFkaWk9bmV3IGYoZT09PTA/MDoxL2Usbj09PTA/MDoxL24scj09PTA/MDoxL3IpLHQuX29uZU92ZXJSYWRpaVNxdWFyZWQ9bmV3IGYoZT09PTA/MDoxLyhlKmUpLG49PT0wPzA6MS8obipuKSxyPT09MD8wOjEvKHIqcikpLHQuX21pbmltdW1SYWRpdXM9TWF0aC5taW4oZSxuLHIpLHQuX21heGltdW1SYWRpdXM9TWF0aC5tYXgoZSxuLHIpLHQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9Ui5FUFNJTE9OMSx0Ll9yYWRpaVNxdWFyZWQueiE9PTAmJih0Ll9zcXVhcmVkWE92ZXJTcXVhcmVkWj10Ll9yYWRpaVNxdWFyZWQueC90Ll9yYWRpaVNxdWFyZWQueil9ZnVuY3Rpb24gaih0LGUsbil7dGhpcy5fcmFkaWk9dm9pZCAwLHRoaXMuX3JhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aD12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9taW5pbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9tYXhpbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXZvaWQgMCx0aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWj12b2lkIDAsT3IodGhpcyx0LGUsbil9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoai5wcm90b3R5cGUse3JhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWl9fSxyYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVNxdWFyZWR9fSxyYWRpaVRvVGhlRm91cnRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aH19LG9uZU92ZXJSYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaX19LG9uZU92ZXJSYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkfX0sbWluaW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbmltdW1SYWRpdXN9fSxtYXhpbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4aW11bVJhZGl1c319fSksai5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXJldHVybjtjb25zdCBuPXQuX3JhZGlpO3JldHVybiBwKGUpPyhmLmNsb25lKG4sZS5fcmFkaWkpLGYuY2xvbmUodC5fcmFkaWlTcXVhcmVkLGUuX3JhZGlpU3F1YXJlZCksZi5jbG9uZSh0Ll9yYWRpaVRvVGhlRm91cnRoLGUuX3JhZGlpVG9UaGVGb3VydGgpLGYuY2xvbmUodC5fb25lT3ZlclJhZGlpLGUuX29uZU92ZXJSYWRpaSksZi5jbG9uZSh0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkLGUuX29uZU92ZXJSYWRpaVNxdWFyZWQpLGUuX21pbmltdW1SYWRpdXM9dC5fbWluaW11bVJhZGl1cyxlLl9tYXhpbXVtUmFkaXVzPXQuX21heGltdW1SYWRpdXMsZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD10Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGUpOm5ldyBqKG4ueCxuLnksbi56KX0sai5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgaikscCh0KSYmT3IoZSx0LngsdC55LHQueiksZX0sai5XR1M4ND1PYmplY3QuZnJlZXplKG5ldyBqKDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSksai5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyBqKDEsMSwxKSksai5NT09OPU9iamVjdC5mcmVlemUobmV3IGooUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMpKSxqLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gai5jbG9uZSh0aGlzLHQpfSxqLnBhY2tlZExlbmd0aD1mLnBhY2tlZExlbmd0aCxqLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSxoLmRlZmluZWQoImFycmF5IixlKSxuPW0obiwwKSxmLnBhY2sodC5fcmFkaWksZSxuKSxlfSxqLnVucGFjaz1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhcnJheSIsdCksZT1tKGUsMCk7Y29uc3Qgcj1mLnVucGFjayh0LGUpO3JldHVybiBqLmZyb21DYXJ0ZXNpYW4zKHIsbil9LGoucHJvdG90eXBlLmdlb2NlbnRyaWNTdXJmYWNlTm9ybWFsPWYubm9ybWFsaXplLGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIix0KTtjb25zdCBuPXQubG9uZ2l0dWRlLHI9dC5sYXRpdHVkZSxpPU1hdGguY29zKHIpLG89aSpNYXRoLmNvcyhuKSxzPWkqTWF0aC5zaW4obiksdT1NYXRoLnNpbihyKTtyZXR1cm4gcChlKXx8KGU9bmV3IGYpLGUueD1vLGUueT1zLGUuej11LGYubm9ybWFsaXplKGUsZSl9LGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbD1mdW5jdGlvbih0LGUpe2lmKCFmLmVxdWFsc0Vwc2lsb24odCxmLlpFUk8sUi5FUFNJTE9OMTQpKXJldHVybiBwKGUpfHwoZT1uZXcgZiksZT1mLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsZSksZi5ub3JtYWxpemUoZSxlKX07Y29uc3QgVG89bmV3IGYsUm89bmV3IGY7ai5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlKXtjb25zdCBuPVRvLHI9Um87dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWModCxuKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0aGlzLl9yYWRpaVNxdWFyZWQsbixyKTtjb25zdCBpPU1hdGguc3FydChmLmRvdChuLHIpKTtyZXR1cm4gZi5kaXZpZGVCeVNjYWxhcihyLGksciksZi5tdWx0aXBseUJ5U2NhbGFyKG4sdC5oZWlnaHQsbikscChlKXx8KGU9bmV3IGYpLGYuYWRkKHIsbixlKX0sai5wcm90b3R5cGUuY2FydG9ncmFwaGljQXJyYXlUb0NhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47cisrKWVbcl09dGhpcy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbih0W3JdLGVbcl0pO3JldHVybiBlfTtjb25zdCB4bz1uZXcgZixPbz1uZXcgZixibz1uZXcgZjtqLnByb3RvdHlwZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQsT28pO2lmKCFwKG4pKXJldHVybjtjb25zdCByPXRoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4seG8pLGk9Zi5zdWJ0cmFjdCh0LG4sYm8pLG89TWF0aC5hdGFuMihyLnksci54KSxzPU1hdGguYXNpbihyLnopLHU9Ui5zaWduKGYuZG90KGksdCkpKmYubWFnbml0dWRlKGkpO3JldHVybiBwKGUpPyhlLmxvbmdpdHVkZT1vLGUubGF0aXR1ZGU9cyxlLmhlaWdodD11LGUpOm5ldyBIKG8scyx1KX0sai5wcm90b3R5cGUuY2FydGVzaWFuQXJyYXlUb0NhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47KytyKWVbcl09dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W3JdLGVbcl0pO3JldHVybiBlfSxqLnByb3RvdHlwZS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHhyKHQsdGhpcy5fb25lT3ZlclJhZGlpLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKX0sai5wcm90b3R5cGUuc2NhbGVUb0dlb2NlbnRyaWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQueCxyPXQueSxpPXQueixvPXRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQscz0xL01hdGguc3FydChuKm4qby54K3IqcipvLnkraSppKm8ueik7cmV0dXJuIGYubXVsdGlwbHlCeVNjYWxhcih0LHMsZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgZiksZi5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWksZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uRnJvbVNjYWxlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAoZSl8fChlPW5ldyBmKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX3JhZGlpLGUpfSxqLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHxwKHQpJiZmLmVxdWFscyh0aGlzLl9yYWRpaSx0Ll9yYWRpaSl9LGoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpLnRvU3RyaW5nKCl9LGoucHJvdG90eXBlLmdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXM9ZnVuY3Rpb24odCxlLG4pe2lmKGgudHlwZU9mLm9iamVjdCgicG9zaXRpb24iLHQpLCFSLmVxdWFsc0Vwc2lsb24odGhpcy5fcmFkaWkueCx0aGlzLl9yYWRpaS55LFIuRVBTSUxPTjE1KSl0aHJvdyBuZXcgeCgiRWxsaXBzb2lkIG11c3QgYmUgYW4gZWxsaXBzb2lkIG9mIHJldm9sdXRpb24gKHJhZGlpLnggPT0gcmFkaWkueSkiKTtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW4oIkVsbGlwc29pZC5yYWRpaS56Iix0aGlzLl9yYWRpaS56LDApLGU9bShlLDApO2NvbnN0IHI9dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYocChuKXx8KG49bmV3IGYpLG4ueD0wLG4ueT0wLG4uej10LnoqKDEtciksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LWUpKXJldHVybiBufTtjb25zdCBnbz1bLjE0ODg3NDMzODk4MTYzLC40MzMzOTUzOTQxMjkyNSwuNjc5NDA5NTY4Mjk5MDIsLjg2NTA2MzM2NjY4ODk4LC45NzM5MDY1Mjg1MTcxNywwXSxTbz1bLjI5NTUyNDIyNDcxNDc1LC4yNjkyNjY3MTkzMDk5OSwuMjE5MDg2MzYyNTE1OTgsLjE0OTQ1MTM0OTE1MDU4LC4wNjY2NzEzNDQzMDg2ODQsMF07ZnVuY3Rpb24gYnIodCxlLG4pe2gudHlwZU9mLm51bWJlcigiYSIsdCksaC50eXBlT2YubnVtYmVyKCJiIixlKSxoLnR5cGVPZi5mdW5jKCJmdW5jIixuKTtjb25zdCByPS41KihlK3QpLGk9LjUqKGUtdCk7bGV0IG89MDtmb3IobGV0IHM9MDtzPDU7cysrKXtjb25zdCB1PWkqZ29bc107bys9U29bc10qKG4ocit1KStuKHItdSkpfXJldHVybiBvKj1pLG99ai5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24odCl7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2NvbnN0IGU9dC53ZXN0O2xldCBuPXQuZWFzdDtjb25zdCByPXQuc291dGgsaT10Lm5vcnRoO2Zvcig7bjxlOyluKz1SLlRXT19QSTtjb25zdCBvPXRoaXMuX3JhZGlpU3F1YXJlZCxzPW8ueCx1PW8ueSxhPW8ueixsPXMqdTtyZXR1cm4gYnIocixpLGZ1bmN0aW9uKGQpe2NvbnN0IF89TWF0aC5jb3MoZCksTz1NYXRoLnNpbihkKTtyZXR1cm4gTWF0aC5jb3MoZCkqYnIoZSxuLGZ1bmN0aW9uKGIpe2NvbnN0IEY9TWF0aC5jb3MoYiksUz1NYXRoLnNpbihiKTtyZXR1cm4gTWF0aC5zcXJ0KGwqTypPK2EqKHUqRipGK3MqUypTKSpfKl8pfSl9KX07ZnVuY3Rpb24gSSh0LGUsbixyKXt0aGlzLndlc3Q9bSh0LDApLHRoaXMuc291dGg9bShlLDApLHRoaXMuZWFzdD1tKG4sMCksdGhpcy5ub3J0aD1tKHIsMCl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSS5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSS5jb21wdXRlV2lkdGgodGhpcyl9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBJLmNvbXB1dGVIZWlnaHQodGhpcyl9fX0pLEkucGFja2VkTGVuZ3RoPTQsSS5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1tKG4sMCksZVtuKytdPXQud2VzdCxlW24rK109dC5zb3V0aCxlW24rK109dC5lYXN0LGVbbl09dC5ub3J0aCxlfSxJLnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguZGVmaW5lZCgiYXJyYXkiLHQpLGU9bShlLDApLHAobil8fChuPW5ldyBJKSxuLndlc3Q9dFtlKytdLG4uc291dGg9dFtlKytdLG4uZWFzdD10W2UrK10sbi5ub3J0aD10W2VdLG59LEkuY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgZT10LmVhc3Q7Y29uc3Qgbj10Lndlc3Q7cmV0dXJuIGU8biYmKGUrPVIuVFdPX1BJKSxlLW59LEkuY29tcHV0ZUhlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHQubm9ydGgtdC5zb3V0aH0sSS5mcm9tRGVncmVlcz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0PVIudG9SYWRpYW5zKG0odCwwKSksZT1SLnRvUmFkaWFucyhtKGUsMCkpLG49Ui50b1JhZGlhbnMobShuLDApKSxyPVIudG9SYWRpYW5zKG0ociwwKSkscChpKT8oaS53ZXN0PXQsaS5zb3V0aD1lLGkuZWFzdD1uLGkubm9ydGg9cixpKTpuZXcgSSh0LGUsbixyKX0sSS5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBwKGkpPyhpLndlc3Q9bSh0LDApLGkuc291dGg9bShlLDApLGkuZWFzdD1tKG4sMCksaS5ub3J0aD1tKHIsMCksaSk6bmV3IEkodCxlLG4scil9LEkuZnJvbUNhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtsZXQgbj1OdW1iZXIuTUFYX1ZBTFVFLHI9LU51bWJlci5NQVhfVkFMVUUsaT1OdW1iZXIuTUFYX1ZBTFVFLG89LU51bWJlci5NQVhfVkFMVUUscz1OdW1iZXIuTUFYX1ZBTFVFLHU9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBhPTAsbD10Lmxlbmd0aDthPGw7YSsrKXtjb25zdCBkPXRbYV07bj1NYXRoLm1pbihuLGQubG9uZ2l0dWRlKSxyPU1hdGgubWF4KHIsZC5sb25naXR1ZGUpLHM9TWF0aC5taW4ocyxkLmxhdGl0dWRlKSx1PU1hdGgubWF4KHUsZC5sYXRpdHVkZSk7Y29uc3QgXz1kLmxvbmdpdHVkZT49MD9kLmxvbmdpdHVkZTpkLmxvbmdpdHVkZStSLlRXT19QSTtpPU1hdGgubWluKGksXyksbz1NYXRoLm1heChvLF8pfXJldHVybiByLW4+by1pJiYobj1pLHI9byxyPlIuUEkmJihyPXItUi5UV09fUEkpLG4+Ui5QSSYmKG49bi1SLlRXT19QSSkpLHAoZSk/KGUud2VzdD1uLGUuc291dGg9cyxlLmVhc3Q9cixlLm5vcnRoPXUsZSk6bmV3IEkobixzLHIsdSl9LEkuZnJvbUNhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSxuKXtoLmRlZmluZWQoImNhcnRlc2lhbnMiLHQpLGU9bShlLGouV0dTODQpO2xldCByPU51bWJlci5NQVhfVkFMVUUsaT0tTnVtYmVyLk1BWF9WQUxVRSxvPU51bWJlci5NQVhfVkFMVUUscz0tTnVtYmVyLk1BWF9WQUxVRSx1PU51bWJlci5NQVhfVkFMVUUsYT0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IGw9MCxkPXQubGVuZ3RoO2w8ZDtsKyspe2NvbnN0IF89ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W2xdKTtyPU1hdGgubWluKHIsXy5sb25naXR1ZGUpLGk9TWF0aC5tYXgoaSxfLmxvbmdpdHVkZSksdT1NYXRoLm1pbih1LF8ubGF0aXR1ZGUpLGE9TWF0aC5tYXgoYSxfLmxhdGl0dWRlKTtjb25zdCBPPV8ubG9uZ2l0dWRlPj0wP18ubG9uZ2l0dWRlOl8ubG9uZ2l0dWRlK1IuVFdPX1BJO289TWF0aC5taW4obyxPKSxzPU1hdGgubWF4KHMsTyl9cmV0dXJuIGktcj5zLW8mJihyPW8saT1zLGk+Ui5QSSYmKGk9aS1SLlRXT19QSSkscj5SLlBJJiYocj1yLVIuVFdPX1BJKSkscChuKT8obi53ZXN0PXIsbi5zb3V0aD11LG4uZWFzdD1pLG4ubm9ydGg9YSxuKTpuZXcgSShyLHUsaSxhKX0sSS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUud2VzdD10Lndlc3QsZS5zb3V0aD10LnNvdXRoLGUuZWFzdD10LmVhc3QsZS5ub3J0aD10Lm5vcnRoLGUpOm5ldyBJKHQud2VzdCx0LnNvdXRoLHQuZWFzdCx0Lm5vcnRoKX0sSS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj1tKG4sMCksdD09PWV8fHAodCkmJnAoZSkmJk1hdGguYWJzKHQud2VzdC1lLndlc3QpPD1uJiZNYXRoLmFicyh0LnNvdXRoLWUuc291dGgpPD1uJiZNYXRoLmFicyh0LmVhc3QtZS5lYXN0KTw9biYmTWF0aC5hYnModC5ub3J0aC1lLm5vcnRoKTw9bn0sSS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEkuY2xvbmUodGhpcyx0KX0sSS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBJLmVxdWFscyh0aGlzLHQpfSxJLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC53ZXN0PT09ZS53ZXN0JiZ0LnNvdXRoPT09ZS5zb3V0aCYmdC5lYXN0PT09ZS5lYXN0JiZ0Lm5vcnRoPT09ZS5ub3J0aH0sSS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBJLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfSxJLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtjb25zdCBlPXQubm9ydGg7aC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoIixlLC1SLlBJX09WRVJfVFdPKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGgiLGUsUi5QSV9PVkVSX1RXTyk7Y29uc3Qgbj10LnNvdXRoO2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJzb3V0aCIsbiwtUi5QSV9PVkVSX1RXTyksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoIixuLFIuUElfT1ZFUl9UV08pO2NvbnN0IHI9dC53ZXN0O2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ3ZXN0IixyLC1NYXRoLlBJKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygid2VzdCIscixNYXRoLlBJKTtjb25zdCBpPXQuZWFzdDtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdCIsaSwtTWF0aC5QSSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3QiLGksTWF0aC5QSSl9LEkuc291dGh3ZXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10Lndlc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC53ZXN0LHQuc291dGgpfSxJLm5vcnRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBIKHQud2VzdCx0Lm5vcnRoKX0sSS5ub3J0aGVhc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHAoZSk/KGUubG9uZ2l0dWRlPXQuZWFzdCxlLmxhdGl0dWRlPXQubm9ydGgsZS5oZWlnaHQ9MCxlKTpuZXcgSCh0LmVhc3QsdC5ub3J0aCl9LEkuc291dGhlYXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10LmVhc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC5lYXN0LHQuc291dGgpfSxJLmNlbnRlcj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgbj10LmVhc3Q7Y29uc3Qgcj10Lndlc3Q7bjxyJiYobis9Ui5UV09fUEkpO2NvbnN0IGk9Ui5uZWdhdGl2ZVBpVG9QaSgocituKSouNSksbz0odC5zb3V0aCt0Lm5vcnRoKSouNTtyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9aSxlLmxhdGl0dWRlPW8sZS5oZWlnaHQ9MCxlKTpuZXcgSChpLG8pfSxJLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2xldCByPXQuZWFzdCxpPXQud2VzdCxvPWUuZWFzdCxzPWUud2VzdDtyPGkmJm8+MD9yKz1SLlRXT19QSTpvPHMmJnI+MCYmKG8rPVIuVFdPX1BJKSxyPGkmJnM8MD9zKz1SLlRXT19QSTpvPHMmJmk8MCYmKGkrPVIuVFdPX1BJKTtjb25zdCB1PVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgoaSxzKSksYT1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWluKHIsbykpO2lmKCh0Lndlc3Q8dC5lYXN0fHxlLndlc3Q8ZS5lYXN0KSYmYTw9dSlyZXR1cm47Y29uc3QgbD1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLGQ9TWF0aC5taW4odC5ub3J0aCxlLm5vcnRoKTtpZighKGw+PWQpKXJldHVybiBwKG4pPyhuLndlc3Q9dSxuLnNvdXRoPWwsbi5lYXN0PWEsbi5ub3J0aD1kLG4pOm5ldyBJKHUsbCxhLGQpfSxJLnNpbXBsZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2NvbnN0IHI9TWF0aC5tYXgodC53ZXN0LGUud2VzdCksaT1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLG89TWF0aC5taW4odC5lYXN0LGUuZWFzdCkscz1NYXRoLm1pbih0Lm5vcnRoLGUubm9ydGgpO2lmKCEoaT49c3x8cj49bykpcmV0dXJuIHAobik/KG4ud2VzdD1yLG4uc291dGg9aSxuLmVhc3Q9byxuLm5vcnRoPXMsbik6bmV3IEkocixpLG8scyl9LEkudW5pb249ZnVuY3Rpb24odCxlLG4pe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxoLnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKSxwKG4pfHwobj1uZXcgSSk7bGV0IHI9dC5lYXN0LGk9dC53ZXN0LG89ZS5lYXN0LHM9ZS53ZXN0O3I8aSYmbz4wP3IrPVIuVFdPX1BJOm88cyYmcj4wJiYobys9Ui5UV09fUEkpLHI8aSYmczwwP3MrPVIuVFdPX1BJOm88cyYmaTwwJiYoaSs9Ui5UV09fUEkpO2NvbnN0IHU9Ui5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihpLHMpKSxhPVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgocixvKSk7cmV0dXJuIG4ud2VzdD11LG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLnNvdXRoKSxuLmVhc3Q9YSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5ub3J0aCksbn0sSS5leHBhbmQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpLHAobil8fChuPW5ldyBJKSxuLndlc3Q9TWF0aC5taW4odC53ZXN0LGUubG9uZ2l0dWRlKSxuLnNvdXRoPU1hdGgubWluKHQuc291dGgsZS5sYXRpdHVkZSksbi5lYXN0PU1hdGgubWF4KHQuZWFzdCxlLmxvbmdpdHVkZSksbi5ub3J0aD1NYXRoLm1heCh0Lm5vcnRoLGUubGF0aXR1ZGUpLG59LEkuY29udGFpbnM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpO2xldCBuPWUubG9uZ2l0dWRlO2NvbnN0IHI9ZS5sYXRpdHVkZSxpPXQud2VzdDtsZXQgbz10LmVhc3Q7cmV0dXJuIG88aSYmKG8rPVIuVFdPX1BJLG48MCYmKG4rPVIuVFdPX1BJKSksKG4+aXx8Ui5lcXVhbHNFcHNpbG9uKG4saSxSLkVQU0lMT04xNCkpJiYobjxvfHxSLmVxdWFsc0Vwc2lsb24obixvLFIuRVBTSUxPTjE0KSkmJnI+PXQuc291dGgmJnI8PXQubm9ydGh9O2NvbnN0IG1vPW5ldyBIO0kuc3Vic2FtcGxlPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxlPW0oZSxqLldHUzg0KSxuPW0obiwwKSxwKHIpfHwocj1bXSk7bGV0IGk9MDtjb25zdCBvPXQubm9ydGgscz10LnNvdXRoLHU9dC5lYXN0LGE9dC53ZXN0LGw9bW87bC5oZWlnaHQ9bixsLmxvbmdpdHVkZT1hLGwubGF0aXR1ZGU9byxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sYXRpdHVkZT1zLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxsLmxvbmdpdHVkZT1hLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxvPDA/bC5sYXRpdHVkZT1vOnM+MD9sLmxhdGl0dWRlPXM6bC5sYXRpdHVkZT0wO2ZvcihsZXQgZD0xO2Q8ODsrK2QpbC5sb25naXR1ZGU9LU1hdGguUEkrZCpSLlBJX09WRVJfVFdPLEkuY29udGFpbnModCxsKSYmKHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyk7cmV0dXJuIGwubGF0aXR1ZGU9PT0wJiYobC5sb25naXR1ZGU9YSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyspLHIubGVuZ3RoPWkscn0sSS5zdWJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtpZihoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGhMZXJwIixuLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4sMSksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImVhc3RMZXJwIixyLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0TGVycCIsciwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibm9ydGhMZXJwIixpLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLGksMSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLHIpLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4saSkscChvKXx8KG89bmV3IEkpLHQud2VzdDw9dC5lYXN0KXtjb25zdCB1PXQuZWFzdC10Lndlc3Q7by53ZXN0PXQud2VzdCtlKnUsby5lYXN0PXQud2VzdCtyKnV9ZWxzZXtjb25zdCB1PVIuVFdPX1BJK3QuZWFzdC10Lndlc3Q7by53ZXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K2UqdSksby5lYXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K3IqdSl9Y29uc3Qgcz10Lm5vcnRoLXQuc291dGg7cmV0dXJuIG8uc291dGg9dC5zb3V0aCtuKnMsby5ub3J0aD10LnNvdXRoK2kqcyxlPT09MSYmKG8ud2VzdD10LmVhc3QpLHI9PT0xJiYoby5lYXN0PXQuZWFzdCksbj09PTEmJihvLnNvdXRoPXQubm9ydGgpLGk9PT0xJiYoby5ub3J0aD10Lm5vcnRoKSxvfSxJLk1BWF9WQUxVRT1PYmplY3QuZnJlZXplKG5ldyBJKC1NYXRoLlBJLC1SLlBJX09WRVJfVFdPLE1hdGguUEksUi5QSV9PVkVSX1RXTykpO3ZhciBncj1PYmplY3QuZnJlZXplKHtERVBUSF9CVUZGRVJfQklUOjI1NixTVEVOQ0lMX0JVRkZFUl9CSVQ6MTAyNCxDT0xPUl9CVUZGRVJfQklUOjE2Mzg0LFBPSU5UUzowLExJTkVTOjEsTElORV9MT09QOjIsTElORV9TVFJJUDozLFRSSUFOR0xFUzo0LFRSSUFOR0xFX1NUUklQOjUsVFJJQU5HTEVfRkFOOjYsWkVSTzowLE9ORToxLFNSQ19DT0xPUjo3NjgsT05FX01JTlVTX1NSQ19DT0xPUjo3NjksU1JDX0FMUEhBOjc3MCxPTkVfTUlOVVNfU1JDX0FMUEhBOjc3MSxEU1RfQUxQSEE6NzcyLE9ORV9NSU5VU19EU1RfQUxQSEE6NzczLERTVF9DT0xPUjo3NzQsT05FX01JTlVTX0RTVF9DT0xPUjo3NzUsU1JDX0FMUEhBX1NBVFVSQVRFOjc3NixGVU5DX0FERDozMjc3NCxCTEVORF9FUVVBVElPTjozMjc3NyxCTEVORF9FUVVBVElPTl9SR0I6MzI3NzcsQkxFTkRfRVFVQVRJT05fQUxQSEE6MzQ4NzcsRlVOQ19TVUJUUkFDVDozMjc3OCxGVU5DX1JFVkVSU0VfU1VCVFJBQ1Q6MzI3NzksQkxFTkRfRFNUX1JHQjozMjk2OCxCTEVORF9TUkNfUkdCOjMyOTY5LEJMRU5EX0RTVF9BTFBIQTozMjk3MCxCTEVORF9TUkNfQUxQSEE6MzI5NzEsQ09OU1RBTlRfQ09MT1I6MzI3NjksT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOjMyNzcwLENPTlNUQU5UX0FMUEhBOjMyNzcxLE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQTozMjc3MixCTEVORF9DT0xPUjozMjc3MyxBUlJBWV9CVUZGRVI6MzQ5NjIsRUxFTUVOVF9BUlJBWV9CVUZGRVI6MzQ5NjMsQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjQsRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORzozNDk2NSxTVFJFQU1fRFJBVzozNTA0MCxTVEFUSUNfRFJBVzozNTA0NCxEWU5BTUlDX0RSQVc6MzUwNDgsQlVGRkVSX1NJWkU6MzQ2NjAsQlVGRkVSX1VTQUdFOjM0NjYxLENVUlJFTlRfVkVSVEVYX0FUVFJJQjozNDM0MixGUk9OVDoxMDI4LEJBQ0s6MTAyOSxGUk9OVF9BTkRfQkFDSzoxMDMyLENVTExfRkFDRToyODg0LEJMRU5EOjMwNDIsRElUSEVSOjMwMjQsU1RFTkNJTF9URVNUOjI5NjAsREVQVEhfVEVTVDoyOTI5LFNDSVNTT1JfVEVTVDozMDg5LFBPTFlHT05fT0ZGU0VUX0ZJTEw6MzI4MjMsU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOjMyOTI2LFNBTVBMRV9DT1ZFUkFHRTozMjkyOCxOT19FUlJPUjowLElOVkFMSURfRU5VTToxMjgwLElOVkFMSURfVkFMVUU6MTI4MSxJTlZBTElEX09QRVJBVElPTjoxMjgyLE9VVF9PRl9NRU1PUlk6MTI4NSxDVzoyMzA0LENDVzoyMzA1LExJTkVfV0lEVEg6Mjg0OSxBTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6MzM5MDEsQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOjMzOTAyLENVTExfRkFDRV9NT0RFOjI4ODUsRlJPTlRfRkFDRToyODg2LERFUFRIX1JBTkdFOjI5MjgsREVQVEhfV1JJVEVNQVNLOjI5MzAsREVQVEhfQ0xFQVJfVkFMVUU6MjkzMSxERVBUSF9GVU5DOjI5MzIsU1RFTkNJTF9DTEVBUl9WQUxVRToyOTYxLFNURU5DSUxfRlVOQzoyOTYyLFNURU5DSUxfRkFJTDoyOTY0LFNURU5DSUxfUEFTU19ERVBUSF9GQUlMOjI5NjUsU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1M6Mjk2NixTVEVOQ0lMX1JFRjoyOTY3LFNURU5DSUxfVkFMVUVfTUFTSzoyOTYzLFNURU5DSUxfV1JJVEVNQVNLOjI5NjgsU1RFTkNJTF9CQUNLX0ZVTkM6MzQ4MTYsU1RFTkNJTF9CQUNLX0ZBSUw6MzQ4MTcsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTDozNDgxOCxTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTOjM0ODE5LFNURU5DSUxfQkFDS19SRUY6MzYwMDMsU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0s6MzYwMDQsU1RFTkNJTF9CQUNLX1dSSVRFTUFTSzozNjAwNSxWSUVXUE9SVDoyOTc4LFNDSVNTT1JfQk9YOjMwODgsQ09MT1JfQ0xFQVJfVkFMVUU6MzEwNixDT0xPUl9XUklURU1BU0s6MzEwNyxVTlBBQ0tfQUxJR05NRU5UOjMzMTcsUEFDS19BTElHTk1FTlQ6MzMzMyxNQVhfVEVYVFVSRV9TSVpFOjMzNzksTUFYX1ZJRVdQT1JUX0RJTVM6MzM4NixTVUJQSVhFTF9CSVRTOjM0MDgsUkVEX0JJVFM6MzQxMCxHUkVFTl9CSVRTOjM0MTEsQkxVRV9CSVRTOjM0MTIsQUxQSEFfQklUUzozNDEzLERFUFRIX0JJVFM6MzQxNCxTVEVOQ0lMX0JJVFM6MzQxNSxQT0xZR09OX09GRlNFVF9VTklUUzoxMDc1MixQT0xZR09OX09GRlNFVF9GQUNUT1I6MzI4MjQsVEVYVFVSRV9CSU5ESU5HXzJEOjMyODczLFNBTVBMRV9CVUZGRVJTOjMyOTM2LFNBTVBMRVM6MzI5MzcsU0FNUExFX0NPVkVSQUdFX1ZBTFVFOjMyOTM4LFNBTVBMRV9DT1ZFUkFHRV9JTlZFUlQ6MzI5MzksQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6MzQ0NjcsRE9OVF9DQVJFOjQzNTIsRkFTVEVTVDo0MzUzLE5JQ0VTVDo0MzU0LEdFTkVSQVRFX01JUE1BUF9ISU5UOjMzMTcwLEJZVEU6NTEyMCxVTlNJR05FRF9CWVRFOjUxMjEsU0hPUlQ6NTEyMixVTlNJR05FRF9TSE9SVDo1MTIzLElOVDo1MTI0LFVOU0lHTkVEX0lOVDo1MTI1LEZMT0FUOjUxMjYsREVQVEhfQ09NUE9ORU5UOjY0MDIsQUxQSEE6NjQwNixSR0I6NjQwNyxSR0JBOjY0MDgsTFVNSU5BTkNFOjY0MDksTFVNSU5BTkNFX0FMUEhBOjY0MTAsVU5TSUdORURfU0hPUlRfNF80XzRfNDozMjgxOSxVTlNJR05FRF9TSE9SVF81XzVfNV8xOjMyODIwLFVOU0lHTkVEX1NIT1JUXzVfNl81OjMzNjM1LEZSQUdNRU5UX1NIQURFUjozNTYzMixWRVJURVhfU0hBREVSOjM1NjMzLE1BWF9WRVJURVhfQVRUUklCUzozNDkyMSxNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzozNjM0NyxNQVhfVkFSWUlOR19WRUNUT1JTOjM2MzQ4LE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOjM1NjYxLE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MCxNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNDkzMCxNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTOjM2MzQ5LFNIQURFUl9UWVBFOjM1NjYzLERFTEVURV9TVEFUVVM6MzU3MTIsTElOS19TVEFUVVM6MzU3MTQsVkFMSURBVEVfU1RBVFVTOjM1NzE1LEFUVEFDSEVEX1NIQURFUlM6MzU3MTcsQUNUSVZFX1VOSUZPUk1TOjM1NzE4LEFDVElWRV9BVFRSSUJVVEVTOjM1NzIxLFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjozNTcyNCxDVVJSRU5UX1BST0dSQU06MzU3MjUsTkVWRVI6NTEyLExFU1M6NTEzLEVRVUFMOjUxNCxMRVFVQUw6NTE1LEdSRUFURVI6NTE2LE5PVEVRVUFMOjUxNyxHRVFVQUw6NTE4LEFMV0FZUzo1MTksS0VFUDo3NjgwLFJFUExBQ0U6NzY4MSxJTkNSOjc2ODIsREVDUjo3NjgzLElOVkVSVDo1Mzg2LElOQ1JfV1JBUDozNDA1NSxERUNSX1dSQVA6MzQwNTYsVkVORE9SOjc5MzYsUkVOREVSRVI6NzkzNyxWRVJTSU9OOjc5MzgsTkVBUkVTVDo5NzI4LExJTkVBUjo5NzI5LE5FQVJFU1RfTUlQTUFQX05FQVJFU1Q6OTk4NCxMSU5FQVJfTUlQTUFQX05FQVJFU1Q6OTk4NSxORUFSRVNUX01JUE1BUF9MSU5FQVI6OTk4NixMSU5FQVJfTUlQTUFQX0xJTkVBUjo5OTg3LFRFWFRVUkVfTUFHX0ZJTFRFUjoxMDI0MCxURVhUVVJFX01JTl9GSUxURVI6MTAyNDEsVEVYVFVSRV9XUkFQX1M6MTAyNDIsVEVYVFVSRV9XUkFQX1Q6MTAyNDMsVEVYVFVSRV8yRDozNTUzLFRFWFRVUkU6NTg5MCxURVhUVVJFX0NVQkVfTUFQOjM0MDY3LFRFWFRVUkVfQklORElOR19DVUJFX01BUDozNDA2OCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6MzQwNjksVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOjM0MDcwLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWTozNDA3MSxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6MzQwNzIsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOjM0MDczLFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjozNDA3NCxNQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOjM0MDc2LFRFWFRVUkUwOjMzOTg0LFRFWFRVUkUxOjMzOTg1LFRFWFRVUkUyOjMzOTg2LFRFWFRVUkUzOjMzOTg3LFRFWFRVUkU0OjMzOTg4LFRFWFRVUkU1OjMzOTg5LFRFWFRVUkU2OjMzOTkwLFRFWFRVUkU3OjMzOTkxLFRFWFRVUkU4OjMzOTkyLFRFWFRVUkU5OjMzOTkzLFRFWFRVUkUxMDozMzk5NCxURVhUVVJFMTE6MzM5OTUsVEVYVFVSRTEyOjMzOTk2LFRFWFRVUkUxMzozMzk5NyxURVhUVVJFMTQ6MzM5OTgsVEVYVFVSRTE1OjMzOTk5LFRFWFRVUkUxNjozNGUzLFRFWFRVUkUxNzozNDAwMSxURVhUVVJFMTg6MzQwMDIsVEVYVFVSRTE5OjM0MDAzLFRFWFRVUkUyMDozNDAwNCxURVhUVVJFMjE6MzQwMDUsVEVYVFVSRTIyOjM0MDA2LFRFWFRVUkUyMzozNDAwNyxURVhUVVJFMjQ6MzQwMDgsVEVYVFVSRTI1OjM0MDA5LFRFWFRVUkUyNjozNDAxMCxURVhUVVJFMjc6MzQwMTEsVEVYVFVSRTI4OjM0MDEyLFRFWFRVUkUyOTozNDAxMyxURVhUVVJFMzA6MzQwMTQsVEVYVFVSRTMxOjM0MDE1LEFDVElWRV9URVhUVVJFOjM0MDE2LFJFUEVBVDoxMDQ5NyxDTEFNUF9UT19FREdFOjMzMDcxLE1JUlJPUkVEX1JFUEVBVDozMzY0OCxGTE9BVF9WRUMyOjM1NjY0LEZMT0FUX1ZFQzM6MzU2NjUsRkxPQVRfVkVDNDozNTY2NixJTlRfVkVDMjozNTY2NyxJTlRfVkVDMzozNTY2OCxJTlRfVkVDNDozNTY2OSxCT09MOjM1NjcwLEJPT0xfVkVDMjozNTY3MSxCT09MX1ZFQzM6MzU2NzIsQk9PTF9WRUM0OjM1NjczLEZMT0FUX01BVDI6MzU2NzQsRkxPQVRfTUFUMzozNTY3NSxGTE9BVF9NQVQ0OjM1Njc2LFNBTVBMRVJfMkQ6MzU2NzgsU0FNUExFUl9DVUJFOjM1NjgwLFZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDozNDMzOCxWRVJURVhfQVRUUklCX0FSUkFZX1NJWkU6MzQzMzksVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREU6MzQzNDAsVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFOjM0MzQxLFZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDozNDkyMixWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVI6MzQzNzMsVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORzozNDk3NSxJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6MzU3MzgsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6MzU3MzksQ09NUElMRV9TVEFUVVM6MzU3MTMsTE9XX0ZMT0FUOjM2MzM2LE1FRElVTV9GTE9BVDozNjMzNyxISUdIX0ZMT0FUOjM2MzM4LExPV19JTlQ6MzYzMzksTUVESVVNX0lOVDozNjM0MCxISUdIX0lOVDozNjM0MSxGUkFNRUJVRkZFUjozNjE2MCxSRU5ERVJCVUZGRVI6MzYxNjEsUkdCQTQ6MzI4NTQsUkdCNV9BMTozMjg1NSxSR0I1NjU6MzYxOTQsREVQVEhfQ09NUE9ORU5UMTY6MzMxODksU1RFTkNJTF9JTkRFWDo2NDAxLFNURU5DSUxfSU5ERVg4OjM2MTY4LERFUFRIX1NURU5DSUw6MzQwNDEsUkVOREVSQlVGRkVSX1dJRFRIOjM2MTYyLFJFTkRFUkJVRkZFUl9IRUlHSFQ6MzYxNjMsUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVDozNjE2NCxSRU5ERVJCVUZGRVJfUkVEX1NJWkU6MzYxNzYsUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU6MzYxNzcsUkVOREVSQlVGRkVSX0JMVUVfU0laRTozNjE3OCxSRU5ERVJCVUZGRVJfQUxQSEFfU0laRTozNjE3OSxSRU5ERVJCVUZGRVJfREVQVEhfU0laRTozNjE4MCxSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFOjM2MTgxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6MzYwNDgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRTozNjA0OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUw6MzYwNTAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6MzYwNTEsQ09MT1JfQVRUQUNITUVOVDA6MzYwNjQsREVQVEhfQVRUQUNITUVOVDozNjA5NixTVEVOQ0lMX0FUVEFDSE1FTlQ6MzYxMjgsREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOjMzMzA2LE5PTkU6MCxGUkFNRUJVRkZFUl9DT01QTEVURTozNjA1MyxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6MzYwNTQsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6MzYwNTUsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOjM2MDU3LEZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOjM2MDYxLEZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVOREVSQlVGRkVSX0JJTkRJTkc6MzYwMDcsTUFYX1JFTkRFUkJVRkZFUl9TSVpFOjM0MDI0LElOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOjEyODYsVU5QQUNLX0ZMSVBfWV9XRUJHTDozNzQ0MCxVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6Mzc0NDEsQ09OVEVYVF9MT1NUX1dFQkdMOjM3NDQyLFVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0w6Mzc0NDMsQlJPV1NFUl9ERUZBVUxUX1dFQkdMOjM3NDQ0LENPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6MzM3NzYsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6MzM3NzcsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6MzM3NzgsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6MzM3NzksQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRzozNTg0MCxDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOjM1ODQxLENPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HOjM1ODQyLENPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOjM1ODQzLENPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9XRUJHTDozNzgwOCxDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOjM2MTk2LENPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNOjM2NDkyLEhBTEZfRkxPQVRfT0VTOjM2MTkzLERPVUJMRTo1MTMwLFJFQURfQlVGRkVSOjMwNzQsVU5QQUNLX1JPV19MRU5HVEg6MzMxNCxVTlBBQ0tfU0tJUF9ST1dTOjMzMTUsVU5QQUNLX1NLSVBfUElYRUxTOjMzMTYsUEFDS19ST1dfTEVOR1RIOjMzMzAsUEFDS19TS0lQX1JPV1M6MzMzMSxQQUNLX1NLSVBfUElYRUxTOjMzMzIsQ09MT1I6NjE0NCxERVBUSDo2MTQ1LFNURU5DSUw6NjE0NixSRUQ6NjQwMyxSR0I4OjMyODQ5LFJHQkE4OjMyODU2LFJHQjEwX0EyOjMyODU3LFRFWFRVUkVfQklORElOR18zRDozMjg3NCxVTlBBQ0tfU0tJUF9JTUFHRVM6MzI4NzcsVU5QQUNLX0lNQUdFX0hFSUdIVDozMjg3OCxURVhUVVJFXzNEOjMyODc5LFRFWFRVUkVfV1JBUF9SOjMyODgyLE1BWF8zRF9URVhUVVJFX1NJWkU6MzI4ODMsVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWOjMzNjQwLE1BWF9FTEVNRU5UU19WRVJUSUNFUzozM2UzLE1BWF9FTEVNRU5UU19JTkRJQ0VTOjMzMDAxLFRFWFRVUkVfTUlOX0xPRDozMzA4MixURVhUVVJFX01BWF9MT0Q6MzMwODMsVEVYVFVSRV9CQVNFX0xFVkVMOjMzMDg0LFRFWFRVUkVfTUFYX0xFVkVMOjMzMDg1LE1JTjozMjc3NSxNQVg6MzI3NzYsREVQVEhfQ09NUE9ORU5UMjQ6MzMxOTAsTUFYX1RFWFRVUkVfTE9EX0JJQVM6MzQwNDUsVEVYVFVSRV9DT01QQVJFX01PREU6MzQ4OTIsVEVYVFVSRV9DT01QQVJFX0ZVTkM6MzQ4OTMsQ1VSUkVOVF9RVUVSWTozNDkxNyxRVUVSWV9SRVNVTFQ6MzQ5MTgsUVVFUllfUkVTVUxUX0FWQUlMQUJMRTozNDkxOSxTVFJFQU1fUkVBRDozNTA0MSxTVFJFQU1fQ09QWTozNTA0MixTVEFUSUNfUkVBRDozNTA0NSxTVEFUSUNfQ09QWTozNTA0NixEWU5BTUlDX1JFQUQ6MzUwNDksRFlOQU1JQ19DT1BZOjM1MDUwLE1BWF9EUkFXX0JVRkZFUlM6MzQ4NTIsRFJBV19CVUZGRVIwOjM0ODUzLERSQVdfQlVGRkVSMTozNDg1NCxEUkFXX0JVRkZFUjI6MzQ4NTUsRFJBV19CVUZGRVIzOjM0ODU2LERSQVdfQlVGRkVSNDozNDg1NyxEUkFXX0JVRkZFUjU6MzQ4NTgsRFJBV19CVUZGRVI2OjM0ODU5LERSQVdfQlVGRkVSNzozNDg2MCxEUkFXX0JVRkZFUjg6MzQ4NjEsRFJBV19CVUZGRVI5OjM0ODYyLERSQVdfQlVGRkVSMTA6MzQ4NjMsRFJBV19CVUZGRVIxMTozNDg2NCxEUkFXX0JVRkZFUjEyOjM0ODY1LERSQVdfQlVGRkVSMTM6MzQ4NjYsRFJBV19CVUZGRVIxNDozNDg2NyxEUkFXX0JVRkZFUjE1OjM0ODY4LE1BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTcsTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTgsU0FNUExFUl8zRDozNTY3OSxTQU1QTEVSXzJEX1NIQURPVzozNTY4MixGUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UOjM1NzIzLFBJWEVMX1BBQ0tfQlVGRkVSOjM1MDUxLFBJWEVMX1VOUEFDS19CVUZGRVI6MzUwNTIsUElYRUxfUEFDS19CVUZGRVJfQklORElORzozNTA1MyxQSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTUsRkxPQVRfTUFUMngzOjM1Njg1LEZMT0FUX01BVDJ4NDozNTY4NixGTE9BVF9NQVQzeDI6MzU2ODcsRkxPQVRfTUFUM3g0OjM1Njg4LEZMT0FUX01BVDR4MjozNTY4OSxGTE9BVF9NQVQ0eDM6MzU2OTAsU1JHQjozNTkwNCxTUkdCODozNTkwNSxTUkdCOF9BTFBIQTg6MzU5MDcsQ09NUEFSRV9SRUZfVE9fVEVYVFVSRTozNDg5NCxSR0JBMzJGOjM0ODM2LFJHQjMyRjozNDgzNyxSR0JBMTZGOjM0ODQyLFJHQjE2RjozNDg0MyxWRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVI6MzUwNjksTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTOjM1MDcxLE1JTl9QUk9HUkFNX1RFWEVMX09GRlNFVDozNTA3NixNQVhfUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzcsTUFYX1ZBUllJTkdfQ09NUE9ORU5UUzozNTY1OSxURVhUVVJFXzJEX0FSUkFZOjM1ODY2LFRFWFRVUkVfQklORElOR18yRF9BUlJBWTozNTg2OSxSMTFGX0cxMUZfQjEwRjozNTg5OCxVTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWOjM1ODk5LFJHQjlfRTU6MzU5MDEsVU5TSUdORURfSU5UXzVfOV85XzlfUkVWOjM1OTAyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERTozNTk2NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0NPTVBPTkVOVFM6MzU5NjgsVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTOjM1OTcxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQ6MzU5NzIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFOjM1OTczLFRSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU46MzU5NzYsUkFTVEVSSVpFUl9ESVNDQVJEOjM1OTc3LE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UUzozNTk3OCxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlM6MzU5NzksSU5URVJMRUFWRURfQVRUUklCUzozNTk4MCxTRVBBUkFURV9BVFRSSUJTOjM1OTgxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVI6MzU5ODIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HOjM1OTgzLFJHQkEzMlVJOjM2MjA4LFJHQjMyVUk6MzYyMDksUkdCQTE2VUk6MzYyMTQsUkdCMTZVSTozNjIxNSxSR0JBOFVJOjM2MjIwLFJHQjhVSTozNjIyMSxSR0JBMzJJOjM2MjI2LFJHQjMySTozNjIyNyxSR0JBMTZJOjM2MjMyLFJHQjE2STozNjIzMyxSR0JBOEk6MzYyMzgsUkdCOEk6MzYyMzksUkVEX0lOVEVHRVI6MzYyNDQsUkdCX0lOVEVHRVI6MzYyNDgsUkdCQV9JTlRFR0VSOjM2MjQ5LFNBTVBMRVJfMkRfQVJSQVk6MzYyODksU0FNUExFUl8yRF9BUlJBWV9TSEFET1c6MzYyOTIsU0FNUExFUl9DVUJFX1NIQURPVzozNjI5MyxVTlNJR05FRF9JTlRfVkVDMjozNjI5NCxVTlNJR05FRF9JTlRfVkVDMzozNjI5NSxVTlNJR05FRF9JTlRfVkVDNDozNjI5NixJTlRfU0FNUExFUl8yRDozNjI5OCxJTlRfU0FNUExFUl8zRDozNjI5OSxJTlRfU0FNUExFUl9DVUJFOjM2MzAwLElOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzAzLFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEOjM2MzA2LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzNEOjM2MzA3LFVOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkU6MzYzMDgsVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVk6MzYzMTEsREVQVEhfQ09NUE9ORU5UMzJGOjM2MDEyLERFUFRIMzJGX1NURU5DSUw4OjM2MDEzLEZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFVjozNjI2OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HOjMzMjk2LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEU6MzMyOTcsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRTozMzI5OCxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkU6MzMyOTksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkU6MzMzMDAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFOjMzMzAxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRTozMzMwMixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRTozMzMwMyxGUkFNRUJVRkZFUl9ERUZBVUxUOjMzMzA0LFVOU0lHTkVEX0lOVF8yNF84OjM0MDQyLERFUFRIMjRfU1RFTkNJTDg6MzUwNTYsVU5TSUdORURfTk9STUFMSVpFRDozNTg2MyxEUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVBRF9GUkFNRUJVRkZFUjozNjAwOCxEUkFXX0ZSQU1FQlVGRkVSOjM2MDA5LFJFQURfRlJBTUVCVUZGRVJfQklORElORzozNjAxMCxSRU5ERVJCVUZGRVJfU0FNUExFUzozNjAxMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVI6MzYwNTIsTUFYX0NPTE9SX0FUVEFDSE1FTlRTOjM2MDYzLENPTE9SX0FUVEFDSE1FTlQxOjM2MDY1LENPTE9SX0FUVEFDSE1FTlQyOjM2MDY2LENPTE9SX0FUVEFDSE1FTlQzOjM2MDY3LENPTE9SX0FUVEFDSE1FTlQ0OjM2MDY4LENPTE9SX0FUVEFDSE1FTlQ1OjM2MDY5LENPTE9SX0FUVEFDSE1FTlQ2OjM2MDcwLENPTE9SX0FUVEFDSE1FTlQ3OjM2MDcxLENPTE9SX0FUVEFDSE1FTlQ4OjM2MDcyLENPTE9SX0FUVEFDSE1FTlQ5OjM2MDczLENPTE9SX0FUVEFDSE1FTlQxMDozNjA3NCxDT0xPUl9BVFRBQ0hNRU5UMTE6MzYwNzUsQ09MT1JfQVRUQUNITUVOVDEyOjM2MDc2LENPTE9SX0FUVEFDSE1FTlQxMzozNjA3NyxDT0xPUl9BVFRBQ0hNRU5UMTQ6MzYwNzgsQ09MT1JfQVRUQUNITUVOVDE1OjM2MDc5LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEU6MzYxODIsTUFYX1NBTVBMRVM6MzYxODMsSEFMRl9GTE9BVDo1MTMxLFJHOjMzMzE5LFJHX0lOVEVHRVI6MzMzMjAsUjg6MzMzMjEsUkc4OjMzMzIzLFIxNkY6MzMzMjUsUjMyRjozMzMyNixSRzE2RjozMzMyNyxSRzMyRjozMzMyOCxSOEk6MzMzMjksUjhVSTozMzMzMCxSMTZJOjMzMzMxLFIxNlVJOjMzMzMyLFIzMkk6MzMzMzMsUjMyVUk6MzMzMzQsUkc4STozMzMzNSxSRzhVSTozMzMzNixSRzE2STozMzMzNyxSRzE2VUk6MzMzMzgsUkczMkk6MzMzMzksUkczMlVJOjMzMzQwLFZFUlRFWF9BUlJBWV9CSU5ESU5HOjM0MjI5LFI4X1NOT1JNOjM2NzU2LFJHOF9TTk9STTozNjc1NyxSR0I4X1NOT1JNOjM2NzU4LFJHQkE4X1NOT1JNOjM2NzU5LFNJR05FRF9OT1JNQUxJWkVEOjM2NzY0LENPUFlfUkVBRF9CVUZGRVI6MzY2NjIsQ09QWV9XUklURV9CVUZGRVI6MzY2NjMsQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSX0JJTkRJTkc6MzY2NjMsVU5JRk9STV9CVUZGRVI6MzUzNDUsVU5JRk9STV9CVUZGRVJfQklORElORzozNTM2OCxVTklGT1JNX0JVRkZFUl9TVEFSVDozNTM2OSxVTklGT1JNX0JVRkZFUl9TSVpFOjM1MzcwLE1BWF9WRVJURVhfVU5JRk9STV9CTE9DS1M6MzUzNzEsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTOjM1MzczLE1BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUzozNTM3NCxNQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1M6MzUzNzUsTUFYX1VOSUZPUk1fQkxPQ0tfU0laRTozNTM3NixNQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3NyxNQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1Mzc5LFVOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQ6MzUzODAsQUNUSVZFX1VOSUZPUk1fQkxPQ0tTOjM1MzgyLFVOSUZPUk1fVFlQRTozNTM4MyxVTklGT1JNX1NJWkU6MzUzODQsVU5JRk9STV9CTE9DS19JTkRFWDozNTM4NixVTklGT1JNX09GRlNFVDozNTM4NyxVTklGT1JNX0FSUkFZX1NUUklERTozNTM4OCxVTklGT1JNX01BVFJJWF9TVFJJREU6MzUzODksVU5JRk9STV9JU19ST1dfTUFKT1I6MzUzOTAsVU5JRk9STV9CTE9DS19CSU5ESU5HOjM1MzkxLFVOSUZPUk1fQkxPQ0tfREFUQV9TSVpFOjM1MzkyLFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TOjM1Mzk0LFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1fSU5ESUNFUzozNTM5NSxVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUjozNTM5NixVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSOjM1Mzk4LElOVkFMSURfSU5ERVg6NDI5NDk2NzI5NSxNQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTOjM3MTU0LE1BWF9GUkFHTUVOVF9JTlBVVF9DT01QT05FTlRTOjM3MTU3LE1BWF9TRVJWRVJfV0FJVF9USU1FT1VUOjM3MTM3LE9CSkVDVF9UWVBFOjM3MTM4LFNZTkNfQ09ORElUSU9OOjM3MTM5LFNZTkNfU1RBVFVTOjM3MTQwLFNZTkNfRkxBR1M6MzcxNDEsU1lOQ19GRU5DRTozNzE0MixTWU5DX0dQVV9DT01NQU5EU19DT01QTEVURTozNzE0MyxVTlNJR05BTEVEOjM3MTQ0LFNJR05BTEVEOjM3MTQ1LEFMUkVBRFlfU0lHTkFMRUQ6MzcxNDYsVElNRU9VVF9FWFBJUkVEOjM3MTQ3LENPTkRJVElPTl9TQVRJU0ZJRUQ6MzcxNDgsV0FJVF9GQUlMRUQ6MzcxNDksU1lOQ19GTFVTSF9DT01NQU5EU19CSVQ6MSxWRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1I6MzUwNzAsQU5ZX1NBTVBMRVNfUEFTU0VEOjM1ODg3LEFOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkU6MzYyMDIsU0FNUExFUl9CSU5ESU5HOjM1MDk3LFJHQjEwX0EyVUk6MzY5NzUsSU5UXzJfMTBfMTBfMTBfUkVWOjM2MjU1LFRSQU5TRk9STV9GRUVEQkFDSzozNjM4NixUUkFOU0ZPUk1fRkVFREJBQ0tfUEFVU0VEOjM2Mzg3LFRSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkU6MzYzODgsVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkc6MzYzODksQ09NUFJFU1NFRF9SMTFfRUFDOjM3NDg4LENPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUM6Mzc0ODksQ09NUFJFU1NFRF9SRzExX0VBQzozNzQ5MCxDT01QUkVTU0VEX1NJR05FRF9SRzExX0VBQzozNzQ5MSxDT01QUkVTU0VEX1JHQjhfRVRDMjozNzQ5MixDT01QUkVTU0VEX1NSR0I4X0VUQzI6Mzc0OTMsQ09NUFJFU1NFRF9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NCxDT01QUkVTU0VEX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NSxDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDOjM3NDk2LENPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDOjM3NDk3LFRFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVDozNzE2NyxNQVhfRUxFTUVOVF9JTkRFWDozNjIwMyxURVhUVVJFX0lNTVVUQUJMRV9MRVZFTFM6MzM1MDMsTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUOjM0MDQ3fSk7Y29uc3QgSmU9e0NMT0NLV0lTRTpnci5DVyxDT1VOVEVSX0NMT0NLV0lTRTpnci5DQ1d9O0plLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09SmUuQ0xPQ0tXSVNFfHx0PT09SmUuQ09VTlRFUl9DTE9DS1dJU0V9O3ZhciBibj1PYmplY3QuZnJlZXplKEplKTtmdW5jdGlvbiBBdCh0KXt0aGlzLl9lbGxpcHNvaWQ9bSh0LGouV0dTODQpLHRoaXMuX3NlbWltYWpvckF4aXM9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsdGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXM9MS90aGlzLl9zZW1pbWFqb3JBeGlzfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KSxBdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBSLlBJX09WRVJfVFdPLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10KSl9LEF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGU9ZnVuY3Rpb24odCl7dD5BdC5NYXhpbXVtTGF0aXR1ZGU/dD1BdC5NYXhpbXVtTGF0aXR1ZGU6dDwtQXQuTWF4aW11bUxhdGl0dWRlJiYodD0tQXQuTWF4aW11bUxhdGl0dWRlKTtjb25zdCBlPU1hdGguc2luKHQpO3JldHVybiAuNSpNYXRoLmxvZygoMStlKS8oMS1lKSl9LEF0Lk1heGltdW1MYXRpdHVkZT1BdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlKE1hdGguUEkpLEF0LnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9zZW1pbWFqb3JBeGlzLHI9dC5sb25naXR1ZGUqbixpPUF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUodC5sYXRpdHVkZSkqbixvPXQuaGVpZ2h0O3JldHVybiBwKGUpPyhlLng9cixlLnk9aSxlLno9byxlKTpuZXcgZihyLGksbyl9LEF0LnByb3RvdHlwZS51bnByb2plY3Q9ZnVuY3Rpb24odCxlKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiY2FydGVzaWFuIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxyPXQueCpuLGk9QXQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZSh0Lnkqbiksbz10Lno7cmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPXIsZS5sYXRpdHVkZT1pLGUuaGVpZ2h0PW8sZSk6bmV3IEgocixpLG8pfTtjbGFzcyBGb3thZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19Y2xhc3Mgd297Y29uc3RydWN0b3IoZSl7dGhpcy5qc2VwPWUsdGhpcy5yZWdpc3RlcmVkPXt9fXJlZ2lzdGVyKC4uLmUpe2UuZm9yRWFjaChuPT57aWYodHlwZW9mIG4hPSJvYmplY3QifHwhbi5uYW1lfHwhbi5pbml0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBKU0VQIHBsdWdpbiBmb3JtYXQiKTt0aGlzLnJlZ2lzdGVyZWRbbi5uYW1lXXx8KG4uaW5pdCh0aGlzLmpzZXApLHRoaXMucmVnaXN0ZXJlZFtuLm5hbWVdPW4pfSl9fWNsYXNzIEV7c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjEuMy44In1zdGF0aWMgdG9TdHJpbmcoKXtyZXR1cm4iSmF2YVNjcmlwdCBFeHByZXNzaW9uIFBhcnNlciAoSlNFUCkgdiIrRS52ZXJzaW9ufXN0YXRpYyBhZGRVbmFyeU9wKGUpe3JldHVybiBFLm1heF91bm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF91bm9wX2xlbiksRS51bmFyeV9vcHNbZV09MSxFfXN0YXRpYyBhZGRCaW5hcnlPcChlLG4scil7cmV0dXJuIEUubWF4X2Jpbm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF9iaW5vcF9sZW4pLEUuYmluYXJ5X29wc1tlXT1uLHI/RS5yaWdodF9hc3NvY2lhdGl2ZS5hZGQoZSk6RS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSksRX1zdGF0aWMgYWRkSWRlbnRpZmllckNoYXIoZSl7cmV0dXJuIEUuYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzLmFkZChlKSxFfXN0YXRpYyBhZGRMaXRlcmFsKGUsbil7cmV0dXJuIEUubGl0ZXJhbHNbZV09bixFfXN0YXRpYyByZW1vdmVVbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS51bmFyeV9vcHNbZV0sZS5sZW5ndGg9PT1FLm1heF91bm9wX2xlbiYmKEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSksRX1zdGF0aWMgcmVtb3ZlQWxsVW5hcnlPcHMoKXtyZXR1cm4gRS51bmFyeV9vcHM9e30sRS5tYXhfdW5vcF9sZW49MCxFfXN0YXRpYyByZW1vdmVJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4gRS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUJpbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS5iaW5hcnlfb3BzW2VdLGUubGVuZ3RoPT09RS5tYXhfYmlub3BfbGVuJiYoRS5tYXhfYmlub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUuYmluYXJ5X29wcykpLEUucmlnaHRfYXNzb2NpYXRpdmUuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUFsbEJpbmFyeU9wcygpe3JldHVybiBFLmJpbmFyeV9vcHM9e30sRS5tYXhfYmlub3BfbGVuPTAsRX1zdGF0aWMgcmVtb3ZlTGl0ZXJhbChlKXtyZXR1cm4gZGVsZXRlIEUubGl0ZXJhbHNbZV0sRX1zdGF0aWMgcmVtb3ZlQWxsTGl0ZXJhbHMoKXtyZXR1cm4gRS5saXRlcmFscz17fSxFfWdldCBjaGFyKCl7cmV0dXJuIHRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCl9Z2V0IGNvZGUoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCl9Y29uc3RydWN0b3IoZSl7dGhpcy5leHByPWUsdGhpcy5pbmRleD0wfXN0YXRpYyBwYXJzZShlKXtyZXR1cm4gbmV3IEUoZSkucGFyc2UoKX1zdGF0aWMgZ2V0TWF4S2V5TGVuKGUpe3JldHVybiBNYXRoLm1heCgwLC4uLk9iamVjdC5rZXlzKGUpLm1hcChuPT5uLmxlbmd0aCkpfXN0YXRpYyBpc0RlY2ltYWxEaWdpdChlKXtyZXR1cm4gZT49NDgmJmU8PTU3fXN0YXRpYyBiaW5hcnlQcmVjZWRlbmNlKGUpe3JldHVybiBFLmJpbmFyeV9vcHNbZV18fDB9c3RhdGljIGlzSWRlbnRpZmllclN0YXJ0KGUpe3JldHVybiBlPj02NSYmZTw9OTB8fGU+PTk3JiZlPD0xMjJ8fGU+PTEyOCYmIUUuYmluYXJ5X29wc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGUpXXx8RS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuaGFzKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfXN0YXRpYyBpc0lkZW50aWZpZXJQYXJ0KGUpe3JldHVybiBFLmlzSWRlbnRpZmllclN0YXJ0KGUpfHxFLmlzRGVjaW1hbERpZ2l0KGUpfXRocm93RXJyb3IoZSl7Y29uc3Qgbj1uZXcgRXJyb3IoZSsiIGF0IGNoYXJhY3RlciAiK3RoaXMuaW5kZXgpO3Rocm93IG4uaW5kZXg9dGhpcy5pbmRleCxuLmRlc2NyaXB0aW9uPWUsbn1ydW5Ib29rKGUsbil7aWYoRS5ob29rc1tlXSl7Y29uc3Qgcj17Y29udGV4dDp0aGlzLG5vZGU6bn07cmV0dXJuIEUuaG9va3MucnVuKGUsciksci5ub2RlfXJldHVybiBufXNlYXJjaEhvb2soZSl7aWYoRS5ob29rc1tlXSl7Y29uc3Qgbj17Y29udGV4dDp0aGlzfTtyZXR1cm4gRS5ob29rc1tlXS5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNhbGwobi5jb250ZXh0LG4pLG4ubm9kZX0pLG4ubm9kZX19Z29iYmxlU3BhY2VzKCl7bGV0IGU9dGhpcy5jb2RlO2Zvcig7ZT09PUUuU1BBQ0VfQ09ERXx8ZT09PUUuVEFCX0NPREV8fGU9PT1FLkxGX0NPREV8fGU9PT1FLkNSX0NPREU7KWU9dGhpcy5leHByLmNoYXJDb2RlQXQoKyt0aGlzLmluZGV4KTt0aGlzLnJ1bkhvb2soImdvYmJsZS1zcGFjZXMiKX1wYXJzZSgpe3RoaXMucnVuSG9vaygiYmVmb3JlLWFsbCIpO2NvbnN0IGU9dGhpcy5nb2JibGVFeHByZXNzaW9ucygpLG49ZS5sZW5ndGg9PT0xP2VbMF06e3R5cGU6RS5DT01QT1VORCxib2R5OmV9O3JldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLWFsbCIsbil9Z29iYmxlRXhwcmVzc2lvbnMoZSl7bGV0IG49W10scixpO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOylpZihyPXRoaXMuY29kZSxyPT09RS5TRU1DT0xfQ09ERXx8cj09PUUuQ09NTUFfQ09ERSl0aGlzLmluZGV4Kys7ZWxzZSBpZihpPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpKW4ucHVzaChpKTtlbHNlIGlmKHRoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCl7aWYocj09PWUpYnJlYWs7dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpfXJldHVybiBufWdvYmJsZUV4cHJlc3Npb24oKXtjb25zdCBlPXRoaXMuc2VhcmNoSG9vaygiZ29iYmxlLWV4cHJlc3Npb24iKXx8dGhpcy5nb2JibGVCaW5hcnlFeHByZXNzaW9uKCk7cmV0dXJuIHRoaXMuZ29iYmxlU3BhY2VzKCksdGhpcy5ydW5Ib29rKCJhZnRlci1leHByZXNzaW9uIixlKX1nb2JibGVCaW5hcnlPcCgpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IGU9dGhpcy5leHByLnN1YnN0cih0aGlzLmluZGV4LEUubWF4X2Jpbm9wX2xlbiksbj1lLmxlbmd0aDtmb3IoO24+MDspe2lmKEUuYmluYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShlKSYmKCFFLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrZS5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIUUuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K2UubGVuZ3RoKSkpKXJldHVybiB0aGlzLmluZGV4Kz1uLGU7ZT1lLnN1YnN0cigwLC0tbil9cmV0dXJuITF9Z29iYmxlQmluYXJ5RXhwcmVzc2lvbigpe2xldCBlLG4scixpLG8scyx1LGEsbDtpZihzPXRoaXMuZ29iYmxlVG9rZW4oKSwhc3x8KG49dGhpcy5nb2JibGVCaW5hcnlPcCgpLCFuKSlyZXR1cm4gcztmb3Iobz17dmFsdWU6bixwcmVjOkUuYmluYXJ5UHJlY2VkZW5jZShuKSxyaWdodF9hOkUucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSx1PXRoaXMuZ29iYmxlVG9rZW4oKSx1fHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24gYWZ0ZXIgIituKSxpPVtzLG8sdV07bj10aGlzLmdvYmJsZUJpbmFyeU9wKCk7KXtpZihyPUUuYmluYXJ5UHJlY2VkZW5jZShuKSxyPT09MCl7dGhpcy5pbmRleC09bi5sZW5ndGg7YnJlYWt9bz17dmFsdWU6bixwcmVjOnIscmlnaHRfYTpFLnJpZ2h0X2Fzc29jaWF0aXZlLmhhcyhuKX0sbD1uO2NvbnN0IGQ9Xz0+by5yaWdodF9hJiZfLnJpZ2h0X2E/cj5fLnByZWM6cjw9Xy5wcmVjO2Zvcig7aS5sZW5ndGg+MiYmZChpW2kubGVuZ3RoLTJdKTspdT1pLnBvcCgpLG49aS5wb3AoKS52YWx1ZSxzPWkucG9wKCksZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6bixsZWZ0OnMscmlnaHQ6dX0saS5wdXNoKGUpO2U9dGhpcy5nb2JibGVUb2tlbigpLGV8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK2wpLGkucHVzaChvLGUpfWZvcihhPWkubGVuZ3RoLTEsZT1pW2FdO2E+MTspZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6aVthLTFdLnZhbHVlLGxlZnQ6aVthLTJdLHJpZ2h0OmV9LGEtPTI7cmV0dXJuIGV9Z29iYmxlVG9rZW4oKXtsZXQgZSxuLHIsaTtpZih0aGlzLmdvYmJsZVNwYWNlcygpLGk9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtdG9rZW4iKSxpKXJldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIixpKTtpZihlPXRoaXMuY29kZSxFLmlzRGVjaW1hbERpZ2l0KGUpfHxlPT09RS5QRVJJT0RfQ09ERSlyZXR1cm4gdGhpcy5nb2JibGVOdW1lcmljTGl0ZXJhbCgpO2lmKGU9PT1FLlNRVU9URV9DT0RFfHxlPT09RS5EUVVPVEVfQ09ERSlpPXRoaXMuZ29iYmxlU3RyaW5nTGl0ZXJhbCgpO2Vsc2UgaWYoZT09PUUuT0JSQUNLX0NPREUpaT10aGlzLmdvYmJsZUFycmF5KCk7ZWxzZXtmb3Iobj10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgsRS5tYXhfdW5vcF9sZW4pLHI9bi5sZW5ndGg7cj4wOyl7aWYoRS51bmFyeV9vcHMuaGFzT3duUHJvcGVydHkobikmJighRS5pc0lkZW50aWZpZXJTdGFydCh0aGlzLmNvZGUpfHx0aGlzLmluZGV4K24ubGVuZ3RoPHRoaXMuZXhwci5sZW5ndGgmJiFFLmlzSWRlbnRpZmllclBhcnQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCtuLmxlbmd0aCkpKSl7dGhpcy5pbmRleCs9cjtjb25zdCBvPXRoaXMuZ29iYmxlVG9rZW4oKTtyZXR1cm4gb3x8dGhpcy50aHJvd0Vycm9yKCJtaXNzaW5nIHVuYXJ5T3AgYXJndW1lbnQiKSx0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIix7dHlwZTpFLlVOQVJZX0VYUCxvcGVyYXRvcjpuLGFyZ3VtZW50Om8scHJlZml4OiEwfSl9bj1uLnN1YnN0cigwLC0tcil9RS5pc0lkZW50aWZpZXJTdGFydChlKT8oaT10aGlzLmdvYmJsZUlkZW50aWZpZXIoKSxFLmxpdGVyYWxzLmhhc093blByb3BlcnR5KGkubmFtZSk/aT17dHlwZTpFLkxJVEVSQUwsdmFsdWU6RS5saXRlcmFsc1tpLm5hbWVdLHJhdzppLm5hbWV9OmkubmFtZT09PUUudGhpc19zdHImJihpPXt0eXBlOkUuVEhJU19FWFB9KSk6ZT09PUUuT1BBUkVOX0NPREUmJihpPXRoaXMuZ29iYmxlR3JvdXAoKSl9cmV0dXJuIGk/KGk9dGhpcy5nb2JibGVUb2tlblByb3BlcnR5KGkpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpKTp0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIiwhMSl9Z29iYmxlVG9rZW5Qcm9wZXJ0eShlKXt0aGlzLmdvYmJsZVNwYWNlcygpO2xldCBuPXRoaXMuY29kZTtmb3IoO249PT1FLlBFUklPRF9DT0RFfHxuPT09RS5PQlJBQ0tfQ09ERXx8bj09PUUuT1BBUkVOX0NPREV8fG49PT1FLlFVTUFSS19DT0RFOyl7bGV0IHI7aWYobj09PUUuUVVNQVJLX0NPREUpe2lmKHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrMSkhPT1FLlBFUklPRF9DT0RFKWJyZWFrO3I9ITAsdGhpcy5pbmRleCs9Mix0aGlzLmdvYmJsZVNwYWNlcygpLG49dGhpcy5jb2RlfXRoaXMuaW5kZXgrKyxuPT09RS5PQlJBQ0tfQ09ERT8oZT17dHlwZTpFLk1FTUJFUl9FWFAsY29tcHV0ZWQ6ITAsb2JqZWN0OmUscHJvcGVydHk6dGhpcy5nb2JibGVFeHByZXNzaW9uKCl9LHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PUUuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PUUuT1BBUkVOX0NPREU/ZT17dHlwZTpFLkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT1FLlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6RS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDtFLmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT1FLlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7RS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUsRS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT1FLlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PUUuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6RS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOkUuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2ZvcihFLmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLEUuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTpFLklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT1FLkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09RS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PUUuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT1FLkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT1FLkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoRS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09RS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOkUuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTpFLkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNCUkFDS19DT0RFKX19fWNvbnN0IElvPW5ldyBGbztPYmplY3QuYXNzaWduKEUse2hvb2tzOklvLHBsdWdpbnM6bmV3IHdvKEUpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiJiYiOjIsInwiOjMsIl4iOjQsIiYiOjUsIj09Ijo2LCIhPSI6NiwiPT09Ijo2LCIhPT0iOjYsIjwiOjcsIj4iOjcsIjw9Ijo3LCI+PSI6NywiPDwiOjgsIj4+Ijo4LCI+Pj4iOjgsIisiOjksIi0iOjksIioiOjEwLCIvIjoxMCwiJSI6MTB9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQsYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzOm5ldyBTZXQoWyIkIiwiXyJdKSxsaXRlcmFsczp7dHJ1ZTohMCxmYWxzZTohMSxudWxsOm51bGx9LHRoaXNfc3RyOiJ0aGlzIn0pLEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSxFLm1heF9iaW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS5iaW5hcnlfb3BzKTtjb25zdCBxdD10PT5uZXcgRSh0KS5wYXJzZSgpO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEUpLmZvckVhY2godD0+e3F0W3RdPT09dm9pZCAwJiZ0IT09InByb3RvdHlwZSImJihxdFt0XT1FW3RdKX0pLHF0LkpzZXA9RTtjb25zdCBObz0iQ29uZGl0aW9uYWxFeHByZXNzaW9uIjt2YXIgTW89e25hbWU6InRlcm5hcnkiLGluaXQodCl7dC5ob29rcy5hZGQoImFmdGVyLWV4cHJlc3Npb24iLGZ1bmN0aW9uKG4pe2lmKG4ubm9kZSYmdGhpcy5jb2RlPT09dC5RVU1BUktfQ09ERSl7dGhpcy5pbmRleCsrO2NvbnN0IHI9bi5ub2RlLGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7aWYoaXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIiksdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLmNvZGU9PT10LkNPTE9OX0NPREUpe3RoaXMuaW5kZXgrKztjb25zdCBvPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpO2lmKG98fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiIpLG4ubm9kZT17dHlwZTpObyx0ZXN0OnIsY29uc2VxdWVudDppLGFsdGVybmF0ZTpvfSxyLm9wZXJhdG9yJiZ0LmJpbmFyeV9vcHNbci5vcGVyYXRvcl08PS45KXtsZXQgcz1yO2Zvcig7cy5yaWdodC5vcGVyYXRvciYmdC5iaW5hcnlfb3BzW3MucmlnaHQub3BlcmF0b3JdPD0uOTspcz1zLnJpZ2h0O24ubm9kZS50ZXN0PXMucmlnaHQscy5yaWdodD1uLm5vZGUsbi5ub2RlPXJ9fWVsc2UgdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCA6Iil9fSl9fTtxdC5wbHVnaW5zLnJlZ2lzdGVyKE1vKTtmdW5jdGlvbiBrdCh0KXtpZih0PW0odCxtLkVNUFRZX09CSkVDVCksdGhpcy5fZWxsaXBzb2lkPW0odC5lbGxpcHNvaWQsai5XR1M4NCksdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1g9bSh0Lm51bWJlck9mTGV2ZWxaZXJvVGlsZXNYLDEpLHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNZPW0odC5udW1iZXJPZkxldmVsWmVyb1RpbGVzWSwxKSx0aGlzLl9wcm9qZWN0aW9uPW5ldyBBdCh0aGlzLl9lbGxpcHNvaWQpLHAodC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycykmJnAodC5yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycykpdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnM9dC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycyx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz10LnJlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzO2Vsc2V7Y29uc3Qgcj10aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cypNYXRoLlBJO3RoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzPW5ldyBBKC1yLC1yKSx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz1uZXcgQShyLHIpfWNvbnN0IGU9dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMpLG49dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMpO3RoaXMuX3JlY3RhbmdsZT1uZXcgSShlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLG4ubG9uZ2l0dWRlLG4ubGF0aXR1ZGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGt0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX0scmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdGFuZ2xlfX0scHJvamVjdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2plY3Rpb259fX0pLGt0LnByb3RvdHlwZS5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNYPDx0fSxrdC5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWTw8dH0sa3QucHJvdG90eXBlLnJlY3RhbmdsZVRvTmF0aXZlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9wcm9qZWN0aW9uLHI9bi5wcm9qZWN0KEkuc291dGh3ZXN0KHQpKSxpPW4ucHJvamVjdChJLm5vcnRoZWFzdCh0KSk7cmV0dXJuIHAoZSk/KGUud2VzdD1yLngsZS5zb3V0aD1yLnksZS5lYXN0PWkueCxlLm5vcnRoPWkueSxlKTpuZXcgSShyLngsci55LGkueCxpLnkpfSxrdC5wcm90b3R5cGUudGlsZVhZVG9OYXRpdmVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChuKSxvPXRoaXMuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsKG4pLHM9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLngtdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCkvaSx1PXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngrdCpzLGE9dGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCsodCsxKSpzLGw9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueSkvbyxkPXRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktZSpsLF89dGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS0oZSsxKSpsO3JldHVybiBwKHIpPyhyLndlc3Q9dSxyLnNvdXRoPV8sci5lYXN0PWEsci5ub3J0aD1kLHIpOm5ldyBJKHUsXyxhLGQpfSxrdC5wcm90b3R5cGUudGlsZVhZVG9SZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKHQsZSxuLHIpLG89dGhpcy5fcHJvamVjdGlvbixzPW8udW5wcm9qZWN0KG5ldyBBKGkud2VzdCxpLnNvdXRoKSksdT1vLnVucHJvamVjdChuZXcgQShpLmVhc3QsaS5ub3J0aCkpO3JldHVybiBpLndlc3Q9cy5sb25naXR1ZGUsaS5zb3V0aD1zLmxhdGl0dWRlLGkuZWFzdD11LmxvbmdpdHVkZSxpLm5vcnRoPXUubGF0aXR1ZGUsaX0sa3QucHJvdG90eXBlLnBvc2l0aW9uVG9UaWxlWFk9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9dGhpcy5fcmVjdGFuZ2xlO2lmKCFJLmNvbnRhaW5zKHIsdCkpcmV0dXJuO2NvbnN0IGk9dGhpcy5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWwoZSksbz10aGlzLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbChlKSx1PSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngpL2ksbD0odGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy55KS9vLF89dGhpcy5fcHJvamVjdGlvbi5wcm9qZWN0KHQpLE89Xy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngsYj10aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LV8ueTtsZXQgRj1PL3V8MDtGPj1pJiYoRj1pLTEpO2xldCBTPWIvbHwwO3JldHVybiBTPj1vJiYoUz1vLTEpLHAobik/KG4ueD1GLG4ueT1TLG4pOm5ldyBBKEYsUyl9O2Z1bmN0aW9uIGduKCl7dGhpcy5uYW1lPXZvaWQgMCx0aGlzLmRlc2NyaXB0aW9uPXZvaWQgMCx0aGlzLnBvc2l0aW9uPXZvaWQgMCx0aGlzLmRhdGE9dm9pZCAwLHRoaXMuaW1hZ2VyeUxheWVyPXZvaWQgMH1nbi5wcm90b3R5cGUuY29uZmlndXJlTmFtZUZyb21Qcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe2xldCBlPTEwLG47Zm9yKGNvbnN0IHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpJiZ0W3JdKXtjb25zdCBpPXIudG9Mb3dlckNhc2UoKTtlPjEmJmk9PT0ibmFtZSI/KGU9MSxuPXIpOmU+MiYmaT09PSJ0aXRsZSI/KGU9MixuPXIpOmU+MyYmL25hbWUvaS50ZXN0KHIpPyhlPTMsbj1yKTplPjQmJi90aXRsZS9pLnRlc3QocikmJihlPTQsbj1yKX1wKG4pJiYodGhpcy5uYW1lPXRbbl0pfSxnbi5wcm90b3R5cGUuY29uZmlndXJlRGVzY3JpcHRpb25Gcm9tUHJvcGVydGllcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe2xldCByPSc8dGFibGUgY2xhc3M9ImNlc2l1bS1pbmZvQm94LWRlZmF1bHRUYWJsZSI+Jztmb3IoY29uc3QgaSBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkoaSkpe2NvbnN0IG89bltpXTtwKG8pJiYodHlwZW9mIG89PSJvYmplY3QiP3IrPWA8dHI+PHRkPiR7aX08L3RkPjx0ZD4ke2Uobyl9PC90ZD48L3RyPmA6cis9YDx0cj48dGQ+JHtpfTwvdGQ+PHRkPiR7b308L3RkPjwvdHI+YCl9cmV0dXJuIHIrPSI8L3RhYmxlPiIscn10aGlzLmRlc2NyaXB0aW9uPWUodCl9O3ZhciBTcj1BZTtmdW5jdGlvbiBBZSh0LGUpe3RoaXMueD10LHRoaXMueT1lfUFlLnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFlKHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpfSxzdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpfSxtdWx0QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludCh0KX0sZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHQpfSxtdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQodCl9LGRpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYodCl9LHJvdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUodCl9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZUFyb3VuZCh0LGUpfSxtYXRNdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQodCl9LHVuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCl9LHBlcnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sbWFnOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55fSxkaXN0OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHQpKX0sZGlzdFNxcjpmdW5jdGlvbih0KXt2YXIgZT10LngtdGhpcy54LG49dC55LXRoaXMueTtyZXR1cm4gZSplK24qbn0sYW5nbGU6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksdGhpcy54KX0sYW5nbGVUbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnktdC55LHRoaXMueC10LngpfSxhbmdsZVdpdGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKHQueCx0LnkpfSxhbmdsZVdpdGhTZXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLngqZS10aGlzLnkqdCx0aGlzLngqdCt0aGlzLnkqZSl9LF9tYXRNdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0qdGhpcy54K3RbMV0qdGhpcy55LG49dFsyXSp0aGlzLngrdFszXSp0aGlzLnk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXN9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LF9zdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LF9tdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9LF9kaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sX211bHRCeVBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfSxfZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc30sX3VuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGl2KHRoaXMubWFnKCkpLHRoaXN9LF9wZXJwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55O3JldHVybiB0aGlzLnk9dGhpcy54LHRoaXMueD0tdCx0aGlzfSxfcm90YXRlOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCkscj1lKnRoaXMueC1uKnRoaXMueSxpPW4qdGhpcy54K2UqdGhpcy55O3JldHVybiB0aGlzLng9cix0aGlzLnk9aSx0aGlzfSxfcm90YXRlQXJvdW5kOmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5jb3ModCkscj1NYXRoLnNpbih0KSxpPWUueCtuKih0aGlzLngtZS54KS1yKih0aGlzLnktZS55KSxvPWUueStyKih0aGlzLngtZS54KStuKih0aGlzLnktZS55KTtyZXR1cm4gdGhpcy54PWksdGhpcy55PW8sdGhpc30sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfX0sQWUuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFlP3Q6QXJyYXkuaXNBcnJheSh0KT9uZXcgQWUodFswXSx0WzFdKTp0fTt2YXIgQ289U3IsbXI9VGU7ZnVuY3Rpb24gVGUodCxlLG4scixpKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9bix0aGlzLnR5cGU9MCx0aGlzLl9wYmY9dCx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPXIsdGhpcy5fdmFsdWVzPWksdC5yZWFkRmllbGRzKHZvLHRoaXMsZSl9ZnVuY3Rpb24gdm8odCxlLG4pe3Q9PTE/ZS5pZD1uLnJlYWRWYXJpbnQoKTp0PT0yP0RvKG4sZSk6dD09Mz9lLnR5cGU9bi5yZWFkVmFyaW50KCk6dD09NCYmKGUuX2dlb21ldHJ5PW4ucG9zKX1mdW5jdGlvbiBEbyh0LGUpe2Zvcih2YXIgbj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxuOyl7dmFyIHI9ZS5fa2V5c1t0LnJlYWRWYXJpbnQoKV0saT1lLl92YWx1ZXNbdC5yZWFkVmFyaW50KCldO2UucHJvcGVydGllc1tyXT1pfX1UZS50eXBlcz1bIlVua25vd24iLCJQb2ludCIsIkxpbmVTdHJpbmciLCJQb2x5Z29uIl0sVGUucHJvdG90eXBlLmxvYWRHZW9tZXRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BiZjt0LnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIGU9dC5yZWFkVmFyaW50KCkrdC5wb3Msbj0xLHI9MCxpPTAsbz0wLHM9W10sdTt0LnBvczxlOyl7aWYocjw9MCl7dmFyIGE9dC5yZWFkVmFyaW50KCk7bj1hJjcscj1hPj4zfWlmKHItLSxuPT09MXx8bj09PTIpaSs9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxuPT09MSYmKHUmJnMucHVzaCh1KSx1PVtdKSx1LnB1c2gobmV3IENvKGksbykpO2Vsc2UgaWYobj09PTcpdSYmdS5wdXNoKHVbMF0uY2xvbmUoKSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybiB1JiZzLnB1c2godSksc30sVGUucHJvdG90eXBlLmJib3g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYmY7dC5wb3M9dGhpcy5fZ2VvbWV0cnk7Zm9yKHZhciBlPXQucmVhZFZhcmludCgpK3QucG9zLG49MSxyPTAsaT0wLG89MCxzPTEvMCx1PS0xLzAsYT0xLzAsbD0tMS8wO3QucG9zPGU7KXtpZihyPD0wKXt2YXIgZD10LnJlYWRWYXJpbnQoKTtuPWQmNyxyPWQ+PjN9aWYoci0tLG49PT0xfHxuPT09MilpKz10LnJlYWRTVmFyaW50KCksbys9dC5yZWFkU1ZhcmludCgpLGk8cyYmKHM9aSksaT51JiYodT1pKSxvPGEmJihhPW8pLG8+bCYmKGw9byk7ZWxzZSBpZihuIT09Nyl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybltzLGEsdSxsXX0sVGUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5leHRlbnQqTWF0aC5wb3coMixuKSxpPXRoaXMuZXh0ZW50KnQsbz10aGlzLmV4dGVudCplLHM9dGhpcy5sb2FkR2VvbWV0cnkoKSx1PVRlLnR5cGVzW3RoaXMudHlwZV0sYSxsO2Z1bmN0aW9uIGQoYil7Zm9yKHZhciBGPTA7RjxiLmxlbmd0aDtGKyspe3ZhciBTPWJbRl0sTj0xODAtKFMueStvKSozNjAvcjtiW0ZdPVsoUy54K2kpKjM2MC9yLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAoTipNYXRoLlBJLzE4MCkpLTkwXX19c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSAxOnZhciBfPVtdO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspX1thXT1zW2FdWzBdO3M9XyxkKHMpO2JyZWFrO2Nhc2UgMjpmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKWQoc1thXSk7YnJlYWs7Y2FzZSAzOmZvcihzPUxvKHMpLGE9MDthPHMubGVuZ3RoO2ErKylmb3IobD0wO2w8c1thXS5sZW5ndGg7bCsrKWQoc1thXVtsXSk7YnJlYWt9cy5sZW5ndGg9PT0xP3M9c1swXTp1PSJNdWx0aSIrdTt2YXIgTz17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6dSxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOnRoaXMucHJvcGVydGllc307cmV0dXJuImlkImluIHRoaXMmJihPLmlkPXRoaXMuaWQpLE99O2Z1bmN0aW9uIExvKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTEpcmV0dXJuW3RdO2Zvcih2YXIgbj1bXSxyLGksbz0wO288ZTtvKyspe3ZhciBzPVBvKHRbb10pO3MhPT0wJiYoaT09PXZvaWQgMCYmKGk9czwwKSxpPT09czwwPyhyJiZuLnB1c2gocikscj1bdFtvXV0pOnIucHVzaCh0W29dKSl9cmV0dXJuIHImJm4ucHVzaChyKSxufWZ1bmN0aW9uIFBvKHQpe2Zvcih2YXIgZT0wLG49MCxyPXQubGVuZ3RoLGk9ci0xLG8scztuPHI7aT1uKyspbz10W25dLHM9dFtpXSxlKz0ocy54LW8ueCkqKG8ueStzLnkpO3JldHVybiBlfXZhciBCbz1tcixVbz1GcjtmdW5jdGlvbiBGcih0LGUpe3RoaXMudmVyc2lvbj0xLHRoaXMubmFtZT1udWxsLHRoaXMuZXh0ZW50PTQwOTYsdGhpcy5sZW5ndGg9MCx0aGlzLl9wYmY9dCx0aGlzLl9rZXlzPVtdLHRoaXMuX3ZhbHVlcz1bXSx0aGlzLl9mZWF0dXJlcz1bXSx0LnJlYWRGaWVsZHMoam8sdGhpcyxlKSx0aGlzLmxlbmd0aD10aGlzLl9mZWF0dXJlcy5sZW5ndGh9ZnVuY3Rpb24gam8odCxlLG4pe3Q9PT0xNT9lLnZlcnNpb249bi5yZWFkVmFyaW50KCk6dD09PTE/ZS5uYW1lPW4ucmVhZFN0cmluZygpOnQ9PT01P2UuZXh0ZW50PW4ucmVhZFZhcmludCgpOnQ9PT0yP2UuX2ZlYXR1cmVzLnB1c2gobi5wb3MpOnQ9PT0zP2UuX2tleXMucHVzaChuLnJlYWRTdHJpbmcoKSk6dD09PTQmJmUuX3ZhbHVlcy5wdXNoKEdvKG4pKX1mdW5jdGlvbiBHbyh0KXtmb3IodmFyIGU9bnVsbCxuPXQucmVhZFZhcmludCgpK3QucG9zO3QucG9zPG47KXt2YXIgcj10LnJlYWRWYXJpbnQoKT4+MztlPXI9PT0xP3QucmVhZFN0cmluZygpOnI9PT0yP3QucmVhZEZsb2F0KCk6cj09PTM/dC5yZWFkRG91YmxlKCk6cj09PTQ/dC5yZWFkVmFyaW50NjQoKTpyPT09NT90LnJlYWRWYXJpbnQoKTpyPT09Nj90LnJlYWRTVmFyaW50KCk6cj09PTc/dC5yZWFkQm9vbGVhbigpOm51bGx9cmV0dXJuIGV9RnIucHJvdG90eXBlLmZlYXR1cmU9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLl9mZWF0dXJlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW3RdO3ZhciBlPXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IEJvKHRoaXMuX3BiZixlLHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX07dmFyICRvPVVvLFZvPXpvO2Z1bmN0aW9uIHpvKHQsZSl7dGhpcy5sYXllcnM9dC5yZWFkRmllbGRzKFdvLHt9LGUpfWZ1bmN0aW9uIFdvKHQsZSxuKXtpZih0PT09Myl7dmFyIHI9bmV3ICRvKG4sbi5yZWFkVmFyaW50KCkrbi5wb3MpO3IubGVuZ3RoJiYoZVtyLm5hbWVdPXIpfX12YXIgWG89Vm8scmU9bXIsU249e307LyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9Tbi5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8scyx1PWkqOC1yLTEsYT0oMTw8dSktMSxsPWE+PjEsZD0tNyxfPW4/aS0xOjAsTz1uPy0xOjEsYj10W2UrX107Zm9yKF8rPU8sbz1iJigxPDwtZCktMSxiPj49LWQsZCs9dTtkPjA7bz1vKjI1Nit0W2UrX10sXys9TyxkLT04KTtmb3Iocz1vJigxPDwtZCktMSxvPj49LWQsZCs9cjtkPjA7cz1zKjI1Nit0W2UrX10sXys9TyxkLT04KTtpZihvPT09MClvPTEtbDtlbHNle2lmKG89PT1hKXJldHVybiBzP05hTjooYj8tMToxKSooMS8wKTtzPXMrTWF0aC5wb3coMixyKSxvPW8tbH1yZXR1cm4oYj8tMToxKSpzKk1hdGgucG93KDIsby1yKX0sU24ud3JpdGU9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBzLHUsYSxsPW8qOC1pLTEsZD0oMTw8bCktMSxfPWQ+PjEsTz1pPT09MjM/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGI9cj8wOm8tMSxGPXI/MTotMSxTPWU8MHx8ZT09PTAmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8odT1pc05hTihlKT8xOjAscz1kKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKihhPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGEqPTIpLHMrXz49MT9lKz1PL2E6ZSs9TypNYXRoLnBvdygyLDEtXyksZSphPj0yJiYocysrLGEvPTIpLHMrXz49ZD8odT0wLHM9ZCk6cytfPj0xPyh1PShlKmEtMSkqTWF0aC5wb3coMixpKSxzPXMrXyk6KHU9ZSpNYXRoLnBvdygyLF8tMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O3RbbitiXT11JjI1NSxiKz1GLHUvPTI1NixpLT04KTtmb3Iocz1zPDxpfHUsbCs9aTtsPjA7dFtuK2JdPXMmMjU1LGIrPUYscy89MjU2LGwtPTgpO3RbbitiLUZdfD1TKjEyOH07dmFyIEhvPXosdG49U247ZnVuY3Rpb24geih0KXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcmJkFycmF5QnVmZmVyLmlzVmlldyh0KT90Om5ldyBVaW50OEFycmF5KHR8fDApLHRoaXMucG9zPTAsdGhpcy50eXBlPTAsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofXouVmFyaW50PTAsei5GaXhlZDY0PTEsei5CeXRlcz0yLHouRml4ZWQzMj01O3ZhciBtbj0oMTw8MTYpKigxPDwxNiksd3I9MS9tbixxbz0xMixJcj10eXBlb2YgVGV4dERlY29kZXI+InUiP251bGw6bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik7ei5wcm90b3R5cGU9e2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmJ1Zj1udWxsfSxyZWFkRmllbGRzOmZ1bmN0aW9uKHQsZSxuKXtmb3Iobj1ufHx0aGlzLmxlbmd0aDt0aGlzLnBvczxuOyl7dmFyIHI9dGhpcy5yZWFkVmFyaW50KCksaT1yPj4zLG89dGhpcy5wb3M7dGhpcy50eXBlPXImNyx0KGksZSx0aGlzKSx0aGlzLnBvcz09PW8mJnRoaXMuc2tpcChyKX1yZXR1cm4gZX0scmVhZE1lc3NhZ2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWFkRmllbGRzKHQsZSx0aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyl9LHJlYWRGaXhlZDMyOmZ1bmN0aW9uKCl7dmFyIHQ9ZW4odGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD1Ncih0aGlzLmJ1Zix0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9ZW4odGhpcy5idWYsdGhpcy5wb3MpK2VuKHRoaXMuYnVmLHRoaXMucG9zKzQpKm1uO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkU0ZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD1lbih0aGlzLmJ1Zix0aGlzLnBvcykrTXIodGhpcy5idWYsdGhpcy5wb3MrNCkqbW47cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRGbG9hdDpmdW5jdGlvbigpe3ZhciB0PXRuLnJlYWQodGhpcy5idWYsdGhpcy5wb3MsITAsMjMsNCk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD10bi5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDUyLDgpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYnVmLG4scjtyZXR1cm4gcj1lW3RoaXMucG9zKytdLG49ciYxMjcscjwxMjh8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8NyxyPDEyOCl8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8MTQscjwxMjgpfHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDIxLHI8MTI4KT9uOihyPWVbdGhpcy5wb3NdLG58PShyJjE1KTw8Mjgsa28obix0LHRoaXMpKX0scmVhZFZhcmludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFZhcmludCghMCl9LHJlYWRTVmFyaW50OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVmFyaW50KCk7cmV0dXJuIHQlMj09PTE/KHQrMSkvLTI6dC8yfSxyZWFkQm9vbGVhbjpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKX0scmVhZFN0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5wb3M7cmV0dXJuIHRoaXMucG9zPXQsdC1lPj1xbyYmSXI/dXModGhpcy5idWYsZSx0KTphcyh0aGlzLmJ1ZixlLHQpfSxyZWFkQnl0ZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxlPXRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGV9LHJlYWRQYWNrZWRWYXJpbnQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTt2YXIgbj1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxuOyl0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTtyZXR1cm4gdH0scmVhZFBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PXouQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gdH0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PXouQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3JldHVybiB0fSxyZWFkUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ei5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT16LkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7dmFyIGU9V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiB0fSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBlPXQmNztpZihlPT09ei5WYXJpbnQpZm9yKDt0aGlzLmJ1Zlt0aGlzLnBvcysrXT4xMjc7KTtlbHNlIGlmKGU9PT16LkJ5dGVzKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYoZT09PXouRml4ZWQzMil0aGlzLnBvcys9NDtlbHNlIGlmKGU9PT16LkZpeGVkNjQpdGhpcy5wb3MrPTg7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuaW1wbGVtZW50ZWQgdHlwZTogIitlKX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8ZSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGVuZ3RofHwxNjtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXt2YXIgbj1uZXcgVWludDhBcnJheShlKTtuLnNldCh0aGlzLmJ1ZiksdGhpcy5idWY9bix0aGlzLmxlbmd0aD1lfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc3ViYXJyYXkoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCkseGUodGhpcy5idWYsdCx0aGlzLnBvcyksdGhpcy5wb3MrPTR9LHdyaXRlU0ZpeGVkMzI6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLHhlKHRoaXMuYnVmLHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlVmFyaW50OmZ1bmN0aW9uKHQpe2lmKHQ9K3R8fDAsdD4yNjg0MzU0NTV8fHQ8MCl7WW8odCx0aGlzKTtyZXR1cm59dGhpcy5yZWFsbG9jKDQpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjcmMTI3KSkpfSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCh0PDA/LXQqMi0xOnQqMil9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KSx0aGlzLnJlYWxsb2ModC5sZW5ndGgqNCksdGhpcy5wb3MrKzt2YXIgZT10aGlzLnBvczt0aGlzLnBvcz1jcyh0aGlzLmJ1Zix0LHRoaXMucG9zKTt2YXIgbj10aGlzLnBvcy1lO24+PTEyOCYmTnIoZSxuLHRoaXMpLHRoaXMucG9zPWUtMSx0aGlzLndyaXRlVmFyaW50KG4pLHRoaXMucG9zKz1ufSx3cml0ZUZsb2F0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg0KSx0bi53cml0ZSh0aGlzLmJ1Zix0LHRoaXMucG9zLCEwLDIzLDQpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksdG4ud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCw1Miw4KSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGUpLHRoaXMucmVhbGxvYyhlKTtmb3IodmFyIG49MDtuPGU7bisrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbbl19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGUpe3RoaXMucG9zKys7dmFyIG49dGhpcy5wb3M7dChlLHRoaXMpO3ZhciByPXRoaXMucG9zLW47cj49MTI4JiZOcihuLHIsdGhpcyksdGhpcy5wb3M9bi0xLHRoaXMud3JpdGVWYXJpbnQociksdGhpcy5wb3MrPXJ9LHdyaXRlTWVzc2FnZTpmdW5jdGlvbih0LGUsbil7dGhpcy53cml0ZVRhZyh0LHouQnl0ZXMpLHRoaXMud3JpdGVSYXdNZXNzYWdlKGUsbil9LHdyaXRlUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsUW8sZSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LEpvLGUpfSx3cml0ZVBhY2tlZEJvb2xlYW46ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxucyxlKX0sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHRzLGUpfSx3cml0ZVBhY2tlZERvdWJsZTpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGVzLGUpfSx3cml0ZVBhY2tlZEZpeGVkMzI6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxycyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGlzLGUpfSx3cml0ZVBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxvcyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHNzLGUpfSx3cml0ZUJ5dGVzRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5CeXRlcyksdGhpcy53cml0ZUJ5dGVzKGUpfSx3cml0ZUZpeGVkMzJGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGUpfSx3cml0ZVNGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5GaXhlZDMyKSx0aGlzLndyaXRlU0ZpeGVkMzIoZSl9LHdyaXRlRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LHouRml4ZWQ2NCksdGhpcy53cml0ZUZpeGVkNjQoZSl9LHdyaXRlU0ZpeGVkNjRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChlKX0sd3JpdGVWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LlZhcmludCksdGhpcy53cml0ZVZhcmludChlKX0sd3JpdGVTVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsei5WYXJpbnQpLHRoaXMud3JpdGVTVmFyaW50KGUpfSx3cml0ZVN0cmluZ0ZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LHouQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoZSl9LHdyaXRlRmxvYXRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkMzIpLHRoaXMud3JpdGVGbG9hdChlKX0sd3JpdGVEb3VibGVGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCx6LkZpeGVkNjQpLHRoaXMud3JpdGVEb3VibGUoZSl9LHdyaXRlQm9vbGVhbkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVZhcmludEZpZWxkKHQsQm9vbGVhbihlKSl9fTtmdW5jdGlvbiBrbyh0LGUsbil7dmFyIHI9bi5idWYsaSxvO2lmKG89cltuLnBvcysrXSxpPShvJjExMik+PjQsbzwxMjh8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MyxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MTAsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDE3LG88MTI4KXx8KG89cltuLnBvcysrXSxpfD0obyYxMjcpPDwyNCxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMSk8PDMxLG88MTI4KSlyZXR1cm4gUmUodCxpLGUpO3Rocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMiKX1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gdC50eXBlPT09ei5CeXRlcz90LnJlYWRWYXJpbnQoKSt0LnBvczp0LnBvcysxfWZ1bmN0aW9uIFJlKHQsZSxuKXtyZXR1cm4gbj9lKjQyOTQ5NjcyOTYrKHQ+Pj4wKTooZT4+PjApKjQyOTQ5NjcyOTYrKHQ+Pj4wKX1mdW5jdGlvbiBZbyh0LGUpe3ZhciBuLHI7aWYodD49MD8obj10JTQyOTQ5NjcyOTZ8MCxyPXQvNDI5NDk2NzI5NnwwKToobj1+KC10JTQyOTQ5NjcyOTYpLHI9figtdC80Mjk0OTY3Mjk2KSxuXjQyOTQ5NjcyOTU/bj1uKzF8MDoobj0wLHI9cisxfDApKSx0Pj0xODQ0Njc0NDA3MzcwOTU1MmUzfHx0PC0xODQ0Njc0NDA3MzcwOTU1MmUzKXRocm93IG5ldyBFcnJvcigiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXMiKTtlLnJlYWxsb2MoMTApLEtvKG4scixlKSxabyhyLGUpfWZ1bmN0aW9uIEtvKHQsZSxuKXtuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zKytdPXQmMTI3fDEyOCx0Pj4+PTcsbi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zXT10JjEyN31mdW5jdGlvbiBabyh0LGUpe3ZhciBuPSh0JjcpPDw0O2UuYnVmW2UucG9zKytdfD1ufCgodD4+Pj0zKT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3KSkpKSl9ZnVuY3Rpb24gTnIodCxlLG4pe3ZhciByPWU8PTE2MzgzPzE6ZTw9MjA5NzE1MT8yOmU8PTI2ODQzNTQ1NT8zOk1hdGguZmxvb3IoTWF0aC5sb2coZSkvKE1hdGguTE4yKjcpKTtuLnJlYWxsb2Mocik7Zm9yKHZhciBpPW4ucG9zLTE7aT49dDtpLS0pbi5idWZbaStyXT1uLmJ1ZltpXX1mdW5jdGlvbiBRbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVWYXJpbnQodFtuXSl9ZnVuY3Rpb24gSm8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU1ZhcmludCh0W25dKX1mdW5jdGlvbiB0cyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGbG9hdCh0W25dKX1mdW5jdGlvbiBlcyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVEb3VibGUodFtuXSl9ZnVuY3Rpb24gbnModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlQm9vbGVhbih0W25dKX1mdW5jdGlvbiBycyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIGlzKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIG9zKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZUZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gc3ModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU0ZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gZW4odCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrdFtlKzNdKjE2Nzc3MjE2fWZ1bmN0aW9uIHhlKHQsZSxuKXt0W25dPWUsdFtuKzFdPWU+Pj44LHRbbisyXT1lPj4+MTYsdFtuKzNdPWU+Pj4yNH1mdW5jdGlvbiBNcih0LGUpe3JldHVybih0W2VdfHRbZSsxXTw8OHx0W2UrMl08PDE2KSsodFtlKzNdPDwyNCl9ZnVuY3Rpb24gYXModCxlLG4pe2Zvcih2YXIgcj0iIixpPWU7aTxuOyl7dmFyIG89dFtpXSxzPW51bGwsdT1vPjIzOT80Om8+MjIzPzM6bz4xOTE/MjoxO2lmKGkrdT5uKWJyZWFrO3ZhciBhLGwsZDt1PT09MT9vPDEyOCYmKHM9byk6dT09PTI/KGE9dFtpKzFdLChhJjE5Mik9PT0xMjgmJihzPShvJjMxKTw8NnxhJjYzLHM8PTEyNyYmKHM9bnVsbCkpKTp1PT09Mz8oYT10W2krMV0sbD10W2krMl0sKGEmMTkyKT09PTEyOCYmKGwmMTkyKT09PTEyOCYmKHM9KG8mMTUpPDwxMnwoYSY2Myk8PDZ8bCY2Mywoczw9MjA0N3x8cz49NTUyOTYmJnM8PTU3MzQzKSYmKHM9bnVsbCkpKTp1PT09NCYmKGE9dFtpKzFdLGw9dFtpKzJdLGQ9dFtpKzNdLChhJjE5Mik9PT0xMjgmJihsJjE5Mik9PT0xMjgmJihkJjE5Mik9PT0xMjgmJihzPShvJjE1KTw8MTh8KGEmNjMpPDwxMnwobCY2Myk8PDZ8ZCY2Mywoczw9NjU1MzV8fHM+PTExMTQxMTIpJiYocz1udWxsKSkpLHM9PT1udWxsPyhzPTY1NTMzLHU9MSk6cz42NTUzNSYmKHMtPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUocz4+PjEwJjEwMjN8NTUyOTYpLHM9NTYzMjB8cyYxMDIzKSxyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpLGkrPXV9cmV0dXJuIHJ9ZnVuY3Rpb24gdXModCxlLG4pe3JldHVybiBJci5kZWNvZGUodC5zdWJhcnJheShlLG4pKX1mdW5jdGlvbiBjcyh0LGUsbil7Zm9yKHZhciByPTAsaSxvO3I8ZS5sZW5ndGg7cisrKXtpZihpPWUuY2hhckNvZGVBdChyKSxpPjU1Mjk1JiZpPDU3MzQ0KWlmKG8paWYoaTw1NjMyMCl7dFtuKytdPTIzOSx0W24rK109MTkxLHRbbisrXT0xODksbz1pO2NvbnRpbnVlfWVsc2UgaT1vLTU1Mjk2PDwxMHxpLTU2MzIwfDY1NTM2LG89bnVsbDtlbHNle2k+NTYzMTl8fHIrMT09PWUubGVuZ3RoPyh0W24rK109MjM5LHRbbisrXT0xOTEsdFtuKytdPTE4OSk6bz1pO2NvbnRpbnVlfWVsc2UgbyYmKHRbbisrXT0yMzksdFtuKytdPTE5MSx0W24rK109MTg5LG89bnVsbCk7aTwxMjg/dFtuKytdPWk6KGk8MjA0OD90W24rK109aT4+NnwxOTI6KGk8NjU1MzY/dFtuKytdPWk+PjEyfDIyNDoodFtuKytdPWk+PjE4fDI0MCx0W24rK109aT4+MTImNjN8MTI4KSx0W24rK109aT4+NiY2M3wxMjgpLHRbbisrXT1pJjYzfDEyOCl9cmV0dXJuIG59dmFyIGhzPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxDcj1ocyxmcz10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGxzPUNyfHxmc3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxVdD1scyxkcz1VdC5TeW1ib2wsanQ9ZHMsdnI9T2JqZWN0LnByb3RvdHlwZSxFcz12ci5oYXNPd25Qcm9wZXJ0eSxfcz12ci50b1N0cmluZyx2ZT1qdD9qdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gcHModCl7dmFyIGU9RXMuY2FsbCh0LHZlKSxuPXRbdmVdO3RyeXt0W3ZlXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBpPV9zLmNhbGwodCk7cmV0dXJuIHImJihlP3RbdmVdPW46ZGVsZXRlIHRbdmVdKSxpfXZhciB5cz1PYmplY3QucHJvdG90eXBlLEFzPXlzLnRvU3RyaW5nO2Z1bmN0aW9uIFRzKHQpe3JldHVybiBBcy5jYWxsKHQpfXZhciBScz0iW29iamVjdCBOdWxsXSIseHM9IltvYmplY3QgVW5kZWZpbmVkXSIsRHI9anQ/anQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIE9lKHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/eHM6UnM6RHImJkRyIGluIE9iamVjdCh0KT9wcyh0KTpUcyh0KX1mdW5jdGlvbiBiZSh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBPcz0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBGbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxiZSh0KSYmT2UodCk9PU9zfWZ1bmN0aW9uIGJzKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9QXJyYXkocik7KytuPHI7KWlbbl09ZSh0W25dLG4sdCk7cmV0dXJuIGl9dmFyIGdzPUFycmF5LmlzQXJyYXksWXQ9Z3MsU3M9MS8wLExyPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsUHI9THI/THIudG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIEJyKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdDtpZihZdCh0KSlyZXR1cm4gYnModCxCcikrIiI7aWYoRm4odCkpcmV0dXJuIFByP1ByLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4gZT09IjAiJiYxL3Q9PS1Tcz8iLTAiOmV9ZnVuY3Rpb24gaWUodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihlPT0ib2JqZWN0Inx8ZT09ImZ1bmN0aW9uIil9ZnVuY3Rpb24gbXModCl7cmV0dXJuIHR9dmFyIEZzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIix3cz0iW29iamVjdCBGdW5jdGlvbl0iLElzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsTnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBVcih0KXtpZighaWUodCkpcmV0dXJuITE7dmFyIGU9T2UodCk7cmV0dXJuIGU9PXdzfHxlPT1Jc3x8ZT09RnN8fGU9PU5zfXZhciBNcz1VdFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sd249TXMsanI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKHduJiZ3bi5rZXlzJiZ3bi5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIENzKHQpe3JldHVybiEhanImJmpyIGluIHR9dmFyIHZzPUZ1bmN0aW9uLnByb3RvdHlwZSxEcz12cy50b1N0cmluZztmdW5jdGlvbiBvZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIERzLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBMcz0vW1xcXiQuKis/KClbXF17fXxdL2csUHM9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sQnM9RnVuY3Rpb24ucHJvdG90eXBlLFVzPU9iamVjdC5wcm90b3R5cGUsanM9QnMudG9TdHJpbmcsR3M9VXMuaGFzT3duUHJvcGVydHksJHM9UmVnRXhwKCJeIitqcy5jYWxsKEdzKS5yZXBsYWNlKExzLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIFZzKHQpe2lmKCFpZSh0KXx8Q3ModCkpcmV0dXJuITE7dmFyIGU9VXIodCk/JHM6UHM7cmV0dXJuIGUudGVzdChvZSh0KSl9ZnVuY3Rpb24genModCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBzZSh0LGUpe3ZhciBuPXpzKHQsZSk7cmV0dXJuIFZzKG4pP246dm9pZCAwfXZhciBXcz1zZShVdCwiV2Vha01hcCIpLEluPVdzLEdyPU9iamVjdC5jcmVhdGUsWHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighaWUoZSkpcmV0dXJue307aWYoR3IpcmV0dXJuIEdyKGUpO3QucHJvdG90eXBlPWU7dmFyIG49bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxufX0oKSxIcz1YcztmdW5jdGlvbiBxcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIGtzKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9QXJyYXkocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9dmFyIFlzPTgwMCxLcz0xNixacz1EYXRlLm5vdztmdW5jdGlvbiBRcyh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1acygpLGk9S3MtKHItbik7aWYobj1yLGk+MCl7aWYoKytlPj1ZcylyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBKcyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIHRhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXNlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpLG5uPXRhLGVhPW5uP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIG5uKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6SnMoZSksd3JpdGFibGU6ITB9KX06bXMsbmE9ZWEscmE9UXMobmEpLGlhPXJhO2Z1bmN0aW9uIG9hKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoOysrbjxyJiZlKHRbbl0sbix0KSE9PSExOyk7cmV0dXJuIHR9dmFyIHNhPTkwMDcxOTkyNTQ3NDA5OTEsYWE9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIE5uKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuIGU9ZT8/c2EsISFlJiYobj09Im51bWJlciJ8fG4hPSJzeW1ib2wiJiZhYS50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9ZnVuY3Rpb24gJHIodCxlLG4pe2U9PSJfX3Byb3RvX18iJiZubj9ubih0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gVnIodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgdWE9T2JqZWN0LnByb3RvdHlwZSxjYT11YS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBNbih0LGUsbil7dmFyIHI9dFtlXTsoIShjYS5jYWxsKHQsZSkmJlZyKHIsbikpfHxuPT09dm9pZCAwJiYhKGUgaW4gdCkpJiYkcih0LGUsbil9ZnVuY3Rpb24gcm4odCxlLG4scil7dmFyIGk9IW47bnx8KG49e30pO2Zvcih2YXIgbz0tMSxzPWUubGVuZ3RoOysrbzxzOyl7dmFyIHU9ZVtvXSxhPXI/cihuW3VdLHRbdV0sdSxuLHQpOnZvaWQgMDthPT09dm9pZCAwJiYoYT10W3VdKSxpPyRyKG4sdSxhKTpNbihuLHUsYSl9cmV0dXJuIG59dmFyIHpyPU1hdGgubWF4O2Z1bmN0aW9uIGhhKHQsZSxuKXtyZXR1cm4gZT16cihlPT09dm9pZCAwP3QubGVuZ3RoLTE6ZSwwKSxmdW5jdGlvbigpe2Zvcih2YXIgcj1hcmd1bWVudHMsaT0tMSxvPXpyKHIubGVuZ3RoLWUsMCkscz1BcnJheShvKTsrK2k8bzspc1tpXT1yW2UraV07aT0tMTtmb3IodmFyIHU9QXJyYXkoZSsxKTsrK2k8ZTspdVtpXT1yW2ldO3JldHVybiB1W2VdPW4ocykscXModCx0aGlzLHUpfX12YXIgZmE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBDbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PWZhfWZ1bmN0aW9uIFdyKHQpe3JldHVybiB0IT1udWxsJiZDbih0Lmxlbmd0aCkmJiFVcih0KX12YXIgbGE9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiB2bih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yLG49dHlwZW9mIGU9PSJmdW5jdGlvbiImJmUucHJvdG90eXBlfHxsYTtyZXR1cm4gdD09PW59ZnVuY3Rpb24gZGEodCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfXZhciBFYT0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBYcih0KXtyZXR1cm4gYmUodCkmJk9lKHQpPT1FYX12YXIgSHI9T2JqZWN0LnByb3RvdHlwZSxfYT1Ici5oYXNPd25Qcm9wZXJ0eSxwYT1Ici5wcm9wZXJ0eUlzRW51bWVyYWJsZSx5YT1YcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1hyOmZ1bmN0aW9uKHQpe3JldHVybiBiZSh0KSYmX2EuY2FsbCh0LCJjYWxsZWUiKSYmIXBhLmNhbGwodCwiY2FsbGVlIil9LERuPXlhO2Z1bmN0aW9uIEFhKCl7cmV0dXJuITF9dmFyIHFyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsa3I9cXImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxUYT1rciYma3IuZXhwb3J0cz09PXFyLFlyPVRhP1V0LkJ1ZmZlcjp2b2lkIDAsUmE9WXI/WXIuaXNCdWZmZXI6dm9pZCAwLHhhPVJhfHxBYSxLcj14YSxPYT0iW29iamVjdCBBcmd1bWVudHNdIixiYT0iW29iamVjdCBBcnJheV0iLGdhPSJbb2JqZWN0IEJvb2xlYW5dIixTYT0iW29iamVjdCBEYXRlXSIsbWE9IltvYmplY3QgRXJyb3JdIixGYT0iW29iamVjdCBGdW5jdGlvbl0iLHdhPSJbb2JqZWN0IE1hcF0iLElhPSJbb2JqZWN0IE51bWJlcl0iLE5hPSJbb2JqZWN0IE9iamVjdF0iLE1hPSJbb2JqZWN0IFJlZ0V4cF0iLENhPSJbb2JqZWN0IFNldF0iLHZhPSJbb2JqZWN0IFN0cmluZ10iLERhPSJbb2JqZWN0IFdlYWtNYXBdIixMYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLFBhPSJbb2JqZWN0IERhdGFWaWV3XSIsQmE9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsVWE9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsamE9IltvYmplY3QgSW50OEFycmF5XSIsR2E9IltvYmplY3QgSW50MTZBcnJheV0iLCRhPSJbb2JqZWN0IEludDMyQXJyYXldIixWYT0iW29iamVjdCBVaW50OEFycmF5XSIsemE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixXYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFhhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsUT17fTtRW0JhXT1RW1VhXT1RW2phXT1RW0dhXT1RWyRhXT1RW1ZhXT1RW3phXT1RW1dhXT1RW1hhXT0hMCxRW09hXT1RW2JhXT1RW0xhXT1RW2dhXT1RW1BhXT1RW1NhXT1RW21hXT1RW0ZhXT1RW3dhXT1RW0lhXT1RW05hXT1RW01hXT1RW0NhXT1RW3ZhXT1RW0RhXT0hMTtmdW5jdGlvbiBIYSh0KXtyZXR1cm4gYmUodCkmJkNuKHQubGVuZ3RoKSYmISFRW09lKHQpXX1mdW5jdGlvbiBMbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBacj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVpyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUscWE9RGUmJkRlLmV4cG9ydHM9PT1acixQbj1xYSYmQ3IucHJvY2VzcyxrYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxQbiYmUG4uYmluZGluZyYmUG4uYmluZGluZygidXRpbCIpfWNhdGNoe319KCksZ2U9a2EsUXI9Z2UmJmdlLmlzVHlwZWRBcnJheSxZYT1Rcj9MbihRcik6SGEsS2E9WWEsWmE9T2JqZWN0LnByb3RvdHlwZSxRYT1aYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBKcih0LGUpe3ZhciBuPVl0KHQpLHI9IW4mJkRuKHQpLGk9IW4mJiFyJiZLcih0KSxvPSFuJiYhciYmIWkmJkthKHQpLHM9bnx8cnx8aXx8byx1PXM/ZGEodC5sZW5ndGgsU3RyaW5nKTpbXSxhPXUubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShlfHxRYS5jYWxsKHQsbCkpJiYhKHMmJihsPT0ibGVuZ3RoInx8aSYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fG8mJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxObihsLGEpKSkmJnUucHVzaChsKTtyZXR1cm4gdX1mdW5jdGlvbiB0aSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19dmFyIEphPXRpKE9iamVjdC5rZXlzLE9iamVjdCksdHU9SmEsZXU9T2JqZWN0LnByb3RvdHlwZSxudT1ldS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBydSh0KXtpZighdm4odCkpcmV0dXJuIHR1KHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpbnUuY2FsbCh0LG4pJiZuIT0iY29uc3RydWN0b3IiJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIFdyKHQpP0pyKHQpOnJ1KHQpfWZ1bmN0aW9uIGl1KHQpe3ZhciBlPVtdO2lmKHQhPW51bGwpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9dmFyIG91PU9iamVjdC5wcm90b3R5cGUsc3U9b3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gYXUodCl7aWYoIWllKHQpKXJldHVybiBpdSh0KTt2YXIgZT12bih0KSxuPVtdO2Zvcih2YXIgciBpbiB0KXI9PSJjb25zdHJ1Y3RvciImJihlfHwhc3UuY2FsbCh0LHIpKXx8bi5wdXNoKHIpO3JldHVybiBufWZ1bmN0aW9uIFVuKHQpe3JldHVybiBXcih0KT9Kcih0LCEwKTphdSh0KX12YXIgdXU9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sY3U9L15cdyokLztmdW5jdGlvbiBodSh0LGUpe2lmKFl0KHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8Rm4odCk/ITA6Y3UudGVzdCh0KXx8IXV1LnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBmdT1zZShPYmplY3QsImNyZWF0ZSIpLExlPWZ1O2Z1bmN0aW9uIGx1KCl7dGhpcy5fX2RhdGFfXz1MZT9MZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBkdSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgRXU9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLF91PU9iamVjdC5wcm90b3R5cGUscHU9X3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24geXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihMZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PUV1P3ZvaWQgMDpufXJldHVybiBwdS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIEF1PU9iamVjdC5wcm90b3R5cGUsVHU9QXUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUnUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gTGU/ZVt0XSE9PXZvaWQgMDpUdS5jYWxsKGUsdCl9dmFyIHh1PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBPdSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09TGUmJmU9PT12b2lkIDA/eHU6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1sdSxhZS5wcm90b3R5cGUuZGVsZXRlPWR1LGFlLnByb3RvdHlwZS5nZXQ9eXUsYWUucHJvdG90eXBlLmhhcz1SdSxhZS5wcm90b3R5cGUuc2V0PU91O2Z1bmN0aW9uIGJ1KCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFZyKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIGd1PUFycmF5LnByb3RvdHlwZSxTdT1ndS5zcGxpY2U7ZnVuY3Rpb24gbXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPW9uKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpTdS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBGdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49b24oZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIHd1KHQpe3JldHVybiBvbih0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIEl1KHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPW9uKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gWHQodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19WHQucHJvdG90eXBlLmNsZWFyPWJ1LFh0LnByb3RvdHlwZS5kZWxldGU9bXUsWHQucHJvdG90eXBlLmdldD1GdSxYdC5wcm90b3R5cGUuaGFzPXd1LFh0LnByb3RvdHlwZS5zZXQ9SXU7dmFyIE51PXNlKFV0LCJNYXAiKSxQZT1OdTtmdW5jdGlvbiBNdSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoUGV8fFh0KSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiBDdSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBzbih0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIEN1KGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gdnUodCl7dmFyIGU9c24odGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBEdSh0KXtyZXR1cm4gc24odGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gTHUodCl7cmV0dXJuIHNuKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIFB1KHQsZSl7dmFyIG49c24odGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBLdCh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1LdC5wcm90b3R5cGUuY2xlYXI9TXUsS3QucHJvdG90eXBlLmRlbGV0ZT12dSxLdC5wcm90b3R5cGUuZ2V0PUR1LEt0LnByb3RvdHlwZS5oYXM9THUsS3QucHJvdG90eXBlLnNldD1QdTt2YXIgQnU9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIGpuKHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoQnUpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiBuLmNhY2hlPW5ldyhqbi5DYWNoZXx8S3QpLG59am4uQ2FjaGU9S3Q7dmFyIFV1PTUwMDtmdW5jdGlvbiBqdSh0KXt2YXIgZT1qbih0LGZ1bmN0aW9uKHIpe3JldHVybiBuLnNpemU9PT1VdSYmbi5jbGVhcigpLHJ9KSxuPWUuY2FjaGU7cmV0dXJuIGV9dmFyIEd1PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLCR1PS9cXChcXCk/L2csVnU9anUoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHQuY2hhckNvZGVBdCgwKT09PTQ2JiZlLnB1c2goIiIpLHQucmVwbGFjZShHdSxmdW5jdGlvbihuLHIsaSxvKXtlLnB1c2goaT9vLnJlcGxhY2UoJHUsIiQxIik6cnx8bil9KSxlfSksenU9VnU7ZnVuY3Rpb24gV3UodCl7cmV0dXJuIHQ9PW51bGw/IiI6QnIodCl9ZnVuY3Rpb24gYW4odCxlKXtyZXR1cm4gWXQodCk/dDpodSh0LGUpP1t0XTp6dShXdSh0KSl9dmFyIFh1PTEvMDtmdW5jdGlvbiBHbih0KXtpZih0eXBlb2YgdD09InN0cmluZyJ8fEZuKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIGU9PSIwIiYmMS90PT0tWHU/Ii0wIjplfWZ1bmN0aW9uIEh1KHQsZSl7ZT1hbihlLHQpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7dCE9bnVsbCYmbjxyOyl0PXRbR24oZVtuKytdKV07cmV0dXJuIG4mJm49PXI/dDp2b2lkIDB9ZnVuY3Rpb24gJG4odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH12YXIgZWk9anQ/anQuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMDtmdW5jdGlvbiBxdSh0KXtyZXR1cm4gWXQodCl8fERuKHQpfHwhIShlaSYmdCYmdFtlaV0pfWZ1bmN0aW9uIG5pKHQsZSxuLHIsaSl7dmFyIG89LTEscz10Lmxlbmd0aDtmb3Iobnx8KG49cXUpLGl8fChpPVtdKTsrK288czspe3ZhciB1PXRbb107ZT4wJiZuKHUpP2U+MT9uaSh1LGUtMSxuLHIsaSk6JG4oaSx1KTpyfHwoaVtpLmxlbmd0aF09dSl9cmV0dXJuIGl9ZnVuY3Rpb24ga3UodCl7dmFyIGU9dD09bnVsbD8wOnQubGVuZ3RoO3JldHVybiBlP25pKHQsMSk6W119ZnVuY3Rpb24gWXUodCl7cmV0dXJuIGlhKGhhKHQsdm9pZCAwLGt1KSx0KyIiKX12YXIgS3U9dGkoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCkscmk9S3U7ZnVuY3Rpb24gWnUoKXt0aGlzLl9fZGF0YV9fPW5ldyBYdCx0aGlzLnNpemU9MH1mdW5jdGlvbiBRdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn1mdW5jdGlvbiBKdSh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gdGModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBlYz0yMDA7ZnVuY3Rpb24gbmModCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBYdCl7dmFyIHI9bi5fX2RhdGFfXztpZighUGV8fHIubGVuZ3RoPGVjLTEpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBLdChyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9ZnVuY3Rpb24gU2UodCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgWHQodCk7dGhpcy5zaXplPWUuc2l6ZX1TZS5wcm90b3R5cGUuY2xlYXI9WnUsU2UucHJvdG90eXBlLmRlbGV0ZT1RdSxTZS5wcm90b3R5cGUuZ2V0PUp1LFNlLnByb3RvdHlwZS5oYXM9dGMsU2UucHJvdG90eXBlLnNldD1uYztmdW5jdGlvbiByYyh0LGUpe3JldHVybiB0JiZybihlLEJuKGUpLHQpfWZ1bmN0aW9uIGljKHQsZSl7cmV0dXJuIHQmJnJuKGUsVW4oZSksdCl9dmFyIGlpPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsb2k9aWkmJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxvYz1vaSYmb2kuZXhwb3J0cz09PWlpLHNpPW9jP1V0LkJ1ZmZlcjp2b2lkIDAsYWk9c2k/c2kuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uIHNjKHQsZSl7aWYoZSlyZXR1cm4gdC5zbGljZSgpO3ZhciBuPXQubGVuZ3RoLHI9YWk/YWkobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfWZ1bmN0aW9uIGFjKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtlKHMsbix0KSYmKG9baSsrXT1zKX1yZXR1cm4gb31mdW5jdGlvbiB1aSgpe3JldHVybltdfXZhciB1Yz1PYmplY3QucHJvdG90eXBlLGNjPXVjLnByb3BlcnR5SXNFbnVtZXJhYmxlLGNpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsaGM9Y2k/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLGFjKGNpKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBjYy5jYWxsKHQsZSl9KSl9OnVpLFZuPWhjO2Z1bmN0aW9uIGZjKHQsZSl7cmV0dXJuIHJuKHQsVm4odCksZSl9dmFyIGxjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsZGM9bGM/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KSRuKGUsVm4odCkpLHQ9cmkodCk7cmV0dXJuIGV9OnVpLGhpPWRjO2Z1bmN0aW9uIEVjKHQsZSl7cmV0dXJuIHJuKHQsaGkodCksZSl9ZnVuY3Rpb24gZmkodCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIFl0KHQpP3I6JG4ocixuKHQpKX1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gZmkodCxCbixWbil9ZnVuY3Rpb24gcGModCl7cmV0dXJuIGZpKHQsVW4saGkpfXZhciB5Yz1zZShVdCwiRGF0YVZpZXciKSx6bj15YyxBYz1zZShVdCwiUHJvbWlzZSIpLFduPUFjLFRjPXNlKFV0LCJTZXQiKSxYbj1UYyxsaT0iW29iamVjdCBNYXBdIixSYz0iW29iamVjdCBPYmplY3RdIixkaT0iW29iamVjdCBQcm9taXNlXSIsRWk9IltvYmplY3QgU2V0XSIsX2k9IltvYmplY3QgV2Vha01hcF0iLHBpPSJbb2JqZWN0IERhdGFWaWV3XSIseGM9b2Uoem4pLE9jPW9lKFBlKSxiYz1vZShXbiksZ2M9b2UoWG4pLFNjPW9lKEluKSx1ZT1PZTsoem4mJnVlKG5ldyB6bihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9cGl8fFBlJiZ1ZShuZXcgUGUpIT1saXx8V24mJnVlKFduLnJlc29sdmUoKSkhPWRpfHxYbiYmdWUobmV3IFhuKSE9RWl8fEluJiZ1ZShuZXcgSW4pIT1faSkmJih1ZT1mdW5jdGlvbih0KXt2YXIgZT1PZSh0KSxuPWU9PVJjP3QuY29uc3RydWN0b3I6dm9pZCAwLHI9bj9vZShuKToiIjtpZihyKXN3aXRjaChyKXtjYXNlIHhjOnJldHVybiBwaTtjYXNlIE9jOnJldHVybiBsaTtjYXNlIGJjOnJldHVybiBkaTtjYXNlIGdjOnJldHVybiBFaTtjYXNlIFNjOnJldHVybiBfaX1yZXR1cm4gZX0pO3ZhciBIbj11ZSxtYz1PYmplY3QucHJvdG90eXBlLEZjPW1jLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHdjKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmRmMuY2FsbCh0LCJpbmRleCIpJiYobi5pbmRleD10LmluZGV4LG4uaW5wdXQ9dC5pbnB1dCksbn12YXIgSWM9VXQuVWludDhBcnJheSx5aT1JYztmdW5jdGlvbiBxbih0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgeWkoZSkuc2V0KG5ldyB5aSh0KSksZX1mdW5jdGlvbiBOYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfXZhciBNYz0vXHcqJC87ZnVuY3Rpb24gQ2ModCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2UsTWMuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9dmFyIEFpPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsVGk9QWk/QWkudmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gdmModCl7cmV0dXJuIFRpP09iamVjdChUaS5jYWxsKHQpKTp7fX1mdW5jdGlvbiBEYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCl9dmFyIExjPSJbb2JqZWN0IEJvb2xlYW5dIixQYz0iW29iamVjdCBEYXRlXSIsQmM9IltvYmplY3QgTWFwXSIsVWM9IltvYmplY3QgTnVtYmVyXSIsamM9IltvYmplY3QgUmVnRXhwXSIsR2M9IltvYmplY3QgU2V0XSIsJGM9IltvYmplY3QgU3RyaW5nXSIsVmM9IltvYmplY3QgU3ltYm9sXSIsemM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixXYz0iW29iamVjdCBEYXRhVmlld10iLFhjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLEhjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHFjPSJbb2JqZWN0IEludDhBcnJheV0iLGtjPSJbb2JqZWN0IEludDE2QXJyYXldIixZYz0iW29iamVjdCBJbnQzMkFycmF5XSIsS2M9IltvYmplY3QgVWludDhBcnJheV0iLFpjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsUWM9IltvYmplY3QgVWludDE2QXJyYXldIixKYz0iW29iamVjdCBVaW50MzJBcnJheV0iO2Z1bmN0aW9uIHRoKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlIHpjOnJldHVybiBxbih0KTtjYXNlIExjOmNhc2UgUGM6cmV0dXJuIG5ldyByKCt0KTtjYXNlIFdjOnJldHVybiBOYyh0LG4pO2Nhc2UgWGM6Y2FzZSBIYzpjYXNlIHFjOmNhc2Uga2M6Y2FzZSBZYzpjYXNlIEtjOmNhc2UgWmM6Y2FzZSBRYzpjYXNlIEpjOnJldHVybiBEYyh0LG4pO2Nhc2UgQmM6cmV0dXJuIG5ldyByO2Nhc2UgVWM6Y2FzZSAkYzpyZXR1cm4gbmV3IHIodCk7Y2FzZSBqYzpyZXR1cm4gQ2ModCk7Y2FzZSBHYzpyZXR1cm4gbmV3IHI7Y2FzZSBWYzpyZXR1cm4gdmModCl9fWZ1bmN0aW9uIGVoKHQpe3JldHVybiB0eXBlb2YgdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIXZuKHQpP0hzKHJpKHQpKTp7fX12YXIgbmg9IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gcmgodCl7cmV0dXJuIGJlKHQpJiZIbih0KT09bmh9dmFyIFJpPWdlJiZnZS5pc01hcCxpaD1SaT9MbihSaSk6cmgsb2g9aWgsc2g9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gYWgodCl7cmV0dXJuIGJlKHQpJiZIbih0KT09c2h9dmFyIHhpPWdlJiZnZS5pc1NldCx1aD14aT9Mbih4aSk6YWgsY2g9dWgsaGg9MSxmaD0yLGxoPTQsT2k9IltvYmplY3QgQXJndW1lbnRzXSIsZGg9IltvYmplY3QgQXJyYXldIixFaD0iW29iamVjdCBCb29sZWFuXSIsX2g9IltvYmplY3QgRGF0ZV0iLHBoPSJbb2JqZWN0IEVycm9yXSIsYmk9IltvYmplY3QgRnVuY3Rpb25dIix5aD0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLEFoPSJbb2JqZWN0IE1hcF0iLFRoPSJbb2JqZWN0IE51bWJlcl0iLGdpPSJbb2JqZWN0IE9iamVjdF0iLFJoPSJbb2JqZWN0IFJlZ0V4cF0iLHhoPSJbb2JqZWN0IFNldF0iLE9oPSJbb2JqZWN0IFN0cmluZ10iLGJoPSJbb2JqZWN0IFN5bWJvbF0iLGdoPSJbb2JqZWN0IFdlYWtNYXBdIixTaD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLG1oPSJbb2JqZWN0IERhdGFWaWV3XSIsRmg9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsd2g9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsSWg9IltvYmplY3QgSW50OEFycmF5XSIsTmg9IltvYmplY3QgSW50MTZBcnJheV0iLE1oPSJbb2JqZWN0IEludDMyQXJyYXldIixDaD0iW29iamVjdCBVaW50OEFycmF5XSIsdmg9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixEaD0iW29iamVjdCBVaW50MTZBcnJheV0iLExoPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWj17fTtaW09pXT1aW2RoXT1aW1NoXT1aW21oXT1aW0VoXT1aW19oXT1aW0ZoXT1aW3doXT1aW0loXT1aW05oXT1aW01oXT1aW0FoXT1aW1RoXT1aW2dpXT1aW1JoXT1aW3hoXT1aW09oXT1aW2JoXT1aW0NoXT1aW3ZoXT1aW0RoXT1aW0xoXT0hMCxaW3BoXT1aW2JpXT1aW2doXT0hMTtmdW5jdGlvbiB1bih0LGUsbixyLGksbyl7dmFyIHMsdT1lJmhoLGE9ZSZmaCxsPWUmbGg7aWYobiYmKHM9aT9uKHQscixpLG8pOm4odCkpLHMhPT12b2lkIDApcmV0dXJuIHM7aWYoIWllKHQpKXJldHVybiB0O3ZhciBkPVl0KHQpO2lmKGQpe2lmKHM9d2ModCksIXUpcmV0dXJuIGtzKHQscyl9ZWxzZXt2YXIgXz1Ibih0KSxPPV89PWJpfHxfPT15aDtpZihLcih0KSlyZXR1cm4gc2ModCx1KTtpZihfPT1naXx8Xz09T2l8fE8mJiFpKXtpZihzPWF8fE8/e306ZWgodCksIXUpcmV0dXJuIGE/RWModCxpYyhzLHQpKTpmYyh0LHJjKHMsdCkpfWVsc2V7aWYoIVpbX10pcmV0dXJuIGk/dDp7fTtzPXRoKHQsXyx1KX19b3x8KG89bmV3IFNlKTt2YXIgYj1vLmdldCh0KTtpZihiKXJldHVybiBiO28uc2V0KHQscyksY2godCk/dC5mb3JFYWNoKGZ1bmN0aW9uKE4pe3MuYWRkKHVuKE4sZSxuLE4sdCxvKSl9KTpvaCh0KSYmdC5mb3JFYWNoKGZ1bmN0aW9uKE4sZyl7cy5zZXQoZyx1bihOLGUsbixnLHQsbykpfSk7dmFyIEY9bD9hP3BjOl9jOmE/VW46Qm4sUz1kP3ZvaWQgMDpGKHQpO3JldHVybiBvYShTfHx0LGZ1bmN0aW9uKE4sZyl7UyYmKGc9TixOPXRbZ10pLE1uKHMsZyx1bihOLGUsbixnLHQsbykpfSksc312YXIgUGg9MSxCaD00O2Z1bmN0aW9uIFVoKHQpe3JldHVybiB1bih0LFBofEJoKX1mdW5jdGlvbiBqaCh0LGUpe3JldHVybiB0IT1udWxsJiZlIGluIE9iamVjdCh0KX1mdW5jdGlvbiBHaCh0LGUsbil7ZT1hbihlLHQpO2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89ITE7KytyPGk7KXt2YXIgcz1HbihlW3JdKTtpZighKG89dCE9bnVsbCYmbih0LHMpKSlicmVhazt0PXRbc119cmV0dXJuIG98fCsrciE9aT9vOihpPXQ9PW51bGw/MDp0Lmxlbmd0aCwhIWkmJkNuKGkpJiZObihzLGkpJiYoWXQodCl8fERuKHQpKSl9ZnVuY3Rpb24gJGgodCxlKXtyZXR1cm4gdCE9bnVsbCYmR2godCxlLGpoKX1mdW5jdGlvbiBWaCh0LGUsbixyKXtpZighaWUodCkpcmV0dXJuIHQ7ZT1hbihlLHQpO2Zvcih2YXIgaT0tMSxvPWUubGVuZ3RoLHM9by0xLHU9dDt1IT1udWxsJiYrK2k8bzspe3ZhciBhPUduKGVbaV0pLGw9bjtpZihhPT09Il9fcHJvdG9fXyJ8fGE9PT0iY29uc3RydWN0b3IifHxhPT09InByb3RvdHlwZSIpcmV0dXJuIHQ7aWYoaSE9cyl7dmFyIGQ9dVthXTtsPXI/cihkLGEsdSk6dm9pZCAwLGw9PT12b2lkIDAmJihsPWllKGQpP2Q6Tm4oZVtpKzFdKT9bXTp7fSl9TW4odSxhLGwpLHU9dVthXX1yZXR1cm4gdH1mdW5jdGlvbiB6aCh0LGUsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBzPWVbcl0sdT1IdSh0LHMpO24odSxzKSYmVmgobyxhbihzLHQpLHUpfXJldHVybiBvfWZ1bmN0aW9uIFdoKHQsZSl7cmV0dXJuIHpoKHQsZSxmdW5jdGlvbihuLHIpe3JldHVybiAkaCh0LHIpfSl9dmFyIFhoPVl1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306V2godCxlKX0pLEhoPVhoO2Z1bmN0aW9uIHFoKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KX1mdW5jdGlvbiBkdCh0LGUpe3JldHVybiB0Pz9lfWNvbnN0IGtoPXQ9PntsZXQgZT0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXQuY2hhckNvZGVBdChuKTtlPShlPDw1KS1lK3IsZSY9ZX1yZXR1cm4gZS50b1N0cmluZygxNil9LFloPXFoKHttYXJrZXI6MSxwb2x5bGluZToxLHBvbHlnb246MSxlbGxpcHNvaWQ6MSxlbGxpcHNlOjEsbW9kZWw6MSwiM2R0aWxlcyI6MSxib3g6MSxwaG90b292ZXJsYXk6MSxyZXNvdXJjZToxLHJhc3RlcjoxLGhlYXRNYXA6MSxmcnVzdHVtOjEsdHJhbnNpdGlvbjoxfSk7dmFyIE09KHQ9Pih0W3QuVkFSSUFCTEU9MF09IlZBUklBQkxFIix0W3QuVU5BUlk9MV09IlVOQVJZIix0W3QuQklOQVJZPTJdPSJCSU5BUlkiLHRbdC5URVJOQVJZPTNdPSJURVJOQVJZIix0W3QuQ09ORElUSU9OQUw9NF09IkNPTkRJVElPTkFMIix0W3QuTUVNQkVSPTVdPSJNRU1CRVIiLHRbdC5GVU5DVElPTl9DQUxMPTZdPSJGVU5DVElPTl9DQUxMIix0W3QuQVJSQVk9N109IkFSUkFZIix0W3QuUkVHRVg9OF09IlJFR0VYIix0W3QuVkFSSUFCTEVfSU5fU1RSSU5HPTldPSJWQVJJQUJMRV9JTl9TVFJJTkciLHRbdC5MSVRFUkFMX05VTEw9MTBdPSJMSVRFUkFMX05VTEwiLHRbdC5MSVRFUkFMX0JPT0xFQU49MTFdPSJMSVRFUkFMX0JPT0xFQU4iLHRbdC5MSVRFUkFMX05VTUJFUj0xMl09IkxJVEVSQUxfTlVNQkVSIix0W3QuTElURVJBTF9TVFJJTkc9MTNdPSJMSVRFUkFMX1NUUklORyIsdFt0LkxJVEVSQUxfQ09MT1I9MTRdPSJMSVRFUkFMX0NPTE9SIix0W3QuTElURVJBTF9WRUNUT1I9MTVdPSJMSVRFUkFMX1ZFQ1RPUiIsdFt0LkxJVEVSQUxfUkVHRVg9MTZdPSJMSVRFUkFMX1JFR0VYIix0W3QuTElURVJBTF9VTkRFRklORUQ9MTddPSJMSVRFUkFMX1VOREVGSU5FRCIsdFt0LkJVSUxUSU5fVkFSSUFCTEU9MThdPSJCVUlMVElOX1ZBUklBQkxFIix0KSkoTXx8e30pO2NvbnN0IEtoPVsiISIsIi0iLCIrIl0sWmg9WyIrIiwiLSIsIioiLCIvIiwiJSIsIj09PSIsIiE9PSIsIj4iLCI+PSIsIjwiLCI8PSIsIiYmIiwifHwiLCIhfiIsIj1+IiwiPT0iLCIhPSJdLFFoPS9cXC9nLEpoPSJAIyUiLHRmPS9AIyUvZyxlZj0vXiMoWzAtOWEtZl0pKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pPyQvaSxuZj0vXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPyQvaSxTaT17QUxJQ0VCTFVFOiIjRjBGOEZGIixBTlRJUVVFV0hJVEU6IiNGQUVCRDciLEFRVUE6IiMwMEZGRkYiLEFRVUFNQVJJTkU6IiM3RkZGRDQiLEFaVVJFOiIjRjBGRkZGIixCRUlHRToiI0Y1RjVEQyIsQklTUVVFOiIjRkZFNEM0IixCTEFDSzoiIzAwMDAwMCIsQkxBTkNIRURBTE1PTkQ6IiNGRkVCQ0QiLEJMVUU6IiMwMDAwRkYiLEJMVUVWSU9MRVQ6IiM4QTJCRTIiLEJST1dOOiIjQTUyQTJBIixCVVJMWVdPT0Q6IiNERUI4ODciLENBREVUQkxVRToiIzVGOUVBMCIsQ0hBUlRSRVVTRToiIzdGRkYwMCIsQ0hPQ09MQVRFOiIjRDI2OTFFIixDT1JBTDoiI0ZGN0Y1MCIsQ09STkZMT1dFUkJMVUU6IiM2NDk1RUQiLENPUk5TSUxLOiIjRkZGOERDIixDUklNU09OOiIjREMxNDNDIixDWUFOOiIjMDBGRkZGIixEQVJLQkxVRToiIzAwMDA4QiIsREFSS0NZQU46IiMwMDhCOEIiLERBUktHT0xERU5ST0Q6IiNCODg2MEIiLERBUktHUkFZOiIjQTlBOUE5IixEQVJLR1JFRU46IiMwMDY0MDAiLERBUktHUkVZOiIjQTlBOUE5IixEQVJLS0hBS0k6IiNCREI3NkIiLERBUktNQUdFTlRBOiIjOEIwMDhCIixEQVJLT0xJVkVHUkVFTjoiIzU1NkIyRiIsREFSS09SQU5HRToiI0ZGOEMwMCIsREFSS09SQ0hJRDoiIzk5MzJDQyIsREFSS1JFRDoiIzhCMDAwMCIsREFSS1NBTE1PTjoiI0U5OTY3QSIsREFSS1NFQUdSRUVOOiIjOEZCQzhGIixEQVJLU0xBVEVCTFVFOiIjNDgzRDhCIixEQVJLU0xBVEVHUkFZOiIjMkY0RjRGIixEQVJLU0xBVEVHUkVZOiIjMkY0RjRGIixEQVJLVFVSUVVPSVNFOiIjMDBDRUQxIixEQVJLVklPTEVUOiIjOTQwMEQzIixERUVQUElOSzoiI0ZGMTQ5MyIsREVFUFNLWUJMVUU6IiMwMEJGRkYiLERJTUdSQVk6IiM2OTY5NjkiLERJTUdSRVk6IiM2OTY5NjkiLERPREdFUkJMVUU6IiMxRTkwRkYiLEZJUkVCUklDSzoiI0IyMjIyMiIsRkxPUkFMV0hJVEU6IiNGRkZBRjAiLEZPUkVTVEdSRUVOOiIjMjI4QjIyIixGVUNIU0lBOiIjRkYwMEZGIixHQUlOU0JPUk86IiNEQ0RDREMiLEdIT1NUV0hJVEU6IiNGOEY4RkYiLEdPTEQ6IiNGRkQ3MDAiLEdPTERFTlJPRDoiI0RBQTUyMCIsR1JBWToiIzgwODA4MCIsR1JFRU46IiMwMDgwMDAiLEdSRUVOWUVMTE9XOiIjQURGRjJGIixHUkVZOiIjODA4MDgwIixIT05FWURFVzoiI0YwRkZGMCIsSE9UUElOSzoiI0ZGNjlCNCIsSU5ESUFOUkVEOiIjQ0Q1QzVDIixJTkRJR086IiM0QjAwODIiLElWT1JZOiIjRkZGRkYwIixLSEFLSToiI0YwRTY4QyIsTEFWRU5ERVI6IiNFNkU2RkEiLExBVkVOREFSX0JMVVNIOiIjRkZGMEY1IixMQVdOR1JFRU46IiM3Q0ZDMDAiLExFTU9OQ0hJRkZPTjoiI0ZGRkFDRCIsTElHSFRCTFVFOiIjQUREOEU2IixMSUdIVENPUkFMOiIjRjA4MDgwIixMSUdIVENZQU46IiNFMEZGRkYiLExJR0hUR09MREVOUk9EWUVMTE9XOiIjRkFGQUQyIixMSUdIVEdSQVk6IiNEM0QzRDMiLExJR0hUR1JFRU46IiM5MEVFOTAiLExJR0hUR1JFWToiI0QzRDNEMyIsTElHSFRQSU5LOiIjRkZCNkMxIixMSUdIVFNFQUdSRUVOOiIjMjBCMkFBIixMSUdIVFNLWUJMVUU6IiM4N0NFRkEiLExJR0hUU0xBVEVHUkFZOiIjNzc4ODk5IixMSUdIVFNMQVRFR1JFWToiIzc3ODg5OSIsTElHSFRTVEVFTEJMVUU6IiNCMEM0REUiLExJR0hUWUVMTE9XOiIjRkZGRkUwIixMSU1FOiIjMDBGRjAwIixMSU1FR1JFRU46IiMzMkNEMzIiLExJTkVOOiIjRkFGMEU2IixNQUdFTlRBOiIjRkYwMEZGIixNQVJPT046IiM4MDAwMDAiLE1FRElVTUFRVUFNQVJJTkU6IiM2NkNEQUEiLE1FRElVTUJMVUU6IiMwMDAwQ0QiLE1FRElVTU9SQ0hJRDoiI0JBNTVEMyIsTUVESVVNUFVSUExFOiIjOTM3MERCIixNRURJVU1TRUFHUkVFTjoiIzNDQjM3MSIsTUVESVVNU0xBVEVCTFVFOiIjN0I2OEVFIixNRURJVU1TUFJJTkdHUkVFTjoiIzAwRkE5QSIsTUVESVVNVFVSUVVPSVNFOiIjNDhEMUNDIixNRURJVU1WSU9MRVRSRUQ6IiNDNzE1ODUiLE1JRE5JR0hUQkxVRToiIzE5MTk3MCIsTUlOVENSRUFNOiIjRjVGRkZBIixNSVNUWVJPU0U6IiNGRkU0RTEiLE1PQ0NBU0lOOiIjRkZFNEI1IixOQVZBSk9XSElURToiI0ZGREVBRCIsTkFWWToiIzAwMDA4MCIsT0xETEFDRToiI0ZERjVFNiIsT0xJVkU6IiM4MDgwMDAiLE9MSVZFRFJBQjoiIzZCOEUyMyIsT1JBTkdFOiIjRkZBNTAwIixPUkFOR0VSRUQ6IiNGRjQ1MDAiLE9SQ0hJRDoiI0RBNzBENiIsUEFMRUdPTERFTlJPRDoiI0VFRThBQSIsUEFMRUdSRUVOOiIjOThGQjk4IixQQUxFVFVSUVVPSVNFOiIjQUZFRUVFIixQQUxFVklPTEVUUkVEOiIjREI3MDkzIixQQVBBWUFXSElQOiIjRkZFRkQ1IixQRUFDSFBVRkY6IiNGRkRBQjkiLFBFUlU6IiNDRDg1M0YiLFBJTks6IiNGRkMwQ0IiLFBMVU06IiNEREEwREQiLFBPV0RFUkJMVUU6IiNCMEUwRTYiLFBVUlBMRToiIzgwMDA4MCIsUkVEOiIjRkYwMDAwIixST1NZQlJPV046IiNCQzhGOEYiLFJPWUFMQkxVRToiIzQxNjlFMSIsU0FERExFQlJPV046IiM4QjQ1MTMiLFNBTE1PTjoiI0ZBODA3MiIsU0FORFlCUk9XTjoiI0Y0QTQ2MCIsU0VBR1JFRU46IiMyRThCNTciLFNFQVNIRUxMOiIjRkZGNUVFIixTSUVOTkE6IiNBMDUyMkQiLFNJTFZFUjoiI0MwQzBDMCIsU0tZQkxVRToiIzg3Q0VFQiIsU0xBVEVCTFVFOiIjNkE1QUNEIixTTEFURUdSQVk6IiM3MDgwOTAiLFNMQVRFR1JFWToiIzcwODA5MCIsU05PVzoiI0ZGRkFGQSIsU1BSSU5HR1JFRU46IiMwMEZGN0YiLFNURUVMQkxVRToiIzQ2ODJCNCIsVEFOOiIjRDJCNDhDIixURUFMOiIjMDA4MDgwIixUSElTVExFOiIjRDhCRkQ4IixUT01BVE86IiNGRjYzNDciLFRVUlFVT0lTRToiIzQwRTBEMCIsVklPTEVUOiIjRUU4MkVFIixXSEVBVDoiI0Y1REVCMyIsV0hJVEU6IiNGRkZGRkYiLFdISVRFU01PS0U6IiNGNUY1RjUiLFlFTExPVzoiI0ZGRkYwMCIsWUVMTE9XR1JFRU46IiM5QUNEMzIifTtmdW5jdGlvbiByZih0KXtjb25zdCBlPWtuW3RdO3JldHVybiBmdW5jdGlvbihuKXtjb25zdCByPXRoaXMuX2xlZnQuZXZhbHVhdGUobiksaT10aGlzLl9yaWdodC5ldmFsdWF0ZShuKTtyZXR1cm4gZSh0LHIsaSl9fWNvbnN0IGtuPXthdGFuMjpCZShNYXRoLmF0YW4yLCExKSxwb3c6QmUoTWF0aC5wb3csITEpLG1pbjpCZShNYXRoLm1pbiwhMCksbWF4OkJlKE1hdGgubWF4LCEwKSxzdGFydHNXaXRoOkJlKG9mLCExKX07ZnVuY3Rpb24gQmUodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe2lmKGUmJnR5cGVvZiBpPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIifHx0eXBlb2Ygcj09Im51bWJlciImJnR5cGVvZiBpPT0ibnVtYmVyInx8dHlwZW9mIHI9PSJzdHJpbmciJiZ0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHQocixpKTt0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uICIke259IiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcy4gQXJndW1lbnRzIGFyZSAke3J9IGFuZCAke2l9LmApfX1mdW5jdGlvbiBvZih0LGUpe3JldHVybiB0LnN0YXJ0c1dpdGgoZSl9ZnVuY3Rpb24gc2YodCl7Y29uc3QgZT1Zblt0XTtyZXR1cm4gZnVuY3Rpb24obil7Y29uc3Qgcj10aGlzLl9sZWZ0LmV2YWx1YXRlKG4pO3JldHVybiBlKHQscil9fWNvbnN0IFluPXthYnM6Y3QoTWF0aC5hYnMpLHNxcnQ6Y3QoTWF0aC5zcXJ0KSxjb3M6Y3QoTWF0aC5jb3MpLHNpbjpjdChNYXRoLnNpbiksdGFuOmN0KE1hdGgudGFuKSxhY29zOmN0KE1hdGguYWNvcyksYXNpbjpjdChNYXRoLmFzaW4pLGF0YW46Y3QoTWF0aC5hdGFuKSxyYWRpYW5zOmN0KFIudG9SYWRpYW5zKSxkZWdyZWVzOmN0KFIudG9EZWdyZWVzKSxzaWduOmN0KFIuc2lnbiksZmxvb3I6Y3QoTWF0aC5mbG9vciksY2VpbDpjdChNYXRoLmNlaWwpLHJvdW5kOmN0KE1hdGgucm91bmQpLGV4cDI6Y3QodWYpLGxvZzpjdChNYXRoLmxvZyksbG9nMjpjdChjZiksZnJhY3Q6Y3QoYWYpfTtmdW5jdGlvbiBjdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuIHQobik7dGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiAiJHtlfSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfX1mdW5jdGlvbiBhZih0KXtyZXR1cm4gdC1NYXRoLmZsb29yKHQpfWZ1bmN0aW9uIHVmKHQpe3JldHVybiBNYXRoLnBvdygyLHQpfWZ1bmN0aW9uIGNmKHQpe3JldHVybiBSLmxvZzIodCl9Y29uc3QgaGY9L15yZ2JhP1woXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPykoPzpccyosXHMqKFswLTkuXSspKT9ccypcKSQvaSxmZj0vXmhzbGE/XChccyooWzAtOS5dKylccyosXHMqKFswLTkuXSslKVxzKixccyooWzAtOS5dKyUpKD86XHMqLFxzKihbMC05Ll0rKSk/XHMqXCkkL2k7Y2xhc3MgSntjb25zdHJ1Y3RvcihlLG4scixpKXt2KHRoaXMsInJlZCIpO3YodGhpcywiZ3JlZW4iKTt2KHRoaXMsImJsdWUiKTt2KHRoaXMsImFscGhhIik7dGhpcy5yZWQ9ZHQoZSwxKSx0aGlzLmdyZWVuPWR0KG4sMSksdGhpcy5ibHVlPWR0KHIsMSksdGhpcy5hbHBoYT1kdChpLDEpfXN0YXRpYyBieXRlVG9GbG9hdChlKXtyZXR1cm4gZS8yNTV9c3RhdGljIGZsb2F0VG9CeXRlKGUpe3JldHVybiBlPT09MT8yNTU6ZSoyNTZ8MH1zdGF0aWMgZnJvbUNzc0NvbG9yU3RyaW5nKGUpe2U9ZS5yZXBsYWNlKC9ccy9nLCIiKTtjb25zdCBuPWxmKGUpO2lmKHR5cGVvZiBuPCJ1IilyZXR1cm4gbjtsZXQgcj1lZi5leGVjKGUpO2lmKHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8xNSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzE1LGkuYmx1ZT1wYXJzZUludChyWzNdLDE2KS8xNSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImYiKSwxNikvMTUsaX1pZihyPW5mLmV4ZWMoZSksciE9PW51bGwpe2NvbnN0IGk9bmV3IEo7cmV0dXJuIGkucmVkPXBhcnNlSW50KHJbMV0sMTYpLzI1NSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzI1NSxpLmJsdWU9cGFyc2VJbnQoclszXSwxNikvMjU1LGkuYWxwaGE9cGFyc2VJbnQoZHQocls0XSwiZmYiKSwxNikvMjU1LGl9aWYocj1oZi5leGVjKGUpLHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUZsb2F0KHJbMV0pLyhyWzFdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ncmVlbj1wYXJzZUZsb2F0KHJbMl0pLyhyWzJdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ibHVlPXBhcnNlRmxvYXQoclszXSkvKHJbM10uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmFscGhhPXBhcnNlRmxvYXQoZHQocls0XSwiMS4wIikpLGl9aWYocj1mZi5leGVjKGUpLHIhPT1udWxsKXJldHVybiBKLmZyb21Ic2wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAscGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSkpfXN0YXRpYyBmcm9tSHNsKGUsbixyLGkpe2lmKGU9ZHQoZSwwKSUxLG49ZHQobiwwKSxyPWR0KHIsMCksaT1kdChpLDEpLGUmJm4mJnImJmkpe2xldCBvPXIscz1yLHU9cjtjb25zdCBhPW5ldyBKO2lmKG4hPT0wKXtsZXQgbDtyPC41P2w9ciooMStuKTpsPXIrbi1yKm47Y29uc3QgZD0yKnItbDtvPUtuKGQsbCxlKzEvMykscz1LbihkLGwsZSksdT1LbihkLGwsZS0xLzMpfXJldHVybiB0eXBlb2YgYT4idSI/bmV3IEoobyxzLHUsaSk6KGEucmVkPW8sYS5ncmVlbj1zLGEuYmx1ZT11LGEuYWxwaGE9aSxhKX19dG9Dc3NIZXhTdHJpbmcoKXtsZXQgZT1KLmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7ZS5sZW5ndGg8MiYmKGU9YDAke2V9YCk7bGV0IG49Si5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKS50b1N0cmluZygxNik7bi5sZW5ndGg8MiYmKG49YDAke259YCk7bGV0IHI9Si5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLnRvU3RyaW5nKDE2KTtpZihyLmxlbmd0aDwyJiYocj1gMCR7cn1gKSx0aGlzLmFscGhhPDEpe2xldCBpPUouZmxvYXRUb0J5dGUodGhpcy5hbHBoYSkudG9TdHJpbmcoMTYpO3JldHVybiBpLmxlbmd0aDwyJiYoaT1gMCR7aX1gKSxgIyR7ZX0ke259JHtyfSR7aX1gfXJldHVybmAjJHtlfSR7bn0ke3J9YC50b1VwcGVyQ2FzZSgpfXN0YXRpYyBmcm9tQnl0ZXMoZSxuLHIsaSl7cmV0dXJuIGU9dGhpcy5ieXRlVG9GbG9hdChkdChlLDI1NSkpLG49Si5ieXRlVG9GbG9hdChkdChuLDI1NSkpLHI9Si5ieXRlVG9GbG9hdChkdChyLDI1NSkpLGk9Si5ieXRlVG9GbG9hdChkdChpLDI1NSkpLG5ldyBKKGUsbixyLGkpfX1mdW5jdGlvbiBsZih0KXtpZih0PXQudG9VcHBlckNhc2UoKSxTaVt0XSlyZXR1cm4gSi5mcm9tQ3NzQ29sb3JTdHJpbmcoU2lbdF0pO3N3aXRjaCh0KXtjYXNlIlRSQU5TUEFSRU5UIjpyZXR1cm4gbmV3IEooMCwwLDAsMCk7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIEtuKHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbio2PDE/dCsoZS10KSo2Km46bioyPDE/ZTpuKjM8Mj90KyhlLXQpKigyLzMtbikqNjp0fWNsYXNzIFB7Y29uc3RydWN0b3IoZSxuLHIsaSxvKXt2KHRoaXMsIl90eXBlIik7dih0aGlzLCJfdmFsdWUiKTt2KHRoaXMsIl9sZWZ0Iik7dih0aGlzLCJfcmlnaHQiKTt2KHRoaXMsIl90ZXN0Iik7dih0aGlzLCJldmFsdWF0ZSIpO3RoaXMuX3R5cGU9ZSx0aGlzLl92YWx1ZT1uLHRoaXMuX2xlZnQ9cix0aGlzLl9yaWdodD1pLHRoaXMuX3Rlc3Q9byx0aGlzLnNldEV2YWx1YXRlRnVuY3Rpb24oKX1zZXRFdmFsdWF0ZUZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLl90eXBlLG49dGhpcy5fdmFsdWU7c3dpdGNoKGUpe2Nhc2UgTS5DT05ESVRJT05BTDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uYWw7YnJlYWs7Y2FzZSBNLkZVTkNUSU9OX0NBTEw6c3dpdGNoKG4pe2Nhc2UidG9TdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVUb1N0cmluZzticmVha31icmVhaztjYXNlIE0uVU5BUlk6c3dpdGNoKG4pe2Nhc2UiISI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdDticmVhaztjYXNlIi0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOZWdhdGl2ZTticmVhaztjYXNlIisiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVQb3NpdGl2ZTticmVhaztjYXNlImlzTmFOIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTmFOO2JyZWFrO2Nhc2UiaXNGaW5pdGUiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVJc0Zpbml0ZTticmVhaztjYXNlIkJvb2xlYW4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVCb29sZWFuQ29udmVyc2lvbjticmVhaztjYXNlIk51bWJlciI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb247YnJlYWs7Y2FzZSJTdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVTdHJpbmdDb252ZXJzaW9uO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIFluW25dPCJ1IiYmKHRoaXMuZXZhbHVhdGU9c2YobikpO2JyZWFrfWJyZWFrO2Nhc2UgTS5CSU5BUlk6c3dpdGNoKG4pe2Nhc2UiKyI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZVBsdXM7YnJlYWs7Y2FzZSItIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWludXM7YnJlYWs7Y2FzZSIqIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVGltZXM7YnJlYWs7Y2FzZSIvIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRGl2aWRlO2JyZWFrO2Nhc2UiJSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1vZDticmVhaztjYXNlIj09PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUVxdWFsc1N0cmljdDticmVhaztjYXNlIiE9PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdEVxdWFsc1N0cmljdDticmVhaztjYXNlIjwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVMZXNzVGhhbjticmVhaztjYXNlIjw9Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGVzc1RoYW5PckVxdWFsczticmVhaztjYXNlIj4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVHcmVhdGVyVGhhbjticmVhaztjYXNlIj49Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlR3JlYXRlclRoYW5PckVxdWFsczticmVhaztjYXNlIiYmIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQW5kO2JyZWFrO2Nhc2UifHwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVPcjticmVhaztjYXNlIj09Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRXF1YWxzO2JyZWFrO2Nhc2UiIT0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOb3RFcXVhbHM7YnJlYWs7ZGVmYXVsdDp0eXBlb2Yga25bbl08InUiJiYodGhpcy5ldmFsdWF0ZT1yZihuKSk7YnJlYWt9YnJlYWs7Y2FzZSBNLk1FTUJFUjpuPT09ImJyYWNrZXRzIj90aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWVtYmVyQnJhY2tldHM6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1lbWJlckRvdDticmVhaztjYXNlIE0uQVJSQVk6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUFycmF5O2JyZWFrO2Nhc2UgTS5WQVJJQUJMRTp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGU7YnJlYWs7Y2FzZSBNLlZBUklBQkxFX0lOX1NUUklORzp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGVTdHJpbmc7YnJlYWs7Y2FzZSBNLkxJVEVSQUxfQ09MT1I6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxDb2xvcjticmVhaztjYXNlIE0uTElURVJBTF9TVFJJTkc6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxTdHJpbmc7YnJlYWs7ZGVmYXVsdDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGl0ZXJhbDticmVha319X2V2YWx1YXRlTGl0ZXJhbCgpe3JldHVybiB0aGlzLl92YWx1ZX1fZXZhbHVhdGVMaXRlcmFsU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfV9ldmFsdWF0ZVZhcmlhYmxlU3RyaW5nKGUpe2NvbnN0IG49L1wkeyguKj8pfS9nO2xldCByPXRoaXMuX3ZhbHVlLGk9bi5leGVjKHIpO2Zvcig7aSE9PW51bGw7KXtjb25zdCBvPWlbMF0scz1pWzFdO2xldCB1PWU9PW51bGw/dm9pZCAwOmUucHJvcGVydGllc1tzXTt0eXBlb2YgdT4idSImJih1PSIiKSxyPXIucmVwbGFjZShvLHUpLGk9bi5leGVjKHIpfXJldHVybiByfV9ldmFsdWF0ZVZhcmlhYmxlKGUpe2xldCBuO3JldHVybiBlJiZTdHJpbmcodGhpcy5fdmFsdWUpaW4gZS5wcm9wZXJ0aWVzP249ZS5wcm9wZXJ0aWVzW1N0cmluZyh0aGlzLl92YWx1ZSldOlN0cmluZyh0aGlzLl92YWx1ZSk9PT0iaWQiP249ZT09bnVsbD92b2lkIDA6ZS5pZDplJiZTdHJpbmcodGhpcy5fdmFsdWUpPT09InJvb3RQcm9wZXJ0aWVzIiYmKG49ZS5wcm9wZXJ0aWVzKSx0eXBlb2Ygbj4idSImJihuPSIiKSxufV9ldmFsdWF0ZU1lbWJlckRvdChlKXtpZihtaSh0aGlzLl9sZWZ0KSlyZXR1cm4gZT09bnVsbD92b2lkIDA6ZS5wcm9wZXJ0aWVzW3RoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpXTtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4+InUiKXJldHVybjtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuW3JdfV9ldmFsdWF0ZU1lbWJlckJyYWNrZXRzKGUpe2lmKG1pKHRoaXMuX2xlZnQpKXJldHVybiBlPT1udWxsP3ZvaWQgMDplLnByb3BlcnRpZXNbdGhpcy5fcmlnaHQuZXZhbHVhdGUoZSldO2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj4idSIpcmV0dXJuO2NvbnN0IHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG5bcl19X2V2YWx1YXRlQXJyYXkoZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX3ZhbHVlLmxlbmd0aDtyKyspbltyXT10aGlzLl92YWx1ZVtyXS5ldmFsdWF0ZShlKTtyZXR1cm4gbn1fZXZhbHVhdGVOb3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiISIgcmVxdWlyZXMgYSBib29sZWFuIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiFufV9ldmFsdWF0ZU5lZ2F0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuLW47dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfV9ldmFsdWF0ZVBvc2l0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiKyIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiBufV9ldmFsdWF0ZUxlc3NUaGFuKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPCIgcmVxdWlyZXMgbnVtYmVyIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApLCExKTpuPHJ9X2V2YWx1YXRlTGVzc1RoYW5PckVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIG4hPSJudW1iZXIifHx0eXBlb2YgciE9Im51bWJlciI/KGNvbnNvbGUud2FybihgT3BlcmF0b3IgIjw9IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm48PXJ9X2V2YWx1YXRlR3JlYXRlclRoYW4oZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHR5cGVvZiBuIT0ibnVtYmVyInx8dHlwZW9mIHIhPSJudW1iZXIiPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICI+IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm4+cn1fZXZhbHVhdGVHcmVhdGVyVGhhbk9yRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPj0iIHJlcXVpcmVzIG51bWJlciBhcmd1bWVudHMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKSwhMSk6bj49cn1fZXZhbHVhdGVPcihlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4hPSJib29sZWFuIilyZXR1cm4gY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyAke259LmApLCExO2lmKG4pcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIHIhPSJib29sZWFuIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBTZWNvbmQgYXJndW1lbnQgaXMgJHtyfS5gKSwhMSk6bnx8cn1fZXZhbHVhdGVBbmQoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpcmV0dXJuIGNvbnNvbGUud2FybihgT3BlcmF0b3IgIiYmIiByZXF1aXJlcyBib29sZWFuIGFyZ3VtZW50cy4gRmlyc3QgYXJndW1lbnQgaXMgJHtufS5gKSwhMTtpZighbilyZXR1cm4hMTtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgciE9ImJvb2xlYW4iPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICImJiIgcmVxdWlyZXMgYm9vbGVhbiBhcmd1bWVudHMuIFNlY29uZCBhcmd1bWVudCBpcyAke3J9LmApLCExKTpuJiZyfV9ldmFsdWF0ZVBsdXMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4rcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIrIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYXQgbGVhc3Qgb25lIHN0cmluZyBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1pbnVzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIiKXJldHVybiBuLXI7dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVUaW1lcyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbipyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIioiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgdmVjdG9ycyB0aGV5IG11c3QgYmUgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVEaXZpZGUoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4vcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIvIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYSBudW1iZXIgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1vZChlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbiVyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIiUiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzIG9mIG1hdGNoaW5nIHR5cGVzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCl9X2V2YWx1YXRlRXF1YWxzU3RyaWN0KGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuPT09cn1fZXZhbHVhdGVOb3RFcXVhbHNTdHJpY3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG4hPT1yfV9ldmFsdWF0ZUNvbmRpdGlvbmFsKGUpe2NvbnN0IG49dGhpcy5fdGVzdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcihgQ29uZGl0aW9uYWwgYXJndW1lbnQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGEgYm9vbGVhbi4gQXJndW1lbnQgaXMgJHtufS5gKTtyZXR1cm4gbj90aGlzLl9sZWZ0LmV2YWx1YXRlKGUpOnRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpfV9ldmFsdWF0ZU5hTihlKXtyZXR1cm4gaXNOYU4odGhpcy5fbGVmdC5ldmFsdWF0ZShlKSl9X2V2YWx1YXRlSXNGaW5pdGUoZSl7cmV0dXJuIGlzRmluaXRlKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZUJvb2xlYW5Db252ZXJzaW9uKGUpe3JldHVybiBCb29sZWFuKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb24oZSl7Y29uc3Qgbj1kZih0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKTtyZXR1cm4gTnVtYmVyKG4pfV9ldmFsdWF0ZVN0cmluZ0NvbnZlcnNpb24oZSl7cmV0dXJuIFN0cmluZyh0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKX1fZXZhbHVhdGVUb1N0cmluZyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYobiBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gU3RyaW5nKG4pO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke3RoaXMuX3ZhbHVlfSIuYCl9X2V2YWx1YXRlTGl0ZXJhbENvbG9yKGUpe2NvbnN0IG49dGhpcy5fbGVmdDtsZXQgcj1uZXcgSjtpZih0aGlzLl92YWx1ZT09PSJjb2xvciIpaWYodHlwZW9mIG4+InUiKXI9Si5mcm9tQnl0ZXMoMjU1LDI1NSwyNTUsMjU1KTtlbHNlIGlmKG4ubGVuZ3RoPjEpe2NvbnN0IGk9Si5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCk7ci5hbHBoYT1uWzFdLmV2YWx1YXRlKGUpfWVsc2V7Y29uc3QgaT1KLmZyb21Dc3NDb2xvclN0cmluZyhuWzBdLmV2YWx1YXRlKGUpKTtpZihpKXI9aTtlbHNlIHRocm93IG5ldyBFcnJvcihgd3JvbmcgbGl0ZXJhbENvbG9yIGNhbGwgIiR7dGhpcy5fdmFsdWV9LCAke259fSJgKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09InJnYiIpcj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSwyNTUpO2Vsc2UgaWYodGhpcy5fdmFsdWU9PT0icmdiYSIpe2NvbnN0IGk9blszXS5ldmFsdWF0ZShlKSoyNTU7cj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSxpKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbCIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLDEpO2kmJihyPWkpfWVsc2UgaWYodGhpcy5fdmFsdWU9PT0iaHNsYSIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLG5bM10uZXZhbHVhdGUoZSkpO2kmJihyPWkpfXJldHVybiByLnRvQ3NzSGV4U3RyaW5nKCl9X2V2YWx1YXRlRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBGdChuKSYmIUZ0KHIpP24uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT9yLmluY2x1ZGVzKG4pOihGdChyKSYmRnQobikmJmNvbnNvbGUuZXJyb3IoIkVxdWFscyBsZWZ0IGFuZCByaWdodCBib3RoIGNhbid0IGJlIGFycmF5IGF0IHRoZSBzYW1lIHRpbWUiKSxuPT1yKX1fZXZhbHVhdGVOb3RFcXVhbHMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIEZ0KG4pJiYhRnQocik/IW4uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT8hci5pbmNsdWRlcyhuKTooRnQocikmJkZ0KG4pJiZjb25zb2xlLmVycm9yKCJOb3RFcXVhbHMgbGVmdCBhbmQgcmlnaHQgYm90aCBjYW4ndCBiZSBhcnJheSBhdCB0aGUgc2FtZSB0aW1lIiksbiE9cil9fWZ1bmN0aW9uIGRmKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDtjb25zdCBlPVsiJSJdO2Zvcihjb25zdCBuIG9mIGUpaWYodC5lbmRzV2l0aChuKSlyZXR1cm4gdC5zbGljZSgwLC1uLmxlbmd0aCkudHJpbSgpO3JldHVybiB0LnRyaW0oKX1mdW5jdGlvbiBtaSh0KXtyZXR1cm4gdC5fdmFsdWU9PT0iZmVhdHVyZSJ9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gRWYodCxlLG4pe3JldHVybiBlPVVlKGUpLFJmKHQsWm4oKT9SZWZsZWN0LmNvbnN0cnVjdChlLG58fFtdLFVlKHQpLmNvbnN0cnVjdG9yKTplLmFwcGx5KHQsbikpfWZ1bmN0aW9uIEZpKHQsZSxuKXtpZihabigpKXJldHVybiBSZWZsZWN0LmNvbnN0cnVjdC5hcHBseShudWxsLGFyZ3VtZW50cyk7dmFyIHI9W251bGxdO3IucHVzaC5hcHBseShyLGUpO3ZhciBpPW5ldyh0LmJpbmQuYXBwbHkodCxyKSk7cmV0dXJuIG4mJmplKGksbi5wcm90b3R5cGUpLGl9ZnVuY3Rpb24gWm4oKXt0cnl7dmFyIHQ9IUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpfWNhdGNoe31yZXR1cm4oWm49ZnVuY3Rpb24oKXtyZXR1cm4hIXR9KSgpfWZ1bmN0aW9uIF9mKHQsZSl7aWYodHlwZW9mIHQhPSJvYmplY3QifHwhdClyZXR1cm4gdDt2YXIgbj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZih0eXBlb2YgciE9Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oZT09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKHQpfWZ1bmN0aW9uIHBmKHQpe3ZhciBlPV9mKHQsInN0cmluZyIpO3JldHVybiB0eXBlb2YgZT09InN5bWJvbCI/ZTpTdHJpbmcoZSl9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIEd0PXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxHdCh0KX1mdW5jdGlvbiB3aSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIElpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxwZihyLmtleSkscil9fWZ1bmN0aW9uIE5pKHQsZSxuKXtyZXR1cm4gZSYmSWkodC5wcm90b3R5cGUsZSksbiYmSWkodCxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0fWZ1bmN0aW9uIHlmKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGUmJmplKHQsZSl9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIFVlPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKG4pe3JldHVybiBuLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pfSxVZSh0KX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBqZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGkpe3JldHVybiByLl9fcHJvdG9fXz1pLHJ9LGplKHQsZSl9ZnVuY3Rpb24gQWYodCl7dHJ5e3JldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKSE9PS0xfWNhdGNoe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIn19ZnVuY3Rpb24gUW4odCl7dmFyIGU9dHlwZW9mIE1hcD09ImZ1bmN0aW9uIj9uZXcgTWFwOnZvaWQgMDtyZXR1cm4gUW49ZnVuY3Rpb24ocil7aWYocj09PW51bGx8fCFBZihyKSlyZXR1cm4gcjtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2lmKHR5cGVvZiBlPCJ1Iil7aWYoZS5oYXMocikpcmV0dXJuIGUuZ2V0KHIpO2Uuc2V0KHIsaSl9ZnVuY3Rpb24gaSgpe3JldHVybiBGaShyLGFyZ3VtZW50cyxVZSh0aGlzKS5jb25zdHJ1Y3Rvcil9cmV0dXJuIGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGplKGkscil9LFFuKHQpfWZ1bmN0aW9uIFRmKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBSZih0LGUpe2lmKGUmJih0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKSlyZXR1cm4gZTtpZihlIT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIFRmKHQpfWZ1bmN0aW9uIHhmKHQpe3JldHVybiBPZih0KXx8YmYodCl8fE1pKHQpfHxnZigpfWZ1bmN0aW9uIE9mKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEpuKHQpfWZ1bmN0aW9uIGJmKHQpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fHRbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbSh0KX1mdW5jdGlvbiBNaSh0LGUpe2lmKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gSm4odCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIEpuKHQsZSl9fWZ1bmN0aW9uIEpuKHQsZSl7KGU9PW51bGx8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gZ2YoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIFNmKHQsZSl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj1NaSh0KSl8fGUmJnQmJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciIpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIG89ITAscz0hMSx1O3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwodCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gbz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtzPSEwLHU9YX0sZjpmdW5jdGlvbigpe3RyeXshbyYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IHV9fX19dmFyIFR0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gWnQodCxlKXtyZXR1cm4gdD10LnNsaWNlKCksdC5wdXNoKGUpLHR9ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gZT1lLnNsaWNlKCksZS51bnNoaWZ0KHQpLGV9dmFyIG1mPWZ1bmN0aW9uKHQpe3lmKGUsdCk7ZnVuY3Rpb24gZShuKXt2YXIgcjtyZXR1cm4gd2kodGhpcyxlKSxyPUVmKHRoaXMsZSxbJ0pTT05QYXRoIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggIm5ldyIgKGl0IHByZXZlbnRzIHJldHVybiBvZiAodW53cmFwcGVkKSBzY2FsYXIgdmFsdWVzKSddKSxyLmF2b2lkTmV3PSEwLHIudmFsdWU9bixyLm5hbWU9Ik5ld0Vycm9yIixyfXJldHVybiBOaShlKX0oUW4oRXJyb3IpKTtmdW5jdGlvbiBxKHQsZSxuLHIsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcSkpdHJ5e3JldHVybiBuZXcgcSh0LGUsbixyLGkpfWNhdGNoKGEpe2lmKCFhLmF2b2lkTmV3KXRocm93IGE7cmV0dXJuIGEudmFsdWV9dHlwZW9mIHQ9PSJzdHJpbmciJiYoaT1yLHI9bixuPWUsZT10LHQ9bnVsbCk7dmFyIG89dCYmR3QodCk9PT0ib2JqZWN0IjtpZih0PXR8fHt9LHRoaXMuanNvbj10Lmpzb258fG4sdGhpcy5wYXRoPXQucGF0aHx8ZSx0aGlzLnJlc3VsdFR5cGU9dC5yZXN1bHRUeXBlfHwidmFsdWUiLHRoaXMuZmxhdHRlbj10LmZsYXR0ZW58fCExLHRoaXMud3JhcD1UdC5jYWxsKHQsIndyYXAiKT90LndyYXA6ITAsdGhpcy5zYW5kYm94PXQuc2FuZGJveHx8e30sdGhpcy5wcmV2ZW50RXZhbD10LnByZXZlbnRFdmFsfHwhMSx0aGlzLnBhcmVudD10LnBhcmVudHx8bnVsbCx0aGlzLnBhcmVudFByb3BlcnR5PXQucGFyZW50UHJvcGVydHl8fG51bGwsdGhpcy5jYWxsYmFjaz10LmNhbGxiYWNrfHxyfHxudWxsLHRoaXMub3RoZXJUeXBlQ2FsbGJhY2s9dC5vdGhlclR5cGVDYWxsYmFja3x8aXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBzdXBwbHkgYW4gb3RoZXJUeXBlQ2FsbGJhY2sgY2FsbGJhY2sgb3B0aW9uIHdpdGggdGhlIEBvdGhlcigpIG9wZXJhdG9yLiIpfSx0LmF1dG9zdGFydCE9PSExKXt2YXIgcz17cGF0aDpvP3QucGF0aDplfTtvPyJqc29uImluIHQmJihzLmpzb249dC5qc29uKTpzLmpzb249bjt2YXIgdT10aGlzLmV2YWx1YXRlKHMpO2lmKCF1fHxHdCh1KSE9PSJvYmplY3QiKXRocm93IG5ldyBtZih1KTtyZXR1cm4gdX19cS5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXRoaXMucGFyZW50LHM9dGhpcy5wYXJlbnRQcm9wZXJ0eSx1PXRoaXMuZmxhdHRlbixhPXRoaXMud3JhcDtpZih0aGlzLmN1cnJSZXN1bHRUeXBlPXRoaXMucmVzdWx0VHlwZSx0aGlzLmN1cnJQcmV2ZW50RXZhbD10aGlzLnByZXZlbnRFdmFsLHRoaXMuY3VyclNhbmRib3g9dGhpcy5zYW5kYm94LG49bnx8dGhpcy5jYWxsYmFjayx0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjaz1yfHx0aGlzLm90aGVyVHlwZUNhbGxiYWNrLGU9ZXx8dGhpcy5qc29uLHQ9dHx8dGhpcy5wYXRoLHQmJkd0KHQpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KHQpKXtpZighdC5wYXRoJiZ0LnBhdGghPT0iIil0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSAicGF0aCIgcHJvcGVydHkgd2hlbiBwcm92aWRpbmcgYW4gb2JqZWN0IGFyZ3VtZW50IHRvIEpTT05QYXRoLmV2YWx1YXRlKCkuJyk7aWYoIVR0LmNhbGwodCwianNvbiIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHN1cHBseSBhICJqc29uIiBwcm9wZXJ0eSB3aGVuIHByb3ZpZGluZyBhbiBvYmplY3QgYXJndW1lbnQgdG8gSlNPTlBhdGguZXZhbHVhdGUoKS4nKTt2YXIgbD10O2U9bC5qc29uLHU9VHQuY2FsbCh0LCJmbGF0dGVuIik/dC5mbGF0dGVuOnUsdGhpcy5jdXJyUmVzdWx0VHlwZT1UdC5jYWxsKHQsInJlc3VsdFR5cGUiKT90LnJlc3VsdFR5cGU6dGhpcy5jdXJyUmVzdWx0VHlwZSx0aGlzLmN1cnJTYW5kYm94PVR0LmNhbGwodCwic2FuZGJveCIpP3Quc2FuZGJveDp0aGlzLmN1cnJTYW5kYm94LGE9VHQuY2FsbCh0LCJ3cmFwIik/dC53cmFwOmEsdGhpcy5jdXJyUHJldmVudEV2YWw9VHQuY2FsbCh0LCJwcmV2ZW50RXZhbCIpP3QucHJldmVudEV2YWw6dGhpcy5jdXJyUHJldmVudEV2YWwsbj1UdC5jYWxsKHQsImNhbGxiYWNrIik/dC5jYWxsYmFjazpuLHRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrPVR0LmNhbGwodCwib3RoZXJUeXBlQ2FsbGJhY2siKT90Lm90aGVyVHlwZUNhbGxiYWNrOnRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrLG89VHQuY2FsbCh0LCJwYXJlbnQiKT90LnBhcmVudDpvLHM9VHQuY2FsbCh0LCJwYXJlbnRQcm9wZXJ0eSIpP3QucGFyZW50UHJvcGVydHk6cyx0PXQucGF0aH1pZihvPW98fG51bGwscz1zfHxudWxsLEFycmF5LmlzQXJyYXkodCkmJih0PXEudG9QYXRoU3RyaW5nKHQpKSwhKCF0JiZ0IT09IiJ8fCFlKSl7dmFyIGQ9cS50b1BhdGhBcnJheSh0KTtkWzBdPT09IiQiJiZkLmxlbmd0aD4xJiZkLnNoaWZ0KCksdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9bnVsbDt2YXIgXz10aGlzLl90cmFjZShkLGUsWyIkIl0sbyxzLG4pLmZpbHRlcihmdW5jdGlvbihPKXtyZXR1cm4gTyYmIU8uaXNQYXJlbnRTZWxlY3Rvcn0pO3JldHVybiBfLmxlbmd0aD8hYSYmXy5sZW5ndGg9PT0xJiYhX1swXS5oYXNBcnJFeHByP3RoaXMuX2dldFByZWZlcnJlZE91dHB1dChfWzBdKTpfLnJlZHVjZShmdW5jdGlvbihPLGIpe3ZhciBGPWkuX2dldFByZWZlcnJlZE91dHB1dChiKTtyZXR1cm4gdSYmQXJyYXkuaXNBcnJheShGKT9PPU8uY29uY2F0KEYpOk8ucHVzaChGKSxPfSxbXSk6YT9bXTp2b2lkIDB9fSxxLnByb3RvdHlwZS5fZ2V0UHJlZmVycmVkT3V0cHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VyclJlc3VsdFR5cGU7c3dpdGNoKGUpe2Nhc2UiYWxsIjp7dmFyIG49QXJyYXkuaXNBcnJheSh0LnBhdGgpP3QucGF0aDpxLnRvUGF0aEFycmF5KHQucGF0aCk7cmV0dXJuIHQucG9pbnRlcj1xLnRvUG9pbnRlcihuKSx0LnBhdGg9dHlwZW9mIHQucGF0aD09InN0cmluZyI/dC5wYXRoOnEudG9QYXRoU3RyaW5nKHQucGF0aCksdH1jYXNlInZhbHVlIjpjYXNlInBhcmVudCI6Y2FzZSJwYXJlbnRQcm9wZXJ0eSI6cmV0dXJuIHRbZV07Y2FzZSJwYXRoIjpyZXR1cm4gcS50b1BhdGhTdHJpbmcodFtlXSk7Y2FzZSJwb2ludGVyIjpyZXR1cm4gcS50b1BvaW50ZXIodC5wYXRoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gcmVzdWx0IHR5cGUiKX19LHEucHJvdG90eXBlLl9oYW5kbGVDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7aWYoZSl7dmFyIHI9dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KHQpO3QucGF0aD10eXBlb2YgdC5wYXRoPT0ic3RyaW5nIj90LnBhdGg6cS50b1BhdGhTdHJpbmcodC5wYXRoKSxlKHIsbix0KX19LHEucHJvdG90eXBlLl90cmFjZT1mdW5jdGlvbih0LGUsbixyLGksbyxzLHUpe3ZhciBhPXRoaXMsbDtpZighdC5sZW5ndGgpcmV0dXJuIGw9e3BhdGg6bix2YWx1ZTplLHBhcmVudDpyLHBhcmVudFByb3BlcnR5OmksaGFzQXJyRXhwcjpzfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInZhbHVlIiksbDt2YXIgZD10WzBdLF89dC5zbGljZSgxKSxPPVtdO2Z1bmN0aW9uIGIoRCl7QXJyYXkuaXNBcnJheShEKT9ELmZvckVhY2goZnVuY3Rpb24oeXQpe08ucHVzaCh5dCl9KTpPLnB1c2goRCl9aWYoKHR5cGVvZiBkIT0ic3RyaW5nInx8dSkmJmUmJlR0LmNhbGwoZSxkKSliKHRoaXMuX3RyYWNlKF8sZVtkXSxadChuLGQpLGUsZCxvLHMpKTtlbHNlIGlmKGQ9PT0iKiIpdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2IoYS5fdHJhY2UoXyxlW0RdLFp0KG4sRCksZSxELG8sITAsITApKX0pO2Vsc2UgaWYoZD09PSIuLiIpYih0aGlzLl90cmFjZShfLGUsbixyLGksbyxzKSksdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe0d0KGVbRF0pPT09Im9iamVjdCImJmIoYS5fdHJhY2UodC5zbGljZSgpLGVbRF0sWnQobixEKSxlLEQsbywhMCkpfSk7ZWxzZXtpZihkPT09Il4iKXJldHVybiB0aGlzLl9oYXNQYXJlbnRTZWxlY3Rvcj0hMCx7cGF0aDpuLnNsaWNlKDAsLTEpLGV4cHI6Xyxpc1BhcmVudFNlbGVjdG9yOiEwfTtpZihkPT09In4iKXJldHVybiBsPXtwYXRoOlp0KG4sZCksdmFsdWU6aSxwYXJlbnQ6cixwYXJlbnRQcm9wZXJ0eTpudWxsfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInByb3BlcnR5IiksbDtpZihkPT09IiQiKWIodGhpcy5fdHJhY2UoXyxlLG4sbnVsbCxudWxsLG8scykpO2Vsc2UgaWYoL14oXHgyRD9bMC05XSopOihceDJEP1swLTldKik6PyhbMC05XSopJC8udGVzdChkKSliKHRoaXMuX3NsaWNlKGQsXyxlLG4scixpLG8pKTtlbHNlIGlmKGQuaW5kZXhPZigiPygiKT09PTApe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbPyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7dmFyIEY9ZC5yZXBsYWNlKC9eXD9cKCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/KVwpJC8sIiQxIiksUz0vQCg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pPygoPzpbXDAtPkAtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsnXFtdKFw/P1woKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1wpKSg/ISg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pXClcXSlbJ1xdXS9nLmV4ZWMoRik7Uz90aGlzLl93YWxrKGUsZnVuY3Rpb24oRCl7dmFyIHl0PVtTWzJdXSxvdD1TWzFdP2VbRF1bU1sxXV06ZVtEXSxndD1hLl90cmFjZSh5dCxvdCxuLHIsaSxvLCEwKTtndC5sZW5ndGg+MCYmYihhLl90cmFjZShfLGVbRF0sWnQobixEKSxlLEQsbywhMCkpfSk6dGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2EuX2V2YWwoRixlW0RdLEQsbixyLGkpJiZiKGEuX3RyYWNlKF8sZVtEXSxadChuLEQpLGUsRCxvLCEwKSl9KX1lbHNlIGlmKGRbMF09PT0iKCIpe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbKGV4cHIpXSBwcmV2ZW50ZWQgaW4gSlNPTlBhdGggZXhwcmVzc2lvbi4iKTtiKHRoaXMuX3RyYWNlKHRyKHRoaXMuX2V2YWwoZCxlLG5bbi5sZW5ndGgtMV0sbi5zbGljZSgwLC0xKSxyLGkpLF8pLGUsbixyLGksbyxzKSl9ZWxzZSBpZihkWzBdPT09IkAiKXt2YXIgTj0hMSxnPWQuc2xpY2UoMSwtMik7c3dpdGNoKGcpe2Nhc2Uic2NhbGFyIjooIWV8fCFbIm9iamVjdCIsImZ1bmN0aW9uIl0uaW5jbHVkZXMoR3QoZSkpKSYmKE49ITApO2JyZWFrO2Nhc2UiYm9vbGVhbiI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpjYXNlImZ1bmN0aW9uIjpHdChlKT09PWcmJihOPSEwKTticmVhaztjYXNlImludGVnZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmIShlJTEpJiYoTj0hMCk7YnJlYWs7Y2FzZSJudW1iZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmKE49ITApO2JyZWFrO2Nhc2Uibm9uRmluaXRlIjp0eXBlb2YgZT09Im51bWJlciImJiFOdW1iZXIuaXNGaW5pdGUoZSkmJihOPSEwKTticmVhaztjYXNlIm9iamVjdCI6ZSYmR3QoZSk9PT1nJiYoTj0hMCk7YnJlYWs7Y2FzZSJhcnJheSI6QXJyYXkuaXNBcnJheShlKSYmKE49ITApO2JyZWFrO2Nhc2Uib3RoZXIiOk49dGhpcy5jdXJyT3RoZXJUeXBlQ2FsbGJhY2soZSxuLHIsaSk7YnJlYWs7Y2FzZSJudWxsIjplPT09bnVsbCYmKE49ITApO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB2YWx1ZSB0eXBlICIrZyl9aWYoTilyZXR1cm4gbD17cGF0aDpuLHZhbHVlOmUscGFyZW50OnIscGFyZW50UHJvcGVydHk6aX0sdGhpcy5faGFuZGxlQ2FsbGJhY2sobCxvLCJ2YWx1ZSIpLGx9ZWxzZSBpZihkWzBdPT09ImAiJiZlJiZUdC5jYWxsKGUsZC5zbGljZSgxKSkpe3ZhciBHPWQuc2xpY2UoMSk7Yih0aGlzLl90cmFjZShfLGVbR10sWnQobixHKSxlLEcsbyxzLCEwKSl9ZWxzZSBpZihkLmluY2x1ZGVzKCIsIikpe3ZhciBLPWQuc3BsaXQoIiwiKSxWPVNmKEspLGl0O3RyeXtmb3IoVi5zKCk7IShpdD1WLm4oKSkuZG9uZTspe3ZhciBsdD1pdC52YWx1ZTtiKHRoaXMuX3RyYWNlKHRyKGx0LF8pLGUsbixyLGksbywhMCkpfX1jYXRjaChEKXtWLmUoRCl9ZmluYWxseXtWLmYoKX19ZWxzZSF1JiZlJiZUdC5jYWxsKGUsZCkmJmIodGhpcy5fdHJhY2UoXyxlW2RdLFp0KG4sZCksZSxkLG8scywhMCkpfWlmKHRoaXMuX2hhc1BhcmVudFNlbGVjdG9yKWZvcih2YXIgcnQ9MDtydDxPLmxlbmd0aDtydCsrKXt2YXIgQnQ9T1tydF07aWYoQnQmJkJ0LmlzUGFyZW50U2VsZWN0b3Ipe3ZhciBUPXRoaXMuX3RyYWNlKEJ0LmV4cHIsZSxCdC5wYXRoLHIsaSxvLHMpO2lmKEFycmF5LmlzQXJyYXkoVCkpe09bcnRdPVRbMF07Zm9yKHZhciBCPVQubGVuZ3RoLCQ9MTskPEI7JCsrKXJ0KyssTy5zcGxpY2UocnQsMCxUWyRdKX1lbHNlIE9bcnRdPVR9fXJldHVybiBPfSxxLnByb3RvdHlwZS5fd2Fsaz1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBuPXQubGVuZ3RoLHI9MDtyPG47cisrKWUocik7ZWxzZSB0JiZHdCh0KT09PSJvYmplY3QiJiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2UoaSl9KX0scS5wcm90b3R5cGUuX3NsaWNlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciB1PW4ubGVuZ3RoLGE9dC5zcGxpdCgiOiIpLGw9YVsyXSYmTnVtYmVyLnBhcnNlSW50KGFbMl0pfHwxLGQ9YVswXSYmTnVtYmVyLnBhcnNlSW50KGFbMF0pfHwwLF89YVsxXSYmTnVtYmVyLnBhcnNlSW50KGFbMV0pfHx1O2Q9ZDwwP01hdGgubWF4KDAsZCt1KTpNYXRoLm1pbih1LGQpLF89XzwwP01hdGgubWF4KDAsXyt1KTpNYXRoLm1pbih1LF8pO2Zvcih2YXIgTz1bXSxiPWQ7YjxfO2IrPWwpe3ZhciBGPXRoaXMuX3RyYWNlKHRyKGIsZSksbixyLGksbyxzLCEwKTtGLmZvckVhY2goZnVuY3Rpb24oUyl7Ty5wdXNoKFMpfSl9cmV0dXJuIE99fSxxLnByb3RvdHlwZS5fZXZhbD1mdW5jdGlvbih0LGUsbixyLGksbyl7dGhpcy5jdXJyU2FuZGJveC5fJF9wYXJlbnRQcm9wZXJ0eT1vLHRoaXMuY3VyclNhbmRib3guXyRfcGFyZW50PWksdGhpcy5jdXJyU2FuZGJveC5fJF9wcm9wZXJ0eT1uLHRoaXMuY3VyclNhbmRib3guXyRfcm9vdD10aGlzLmpzb24sdGhpcy5jdXJyU2FuZGJveC5fJF92PWU7dmFyIHM9dC5pbmNsdWRlcygiQHBhdGgiKTtzJiYodGhpcy5jdXJyU2FuZGJveC5fJF9wYXRoPXEudG9QYXRoU3RyaW5nKHIuY29uY2F0KFtuXSkpKTt2YXIgdT0ic2NyaXB0OiIrdDtpZighcS5jYWNoZVt1XSl7dmFyIGE9dC5yZXBsYWNlKC9AcGFyZW50UHJvcGVydHkvZywiXyRfcGFyZW50UHJvcGVydHkiKS5yZXBsYWNlKC9AcGFyZW50L2csIl8kX3BhcmVudCIpLnJlcGxhY2UoL0Bwcm9wZXJ0eS9nLCJfJF9wcm9wZXJ0eSIpLnJlcGxhY2UoL0Byb290L2csIl8kX3Jvb3QiKS5yZXBsYWNlKC9AKFtcdC1cciBcKVwuXFtceEEwXHUxNjgwXHUyMDAwLVx1MjAwQVx1MjAyOFx1MjAyOVx1MjAyRlx1MjA1Rlx1MzAwMFx1RkVGRl0pL2csIl8kX3YkMSIpO3MmJihhPWEucmVwbGFjZSgvQHBhdGgvZywiXyRfcGF0aCIpKSxxLmNhY2hlW3VdPW5ldyB0aGlzLnZtLlNjcmlwdChhKX10cnl7cmV0dXJuIHEuY2FjaGVbdV0ucnVuSW5OZXdDb250ZXh0KHRoaXMuY3VyclNhbmRib3gpfWNhdGNoKGwpe3Rocm93IG5ldyBFcnJvcigianNvblBhdGg6ICIrbC5tZXNzYWdlKyI6ICIrdCl9fSxxLmNhY2hlPXt9LHEudG9QYXRoU3RyaW5nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iJCIsaT0xO2k8bjtpKyspL14ofnxcXnxAKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1woXCkpJC8udGVzdChlW2ldKXx8KHIrPS9eW1wqMC05XSskLy50ZXN0KGVbaV0pPyJbIitlW2ldKyJdIjoiWyciK2VbaV0rIiddIik7cmV0dXJuIHJ9LHEudG9Qb2ludGVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iIixpPTE7aTxuO2krKykvXih+fFxefEAoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XChcKSkkLy50ZXN0KGVbaV0pfHwocis9Ii8iK2VbaV0udG9TdHJpbmcoKS5yZXBsYWNlKC9+L2csIn4wIikucmVwbGFjZSgvXC8vZywifjEiKSk7cmV0dXJuIHJ9LHEudG9QYXRoQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9cS5jYWNoZTtpZihlW3RdKXJldHVybiBlW3RdLmNvbmNhdCgpO3ZhciBuPVtdLHI9dC5yZXBsYWNlKC9AKD86bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmd8aW50ZWdlcnx1bmRlZmluZWR8bm9uRmluaXRlfHNjYWxhcnxhcnJheXxvYmplY3R8ZnVuY3Rpb258b3RoZXIpXChcKS9nLCI7JCY7IikucmVwbGFjZSgvWydcW10oXD8/XCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XCkpWydcXV0oPyEoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKVxdKS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsjIisobi5wdXNoKHMpLTEpKyJdIn0pLnJlcGxhY2UoL1xbWyInXSgoPzpbXDAtJlwoLVxcXF4tXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsiJ11cXS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsnIitzLnJlcGxhY2UoL1wuL2csIiVAJSIpLnJlcGxhY2UoL34vZywiJSVAQCUlIikrIiddIn0pLnJlcGxhY2UoL34vZywiO347IikucmVwbGFjZSgvWyInXT9cLlsiJ10/KD8hKD86W1wwLVpcXC1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSpcXSl8XFtbIiddPy9nLCI7IikucmVwbGFjZSgvJUAlL2csIi4iKS5yZXBsYWNlKC8lJUBAJSUvZywifiIpLnJlcGxhY2UoLyg/OjspPyhcXispKD86Oyk/L2csZnVuY3Rpb24obyxzKXtyZXR1cm4iOyIrcy5zcGxpdCgiIikuam9pbigiOyIpKyI7In0pLnJlcGxhY2UoLzs7O3w7Oy9nLCI7Li47IikucmVwbGFjZSgvOyR8Jz9cXXwnJC9nLCIiKSxpPXIuc3BsaXQoIjsiKS5tYXAoZnVuY3Rpb24obyl7dmFyIHM9by5tYXRjaCgvIyhbMC05XSspLyk7cmV0dXJuIXN8fCFzWzFdP286bltzWzFdXX0pO3JldHVybiBlW3RdPWksZVt0XS5jb25jYXQoKX07dmFyIEZmPWZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz0wO288aTtvKyspe3ZhciBzPWVbb107cihzKSYmbi5wdXNoKGUuc3BsaWNlKG8tLSwxKVswXSl9fSx3Zj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7d2kodGhpcyx0KSx0aGlzLmNvZGU9ZX1yZXR1cm4gTmkodCxbe2tleToicnVuSW5OZXdDb250ZXh0Iix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLmNvZGUsaT1PYmplY3Qua2V5cyhuKSxvPVtdO0ZmKGksbyxmdW5jdGlvbihkKXtyZXR1cm4gdHlwZW9mIG5bZF09PSJmdW5jdGlvbiJ9KTt2YXIgcz1pLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbltkXX0pLHU9by5yZWR1Y2UoZnVuY3Rpb24oZCxfKXt2YXIgTz1uW19dLnRvU3RyaW5nKCk7cmV0dXJuL2Z1bmN0aW9uLy50ZXN0KE8pfHwoTz0iZnVuY3Rpb24gIitPKSwidmFyICIrXysiPSIrTysiOyIrZH0sIiIpO3I9dStyLCEvKFsiJ10pdXNlIHN0cmljdFwxLy50ZXN0KHIpJiYhaS5pbmNsdWRlcygiYXJndW1lbnRzIikmJihyPSJ2YXIgYXJndW1lbnRzID0gdW5kZWZpbmVkOyIrcikscj1yLnJlcGxhY2UoLztbXHQtXHIgXHhBMFx1MTY4MFx1MjAwMC1cdTIwMEFcdTIwMjhcdTIwMjlcdTIwMkZcdTIwNUZcdTMwMDBcdUZFRkZdKiQvLCIiKTt2YXIgYT1yLmxhc3RJbmRleE9mKCI7IiksbD1hPi0xP3Iuc2xpY2UoMCxhKzEpKyIgcmV0dXJuICIrci5zbGljZShhKzEpOiIgcmV0dXJuICIrcjtyZXR1cm4gRmkoRnVuY3Rpb24saS5jb25jYXQoW2xdKSkuYXBwbHkodm9pZCAwLHhmKHMpKX19XSksdH0oKTtxLnByb3RvdHlwZS52bT17U2NyaXB0OndmfTtjb25zdCBJZj0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiLE5mPXQ9PkFycmF5LmZyb20od2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkodCkpKS5tYXAoZT0+SWZbZSV0XSkuam9pbigiIikudG9Mb3dlckNhc2UoKSxDaT10PT57aWYodHlwZW9mIHQhPSJvYmplY3QifHx0PT09bnVsbClyZXR1cm4gdDtmb3IoY29uc3QgZSBpbiB0KWlmKHR5cGVvZiB0W2VdPT0ic3RyaW5nIil0cnl7dFtlXS5zdGFydHNXaXRoKCJ7IikmJnRbZV0uZW5kc1dpdGgoIn0iKSYmKHRbZV09SlNPTi5wYXJzZSh0W2VdKSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiSW52YWxpZCBKU09OOiIsdFtlXSl9ZWxzZSB0eXBlb2YgdFtlXT09Im9iamVjdCImJih0W2VdPUNpKHRbZV0pKTtyZXR1cm4gdH0sZXI9ImN6bV8iO2Z1bmN0aW9uIE1mKHQsZSl7bGV0IG49dCxyPSIiO2NvbnN0IGk9W107bGV0IG89bi5pbmRleE9mKCIkeyIpO2NvbnN0IHM9dHlwZW9mIGU8InUiLHU9e30sYT0vXlwkLi87Zm9yKDtvPj0wOylpZihDZihuLG8pKXtjb25zdCBsPXZmKG4sbyk7cis9bi5zbGljZSgwLGwrMSksbj1uLnNsaWNlKGwrMSksbz1uLmluZGV4T2YoIiR7Iil9ZWxzZXtyKz1uLnNsaWNlKDAsbyk7Y29uc3QgbD1EZihuLG8pLGQ9bi5zbGljZShvKzIsbCk7aWYoYS50ZXN0KGQpKXtpZighcylyZXR1cm5bcixbXV07bGV0IF89dVtkXTtpZighXyl0cnl7Xz1xKHtqc29uOmUscGF0aDpkfSksdVtkXT1ffWNhdGNoe3JldHVybltyLFtdXX1pZihfLmxlbmd0aCE9PTApe2NvbnN0IE89TmYoMTApO2kucHVzaCh7bGl0ZXJhbE5hbWU6TyxsaXRlcmFsVmFsdWU6X1swXX0pLHIrPU99ZWxzZSByZXR1cm5bImZhbHNlIixbXV19ZWxzZXtjb25zdCBfPUxmKGQpO3IrPWAke2VyfSR7X31gfW49bi5zbGljZShsKzEpLG89bi5pbmRleE9mKCIkeyIpfXJldHVybiByKz1uLFtyLGldfWZ1bmN0aW9uIENmKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoIiciKSxyPXQuaW5kZXhPZignIicpO3JldHVybiBuPj0wJiZuPGU/dC5pbmRleE9mKCInIixuKzEpPj1lOnI+PTAmJnI8ZT90LmluZGV4T2YoJyInLHIrMSk+PWU6ITF9ZnVuY3Rpb24gdmYodCxlKXtjb25zdCBuPXQuaW5kZXhPZigiJyIpLHI9dC5pbmRleE9mKCciJyk7cmV0dXJuIG4+PTAmJm48ZT90LmluZGV4T2YoIiciLG4rMSk6cj49MCYmcjxlP3QuaW5kZXhPZignIicscisxKTotMX1mdW5jdGlvbiBEZih0LGUpe2NvbnN0IG49dC5pbmRleE9mKCJ9IixlKTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJyZXBsYWNlVmFyaWFibGU6IFVubWF0Y2hlZCB7LiIpO3JldHVybiBufWNvbnN0IGNlPXQ9PmAkcmVlYXJ0aF8ke3R9XyRgLG5yPXsiWyI6Y2UoIm9wZW5lZF9zcXVhcmVfYnJhY2tldCIpLCJdIjpjZSgiY2xvc2VkX3NxdWFyZV9icmFja2V0IiksInsiOmNlKCJvcGVuZWRfY3VybHlfYnJhY2tldCIpLCJ9IjpjZSgiY2xvc2VkX2N1cmx5X2JyYWNrZXQiKSwiKCI6Y2UoIm9wZW5lZF9wYXJlbnRoZXNlcyIpLCIpIjpjZSgiY2xvc2VkX3BhcmVudGhlc2VzIiksIi0iOmNlKCJoeXBoZW4iKX0sTGY9dD0+e2NvbnN0IGU9dC5yZXBsYWNlKC8tL2csbnJbIi0iXSk7cmV0dXJuLyhcXXxcKXxcfSlbXlsuXSskLy50ZXN0KGUpP09iamVjdC5lbnRyaWVzKG5yKS5yZWR1Y2UoKG4sW3IsaV0pPT5uLnJlcGxhY2VBbGwocixpKSxlKTplfSxQZj10PT5PYmplY3QuZW50cmllcyhucikucmVkdWNlKChlLFtuLHJdKT0+ZS5yZXBsYWNlQWxsKHIsbiksdCksQmY9bmV3IFNldChLaCksdmk9bmV3IFNldChaaCk7ZnVuY3Rpb24gVyh0LGUpe2xldCBuPW5ldyBFcnJvcigiZmFpbGVkIHRvIHBhcnNlIik7Y29uc3Qgcj1lLnR5cGU7aWYocj09PSJMaXRlcmFsIiluPVVmKGUpO2Vsc2UgaWYocj09PSJDYWxsRXhwcmVzc2lvbiIpbj1HZih0LGUpO2Vsc2UgaWYocj09PSJJZGVudGlmaWVyIiluPSRmKGUpO2Vsc2UgaWYocj09PSJVbmFyeUV4cHJlc3Npb24iKXtjb25zdCBpPWUub3BlcmF0b3Isbz1XKHQsZS5hcmd1bWVudCk7aWYoQmYuaGFzKGkpKW49bmV3IFAoTS5VTkFSWSxpLG8pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdG9yICIke2l9Ii5gKX1lbHNlIGlmKHI9PT0iQmluYXJ5RXhwcmVzc2lvbiIpe2NvbnN0IGk9ZS5vcGVyYXRvcixvPVcodCxlLmxlZnQpLHM9Vyh0LGUucmlnaHQpO2lmKHZpLmhhcyhpKSluPW5ldyBQKE0uQklOQVJZLGksbyxzKTtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcGVyYXRvciAiJHtpfSIuYCl9ZWxzZSBpZihyPT09IkxvZ2ljYWxFeHByZXNzaW9uIil7Y29uc3QgaT1lLm9wZXJhdG9yLG89Vyh0LGUubGVmdCkscz1XKHQsZS5yaWdodCk7dmkuaGFzKGkpJiYobj1uZXcgUChNLkJJTkFSWSxpLG8scykpfWVsc2UgaWYocj09PSJDb25kaXRpb25hbEV4cHJlc3Npb24iKXtjb25zdCBpPVcodCxlLnRlc3QpLG89Vyh0LGUuY29uc2VxdWVudCkscz1XKHQsZS5hbHRlcm5hdGUpO249bmV3IFAoTS5DT05ESVRJT05BTCwiPyIsbyxzLGkpfWVsc2UgaWYocj09PSJNZW1iZXJFeHByZXNzaW9uIiluPVdmKHQsZSk7ZWxzZSBpZihyPT09IkFycmF5RXhwcmVzc2lvbiIpe2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzxlLmVsZW1lbnRzLmxlbmd0aDtvKyspaVtvXT1XKHQsZS5lbGVtZW50c1tvXSk7bj1uZXcgUChNLkFSUkFZLGkpfWVsc2UgdGhyb3cgcj09PSJDb21wb3VuZCI/bmV3IEVycm9yKCJQcm92aWRlIGV4YWN0bHkgb25lIGV4cHJlc3Npb24uIik6bmV3IEVycm9yKCJDYW5ub3QgcGFyc2UgZXhwcmVzc2lvbi4iKTtyZXR1cm4gbn1mdW5jdGlvbiBVZih0KXtjb25zdCBlPXR5cGVvZiB0LnZhbHVlO2lmKHQudmFsdWU9PT1udWxsKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVMTCxudWxsKTtpZihlPT09ImJvb2xlYW4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfQk9PTEVBTix0LnZhbHVlKTtpZihlPT09Im51bWJlciIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsdC52YWx1ZSk7aWYoZT09PSJzdHJpbmciKXJldHVybiB0LnZhbHVlLmluZGV4T2YoIiR7Iik+PTA/bmV3IFAoTS5WQVJJQUJMRV9JTl9TVFJJTkcsdC52YWx1ZSk6bmV3IFAoTS5MSVRFUkFMX1NUUklORyxqZih0LnZhbHVlKSk7dGhyb3cgbmV3IEVycm9yKGAke3R9IGlzIG5vdCBhIGZ1bmN0aW9uLmApfWZ1bmN0aW9uIGpmKHQpe3JldHVybiB0LnJlcGxhY2UodGYsIlxcIil9ZnVuY3Rpb24gR2YodCxlKXtjb25zdCBuPWUuYXJndW1lbnRzLHI9bi5sZW5ndGg7aWYoZS5jYWxsZWUudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIil7Y29uc3Qgbz1lLmNhbGxlZS5wcm9wZXJ0eS5uYW1lLHM9ZS5jYWxsZWUub2JqZWN0O2lmKG89PT0idGVzdCJ8fG89PT0iZXhlYyIpe2lmKHMuY2FsbGVlLm5hbWUhPT0icmVnRXhwIil0aHJvdyBuZXcgRXJyb3IoYCR7b30gaXMgbm90IGEgZnVuY3Rpb24uYCk7aWYocj09PTApcmV0dXJuIG89PT0idGVzdCI/bmV3IFAoTS5MSVRFUkFMX0JPT0xFQU4sITEpOm5ldyBQKE0uTElURVJBTF9OVUxMLG51bGwpO2NvbnN0IHU9Vyh0LHMpLGE9Vyh0LG5bMF0pO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1LGEpfWVsc2UgaWYobz09PSJ0b1N0cmluZyIpe2NvbnN0IHU9Vyh0LHMpO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1KX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtvfSIuYCl9Y29uc3QgaT1lLmNhbGxlZS5uYW1lO2lmKGk9PT0iY29sb3IiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGkpO2NvbnN0IG89Vyh0LG5bMF0pO2lmKHR5cGVvZiBuWzFdPCJ1Iil7Y29uc3Qgcz1XKHQsblsxXSk7cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLFtvLHNdKX1yZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGksW29dKX1lbHNlIGlmKGk9PT0icmdiInx8aT09PSJoc2wiKXtpZihyPDMpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIHRocmVlIGFyZ3VtZW50cy5gKTtjb25zdCBvPVtXKHQsblswXSksVyh0LG5bMV0pLFcodCxuWzJdKV07cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLG8pfWVsc2UgaWYoaT09PSJyZ2JhInx8aT09PSJoc2xhIil7aWYocjw0KXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBmb3VyIGFyZ3VtZW50cy5gKTtjb25zdCBvPVtXKHQsblswXSksVyh0LG5bMV0pLFcodCxuWzJdKSxXKHQsblszXSldO3JldHVybiBuZXcgUChNLkxJVEVSQUxfQ09MT1IsaSxvKX1lbHNlIGlmKGk9PT0iaXNOYU4ifHxpPT09ImlzRmluaXRlIil7aWYocj09PTApcmV0dXJuIGk9PT0iaXNOYU4iP25ldyBQKE0uTElURVJBTF9CT09MRUFOLCEwKTpuZXcgUChNLkxJVEVSQUxfQk9PTEVBTiwhMSk7Y29uc3Qgbz1XKHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX1lbHNlIGlmKHR5cGVvZiBZbltpXTwidSIpe2lmKHIhPT0xKXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudC5gKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYodHlwZW9mIGtuW2ldPCJ1Iil7aWYociE9PTIpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cy5gKTtjb25zdCBvPVcodCxuWzBdKSxzPVcodCxuWzFdKTtyZXR1cm4gbmV3IFAoTS5CSU5BUlksaSxvLHMpfWVsc2UgaWYoaT09PSJCb29sZWFuIil7aWYocj09PTApcmV0dXJuIG5ldyBQKE0uTElURVJBTF9CT09MRUFOLCExKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJOdW1iZXIiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUiwwKTtjb25zdCBvPVcodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJTdHJpbmciKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX1NUUklORywiIik7Y29uc3Qgbz1XKHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtpfSIuYCl9ZnVuY3Rpb24gJGYodCl7Y29uc3QgZT10Lm5hbWU7aWYoWGYoZSkpe2NvbnN0IG49SGYoZSk7cmV0dXJuIG4uc3Vic3RyaW5nKDAsOCk9PT0idGlsZXMzZF8iP25ldyBQKE0uQlVJTFRJTl9WQVJJQUJMRSxuKTpuZXcgUChNLlZBUklBQkxFLG4pfWVsc2V7aWYoZT09PSJOYU4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE5hTik7aWYoZT09PSJJbmZpbml0eSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsMS8wKTtpZihlPT09InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9VTkRFRklORUQsdm9pZCAwKX10aHJvdyBuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IGRlZmluZWQuYCl9ZnVuY3Rpb24gVmYodCl7Y29uc3QgZT10LnByb3BlcnR5Lm5hbWU7aWYoZT09PSJQSSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsTWF0aC5QSSk7aWYoZT09PSJFIilyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUixNYXRoLkUpO3Rocm93IG5ldyBFcnJvcihgJHtlfSBNYXRoIENvbnN0YW50IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudGApfWZ1bmN0aW9uIHpmKHQpe2NvbnN0IGU9dC5wcm9wZXJ0eS5uYW1lO2lmKGU9PT0iUE9TSVRJVkVfSU5GSU5JVFkiKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dGhyb3cgbmV3IEVycm9yKGAke2V9IE51bWJlciBDb25zdGFudCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnRgKX1mdW5jdGlvbiBXZih0LGUpe2lmKGUub2JqZWN0Lm5hbWU9PT0iTWF0aCIpcmV0dXJuIFZmKGUpO2lmKGUub2JqZWN0Lm5hbWU9PT0iTnVtYmVyIilyZXR1cm4gemYoZSk7bGV0IG47Y29uc3Qgcj1XKHQsZS5vYmplY3QpO3JldHVybiBlLmNvbXB1dGVkPyhuPVcodCxlLnByb3BlcnR5KSxuZXcgUChNLk1FTUJFUiwiYnJhY2tldHMiLHIsbikpOihuPW5ldyBQKE0uTElURVJBTF9TVFJJTkcsZS5wcm9wZXJ0eS5uYW1lKSxuZXcgUChNLk1FTUJFUiwiZG90IixyLG4pKX1mdW5jdGlvbiBYZih0KXtyZXR1cm4gdC5zdWJzdHJpbmcoMCw0KT09PWVyfWZ1bmN0aW9uIEhmKHQpe3JldHVybiBQZih0KS5zdWJzdHJpbmcoNCl9Y29uc3QgRGk9bmV3IE1hcCxMaT1uZXcgTWFwLFBpPW5ldyBNYXAsQmk9bmV3IE1hcDtjbGFzcyBjbntjb25zdHJ1Y3RvcihlLG4scil7dih0aGlzLCJfcnVudGltZUFzdCIpO3YodGhpcywiX2ZlYXR1cmUiKTt2YXIgdTt0aGlzLl9mZWF0dXJlPW47bGV0IGk9W107ZT1xZihlLHIpO2NvbnN0IG89TGkuZ2V0KGUpO2lmKG8pW2UsaV09bztlbHNle2NvbnN0IGE9ZTtbZSxpXT1NZihrZihlKSwodT10aGlzLl9mZWF0dXJlKT09bnVsbD92b2lkIDA6dS5wcm9wZXJ0aWVzKSxlLmluY2x1ZGVzKGVyKSYmTGkuc2V0KGEsW2UsaV0pfWNvbnN0IHM9RGkuZ2V0KGUpO2lmKHMpdGhpcy5fcnVudGltZUFzdD1zO2Vsc2V7aWYoaS5sZW5ndGghPT0wKWZvcihjb25zdCBsIG9mIGkpcXQuYWRkTGl0ZXJhbChsLmxpdGVyYWxOYW1lLGwubGl0ZXJhbFZhbHVlKTtxdC5hZGRCaW5hcnlPcCgiPX4iLDApLHF0LmFkZEJpbmFyeU9wKCIhfiIsMCk7bGV0IGE7dHJ5e2E9cXQoZSl9Y2F0Y2gobCl7dGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gZ2VuZXJhdGUgYXN0OiAke2x9YCl9dGhpcy5fcnVudGltZUFzdD1XKHRoaXMsYSksRGkuc2V0KGUsdGhpcy5fcnVudGltZUFzdCl9fWV2YWx1YXRlKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVBc3QuZXZhbHVhdGUodGhpcy5fZmVhdHVyZSl9fWZ1bmN0aW9uIHFmKHQsZSl7aWYodHlwZW9mIGU+InUiKXJldHVybiB0O2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmVudHJpZXMoZSkuc29ydCgpKSxyPXQrbixpPUJpLmdldChyKTtpZihpKXJldHVybiBpO2xldCBvPVBpLmdldCh0KTtvfHwobz1uZXcgUmVnRXhwKGBcXCRcXHsoJHtPYmplY3Qua2V5cyhlKS5qb2luKCJ8Iil9KVxcfWAsImciKSxQaS5zZXQodCxvKSk7Y29uc3Qgcz10LnJlcGxhY2UobywodSxhKT0+dHlwZW9mIGVbYV08InUiP2AoJHtlW2FdfSlgOiIiKTtyZXR1cm4gQmkuc2V0KHIscyksc31mdW5jdGlvbiBrZih0KXtyZXR1cm4gdC5yZXBsYWNlKFFoLEpoKX1jbGFzcyBZZntjb25zdHJ1Y3RvcihlLG4scil7dih0aGlzLCJfY29uZGl0aW9ucyIpO3YodGhpcywiX3J1bnRpbWVDb25kaXRpb25zIik7dih0aGlzLCJfZmVhdHVyZSIpO3YodGhpcywiX21lbW9pemVkUmVzdWx0Iik7dGhpcy5fY29uZGl0aW9ucz1lLmNvbmRpdGlvbnMsdGhpcy5fcnVudGltZUNvbmRpdGlvbnM9W10sdGhpcy5fZmVhdHVyZT1uLHRoaXMuX21lbW9pemVkUmVzdWx0PXZvaWQgMCx0aGlzLnNldFJ1bnRpbWUocil9c2V0UnVudGltZShlKXt2YXIgcjtjb25zdCBuPShyPXRoaXMuX2NvbmRpdGlvbnMpPT1udWxsP3ZvaWQgMDpyLm1hcChpPT57Y29uc3Qgbz1TdHJpbmcoaVswXSkscz1TdHJpbmcoaVsxXSk7cmV0dXJuIG5ldyBLZihuZXcgY24obyx0aGlzLl9mZWF0dXJlLGUpLG5ldyBjbihzLHRoaXMuX2ZlYXR1cmUsZSkpfSk7dGhpcy5fcnVudGltZUNvbmRpdGlvbnM9bj8/W10sdGhpcy5fbWVtb2l6ZWRSZXN1bHQ9dm9pZCAwfWV2YWx1YXRlKCl7aWYodHlwZW9mIHRoaXMuX21lbW9pemVkUmVzdWx0PCJ1IilyZXR1cm4gdGhpcy5fbWVtb2l6ZWRSZXN1bHQ7Y29uc3QgZT10aGlzLl9ydW50aW1lQ29uZGl0aW9ucyxuPWUubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjtpKyspe2NvbnN0IG89ZVtpXTtpZihvLmNvbmRpdGlvbi5ldmFsdWF0ZSgpKXtjb25zdCBzPW8uZXhwcmVzc2lvbi5ldmFsdWF0ZSgpO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1zLHN9fWNvbnN0IHI9dm9pZCAwO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1yLHJ9fWNsYXNzIEtme2NvbnN0cnVjdG9yKGUsbil7dih0aGlzLCJjb25kaXRpb24iKTt2KHRoaXMsImV4cHJlc3Npb24iKTt0aGlzLmNvbmRpdGlvbj1lLHRoaXMuZXhwcmVzc2lvbj1ufX1jb25zdCBaZj0odCxlLG4pPT57Y29uc3Qgcj1IaCh0LFloKSxpPW4wKHQsZSk7cmV0dXJuey4uLmksLi4uUWYocix0LGkpLHR5cGU6ImNvbXB1dGVkRmVhdHVyZSIsaW50ZXJ2YWw6bn19O2Z1bmN0aW9uIFFmKHQsZSxuKXtpZighbil7aWYoIWUuaWQpdGhyb3cgbmV3IEVycm9yKCJsYXllciBpZCBpcyByZXF1aXJlZCIpO249e3R5cGU6ImZlYXR1cmUiLGlkOmUuaWQscHJvcGVydGllczplLnByb3BlcnRpZXN8fHt9fX1yZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoW3IsaV0pPT5pP1tyLFVpKGksZSxuKV06dm9pZCAwKS5maWx0ZXIocj0+ISFyKSl9ZnVuY3Rpb24gVWkodCxlLG4pe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKChbcixpXSk9PnQwKGkpP1tyLFVpKGksZSxuKV06W3IsZTAoaSxlLG4pXSkpfWZ1bmN0aW9uIEpmKHQpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQmJiJleHByZXNzaW9uImluIHR9ZnVuY3Rpb24gdDAodCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0IiYmdCYmISgiZXhwcmVzc2lvbiJpbiB0KSYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gZTAodCxlLG4pe3RyeXtpZihKZih0KSl7Y29uc3Qgcj10LmV4cHJlc3Npb24saT1DaShVaChuKSk7cmV0dXJuIHR5cGVvZiByPiJ1Ij92b2lkIDA6dHlwZW9mIHI9PSJvYmplY3QiJiZyLmNvbmRpdGlvbnM/bmV3IFlmKHIsaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJib29sZWFuInx8dHlwZW9mIHI9PSJudW1iZXIiP25ldyBjbihTdHJpbmcociksaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJzdHJpbmciP25ldyBjbihyLGksZS5kZWZpbmVzKS5ldmFsdWF0ZSgpOnJ9cmV0dXJuIHR9Y2F0Y2gocil7Y29uc29sZS5lcnJvcihyKTtyZXR1cm59fWZ1bmN0aW9uIG4wKHQsZSl7dmFyIGk7Y29uc3Qgbj0oaT10LmRhdGEpPT1udWxsP3ZvaWQgMDppLmpzb25Qcm9wZXJ0aWVzO2lmKCFlLnByb3BlcnRpZXN8fCFufHwhbi5sZW5ndGgpcmV0dXJuIGU7Y29uc3Qgcj17Li4uZSwuLi5lIT1udWxsJiZlLnByb3BlcnRpZXM/e3Byb3BlcnRpZXM6ey4uLmUucHJvcGVydGllc319Ont9fTtyZXR1cm4gbi5mb3JFYWNoKG89PntyLnByb3BlcnRpZXNbb109KCgpPT57Y29uc3Qgcz1yLnByb3BlcnRpZXNbb107dHJ5e3JldHVybiBKU09OLnBhcnNlKHMpfWNhdGNoe3JldHVybiBzfX0pKCl9KSxyfWZ1bmN0aW9uIGhuKHQsZSl7aWYodC50eXBlPT09InNpbXBsZSIpcmV0dXJuIFpmKHQsZSl9Y29uc3QgcjA9KHQsZSxuKT0+e2lmKCFuKXJldHVybjtjb25zdCByPSgoKT0+e3N3aXRjaChyZS50eXBlc1t0LnR5cGVdKXtjYXNlIlBvbHlnb24iOnJldHVybiJwb2x5Z29uIjtjYXNlIkxpbmVTdHJpbmciOnJldHVybiJwb2x5bGluZSI7Y2FzZSJQb2ludCI6cmV0dXJuIm1hcmtlciI7ZGVmYXVsdDpyZXR1cm59fSkoKTtpZighcilyZXR1cm47Y29uc3QgaT10LmlkP1N0cmluZyh0LmlkKTppMCh0LmxvYWRHZW9tZXRyeSgpLGUpLG89aG4obixvMChpLHQsZSxyKSkscz1uZXcgZ247cmV0dXJuIHMuZGF0YT17bGF5ZXJJZDpuPT1udWxsP3ZvaWQgMDpuLmlkLGZlYXR1cmVJZDppLGZlYXR1cmU6byxhcHBlYXJhbmNlVHlwZTpyZS50eXBlc1t0LnR5cGVdLnRvTG93ZXJDYXNlKCl9LHN9LGkwPSh0LGUpPT57Y29uc3Qgbj1bZS54LGUueSxlLmxldmVsLC4uLnQuZmxhdE1hcChyPT5yLm1hcChpPT5baS54LGkueV0pKV0uam9pbigiOiIpO3JldHVybiBraChuKX0sbzA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fSxtZT10eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZwZXJmb3JtYW5jZSYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj9wZXJmb3JtYW5jZTpEYXRlLGppPW5ldyBTZXQscnI9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZwcm9jZXNzP3Byb2Nlc3M6e30sR2k9KHQsZSxuLHIpPT57dHlwZW9mIHJyLmVtaXRXYXJuaW5nPT0iZnVuY3Rpb24iP3JyLmVtaXRXYXJuaW5nKHQsZSxuLHIpOmNvbnNvbGUuZXJyb3IoYFske259XSAke2V9OiAke3R9YCl9O2xldCBmbj1nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciwkaT1nbG9iYWxUaGlzLkFib3J0U2lnbmFsO2lmKHR5cGVvZiBmbj4idSIpeyRpPWNsYXNze2NvbnN0cnVjdG9yKCl7dih0aGlzLCJvbmFib3J0Iik7dih0aGlzLCJfb25hYm9ydCIsW10pO3YodGhpcywicmVhc29uIik7dih0aGlzLCJhYm9ydGVkIiwhMSl9YWRkRXZlbnRMaXN0ZW5lcihyLGkpe3RoaXMuX29uYWJvcnQucHVzaChpKX19LGZuPWNsYXNze2NvbnN0cnVjdG9yKCl7dih0aGlzLCJzaWduYWwiLG5ldyAkaSk7ZSgpfWFib3J0KHIpe3ZhciBpLG87aWYoIXRoaXMuc2lnbmFsLmFib3J0ZWQpe3RoaXMuc2lnbmFsLnJlYXNvbj1yLHRoaXMuc2lnbmFsLmFib3J0ZWQ9ITA7Zm9yKGNvbnN0IHMgb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpcyhyKTsobz0oaT10aGlzLnNpZ25hbCkub25hYm9ydCk9PW51bGx8fG8uY2FsbChpLHIpfX19O2xldCB0PSgoSGk9cnIuZW52KT09bnVsbD92b2lkIDA6SGkuTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HKSE9PSIxIjtjb25zdCBlPSgpPT57dCYmKHQ9ITEsR2koIkFib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluIG5vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlIGBub2RlLWFib3J0LWNvbnRyb2xsZXJgIHBhY2thZ2UuIEEgbWluaW1hbCBwb2x5ZmlsbCBpcyBwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgdXNlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMpLiBZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuIiwiTk9fQUJPUlRfQ09OVFJPTExFUiIsIkVOT1RTVVAiLGUpKX19Y29uc3QgczA9dD0+IWppLmhhcyh0KSxRdD10PT50JiZ0PT09TWF0aC5mbG9vcih0KSYmdD4wJiZpc0Zpbml0ZSh0KSxWaT10PT5RdCh0KT90PD1NYXRoLnBvdygyLDgpP1VpbnQ4QXJyYXk6dDw9TWF0aC5wb3coMiwxNik/VWludDE2QXJyYXk6dDw9TWF0aC5wb3coMiwzMik/VWludDMyQXJyYXk6dDw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/bG46bnVsbDpudWxsO2NsYXNzIGxuIGV4dGVuZHMgQXJyYXl7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5maWxsKDApfX1jb25zdCB3ZT1jbGFzc3tjb25zdHJ1Y3RvcihlLG4pe3YodGhpcywiaGVhcCIpO3YodGhpcywibGVuZ3RoIik7aWYoIWMod2UsRmUpKXRocm93IG5ldyBUeXBlRXJyb3IoImluc3RhbnRpYXRlIFN0YWNrIHVzaW5nIFN0YWNrLmNyZWF0ZShuKSIpO3RoaXMuaGVhcD1uZXcgbihlKSx0aGlzLmxlbmd0aD0wfXN0YXRpYyBjcmVhdGUoZSl7Y29uc3Qgbj1WaShlKTtpZighbilyZXR1cm5bXTtDKHdlLEZlLCEwKTtjb25zdCByPW5ldyB3ZShlLG4pO3JldHVybiBDKHdlLEZlLCExKSxyfXB1c2goZSl7dGhpcy5oZWFwW3RoaXMubGVuZ3RoKytdPWV9cG9wKCl7cmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXX19O2xldCBkbj13ZTtGZT1uZXcgV2Vha01hcCxVKGRuLEZlLCExKTtjb25zdCBvcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXtVKHRoaXMsJGUpO1UodGhpcyxFbik7VSh0aGlzLCR0KTtVKHRoaXMsVnQpO1UodGhpcyxXZSk7VSh0aGlzLE1lKTtVKHRoaXMsQ2UpO1UodGhpcyxZKTtVKHRoaXMsWGUpO1UodGhpcyxsZSk7VSh0aGlzLEl0LHZvaWQgMCk7VSh0aGlzLFJ0LHZvaWQgMCk7VSh0aGlzLE50LHZvaWQgMCk7VSh0aGlzLE10LHZvaWQgMCk7VSh0aGlzLEllLHZvaWQgMCk7dih0aGlzLCJ0dGwiKTt2KHRoaXMsInR0bFJlc29sdXRpb24iKTt2KHRoaXMsInR0bEF1dG9wdXJnZSIpO3YodGhpcywidXBkYXRlQWdlT25HZXQiKTt2KHRoaXMsInVwZGF0ZUFnZU9uSGFzIik7dih0aGlzLCJhbGxvd1N0YWxlIik7dih0aGlzLCJub0Rpc3Bvc2VPblNldCIpO3YodGhpcywibm9VcGRhdGVUVEwiKTt2KHRoaXMsIm1heEVudHJ5U2l6ZSIpO3YodGhpcywic2l6ZUNhbGN1bGF0aW9uIik7dih0aGlzLCJub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24iKTt2KHRoaXMsIm5vRGVsZXRlT25TdGFsZUdldCIpO3YodGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCIpO3YodGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24iKTt2KHRoaXMsImlnbm9yZUZldGNoQWJvcnQiKTtVKHRoaXMsdXQsdm9pZCAwKTtVKHRoaXMsQ3Qsdm9pZCAwKTtVKHRoaXMsYXQsdm9pZCAwKTtVKHRoaXMsdHQsdm9pZCAwKTtVKHRoaXMsTCx2b2lkIDApO1UodGhpcyxfdCx2b2lkIDApO1UodGhpcyx4dCx2b2lkIDApO1UodGhpcyxFdCx2b2lkIDApO1UodGhpcyxodCx2b2lkIDApO1UodGhpcyx2dCx2b2lkIDApO1UodGhpcyxmdCx2b2lkIDApO1UodGhpcyxEdCx2b2lkIDApO1UodGhpcyxMdCx2b2lkIDApO1UodGhpcyxPdCx2b2lkIDApO1UodGhpcyxQdCx2b2lkIDApO1UodGhpcyxKdCx2b2lkIDApO1UodGhpcyxwdCx2b2lkIDApO1UodGhpcyxoZSwoKT0+e30pO1UodGhpcyxIdCwoKT0+e30pO1UodGhpcyxWZSwoKT0+e30pO1UodGhpcyxidCwoKT0+ITEpO1UodGhpcyxmZSxlPT57fSk7VSh0aGlzLE5lLChlLG4scik9Pnt9KTtVKHRoaXMsemUsKGUsbixyLGkpPT57aWYocnx8aSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlIik7cmV0dXJuIDB9KTt2KHRoaXMsUjAsIkxSVUNhY2hlIik7Y29uc3R7bWF4Om49MCx0dGw6cix0dGxSZXNvbHV0aW9uOmk9MSx0dGxBdXRvcHVyZ2U6byx1cGRhdGVBZ2VPbkdldDpzLHVwZGF0ZUFnZU9uSGFzOnUsYWxsb3dTdGFsZTphLGRpc3Bvc2U6bCxkaXNwb3NlQWZ0ZXI6ZCxub0Rpc3Bvc2VPblNldDpfLG5vVXBkYXRlVFRMOk8sbWF4U2l6ZTpiPTAsbWF4RW50cnlTaXplOkY9MCxzaXplQ2FsY3VsYXRpb246UyxmZXRjaE1ldGhvZDpOLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpnLG5vRGVsZXRlT25TdGFsZUdldDpHLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOkssYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpWLGlnbm9yZUZldGNoQWJvcnQ6aXR9PWU7aWYobiE9PTAmJiFRdChuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggb3B0aW9uIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIik7Y29uc3QgbHQ9bj9WaShuKTpBcnJheTtpZighbHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG1heCB2YWx1ZTogIituKTtpZihDKHRoaXMsSXQsbiksQyh0aGlzLFJ0LGIpLHRoaXMubWF4RW50cnlTaXplPUZ8fGModGhpcyxSdCksdGhpcy5zaXplQ2FsY3VsYXRpb249Uyx0aGlzLnNpemVDYWxjdWxhdGlvbil7aWYoIWModGhpcyxSdCkmJiF0aGlzLm1heEVudHJ5U2l6ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUiKTtpZih0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24iKX1pZihOIT09dm9pZCAwJiZ0eXBlb2YgTiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkIik7aWYoQyh0aGlzLEllLE4pLEModGhpcyxKdCwhIU4pLEModGhpcyxhdCxuZXcgTWFwKSxDKHRoaXMsdHQsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksQyh0aGlzLEwsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksQyh0aGlzLF90LG5ldyBsdChuKSksQyh0aGlzLHh0LG5ldyBsdChuKSksQyh0aGlzLEV0LDApLEModGhpcyxodCwwKSxDKHRoaXMsdnQsZG4uY3JlYXRlKG4pKSxDKHRoaXMsdXQsMCksQyh0aGlzLEN0LDApLHR5cGVvZiBsPT0iZnVuY3Rpb24iJiZDKHRoaXMsTnQsbCksdHlwZW9mIGQ9PSJmdW5jdGlvbiI/KEModGhpcyxNdCxkKSxDKHRoaXMsZnQsW10pKTooQyh0aGlzLE10LHZvaWQgMCksQyh0aGlzLGZ0LHZvaWQgMCkpLEModGhpcyxQdCwhIWModGhpcyxOdCkpLEModGhpcyxwdCwhIWModGhpcyxNdCkpLHRoaXMubm9EaXNwb3NlT25TZXQ9ISFfLHRoaXMubm9VcGRhdGVUVEw9ISFPLHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uPSEhZyx0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uPSEhSyx0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQ9ISFWLHRoaXMuaWdub3JlRmV0Y2hBYm9ydD0hIWl0LHRoaXMubWF4RW50cnlTaXplIT09MCl7aWYoYyh0aGlzLFJ0KSE9PTAmJiFRdChjKHRoaXMsUnQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO2lmKCFRdCh0aGlzLm1heEVudHJ5U2l6ZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO3codGhpcyxFbixxaSkuY2FsbCh0aGlzKX1pZih0aGlzLmFsbG93U3RhbGU9ISFhLHRoaXMubm9EZWxldGVPblN0YWxlR2V0PSEhRyx0aGlzLnVwZGF0ZUFnZU9uR2V0PSEhcyx0aGlzLnVwZGF0ZUFnZU9uSGFzPSEhdSx0aGlzLnR0bFJlc29sdXRpb249UXQoaSl8fGk9PT0wP2k6MSx0aGlzLnR0bEF1dG9wdXJnZT0hIW8sdGhpcy50dGw9cnx8MCx0aGlzLnR0bCl7aWYoIVF0KHRoaXMudHRsKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0dGwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7dyh0aGlzLCRlLHVyKS5jYWxsKHRoaXMpfWlmKGModGhpcyxJdCk9PT0wJiZ0aGlzLnR0bD09PTAmJmModGhpcyxSdCk9PT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkF0IGxlYXN0IG9uZSBvZiBtYXgsIG1heFNpemUsIG9yIHR0bCBpcyByZXF1aXJlZCIpO2lmKCF0aGlzLnR0bEF1dG9wdXJnZSYmIWModGhpcyxJdCkmJiFjKHRoaXMsUnQpKXtjb25zdCBydD0iTFJVX0NBQ0hFX1VOQk9VTkRFRCI7czAocnQpJiYoamkuYWRkKHJ0KSxHaSgiVFRMIGNhY2hpbmcgd2l0aG91dCB0dGxBdXRvcHVyZ2UsIG1heCwgb3IgbWF4U2l6ZSBjYW4gcmVzdWx0IGluIHVuYm91bmRlZCBtZW1vcnkgY29uc3VtcHRpb24uIiwiVW5ib3VuZGVkQ2FjaGVXYXJuaW5nIixydCxvcikpfX1zdGF0aWMgdW5zYWZlRXhwb3NlSW50ZXJuYWxzKGUpe3JldHVybntzdGFydHM6YyhlLEx0KSx0dGxzOmMoZSxPdCksc2l6ZXM6YyhlLER0KSxrZXlNYXA6YyhlLGF0KSxrZXlMaXN0OmMoZSx0dCksdmFsTGlzdDpjKGUsTCksbmV4dDpjKGUsX3QpLHByZXY6YyhlLHh0KSxnZXQgaGVhZCgpe3JldHVybiBjKGUsRXQpfSxnZXQgdGFpbCgpe3JldHVybiBjKGUsaHQpfSxmcmVlOmMoZSx2dCksaXNCYWNrZ3JvdW5kRmV0Y2g6bj0+e3ZhciByO3JldHVybiB3KHI9ZSxZLGV0KS5jYWxsKHIsbil9LGJhY2tncm91bmRGZXRjaDoobixyLGksbyk9Pnt2YXIgcztyZXR1cm4gdyhzPWUsQ2UsVG4pLmNhbGwocyxuLHIsaSxvKX0sbW92ZVRvVGFpbDpuPT57dmFyIHI7cmV0dXJuIHcocj1lLGxlLHFlKS5jYWxsKHIsbil9LGluZGV4ZXM6bj0+e3ZhciByO3JldHVybiB3KHI9ZSwkdCx0ZSkuY2FsbChyLG4pfSxyaW5kZXhlczpuPT57dmFyIHI7cmV0dXJuIHcocj1lLFZ0LGVlKS5jYWxsKHIsbil9LGlzU3RhbGU6bj0+e3ZhciByO3JldHVybiBjKHI9ZSxidCkuY2FsbChyLG4pfX19Z2V0IG1heCgpe3JldHVybiBjKHRoaXMsSXQpfWdldCBtYXhTaXplKCl7cmV0dXJuIGModGhpcyxSdCl9Z2V0IGNhbGN1bGF0ZWRTaXplKCl7cmV0dXJuIGModGhpcyxDdCl9Z2V0IHNpemUoKXtyZXR1cm4gYyh0aGlzLHV0KX1nZXQgZmV0Y2hNZXRob2QoKXtyZXR1cm4gYyh0aGlzLEllKX1nZXQgZGlzcG9zZSgpe3JldHVybiBjKHRoaXMsTnQpfWdldCBkaXNwb3NlQWZ0ZXIoKXtyZXR1cm4gYyh0aGlzLE10KX1nZXRSZW1haW5pbmdUVEwoZSl7cmV0dXJuIGModGhpcyxhdCkuaGFzKGUpPzEvMDowfSplbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLCR0LHRlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KnJlbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KmtleXMoKXtmb3IoY29uc3QgZSBvZiB3KHRoaXMsJHQsdGUpLmNhbGwodGhpcykpe2NvbnN0IG49Yyh0aGlzLHR0KVtlXTtuIT09dm9pZCAwJiYhdyh0aGlzLFksZXQpLmNhbGwodGhpcyxjKHRoaXMsTClbZV0pJiYoeWllbGQgbil9fSpya2V5cygpe2Zvcihjb25zdCBlIG9mIHcodGhpcyxWdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3Qgbj1jKHRoaXMsdHQpW2VdO24hPT12b2lkIDAmJiF3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBuKX19KnZhbHVlcygpe2Zvcihjb25zdCBlIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzKSljKHRoaXMsTClbZV0hPT12b2lkIDAmJiF3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBjKHRoaXMsTClbZV0pfSpydmFsdWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmIXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkIGModGhpcyxMKVtlXSl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9ZmluZChlLG49e30pe2Zvcihjb25zdCByIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsWSxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtpZihvIT09dm9pZCAwJiZlKG8sYyh0aGlzLHR0KVtyXSx0aGlzKSlyZXR1cm4gdGhpcy5nZXQoYyh0aGlzLHR0KVtyXSxuKX19Zm9yRWFjaChlLG49dGhpcyl7Zm9yKGNvbnN0IHIgb2Ygdyh0aGlzLCR0LHRlKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyxMKVtyXSxvPXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO28hPT12b2lkIDAmJmUuY2FsbChuLG8sYyh0aGlzLHR0KVtyXSx0aGlzKX19cmZvckVhY2goZSxuPXRoaXMpe2Zvcihjb25zdCByIG9mIHcodGhpcyxWdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsWSxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtvIT09dm9pZCAwJiZlLmNhbGwobixvLGModGhpcyx0dClbcl0sdGhpcyl9fXB1cmdlU3RhbGUoKXtsZXQgZT0hMTtmb3IoY29uc3QgbiBvZiB3KHRoaXMsVnQsZWUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKWModGhpcyxidCkuY2FsbCh0aGlzLG4pJiYodGhpcy5kZWxldGUoYyh0aGlzLHR0KVtuXSksZT0hMCk7cmV0dXJuIGV9aW5mbyhlKXtjb25zdCBuPWModGhpcyxhdCkuZ2V0KGUpO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHI9Yyh0aGlzLEwpW25dLGk9dyh0aGlzLFksZXQpLmNhbGwodGhpcyxyKT9yLl9fc3RhbGVXaGlsZUZldGNoaW5nOnI7aWYoaT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbz17dmFsdWU6aX07aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7Y29uc3Qgcz1jKHRoaXMsT3QpW25dLHU9Yyh0aGlzLEx0KVtuXTtpZihzJiZ1KXtjb25zdCBhPXMtKG1lLm5vdygpLXUpO28udHRsPWEsby5zdGFydD1EYXRlLm5vdygpfX1yZXR1cm4gYyh0aGlzLER0KSYmKG8uc2l6ZT1jKHRoaXMsRHQpW25dKSxvfWR1bXAoKXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHcodGhpcywkdCx0ZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpe2NvbnN0IHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXSxvPXcodGhpcyxZLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO2lmKG89PT12b2lkIDB8fHI9PT12b2lkIDApY29udGludWU7Y29uc3Qgcz17dmFsdWU6b307aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7cy50dGw9Yyh0aGlzLE90KVtuXTtjb25zdCB1PW1lLm5vdygpLWModGhpcyxMdClbbl07cy5zdGFydD1NYXRoLmZsb29yKERhdGUubm93KCktdSl9Yyh0aGlzLER0KSYmKHMuc2l6ZT1jKHRoaXMsRHQpW25dKSxlLnVuc2hpZnQoW3Isc10pfXJldHVybiBlfWxvYWQoZSl7dGhpcy5jbGVhcigpO2Zvcihjb25zdFtuLHJdb2YgZSl7aWYoci5zdGFydCl7Y29uc3QgaT1EYXRlLm5vdygpLXIuc3RhcnQ7ci5zdGFydD1tZS5ub3coKS1pfXRoaXMuc2V0KG4sci52YWx1ZSxyKX19c2V0KGUsbixyPXt9KXt2YXIgTyxiLEYsUyxOO2lmKG49PT12b2lkIDApcmV0dXJuIHRoaXMuZGVsZXRlKGUpLHRoaXM7Y29uc3R7dHRsOmk9dGhpcy50dGwsc3RhcnQ6byxub0Rpc3Bvc2VPblNldDpzPXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZUNhbGN1bGF0aW9uOnU9dGhpcy5zaXplQ2FsY3VsYXRpb24sc3RhdHVzOmF9PXI7bGV0e25vVXBkYXRlVFRMOmw9dGhpcy5ub1VwZGF0ZVRUTH09cjtjb25zdCBkPWModGhpcyx6ZSkuY2FsbCh0aGlzLGUsbixyLnNpemV8fDAsdSk7aWYodGhpcy5tYXhFbnRyeVNpemUmJmQ+dGhpcy5tYXhFbnRyeVNpemUpcmV0dXJuIGEmJihhLnNldD0ibWlzcyIsYS5tYXhFbnRyeVNpemVFeGNlZWRlZD0hMCksdGhpcy5kZWxldGUoZSksdGhpcztsZXQgXz1jKHRoaXMsdXQpPT09MD92b2lkIDA6Yyh0aGlzLGF0KS5nZXQoZSk7aWYoXz09PXZvaWQgMClfPWModGhpcyx1dCk9PT0wP2ModGhpcyxodCk6Yyh0aGlzLHZ0KS5sZW5ndGghPT0wP2ModGhpcyx2dCkucG9wKCk6Yyh0aGlzLHV0KT09PWModGhpcyxJdCk/dyh0aGlzLE1lLEFuKS5jYWxsKHRoaXMsITEpOmModGhpcyx1dCksYyh0aGlzLHR0KVtfXT1lLGModGhpcyxMKVtfXT1uLGModGhpcyxhdCkuc2V0KGUsXyksYyh0aGlzLF90KVtjKHRoaXMsaHQpXT1fLGModGhpcyx4dClbX109Yyh0aGlzLGh0KSxDKHRoaXMsaHQsXykseW4odGhpcyx1dCkuXysrLGModGhpcyxOZSkuY2FsbCh0aGlzLF8sZCxhKSxhJiYoYS5zZXQ9ImFkZCIpLGw9ITE7ZWxzZXt3KHRoaXMsbGUscWUpLmNhbGwodGhpcyxfKTtjb25zdCBnPWModGhpcyxMKVtfXTtpZihuIT09Zyl7aWYoYyh0aGlzLEp0KSYmdyh0aGlzLFksZXQpLmNhbGwodGhpcyxnKSl7Zy5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoInJlcGxhY2VkIikpO2NvbnN0e19fc3RhbGVXaGlsZUZldGNoaW5nOkd9PWc7RyE9PXZvaWQgMCYmIXMmJihjKHRoaXMsUHQpJiYoKE89Yyh0aGlzLE50KSk9PW51bGx8fE8uY2FsbCh0aGlzLEcsZSwic2V0IikpLGModGhpcyxwdCkmJigoYj1jKHRoaXMsZnQpKT09bnVsbHx8Yi5wdXNoKFtHLGUsInNldCJdKSkpfWVsc2Ugc3x8KGModGhpcyxQdCkmJigoRj1jKHRoaXMsTnQpKT09bnVsbHx8Ri5jYWxsKHRoaXMsZyxlLCJzZXQiKSksYyh0aGlzLHB0KSYmKChTPWModGhpcyxmdCkpPT1udWxsfHxTLnB1c2goW2csZSwic2V0Il0pKSk7aWYoYyh0aGlzLGZlKS5jYWxsKHRoaXMsXyksYyh0aGlzLE5lKS5jYWxsKHRoaXMsXyxkLGEpLGModGhpcyxMKVtfXT1uLGEpe2Euc2V0PSJyZXBsYWNlIjtjb25zdCBHPWcmJncodGhpcyxZLGV0KS5jYWxsKHRoaXMsZyk/Zy5fX3N0YWxlV2hpbGVGZXRjaGluZzpnO0chPT12b2lkIDAmJihhLm9sZFZhbHVlPUcpfX1lbHNlIGEmJihhLnNldD0idXBkYXRlIil9aWYoaSE9PTAmJiFjKHRoaXMsT3QpJiZ3KHRoaXMsJGUsdXIpLmNhbGwodGhpcyksYyh0aGlzLE90KSYmKGx8fGModGhpcyxWZSkuY2FsbCh0aGlzLF8saSxvKSxhJiZjKHRoaXMsSHQpLmNhbGwodGhpcyxhLF8pKSwhcyYmYyh0aGlzLHB0KSYmYyh0aGlzLGZ0KSl7Y29uc3QgZz1jKHRoaXMsZnQpO2xldCBHO2Zvcig7Rz1nPT1udWxsP3ZvaWQgMDpnLnNoaWZ0KCk7KShOPWModGhpcyxNdCkpPT1udWxsfHxOLmNhbGwodGhpcywuLi5HKX1yZXR1cm4gdGhpc31wb3AoKXt2YXIgZTt0cnl7Zm9yKDtjKHRoaXMsdXQpOyl7Y29uc3Qgbj1jKHRoaXMsTClbYyh0aGlzLEV0KV07aWYodyh0aGlzLE1lLEFuKS5jYWxsKHRoaXMsITApLHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsbikpe2lmKG4uX19zdGFsZVdoaWxlRmV0Y2hpbmcpcmV0dXJuIG4uX19zdGFsZVdoaWxlRmV0Y2hpbmd9ZWxzZSBpZihuIT09dm9pZCAwKXJldHVybiBufX1maW5hbGx5e2lmKGModGhpcyxwdCkmJmModGhpcyxmdCkpe2NvbnN0IG49Yyh0aGlzLGZ0KTtsZXQgcjtmb3IoO3I9bj09bnVsbD92b2lkIDA6bi5zaGlmdCgpOykoZT1jKHRoaXMsTXQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsLi4ucil9fX1oYXMoZSxuPXt9KXtjb25zdHt1cGRhdGVBZ2VPbkhhczpyPXRoaXMudXBkYXRlQWdlT25IYXMsc3RhdHVzOml9PW4sbz1jKHRoaXMsYXQpLmdldChlKTtpZihvIT09dm9pZCAwKXtjb25zdCBzPWModGhpcyxMKVtvXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLHMpJiZzLl9fc3RhbGVXaGlsZUZldGNoaW5nPT09dm9pZCAwKXJldHVybiExO2lmKGModGhpcyxidCkuY2FsbCh0aGlzLG8pKWkmJihpLmhhcz0ic3RhbGUiLGModGhpcyxIdCkuY2FsbCh0aGlzLGksbykpO2Vsc2UgcmV0dXJuIHImJmModGhpcyxoZSkuY2FsbCh0aGlzLG8pLGkmJihpLmhhcz0iaGl0IixjKHRoaXMsSHQpLmNhbGwodGhpcyxpLG8pKSwhMH1lbHNlIGkmJihpLmhhcz0ibWlzcyIpO3JldHVybiExfXBlZWsoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlfT1uLGk9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoaT09PXZvaWQgMHx8IXImJmModGhpcyxidCkuY2FsbCh0aGlzLGkpKXJldHVybjtjb25zdCBvPWModGhpcyxMKVtpXTtyZXR1cm4gdyh0aGlzLFksZXQpLmNhbGwodGhpcyxvKT9vLl9fc3RhbGVXaGlsZUZldGNoaW5nOm99YXN5bmMgZmV0Y2goZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCx0dGw6cz10aGlzLnR0bCxub0Rpc3Bvc2VPblNldDp1PXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZTphPTAsc2l6ZUNhbGN1bGF0aW9uOmw9dGhpcy5zaXplQ2FsY3VsYXRpb24sbm9VcGRhdGVUVEw6ZD10aGlzLm5vVXBkYXRlVFRMLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfPXRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk89dGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixpZ25vcmVGZXRjaEFib3J0OmI9dGhpcy5pZ25vcmVGZXRjaEFib3J0LGFsbG93U3RhbGVPbkZldGNoQWJvcnQ6Rj10aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsY29udGV4dDpTLGZvcmNlUmVmcmVzaDpOPSExLHN0YXR1czpnLHNpZ25hbDpHfT1uO2lmKCFjKHRoaXMsSnQpKXJldHVybiBnJiYoZy5mZXRjaD0iZ2V0IiksdGhpcy5nZXQoZSx7YWxsb3dTdGFsZTpyLHVwZGF0ZUFnZU9uR2V0Omksbm9EZWxldGVPblN0YWxlR2V0Om8sc3RhdHVzOmd9KTtjb25zdCBLPXthbGxvd1N0YWxlOnIsdXBkYXRlQWdlT25HZXQ6aSxub0RlbGV0ZU9uU3RhbGVHZXQ6byx0dGw6cyxub0Rpc3Bvc2VPblNldDp1LHNpemU6YSxzaXplQ2FsY3VsYXRpb246bCxub1VwZGF0ZVRUTDpkLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk8sYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpGLGlnbm9yZUZldGNoQWJvcnQ6YixzdGF0dXM6ZyxzaWduYWw6R307bGV0IFY9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoVj09PXZvaWQgMCl7ZyYmKGcuZmV0Y2g9Im1pc3MiKTtjb25zdCBpdD13KHRoaXMsQ2UsVG4pLmNhbGwodGhpcyxlLFYsSyxTKTtyZXR1cm4gaXQuX19yZXR1cm5lZD1pdH1lbHNle2NvbnN0IGl0PWModGhpcyxMKVtWXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLGl0KSl7Y29uc3QgQj1yJiZpdC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMDtyZXR1cm4gZyYmKGcuZmV0Y2g9ImluZmxpZ2h0IixCJiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksQj9pdC5fX3N0YWxlV2hpbGVGZXRjaGluZzppdC5fX3JldHVybmVkPWl0fWNvbnN0IGx0PWModGhpcyxidCkuY2FsbCh0aGlzLFYpO2lmKCFOJiYhbHQpcmV0dXJuIGcmJihnLmZldGNoPSJoaXQiKSx3KHRoaXMsbGUscWUpLmNhbGwodGhpcyxWKSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyxWKSxnJiZjKHRoaXMsSHQpLmNhbGwodGhpcyxnLFYpLGl0O2NvbnN0IHJ0PXcodGhpcyxDZSxUbikuY2FsbCh0aGlzLGUsVixLLFMpLFQ9cnQuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJnI7cmV0dXJuIGcmJihnLmZldGNoPWx0PyJzdGFsZSI6InJlZnJlc2giLFQmJmx0JiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksVD9ydC5fX3N0YWxlV2hpbGVGZXRjaGluZzpydC5fX3JldHVybmVkPXJ0fX1nZXQoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCxzdGF0dXM6c309bix1PWModGhpcyxhdCkuZ2V0KGUpO2lmKHUhPT12b2lkIDApe2NvbnN0IGE9Yyh0aGlzLEwpW3VdLGw9dyh0aGlzLFksZXQpLmNhbGwodGhpcyxhKTtyZXR1cm4gcyYmYyh0aGlzLEh0KS5jYWxsKHRoaXMscyx1KSxjKHRoaXMsYnQpLmNhbGwodGhpcyx1KT8ocyYmKHMuZ2V0PSJzdGFsZSIpLGw/KHMmJnImJmEuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJihzLnJldHVybmVkU3RhbGU9ITApLHI/YS5fX3N0YWxlV2hpbGVGZXRjaGluZzp2b2lkIDApOihvfHx0aGlzLmRlbGV0ZShlKSxzJiZyJiYocy5yZXR1cm5lZFN0YWxlPSEwKSxyP2E6dm9pZCAwKSk6KHMmJihzLmdldD0iaGl0IiksbD9hLl9fc3RhbGVXaGlsZUZldGNoaW5nOih3KHRoaXMsbGUscWUpLmNhbGwodGhpcyx1KSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyx1KSxhKSl9ZWxzZSBzJiYocy5nZXQ9Im1pc3MiKX1kZWxldGUoZSl7dmFyIHIsaSxvLHM7bGV0IG49ITE7aWYoYyh0aGlzLHV0KSE9PTApe2NvbnN0IHU9Yyh0aGlzLGF0KS5nZXQoZSk7aWYodSE9PXZvaWQgMClpZihuPSEwLGModGhpcyx1dCk9PT0xKXRoaXMuY2xlYXIoKTtlbHNle2ModGhpcyxmZSkuY2FsbCh0aGlzLHUpO2NvbnN0IGE9Yyh0aGlzLEwpW3VdO2lmKHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsYSk/YS5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoImRlbGV0ZWQiKSk6KGModGhpcyxQdCl8fGModGhpcyxwdCkpJiYoYyh0aGlzLFB0KSYmKChyPWModGhpcyxOdCkpPT1udWxsfHxyLmNhbGwodGhpcyxhLGUsImRlbGV0ZSIpKSxjKHRoaXMscHQpJiYoKGk9Yyh0aGlzLGZ0KSk9PW51bGx8fGkucHVzaChbYSxlLCJkZWxldGUiXSkpKSxjKHRoaXMsYXQpLmRlbGV0ZShlKSxjKHRoaXMsdHQpW3VdPXZvaWQgMCxjKHRoaXMsTClbdV09dm9pZCAwLHU9PT1jKHRoaXMsaHQpKUModGhpcyxodCxjKHRoaXMseHQpW3VdKTtlbHNlIGlmKHU9PT1jKHRoaXMsRXQpKUModGhpcyxFdCxjKHRoaXMsX3QpW3VdKTtlbHNle2NvbnN0IGw9Yyh0aGlzLHh0KVt1XTtjKHRoaXMsX3QpW2xdPWModGhpcyxfdClbdV07Y29uc3QgZD1jKHRoaXMsX3QpW3VdO2ModGhpcyx4dClbZF09Yyh0aGlzLHh0KVt1XX15bih0aGlzLHV0KS5fLS0sYyh0aGlzLHZ0KS5wdXNoKHUpfX1pZihjKHRoaXMscHQpJiYoKG89Yyh0aGlzLGZ0KSkhPW51bGwmJm8ubGVuZ3RoKSl7Y29uc3QgdT1jKHRoaXMsZnQpO2xldCBhO2Zvcig7YT11PT1udWxsP3ZvaWQgMDp1LnNoaWZ0KCk7KShzPWModGhpcyxNdCkpPT1udWxsfHxzLmNhbGwodGhpcywuLi5hKX1yZXR1cm4gbn1jbGVhcigpe3ZhciBlLG4scjtmb3IoY29uc3QgaSBvZiB3KHRoaXMsVnQsZWUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKXtjb25zdCBvPWModGhpcyxMKVtpXTtpZih3KHRoaXMsWSxldCkuY2FsbCh0aGlzLG8pKW8uX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCJkZWxldGVkIikpO2Vsc2V7Y29uc3Qgcz1jKHRoaXMsdHQpW2ldO2ModGhpcyxQdCkmJigoZT1jKHRoaXMsTnQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsbyxzLCJkZWxldGUiKSksYyh0aGlzLHB0KSYmKChuPWModGhpcyxmdCkpPT1udWxsfHxuLnB1c2goW28scywiZGVsZXRlIl0pKX19aWYoYyh0aGlzLGF0KS5jbGVhcigpLGModGhpcyxMKS5maWxsKHZvaWQgMCksYyh0aGlzLHR0KS5maWxsKHZvaWQgMCksYyh0aGlzLE90KSYmYyh0aGlzLEx0KSYmKGModGhpcyxPdCkuZmlsbCgwKSxjKHRoaXMsTHQpLmZpbGwoMCkpLGModGhpcyxEdCkmJmModGhpcyxEdCkuZmlsbCgwKSxDKHRoaXMsRXQsMCksQyh0aGlzLGh0LDApLGModGhpcyx2dCkubGVuZ3RoPTAsQyh0aGlzLEN0LDApLEModGhpcyx1dCwwKSxjKHRoaXMscHQpJiZjKHRoaXMsZnQpKXtjb25zdCBpPWModGhpcyxmdCk7bGV0IG87Zm9yKDtvPWk9PW51bGw/dm9pZCAwOmkuc2hpZnQoKTspKHI9Yyh0aGlzLE10KSk9PW51bGx8fHIuY2FsbCh0aGlzLC4uLm8pfX19O2xldCBpcj1vcjtSMD1TeW1ib2wudG9TdHJpbmdUYWcsSXQ9bmV3IFdlYWtNYXAsUnQ9bmV3IFdlYWtNYXAsTnQ9bmV3IFdlYWtNYXAsTXQ9bmV3IFdlYWtNYXAsSWU9bmV3IFdlYWtNYXAsdXQ9bmV3IFdlYWtNYXAsQ3Q9bmV3IFdlYWtNYXAsYXQ9bmV3IFdlYWtNYXAsdHQ9bmV3IFdlYWtNYXAsTD1uZXcgV2Vha01hcCxfdD1uZXcgV2Vha01hcCx4dD1uZXcgV2Vha01hcCxFdD1uZXcgV2Vha01hcCxodD1uZXcgV2Vha01hcCx2dD1uZXcgV2Vha01hcCxmdD1uZXcgV2Vha01hcCxEdD1uZXcgV2Vha01hcCxMdD1uZXcgV2Vha01hcCxPdD1uZXcgV2Vha01hcCxQdD1uZXcgV2Vha01hcCxKdD1uZXcgV2Vha01hcCxwdD1uZXcgV2Vha01hcCwkZT1uZXcgV2Vha1NldCx1cj1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGxuKGModGhpcyxJdCkpLG49bmV3IGxuKGModGhpcyxJdCkpO0ModGhpcyxPdCxlKSxDKHRoaXMsTHQsbiksQyh0aGlzLFZlLChvLHMsdT1tZS5ub3coKSk9PntpZihuW29dPXMhPT0wP3U6MCxlW29dPXMscyE9PTAmJnRoaXMudHRsQXV0b3B1cmdlKXtjb25zdCBhPXNldFRpbWVvdXQoKCk9PntjKHRoaXMsYnQpLmNhbGwodGhpcyxvKSYmdGhpcy5kZWxldGUoYyh0aGlzLHR0KVtvXSl9LHMrMSk7YS51bnJlZiYmYS51bnJlZigpfX0pLEModGhpcyxoZSxvPT57bltvXT1lW29dIT09MD9tZS5ub3coKTowfSksQyh0aGlzLEh0LChvLHMpPT57aWYoZVtzXSl7Y29uc3QgdT1lW3NdLGE9bltzXTtpZighdXx8IWEpcmV0dXJuO28udHRsPXUsby5zdGFydD1hLG8ubm93PXJ8fGkoKTtjb25zdCBsPW8ubm93LWE7by5yZW1haW5pbmdUVEw9dS1sfX0pO2xldCByPTA7Y29uc3QgaT0oKT0+e2NvbnN0IG89bWUubm93KCk7aWYodGhpcy50dGxSZXNvbHV0aW9uPjApe3I9bztjb25zdCBzPXNldFRpbWVvdXQoKCk9PnI9MCx0aGlzLnR0bFJlc29sdXRpb24pO3MudW5yZWYmJnMudW5yZWYoKX1yZXR1cm4gb307dGhpcy5nZXRSZW1haW5pbmdUVEw9bz0+e2NvbnN0IHM9Yyh0aGlzLGF0KS5nZXQobyk7aWYocz09PXZvaWQgMClyZXR1cm4gMDtjb25zdCB1PWVbc10sYT1uW3NdO2lmKCF1fHwhYSlyZXR1cm4gMS8wO2NvbnN0IGw9KHJ8fGkoKSktYTtyZXR1cm4gdS1sfSxDKHRoaXMsYnQsbz0+e2NvbnN0IHM9bltvXSx1PWVbb107cmV0dXJuISF1JiYhIXMmJihyfHxpKCkpLXM+dX0pfSxoZT1uZXcgV2Vha01hcCxIdD1uZXcgV2Vha01hcCxWZT1uZXcgV2Vha01hcCxidD1uZXcgV2Vha01hcCxFbj1uZXcgV2Vha1NldCxxaT1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGxuKGModGhpcyxJdCkpO0ModGhpcyxDdCwwKSxDKHRoaXMsRHQsZSksQyh0aGlzLGZlLG49PntDKHRoaXMsQ3QsYyh0aGlzLEN0KS1lW25dKSxlW25dPTB9KSxDKHRoaXMsemUsKG4scixpLG8pPT57aWYodyh0aGlzLFksZXQpLmNhbGwodGhpcyxyKSlyZXR1cm4gMDtpZighUXQoaSkpaWYobyl7aWYodHlwZW9mIG8hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIG11c3QgYmUgYSBmdW5jdGlvbiIpO2lmKGk9byhyLG4pLCFRdChpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSIpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiBXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiBvciBzaXplIG11c3QgYmUgc2V0LiIpO3JldHVybiBpfSksQyh0aGlzLE5lLChuLHIsaSk9PntpZihlW25dPXIsYyh0aGlzLFJ0KSl7Y29uc3Qgbz1jKHRoaXMsUnQpLWVbbl07Zm9yKDtjKHRoaXMsQ3QpPm87KXcodGhpcyxNZSxBbikuY2FsbCh0aGlzLCEwKX1DKHRoaXMsQ3QsYyh0aGlzLEN0KStlW25dKSxpJiYoaS5lbnRyeVNpemU9cixpLnRvdGFsQ2FsY3VsYXRlZFNpemU9Yyh0aGlzLEN0KSl9KX0sZmU9bmV3IFdlYWtNYXAsTmU9bmV3IFdlYWtNYXAsemU9bmV3IFdlYWtNYXAsJHQ9bmV3IFdlYWtTZXQsdGU9ZnVuY3Rpb24qKHthbGxvd1N0YWxlOmU9dGhpcy5hbGxvd1N0YWxlfT17fSl7aWYoYyh0aGlzLHV0KSlmb3IobGV0IG49Yyh0aGlzLGh0KTshKCF3KHRoaXMsV2UsY3IpLmNhbGwodGhpcyxuKXx8KChlfHwhYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbikpJiYoeWllbGQgbiksbj09PWModGhpcyxFdCkpKTspbj1jKHRoaXMseHQpW25dfSxWdD1uZXcgV2Vha1NldCxlZT1mdW5jdGlvbiooe2FsbG93U3RhbGU6ZT10aGlzLmFsbG93U3RhbGV9PXt9KXtpZihjKHRoaXMsdXQpKWZvcihsZXQgbj1jKHRoaXMsRXQpOyEoIXcodGhpcyxXZSxjcikuY2FsbCh0aGlzLG4pfHwoKGV8fCFjKHRoaXMsYnQpLmNhbGwodGhpcyxuKSkmJih5aWVsZCBuKSxuPT09Yyh0aGlzLGh0KSkpOyluPWModGhpcyxfdClbbl19LFdlPW5ldyBXZWFrU2V0LGNyPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZjKHRoaXMsYXQpLmdldChjKHRoaXMsdHQpW2VdKT09PWV9LE1lPW5ldyBXZWFrU2V0LEFuPWZ1bmN0aW9uKGUpe3ZhciBvLHM7Y29uc3Qgbj1jKHRoaXMsRXQpLHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXTtyZXR1cm4gYyh0aGlzLEp0KSYmdyh0aGlzLFksZXQpLmNhbGwodGhpcyxpKT9pLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigiZXZpY3RlZCIpKTooYyh0aGlzLFB0KXx8Yyh0aGlzLHB0KSkmJihjKHRoaXMsUHQpJiYoKG89Yyh0aGlzLE50KSk9PW51bGx8fG8uY2FsbCh0aGlzLGksciwiZXZpY3QiKSksYyh0aGlzLHB0KSYmKChzPWModGhpcyxmdCkpPT1udWxsfHxzLnB1c2goW2ksciwiZXZpY3QiXSkpKSxjKHRoaXMsZmUpLmNhbGwodGhpcyxuKSxlJiYoYyh0aGlzLHR0KVtuXT12b2lkIDAsYyh0aGlzLEwpW25dPXZvaWQgMCxjKHRoaXMsdnQpLnB1c2gobikpLGModGhpcyx1dCk9PT0xPyhDKHRoaXMsRXQsQyh0aGlzLGh0LDApKSxjKHRoaXMsdnQpLmxlbmd0aD0wKTpDKHRoaXMsRXQsYyh0aGlzLF90KVtuXSksYyh0aGlzLGF0KS5kZWxldGUocikseW4odGhpcyx1dCkuXy0tLG59LENlPW5ldyBXZWFrU2V0LFRuPWZ1bmN0aW9uKGUsbixyLGkpe2NvbnN0IG89bj09PXZvaWQgMD92b2lkIDA6Yyh0aGlzLEwpW25dO2lmKHcodGhpcyxZLGV0KS5jYWxsKHRoaXMsbykpcmV0dXJuIG87Y29uc3Qgcz1uZXcgZm4se3NpZ25hbDp1fT1yO3U9PW51bGx8fHUuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCgpPT5zLmFib3J0KHUucmVhc29uKSx7c2lnbmFsOnMuc2lnbmFsfSk7Y29uc3QgYT17c2lnbmFsOnMuc2lnbmFsLG9wdGlvbnM6cixjb250ZXh0Oml9LGw9KFMsTj0hMSk9Pntjb25zdHthYm9ydGVkOmd9PXMuc2lnbmFsLEc9ci5pZ25vcmVGZXRjaEFib3J0JiZTIT09dm9pZCAwO2lmKHIuc3RhdHVzJiYoZyYmIU4/KHIuc3RhdHVzLmZldGNoQWJvcnRlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPXMuc2lnbmFsLnJlYXNvbixHJiYoci5zdGF0dXMuZmV0Y2hBYm9ydElnbm9yZWQ9ITApKTpyLnN0YXR1cy5mZXRjaFJlc29sdmVkPSEwKSxnJiYhRyYmIU4pcmV0dXJuIF8ocy5zaWduYWwucmVhc29uKTtjb25zdCBLPWI7cmV0dXJuIGModGhpcyxMKVtuXT09PWImJihTPT09dm9pZCAwP0suX19zdGFsZVdoaWxlRmV0Y2hpbmc/Yyh0aGlzLEwpW25dPUsuX19zdGFsZVdoaWxlRmV0Y2hpbmc6dGhpcy5kZWxldGUoZSk6KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hVcGRhdGVkPSEwKSx0aGlzLnNldChlLFMsYS5vcHRpb25zKSkpLFN9LGQ9Uz0+KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hSZWplY3RlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPVMpLF8oUykpLF89Uz0+e2NvbnN0e2Fib3J0ZWQ6Tn09cy5zaWduYWwsZz1OJiZyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsRz1nfHxyLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLEs9R3x8ci5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sVj1iO2lmKGModGhpcyxMKVtuXT09PWImJighS3x8Vi5fX3N0YWxlV2hpbGVGZXRjaGluZz09PXZvaWQgMD90aGlzLmRlbGV0ZShlKTpnfHwoYyh0aGlzLEwpW25dPVYuX19zdGFsZVdoaWxlRmV0Y2hpbmcpKSxHKXJldHVybiByLnN0YXR1cyYmVi5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmKHIuc3RhdHVzLnJldHVybmVkU3RhbGU9ITApLFYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7aWYoVi5fX3JldHVybmVkPT09Vil0aHJvdyBTfSxPPShTLE4pPT57dmFyIEc7Y29uc3QgZz0oRz1jKHRoaXMsSWUpKT09bnVsbD92b2lkIDA6Ry5jYWxsKHRoaXMsZSxvLGEpO2cmJmcgaW5zdGFuY2VvZiBQcm9taXNlJiZnLnRoZW4oSz0+UyhLPT09dm9pZCAwP3ZvaWQgMDpLKSxOKSxzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PnsoIXIuaWdub3JlRmV0Y2hBYm9ydHx8ci5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSYmKFModm9pZCAwKSxyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQmJihTPUs9PmwoSywhMCkpKX0pfTtyLnN0YXR1cyYmKHIuc3RhdHVzLmZldGNoRGlzcGF0Y2hlZD0hMCk7Y29uc3QgYj1uZXcgUHJvbWlzZShPKS50aGVuKGwsZCksRj1PYmplY3QuYXNzaWduKGIse19fYWJvcnRDb250cm9sbGVyOnMsX19zdGFsZVdoaWxlRmV0Y2hpbmc6byxfX3JldHVybmVkOnZvaWQgMH0pO3JldHVybiBuPT09dm9pZCAwPyh0aGlzLnNldChlLEYsey4uLmEub3B0aW9ucyxzdGF0dXM6dm9pZCAwfSksbj1jKHRoaXMsYXQpLmdldChlKSk6Yyh0aGlzLEwpW25dPUYsRn0sWT1uZXcgV2Vha1NldCxldD1mdW5jdGlvbihlKXtpZighYyh0aGlzLEp0KSlyZXR1cm4hMTtjb25zdCBuPWU7cmV0dXJuISFuJiZuIGluc3RhbmNlb2YgUHJvbWlzZSYmbi5oYXNPd25Qcm9wZXJ0eSgiX19zdGFsZVdoaWxlRmV0Y2hpbmciKSYmbi5fX2Fib3J0Q29udHJvbGxlciBpbnN0YW5jZW9mIGZufSxYZT1uZXcgV2Vha1NldCxocj1mdW5jdGlvbihlLG4pe2ModGhpcyx4dClbbl09ZSxjKHRoaXMsX3QpW2VdPW59LGxlPW5ldyBXZWFrU2V0LHFlPWZ1bmN0aW9uKGUpe2UhPT1jKHRoaXMsaHQpJiYoZT09PWModGhpcyxFdCk/Qyh0aGlzLEV0LGModGhpcyxfdClbZV0pOncodGhpcyxYZSxocikuY2FsbCh0aGlzLGModGhpcyx4dClbZV0sYyh0aGlzLF90KVtlXSksdyh0aGlzLFhlLGhyKS5jYWxsKHRoaXMsYyh0aGlzLGh0KSxlKSxDKHRoaXMsaHQsZSkpfTtjb25zdCB6aT1uZXcgaXIoe21heDoxZTN9KSxhMD0odCxlLG4pPT57Y29uc3Qgcj1KU09OLnN0cmluZ2lmeSh0LnByb3BlcnRpZXMpLGk9emkuZ2V0KHIpO2lmKGkpcmV0dXJuIGk7Y29uc3Qgbz0oKCk9Pntzd2l0Y2gocmUudHlwZXNbdC50eXBlXSl7Y2FzZSJQb2x5Z29uIjpyZXR1cm4icG9seWdvbiI7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4icG9seWxpbmUiO2Nhc2UiUG9pbnQiOnJldHVybiJtYXJrZXIiO2RlZmF1bHQ6cmV0dXJufX0pKCkscz0oKCk9PntpZigobj09bnVsbD92b2lkIDA6bi50eXBlKSE9PSJzaW1wbGUifHwhbylyZXR1cm47Y29uc3QgYT11MCgiIix0LGUsbyk7aWYoYSlyZXR1cm4gaG49PW51bGw/dm9pZCAwOmhuKG4sYSl9KSgpLHU9KCgpPT57aWYobz09PSJwb2x5Z29uIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlnb247cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEuZmlsbCk/PyEwKSYmKChhPT1udWxsP3ZvaWQgMDphLnNob3cpPz8hMCk/YT09bnVsbD92b2lkIDA6YS5maWxsQ29sb3I6InJnYmEoMCwwLDAsMCkiLHN0cm9rZVN0eWxlOmEhPW51bGwmJmEuc3Ryb2tlJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aCxsaW5lSm9pbjphPT1udWxsP3ZvaWQgMDphLmxpbmVKb2lufX1pZihvPT09InBvbHlsaW5lIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlsaW5lO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yKT8/ITApJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixzdHJva2VTdHlsZTphIT1udWxsJiZhLnN0cm9rZUNvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aH19aWYobz09PSJtYXJrZXIiKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMubWFya2VyO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3IpPz8hMCkmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcjoicmdiYSgwLDAsMCwwKSIsc3Ryb2tlU3R5bGU6YSE9bnVsbCYmYS5wb2ludENvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnBvaW50U2l6ZX19fSkoKTtyZXR1cm4gemkuc2V0KHIsdSksdX0sdTA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fTtmdW5jdGlvbiBjMCh0KXtyZXR1cm4gZjAodCk9PT1ibi5DT1VOVEVSX0NMT0NLV0lTRX1mdW5jdGlvbiBXaSh0LGUpe2NvbnN0IG49dC54LHI9dC55O2xldCBpPSExO2ZvcihsZXQgbz0wLHM9ZS5sZW5ndGgtMTtvPGUubGVuZ3RoO3M9bysrKXtjb25zdCB1PWVbb10ueCxhPWVbb10ueSxsPWVbc10ueCxkPWVbc10ueTthPnIhPWQ+ciYmbjwobC11KSooci1hKS8oZC1hKSt1JiYoaT0haSl9cmV0dXJuIGl9ZnVuY3Rpb24gaDAodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZihXaShlLHRbbl0pKXtsZXQgcj0hMTtmb3IoO24rMTx0Lmxlbmd0aCYmIWMwKHRbbisxXSk7KW4rKywhciYmV2koZSx0W25dKSYmKHI9ITApO2lmKCFyKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGYwKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49dFtlLTFdLngqKHRbMF0ueS10W2UtMl0ueSkrdFswXS54Kih0WzFdLnktdFtlLTFdLnkpO2ZvcihsZXQgcj0xO3I8PWUtMjtyKyspbis9dFtyXS54Kih0W3IrMV0ueS10W3ItMV0ueSk7aWYoaXNOYU4obikpdGhyb3cgbmV3IEVycm9yO3JldHVybiBuPjA/Ym4uQ09VTlRFUl9DTE9DS1dJU0U6Ym4uQ0xPQ0tXSVNFfWNvbnN0IEdlPTI1NjtjbGFzcyBsMHtjb25zdHJ1Y3RvcihlKXt2KHRoaXMsIl91cmxUZW1wbGF0ZSIpO3YodGhpcywiX3BhcnNlVGlsZSIpO3YodGhpcywiX3RpbGluZ1NjaGVtZSIpO3YodGhpcywiX2xheWVyTmFtZXMiKTt2KHRoaXMsIl90aWxlV2lkdGgiKTt2KHRoaXMsIl90aWxlSGVpZ2h0Iik7dih0aGlzLCJfdGlsZUNhY2hlcyIpO3RoaXMuX3BhcnNlVGlsZT1kMCx0aGlzLl91cmxUZW1wbGF0ZT1lLnVybFRlbXBsYXRlLHRoaXMuX3RpbGVXaWR0aD1HZSx0aGlzLl90aWxlSGVpZ2h0PUdlLHRoaXMuX2xheWVyTmFtZXM9ZS5sYXllck5hbWVzLHRoaXMuX3RpbGluZ1NjaGVtZT1uZXcga3R9YXN5bmMgcmVuZGVyKGUsbixyLGkpe2NvbnN0IG89WGkodGhpcy5fdXJsVGVtcGxhdGUsbik7YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAocz0+dGhpcy5fcmVuZGVyQ2FudmFzKG8sZSxuLHMscixpKSkpfWFzeW5jIF9yZW5kZXJDYW52YXMoZSxuLHIsaSxvLHMpe2lmKCFlKXJldHVybjtjb25zdCB1PWF3YWl0IHRoaXMuX2NhY2hlZFRpbGUoZSksbD1pLnNwbGl0KC8sICovKS5maWx0ZXIoQm9vbGVhbikubWFwKGQ9PnU9PW51bGw/dm9pZCAwOnUubGF5ZXJzW2RdKTtsJiYobi5zdHJva2VTdHlsZT0iYmxhY2siLG4uZmlsbFN0eWxlPSJibGFjayIsbi5saW5lV2lkdGg9MSxuLm1pdGVyTGltaXQ9MixuLnNldFRyYW5zZm9ybSh0aGlzLl90aWxlV2lkdGgqby9HZSwwLDAsdGhpcy5fdGlsZUhlaWdodCpvL0dlLDAsMCksbC5mb3JFYWNoKGQ9PntpZighZClyZXR1cm47Y29uc3QgXz1HZS9kLmV4dGVudDtmb3IobGV0IE89MDtPPGQubGVuZ3RoO08rKyl7Y29uc3QgYj1kLmZlYXR1cmUoTyksRj1hMChiLHIscyk7aWYoIUYpY29udGludWU7bi5maWxsU3R5bGU9Ri5maWxsU3R5bGU/P24uZmlsbFN0eWxlLG4uc3Ryb2tlU3R5bGU9Ri5zdHJva2VTdHlsZT8/bi5zdHJva2VTdHlsZSxuLmxpbmVXaWR0aD1GLmxpbmVXaWR0aD8/bi5saW5lV2lkdGgsbi5saW5lSm9pbj1GLmxpbmVKb2luPz9uLmxpbmVKb2luO2NvbnN0IFM9Yi5sb2FkR2VvbWV0cnkoKTtyZS50eXBlc1tiLnR5cGVdPT09IlBvbHlnb24iP3RoaXMuX3JlbmRlclBvbHlnb24obixTLF8sKEYubGluZVdpZHRoPz8xKT4wKTpyZS50eXBlc1tiLnR5cGVdPT09IlBvaW50Ij90aGlzLl9yZW5kZXJQb2ludChuLFMsXyk6cmUudHlwZXNbYi50eXBlXT09PSJMaW5lU3RyaW5nIj90aGlzLl9yZW5kZXJMaW5lU3RyaW5nKG4sUyxfKTpjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGdlb21ldHJ5IHR5cGU6ICR7Yi50eXBlfSBpbiByZWdpb24gbWFwIG9uIHRpbGUgJHtbci5sZXZlbCxyLngsci55XS5qb2luKCIvIil9YCl9fSkpfV9yZW5kZXJQb2x5Z29uKGUsbixyLGkpe2UuYmVnaW5QYXRoKCk7Y29uc3Qgbz0oKT0+e2kmJmUuc3Ryb2tlKCksZS5maWxsKCl9O2xldCBzPTA7Zm9yKGxldCB1PTA7dTxuLmxlbmd0aDt1Kyspe2NvbnN0IGE9blt1XTtzK2EubGVuZ3RoPjU0MDAmJihvKCkscz0wLGUuYmVnaW5QYXRoKCkpO2xldCBsPWFbMF07ZS5tb3ZlVG8obC54KnIsbC55KnIpO2ZvcihsZXQgZD0xO2Q8YS5sZW5ndGg7ZCsrKWw9YVtkXSxlLmxpbmVUbyhsLngqcixsLnkqcik7cys9YS5sZW5ndGh9cz4wJiZvKCl9X3JlbmRlclBvaW50KGUsbixyKXtlLmJlZ2luUGF0aCgpO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKXtjb25zdCBvPW5baV1bMF0sW3MsdV09W28ueCpyLG8ueSpyXSxhPWUubGluZVdpZHRoO2UuYmVnaW5QYXRoKCksZS5hcmMocyx1LGEsMCwyKk1hdGguUEkpLGUuZmlsbCgpfX1fcmVuZGVyTGluZVN0cmluZyhlLG4scil7ZS5iZWdpblBhdGgoKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyl7bGV0IG89bltpXVswXTtlLm1vdmVUbyhvLngqcixvLnkqcik7Zm9yKGxldCBzPTE7czxuW2ldLmxlbmd0aDtzKyspbz1uW2ldW3NdLGUubGluZVRvKG8ueCpyLG8ueSpyKX1lLnN0cm9rZSgpfXBpY2tGZWF0dXJlcyhlLG4scixpKXtjb25zdCBvPVhpKHRoaXMuX3VybFRlbXBsYXRlLGUpO3JldHVybiB0aGlzLl9waWNrRmVhdHVyZXNGcm9tTGF5ZXIobyxlLG4scixpKX1hc3luYyBfcGlja0ZlYXR1cmVzRnJvbUxheWVyKGUsbixyLGksbyl7dHJ5e2NvbnN0IHM9YXdhaXQgdGhpcy5fY2FjaGVkVGlsZShlKTtyZXR1cm4gcz8oYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAoYXN5bmMgYT0+e2NvbnN0IGw9cy5sYXllcnNbYV07aWYoIWwpcmV0dXJuW107Y29uc3QgZD1hd2FpdCB0aGlzLl9waWNrRmVhdHVyZXMobixyLGksbCxvKTtyZXR1cm4gZHx8W119KSkpLmZsYXQoKTpbXX1jYXRjaHtyZXR1cm5bXX19YXN5bmMgX3BpY2tGZWF0dXJlcyhlLG4scixpLG8pe2NvbnN0IHM9dGhpcy5fdGlsaW5nU2NoZW1lLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKGUueCxlLnksZS5sZXZlbCksdT1bcy53ZXN0LHMuZWFzdF0sYT1bcy5ub3J0aCxzLnNvdXRoXSxsPWZ1bmN0aW9uKEYsUyxOLGcsRyl7Y29uc3QgSz1uZXcgQTtBLnN1YnRyYWN0KEYsbmV3IEEoU1swXSxOWzBdKSxLKTtjb25zdCBWPW5ldyBBKChnWzFdLWdbMF0pLyhTWzFdLVNbMF0pLChHWzFdLUdbMF0pLyhOWzFdLU5bMF0pKTtyZXR1cm4gQS5hZGQoQS5tdWx0aXBseUNvbXBvbmVudHMoSyxWLG5ldyBBKSxuZXcgQShnWzBdLEdbMF0pLG5ldyBBKX0sZD1bXSxfPVswLGkuZXh0ZW50LTFdLE89bChBLmZyb21DYXJ0ZXNpYW4zKHRoaXMuX3RpbGluZ1NjaGVtZS5wcm9qZWN0aW9uLnByb2plY3QobmV3IEgobixyKSkpLHUsYSxfLF8pLGI9bmV3IFNyKE8ueCxPLnkpO2ZvcihsZXQgRj0wO0Y8aS5sZW5ndGg7RisrKXtjb25zdCBTPWkuZmVhdHVyZShGKTtpZihyZS50eXBlc1tTLnR5cGVdPT09IlBvbHlnb24iJiZoMChTLmxvYWRHZW9tZXRyeSgpLGIpKXtjb25zdCBOPXIwKFMsZSxvKTtOJiZkLnB1c2goTil9fXJldHVybiBkfWFzeW5jIF9jYWNoZWRUaWxlKGUpe3ZhciBuLHI7aWYoZSl7aWYoKG49dGhpcy5fdGlsZUNhY2hlcykhPW51bGwmJm4uaGFzKGUpKXJldHVybiB0aGlzLl90aWxlQ2FjaGVzLmdldChlKTt0cnl7Y29uc3QgaT1wMChhd2FpdCB0aGlzLl9wYXJzZVRpbGUoZSkpO3JldHVybiBpJiYoKHI9dGhpcy5fdGlsZUNhY2hlcyk9PW51bGx8fHIuc2V0KGUsaSkpLGl9Y2F0Y2h7cmV0dXJufX19Y2xlYXJDYWNoZSgpe3ZhciBlOyhlPXRoaXMuX3RpbGVDYWNoZXMpPT1udWxsfHxlLmNsZWFyKCl9fWNvbnN0IGQwPWFzeW5jIHQ9Pnt0cnl7Y29uc3QgZT1hd2FpdCBfMCh0KTtyZXR1cm4gZT9FMChlKTp2b2lkIDB9Y2F0Y2h7cmV0dXJufX0sRTA9dD0+bmV3IFhvKG5ldyBIbyh0KSksXzA9YXN5bmMgdD0+e2lmKCF0KXtjb25zb2xlLmVycm9yKCJmZXRjaCByZXF1ZXN0IGZhaWxlZCBiZWNhdXNlIHJlcXVlc3QgdXJsIGlzIHVuZGVmaW5lZCIpO3JldHVybn10cnl7Y29uc3QgZT1hd2FpdCBmZXRjaCh0KTtyZXR1cm4gZS5vaz9hd2FpdCBlLmFycmF5QnVmZmVyKCk6dm9pZCAwfWNhdGNoe3JldHVybn19LHAwPXQ9Pnt2YXIgbjtpZighdClyZXR1cm47Y29uc3QgZT17fTtmb3IoY29uc3RbcixpXW9mIE9iamVjdC5lbnRyaWVzKHQubGF5ZXJzKSl7Y29uc3Qgbz1bXSxzPWk7Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDt1Kyspe2NvbnN0IGE9cy5mZWF0dXJlKHUpO2xldCBsO2NvbnN0IGQ9KG49YS5iYm94KT09bnVsbD92b2lkIDA6bi5jYWxsKGEpLF89ey4uLmEsaWQ6YS5pZCxsb2FkR2VvbWV0cnk6KCk9PihsfHwobD1hLmxvYWRHZW9tZXRyeSgpKSxsKSxiYm94OmQ/KCk9PmQ6dm9pZCAwLHRvR2VvSlNPTjphLnRvR2VvSlNPTn07by5wdXNoKF8pfWVbcl09ey4uLnMsZmVhdHVyZTp1PT5vW3VdfX1yZXR1cm57bGF5ZXJzOmV9fSxYaT0odCxlKT0+ZGVjb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoInt6fSIsU3RyaW5nKGUubGV2ZWwpKS5yZXBsYWNlKCJ7eH0iLFN0cmluZyhlLngpKS5yZXBsYWNlKCJ7eX0iLFN0cmluZyhlLnkpKSx5MD1uZXcgTWFwO2Z1bmN0aW9uIEEwKHt1cmxUZW1wbGF0ZTp0LG1heGltdW1MZXZlbDplfSl7cmV0dXJuYCR7dH06JHtlfWB9YXN5bmMgZnVuY3Rpb24gVDAodCl7Y29uc3QgZT1BMCh0KTtsZXQgbjtyZXR1cm4gbj09bnVsbCYmKG49bmV3IGwwKHQpLHkwLnNldChlLG4pKSxufW9vKHtyZW5kZXJUaWxlOmFzeW5jKHtyZXF1ZXN0ZWRUaWxlOnQsY2FudmFzOmUsc2NhbGVGYWN0b3I6biwuLi5yfSk9Pntjb25zdCBpPWUuZ2V0Q29udGV4dCgiMmQiKTtpZighaSlyZXR1cm47Y29uc3Qgbz1hd2FpdCBUMChyKTthd2FpdCBvLnJlbmRlcihpLHQsbixyLmN1cnJlbnRMYXllciksby5jbGVhckNhY2hlKCksYXdhaXQgbmV3IFByb21pc2Uocz0+e3JlcXVlc3RBbmltYXRpb25GcmFtZShzKX0pfX0pfSkoKTsK",nc=typeof window<"u"&&window.Blob&&new Blob([atob(rd)],{type:"text/javascript;charset=utf-8"});function Cm(){const t=nc&&(window.URL||window.webkitURL).createObjectURL(nc);try{return t?new Worker(t):new Worker("data:application/javascript;base64,"+rd)}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}const xe=[];function Km(t){let n=xe.find(o=>o.layerId===t);return n==null&&(n=Ym(async()=>await Um(new Cm),{size:Math.ceil(navigator.hardwareConcurrency/4)}),n.layerId=t,xe.push(n)),n}function gm(t,n){return Km(n).queue(o=>t(o,n))}function Nm(t,n){const o=xe.find(s=>s.layerId===t);return o==null||o.taskQueue.length<n}async function Mm(t){const n=xe.findIndex(o=>o.layerId===t);n!==-1&&(await xe[n].terminate(!0),xe.splice(n,1))}async function Hm(t){var n;const{canvas:o,...s}=t,c=o.transferControlToOffscreen();await gm(async d=>{await d.renderTile(Jm({canvas:c,...s},[c]))},(n=t.currentLayer)==null?void 0:n.id)}let Be;const ki=class{constructor(t){Y(this,"taskCount",0),Y(this,"tileCache"),Y(this,"_minimumLevel"),Y(this,"_maximumLevel"),Y(this,"_credit"),Y(this,"_resolution"),Y(this,"_tilingScheme"),Y(this,"_tileWidth"),Y(this,"_tileHeight"),Y(this,"_rectangle"),Y(this,"_ready"),Y(this,"_readyPromise",Promise.resolve(!0)),Y(this,"_errorEvent",new Cesium$1.Event),Y(this,"_currentLayer"),Y(this,"_useWorker"),Y(this,"_urlTemplate"),Y(this,"_layerNames"),this._minimumLevel=t.minimumLevel??0,this._maximumLevel=t.maximumLevel??24,this._credit=t.credit,this._resolution=t.resolution??10,this._tilingScheme=new Cesium$1.WebMercatorTilingScheme,this._tileWidth=ue,this._tileHeight=ue,this._rectangle=this._tilingScheme.rectangle,this._ready=!0,this._urlTemplate=t.urlTemplate,this._layerNames=t.layerName.split(/, */).filter(Boolean),this._currentLayer=t.layer,this._useWorker=t.worker??!1}get tileWidth(){return this._tileWidth}get tileHeight(){return this._tileHeight}get maximumLevel(){return this._maximumLevel}get minimumLevel(){return this._minimumLevel}get tilingScheme(){return this._tilingScheme}get rectangle(){return this._rectangle}get errorEvent(){return this._errorEvent}get ready(){return this._ready}get hasAlphaChannel(){return!0}get credit(){return this._credit?new Cesium$1.Credit(this._credit):void 0}get defaultNightAlpha(){}get defaultDayAlpha(){}get defaultAlpha(){}get defaultBrightness(){}get defaultContrast(){}get defaultHue(){}get defaultSaturation(){}get defaultGamma(){}get defaultMinificationFilter(){}get defaultMagnificationFilter(){}get readyPromise(){return this._readyPromise}get tileDiscardPolicy(){}get proxy(){}getTileCredits(t,n,o){return[]}requestImage(t,n,o,s){var c;const d=this._currentLayer;if(!d||(Be&&d&&!Fr(Be,d)&&Be.id===d.id&&Mm(Be.id),Be=d,this._useWorker&&(this.taskCount>=ki.maximumTasksPerImagery||!Nm(d==null?void 0:d.id,ki.maximumTasks))))return;const h=`${t}/${n}/${o}`;if(((c=this.tileCache)==null?void 0:c.has(h))===!0){const z=this.tileCache.get(h);return Promise.resolve(z)}const p=document.createElement("canvas"),y={x:t,y:n,level:o},E=(o>=this.maximumLevel?this._resolution:void 0)??1;p.width=this._tileWidth*E,p.height=this._tileHeight*E;const L=this._urlTemplate,F=this._layerNames,N=this._maximumLevel;return++this.taskCount,Hm({canvas:p,requestedTile:y,scaleFactor:E,urlTemplate:L,layerNames:F,maximumLevel:N,currentLayer:d}).then(()=>{var z;return(z=this.tileCache)==null||z.set(h,p),p}).catch(z=>{if(z instanceof Error&&z.message.startsWith("Unimplemented type"))return p;throw z}).finally(()=>{--this.taskCount})}async pickFeatures(t,n,o,s,c){const d={x:t,y:n,level:o},h=this._currentLayer,p=this._urlTemplate,y=this._layerNames;return await new lb({urlTemplate:p,layerNames:y}).pickFeatures(d,s,c,h)??[]}};let Gi=ki;Y(Gi,"maximumTasks",50),Y(Gi,"maximumTasksPerImagery",6);const useImageryProvider=(t,n,o)=>{const{hideIndicator:s}=o??{},{viewer:c}=$e$1(),d=o==null?void 0:o.alpha;React.useEffect(()=>{if(!t||!c)return;const h=c.imageryLayers,p=h.addImageryProvider(t);return Object.assign(p,{bringToFront:()=>{h.raiseToTop(p)},sendToBack:()=>{h.lowerToBottom(p)}}),d!==void 0&&typeof d=="number"&&(p.alpha=d),attachTag(p,{layerId:n,hideIndicator:s}),()=>{h.remove(p)}},[t,c,n,d,s])},useData$1=t=>React.useMemo(()=>{const n=extractSimpleLayerData(t);return{type:n==null?void 0:n.type,url:n==null?void 0:n.url,layers:n!=null&&n.layers?Array.isArray(n.layers)?n.layers.join(","):n==null?void 0:n.layers:void 0,parameters:n==null?void 0:n.parameters}},[t]);function normalizeUrl(t,n){if(!t)return"";let o=t.replace("/%7Bz%7D","/{z}").replace("/%7Bx%7D","/{x}").replace("/%7By%7D","/{y}");return o.includes("/{z}/{x}/{y}.")||(o[o.length-1]!=="/"&&(o+="/"),o+="{z}/{x}/{y}."+n),o}const useMVT=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y,layers:E}=useData$1(o),L=extractSimpleLayer(o)||void 0,F=React.useMemo(()=>{if(!(!t||!s||!y||!E||p!=="mvt"))return new Gi({minimumLevel:c,maximumLevel:d,credit:h,urlTemplate:normalizeUrl(y,"mvt"),layerName:E,layer:L,worker:!0})},[t,s,y,E,p,c,d,h,L]);useImageryProvider(F,o==null?void 0:o.id,n)},useTiles=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y}=useData$1(o),E=React.useMemo(()=>{if(!(!t||!s||!y||p!=="tiles"))return new Cesium$1.UrlTemplateImageryProvider({url:normalizeUrl(y,"png"),minimumLevel:c,maximumLevel:d,credit:h})},[t,s,y,p,c,d,h]);useImageryProvider(E,o==null?void 0:o.id,n)},useTMS=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y}=useData$1(o),[E,L]=React.useState();React.useEffect(()=>{if(!t||!s||!y||p!=="tms")return;(async()=>{L(await Cesium$1.TileMapServiceImageryProvider.fromUrl(y,{minimumLevel:c,maximumLevel:d,credit:h}))})()},[t,s,y,p,c,d,h]),useImageryProvider(E,o==null?void 0:o.id,n)},useWMS=({isVisible:t,property:n,layer:o})=>{const{show:s=!0,minimumLevel:c,maximumLevel:d,credit:h}=n??{},{type:p,url:y,layers:E,parameters:L}=useData$1(o),F=React.useMemo(()=>{if(!(!t||!s||!y||!E||p!=="wms"))return new Cesium$1.WebMapServiceImageryProvider({url:y,layers:E,minimumLevel:c,maximumLevel:d,credit:h,parameters:L})},[t,s,y,E,p,c,d,h,L]);useImageryProvider(F,o==null?void 0:o.id,n)};function Raster({isVisible:t,layer:n,property:o}){return useWMS({isVisible:t,layer:n,property:o}),useTiles({isVisible:t,layer:n,property:o}),useTMS({isVisible:t,layer:n,property:o}),useMVT({isVisible:t,layer:n,property:o}),null}const Raster$1=React.memo(Raster,(t,n)=>{var o,s,c,d,h,p;return isEqual((o=extractSimpleLayer(t.layer))==null?void 0:o.polygon,(s=extractSimpleLayer(n.layer))==null?void 0:s.polygon)&&isEqual((c=extractSimpleLayer(t.layer))==null?void 0:c.polyline,(d=extractSimpleLayer(n.layer))==null?void 0:d.polyline)&&isEqual((h=extractSimpleLayer(t.layer))==null?void 0:h.marker,(p=extractSimpleLayer(n.layer))==null?void 0:p.marker)&&isEqual(extractSimpleLayerData(t.layer),extractSimpleLayerData(n.layer))&&isEqual(t.property,n.property)&&t.isVisible===n.isVisible&&t.evalFeature===n.evalFeature&&t.onComputedFeatureFetch===n.onComputedFeatureFetch}),config$3={noFeature:!0};function getMarkerCoordinates(t,n){var s;const o=(s=t.position)==null?void 0:s.getValue(n);return[(o==null?void 0:o.x)??0,(o==null?void 0:o.y)??0,(o==null?void 0:o.z)??0]}function getGeometryFromEntity(t,n){var o,s,c,d,h;if(n.point||n.billboard||n.label)return{type:"Point",coordinates:getMarkerCoordinates(n,t)};if(n.polyline){const p=(s=(o=n.polyline)==null?void 0:o.positions)==null?void 0:s.getValue(t);return{type:"LineString",coordinates:p==null?void 0:p.map(L=>[(L==null?void 0:L.x)??0,(L==null?void 0:L.y)??0,(L==null?void 0:L.z)??0])}}if(n.polygon){const p=(d=(c=n.polygon)==null?void 0:c.hierarchy)==null?void 0:d.getValue(t);return{type:"Polygon",coordinates:[(h=p==null?void 0:p.positions)==null?void 0:h.map(L=>[(L==null?void 0:L.x)??0,(L==null?void 0:L.y)??0,(L==null?void 0:L.z)??0])]}}}function overrideOriginalProperties(t,n,o,s){const c=(n==null?void 0:n.originalProperties)||{};attachTag(t,{...n||{},originalProperties:{...c,[o]:{...c[o],...s}}})}function attachProperties(t,n,o,s){const[c,d]=o,h=t[d]??{};if(!t[d])return;const p=getTag(t),E=((p==null?void 0:p.originalProperties)||{})[c];let L=!1;Object.entries(s).forEach(([F,N])=>{var nt;const z=N.name,oe=N.type;let W=N.override??((nt=n==null?void 0:n[c])==null?void 0:nt[z]);const lt=W==null&&!!N.default;if(W=W??N.default,!((W==null||lt)&&!E)){switch(L=!0,oe){case"color":W=toColor$1(W);break;case"shadows":W=shadowMode(W);break;case"heightReference":W=heightReference(W);break;case"classificationType":W=classificationType(W)}W!==t[d][F]&&(t[d][F]=W??h[F])}}),overrideOriginalProperties(t,p,c,L)}const hasAppearance=(t,n,o)=>{var s;return!!((s=extractSimpleLayer(t))!=null&&s[o[0]]&&n[o[1]])},makeFeatureId$1=t=>String(t.id),attachStyle=(t,n,o,s)=>{var p,y,E,L,F,N,z,oe;if(!n)return;const c=hasAppearance(n,t,["marker","point"]),d=hasAppearance(n,t,["marker","billboard"]),h=hasAppearance(n,t,["marker","label"]);if(t.point||t.billboard||t.label){const W=getMarkerCoordinates(t,s),lt=getGeometryFromEntity(s,t),nt={type:"feature",id:makeFeatureId$1(t),geometry:lt,properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:W[0],y:W[1],z:W[2]}},Ee=o(n.layer,nt);return Ee?(c&&(((p=Ee==null?void 0:Ee.marker)==null?void 0:p.style)==="point"&&!t.point&&(t.point=new Cesium$1.PointGraphics,t.billboard=void 0),attachProperties(t,Ee,["marker","point"],{show:{name:"show",...(y=Ee==null?void 0:Ee.marker)!=null&&y.style?{override:((E=Ee==null?void 0:Ee.marker)==null?void 0:E.style)==="point"&&((Ee==null?void 0:Ee.marker.show)??!0)}:{}},pixelSize:{name:"pointSize"},color:{name:"pointColor",type:"color"},outlineColor:{name:"pointOutlineColor",type:"color"},outlineWidth:{name:"pointOutlineWidth"},heightReference:{name:"heightReference",type:"heightReference"}})),d&&(((L=Ee==null?void 0:Ee.marker)==null?void 0:L.style)==="image"&&!t.billboard&&(t.billboard=new Cesium$1.BillboardGraphics,t.point=void 0),attachProperties(t,Ee,["marker","billboard"],{show:{name:"show",...(F=Ee==null?void 0:Ee.marker)!=null&&F.style?{override:((N=Ee==null?void 0:Ee.marker)==null?void 0:N.style)==="image"&&((Ee==null?void 0:Ee.marker.show)??!0)}:{}},image:{name:"image"},color:{name:"imageColor",type:"color"},scale:{name:"imageSize"},sizeInMeters:{name:"imageSizeInMeters"},heightReference:{name:"heightReference",type:"heightReference"},horizontalOrigin:{name:"imageHorizontalOrigin"},verticalOrigin:{name:"imageVerticalOrigin"}}),h&&attachProperties(t,Ee,["marker","label"],{show:{name:"show",default:!0},text:{name:"labelText"},backgroundColor:{name:"labelBackground",type:"color"},heightReference:{name:"heightReference",type:"heightReference"}})),[nt,Ee]):void 0}if(t.polyline){const W=(z=t.position)==null?void 0:z.getValue(s),lt=getGeometryFromEntity(s,t),nt={type:"feature",id:makeFeatureId$1(t),geometry:lt,properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:(W==null?void 0:W.x)??0,y:(W==null?void 0:W.y)??0,z:(W==null?void 0:W.z)??0}},Ee=o(n.layer,nt);return Ee?(hasAppearance(n,t,["polyline","polyline"])&&attachProperties(t,Ee,["polyline","polyline"],{show:{name:"show",default:!0},width:{name:"strokeWidth"},material:{name:"strokeColor",type:"color"},shadows:{name:"shadows",type:"shadows"},clampToGround:{name:"clampToGround"},classificationType:{name:"classificationType",type:"classificationType"}}),[nt,Ee]):void 0}if(t.polygon){const W=(oe=t.position)==null?void 0:oe.getValue(s),lt=getGeometryFromEntity(s,t),nt={type:"feature",id:makeFeatureId$1(t),geometry:lt,properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:(W==null?void 0:W.x)??0,y:(W==null?void 0:W.y)??0,z:(W==null?void 0:W.z)??0}},Ee=o(n.layer,nt);return Ee?(hasAppearance(n,t,["polygon","polygon"])&&attachProperties(t,Ee,["polygon","polygon"],{show:{name:"show",default:!0},fill:{name:"fill"},material:{name:"fillColor",type:"color"},outline:{name:"stroke"},outlineColor:{name:"strokeColor",type:"color"},outlineWidth:{name:"strokeWidth"},shadows:{name:"shadows",type:"shadows"},heightReference:{name:"heightReference",type:"heightReference"},extrudedHeight:{name:"extrudedHeight"},classificationType:{name:"classificationType",type:"classificationType"}}),[nt,Ee]):void 0}},types={kml:"kml",geojson:"geojson",czml:"czml"},comps={kml:Ys$1,czml:Bs$1,geojson:Us$1};function Resource({isVisible:t,property:n,layer:o,onComputedFeatureFetch:s,onComputedFeatureDelete:c}){var mt,fa,Wa,sl,Vd,Xd;const{show:d=!0,clampToGround:h,stroke:p,strokeWidth:y,markerColor:E,markerSize:L,fill:F,hideIndicator:N}=n??{},[z,oe,W]=React.useMemo(()=>{var Gd;const pu=extractSimpleLayerData(o),gl=n==null?void 0:n.type,md=n==null?void 0:n.url;return[gl??(pu==null?void 0:pu.type),md??(pu==null?void 0:pu.url),((Gd=pu==null?void 0:pu.time)==null?void 0:Gd.updateClockOnLoad)??!0]},[n,o]),{viewer:lt}=$e$1(),nt=React.useRef([]),Ee=React.useRef(new Set),yt=React.useMemo(()=>!z||z==="auto"?guessType(oe):void 0,[z,oe]),Ai=yt?types[yt]:z!=="auto"?z:void 0,zi=Ai?comps[Ai]:void 0,{requestRender:ha,timelineManagerRef:ba}=useContext(),Sa=React.useCallback(pu=>{if(!lt)return;const gl=[],md=[];pu.entities.values.forEach(Gd=>{var ff;const tf=attachStyle(Gd,o,evalFeature,lt.clock.currentTime),[nf,lf]=tf||[];attachTag(Gd,{layerId:o==null?void 0:o.id,featureId:nf==null?void 0:nf.id,hideIndicator:(ff=lf==null?void 0:lf.resource)==null?void 0:ff.hideIndicator}),nf&&!Ee.current.has(nf.id)&&(gl.push(nf),nt.current.push({feature:nf,raw:Gd}),Ee.current.add(nf.id)),lf&&md.push(lf)}),z!=="geojson"&&(s==null||s(gl,md)),ha==null||ha()},[o,lt,s,z,ha]),ya=React.useRef({start:(fa=(mt=ba==null?void 0:ba.current)==null?void 0:mt.timeline)==null?void 0:fa.start,stop:(sl=(Wa=ba==null?void 0:ba.current)==null?void 0:Wa.timeline)==null?void 0:sl.stop,current:(Xd=(Vd=ba==null?void 0:ba.current)==null?void 0:Vd.timeline)==null?void 0:Xd.current}),ms=React.useCallback(pu=>{var gl,md;if(pu.entities.values.forEach(Gd=>requestAnimationFrame(()=>{const tf=getTag(Gd);attachTag(Gd,{layerId:o==null?void 0:o.id,featureId:makeFeatureId$1(Gd),hideIndicator:N??(tf==null?void 0:tf.hideIndicator)})})),!W){ya.current.current&&ya.current.start&&ya.current.stop&&((gl=ba==null?void 0:ba.current)==null||gl.commit({cmd:"SET_TIME",payload:{start:ya.current.start,stop:ya.current.stop,current:ya.current.current},committer:{source:"featureResource",id:o==null?void 0:o.id}}));return}pu.clock&&((md=ba==null?void 0:ba.current)==null||md.commit({cmd:"SET_TIME",payload:{start:Cesium$1.JulianDate.toDate(pu.clock.startTime),stop:Cesium$1.JulianDate.toDate(pu.clock.stopTime),current:Cesium$1.JulianDate.toDate(pu.clock.currentTime)},committer:{source:"featureResource",id:o==null?void 0:o.id}})),ha==null||ha()},[W,ba,o==null?void 0:o.id,ha,N]),bs=React.useMemo(()=>p?Cesium$1.Color.fromCssColorString(p):void 0,[p]),Ra=React.useMemo(()=>F?Cesium$1.Color.fromCssColorString(F):void 0,[F]),pi=React.useMemo(()=>E?Cesium$1.Color.fromCssColorString(E):void 0,[E]);return React.useEffect(()=>{lt&&nt.current.forEach(pu=>{attachStyle(pu.raw,o,evalFeature,lt.clock.currentTime)})},[o,lt]),React.useEffect(()=>()=>{requestIdleCallbackWithRequiredWork(()=>{c==null||c(Array.from(Ee.current.values()))})},[]),!t||!d||!zi||!oe?null:jsxRuntimeExports.jsx(zi,{data:oe,show:!0,clampToGround:h,onChange:Sa,onLoad:ms,stroke:bs,fill:Ra,strokeWidth:y,markerSize:L,markerColor:pi})}const config$2={noFeature:!0},DEFAULT_CLIPPING_POLYGON_STYLE={fill:!0,fillColor:"#FFFFFF22",stroke:!0,strokeColor:"#FFFFFF",strokeWidth:1},DrawClippingPolygon=({coordiantes:t,top:n=0,bottom:o=0,visible:s,style:c,ready:d})=>{const h=useCustomCompareMemo(()=>t?new Cesium$1.PolygonHierarchy(t.map(y=>Cesium$1.Cartesian3.fromDegrees(y[0],y[1],y[2]??0))):void 0,[t??[]],isEqual),p=React.useMemo(()=>({...DEFAULT_CLIPPING_POLYGON_STYLE,...c,fillColor:toColor((c==null?void 0:c.fillColor)??DEFAULT_CLIPPING_POLYGON_STYLE.fillColor),strokeColor:toColor((c==null?void 0:c.strokeColor)??DEFAULT_CLIPPING_POLYGON_STYLE.strokeColor)}),[c]);return jsxRuntimeExports.jsx(EntityExt,{hideIndicator:!0,children:jsxRuntimeExports.jsx(aa$1,{hierarchy:h,fill:p.fill,material:p.fillColor,outline:p.stroke,outlineColor:p.strokeColor,outlineWidth:p.strokeWidth,height:o,extrudedHeight:n,show:s&&d})})},useRefValue=t=>{const n=React.useRef(t);return n.current=t,n},useImmutableFunction=t=>{const n=React.useRef(t),o=React.useCallback(()=>n.current,[]);return React.useEffect(()=>{n.current=t},[t]),o};class FeatureIndex{constructor(){Vf(this,"records",new Map)}has(n){return this.records.has(n)}find(n){}}class TilesetFeatureIndex extends FeatureIndex{has(n){return this.records.has(n)}find(n){const o=this.records.get(n);if(o!=null)return o.map(({content:s,batchId:c})=>s.getFeature(c))}addFeature(n,o,s){if(s==null)return;const c=this.records.get(s);c==null?this.records.set(s,[{content:n,batchId:o}]):c.push({content:n,batchId:o})}deleteFeature(n){n!=null&&this.records.has(n)&&this.records.delete(n)}}const BUILTIN_BOX_SIDE_PLANES=[{normal:{x:0,y:0,z:1},distance:.5},{normal:{x:0,y:0,z:-1},distance:.5},{normal:{x:0,y:1,z:0},distance:.5},{normal:{x:0,y:-1,z:0},distance:.5},{normal:{x:1,y:0,z:0},distance:.5},{normal:{x:-1,y:0,z:0},distance:.5}],useClippingBox=({clipping:t,boxId:n})=>{const{useBuiltinBox:o,visible:s,allowEnterGround:c,coordinates:d,width:h,height:p,length:y,heading:E,pitch:L,roll:F,disabledSelection:N}=t||{},{viewer:z}=$e$1(),oe=React.useRef(!1),W=React.useRef(!1),lt=React.useRef(),[nt,Ee]=React.useState(d);React.useEffect(()=>{o&&!nt&&Ee(d)},[nt,d,o]);const[yt,Ai]=React.useState({width:h,height:p,length:y,heading:E,pitch:L,roll:F});React.useEffect(()=>{o&&!yt&&Ai({width:h,height:p,length:y,heading:E,pitch:L,roll:F})},[yt,h,p,y,E,L,F,o]);const[zi,ha]=React.useState({activeBox:!1,activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1,cursor:"default"}),ba=React.useCallback(pu=>{ha(gl=>({...gl,...pu}))},[]),Sa=React.useCallback(pu=>{if(!z||!N)return;const gl=z.scene.pick(pu.position),md=getLayerId$1(gl);if(md!=null&&md.startsWith(`${n}-scale-point`)){const Gd=Number(md.split("-").slice(-1)[0]);ba({cursor:"nesw-resize",activeScalePointIndex:Gd,isScalePointClicked:!0})}if(md!=null&&md.startsWith(`${n}-edge-draggable`)){const Gd=Number(md.split("-").slice(-1)[0]);ba({cursor:"grabbing",activeEdgeIndex:Gd,isEdgeClicked:!0})}if(md!=null&&md.startsWith(`${n}-plane`)&&(oe.current=!0,W.current=md.endsWith("top")||md.endsWith("bottom")),oe.current){const Gd=getCamera(z);lt.current=Gd,updateMapController(z,!1),(!zi.isScalePointClicked||!zi.isEdgeClicked)&&ba({cursor:"grabbing",activeBox:!0})}},[n,zi,ba,z,N]),ya=React.useCallback(()=>{!z||!N||((zi.activeScalePointIndex||zi.activeEdgeIndex)&&ba({cursor:"default",activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1}),oe.current&&(updateMapController(z,!0),lt.current=void 0,oe.current=!1,W.current=!1,zi.activeBox=!1,zi.cursor="default",ba({activeBox:!1,cursor:"default"})))},[zi,ba,z,N]),ms=React.useRef(0),bs=React.useCallback(async pu=>{if(!oe.current||!z||!N)return;const gl=Cesium$1.Cartesian3.fromDegrees((nt==null?void 0:nt[0])||0,(nt==null?void 0:nt[1])||0,nt==null?void 0:nt[2]);if(W.current){const md=(nt==null?void 0:nt[2])||0,Gd=(()=>{if(!c){const vf=md-((yt==null?void 0:yt.height)||0)/2,Mf=ms.current;if(vf<Mf)return md+(Mf-vf)}})(),tf=new Cesium$1.Cartesian2(pu.startPosition.x,pu.startPosition.y),nf=new Cesium$1.Cartesian2(pu.endPosition.x,pu.endPosition.y),lf=Cesium$1.Cartesian2.subtract(nf,tf,new Cesium$1.Cartesian2),ff=new Cesium$1.Cartesian3(0,0,lf.y<0?-1:1),{moveAmount:_f}=computeMoveAmount(z.scene,{startPosition:tf,endPosition:nf},gl,ff),pf=Cesium$1.Cartesian3.multiplyByScalar(ff,_f,new Cesium$1.Cartesian3);Ee(vf=>[(vf==null?void 0:vf[0])||0,(vf==null?void 0:vf[1])||0,(Gd||(vf==null?void 0:vf[2])||0)+pf.z])}else{const md=pu.endPosition?getLocationFromScreen(z.scene,pu.endPosition.x,pu.endPosition.y,!c):void 0;Ee(Gd=>[(md==null?void 0:md.lng)||0,(md==null?void 0:md.lat)||0,(c?Gd==null?void 0:Gd[2]:md==null?void 0:md.height)||0]),sampleTerrainHeight(z.scene,(nt==null?void 0:nt[0])||0,(nt==null?void 0:nt[1])||0).then(Gd=>{ms.current=Gd||0})}},[c,nt,yt==null?void 0:yt.height,z,N]),Ra=React.useCallback(({layerId:pu}={})=>{const gl=!zi.isScalePointClicked&&!zi.isEdgeClicked&&!oe.current;if(pu!=null&&pu.startsWith(`${n}-scale-point`)&&gl){const md=Number(pu.split("-").slice(-1)[0]);ba({cursor:"nesw-resize",activeScalePointIndex:md})}if(pu!=null&&pu.startsWith(`${n}-edge-draggable`)&&gl){const md=Number(pu.split("-").slice(-1)[0]);ba({cursor:"grab",activeEdgeIndex:md})}pu!=null&&pu.startsWith(`${n}-plane`)&&gl&&ba({cursor:"grab",activeBox:!0})},[n,zi.isEdgeClicked,zi.isScalePointClicked,ba]),pi=React.useCallback(({layerId:pu}={})=>{const gl=!zi.isScalePointClicked&&!zi.isEdgeClicked&&!oe.current;pu!=null&&pu.startsWith(`${n}-scale-point`)&&gl&&ba({cursor:"default",activeScalePointIndex:void 0}),pu!=null&&pu.startsWith(`${n}-edge-draggable`)&&gl&&ba({cursor:"default",activeEdgeIndex:void 0}),pu!=null&&pu.startsWith(`${n}-plane`)&&gl&&ba({cursor:"default",activeBox:!1})},[n,zi.isEdgeClicked,zi.isScalePointClicked,ba]),mt=React.useRef(),fa=React.useCallback(pu=>{const gl=z==null?void 0:z.scene.pick(pu.endPosition);if(mt.current!==gl){if(mt.current){const md=getLayerId$1(mt.current);pi({layerId:md}),pi()}if(gl){const md=getLayerId$1(gl);Ra({layerId:md}),Ra()}}bs(pu),mt.current=gl},[Ra,pi,bs,z==null?void 0:z.scene]),Wa=React.useCallback(pu=>{var gl,md;if((gl=pu.layerId)!=null&&gl.startsWith(`${n}-scale-point`)&&pu.scale){const Gd=pu.scale;Ai(tf=>({...tf,width:Gd.width,height:Gd.height,length:Gd.length})),Ee([Gd.location.lng,Gd.location.lat,Gd.location.height])}if((md=pu.layerId)!=null&&md.startsWith(`${n}-edge-draggable`)&&pu.rotate){const Gd=pu.rotate;Ai(tf=>({...tf,heading:Gd.heading,pitch:Gd.pitch,roll:Gd.roll}))}},[n]),sl=React.useMemo(()=>new Cesium$1.ScreenSpaceEventHandler(z==null?void 0:z.scene.canvas),[z]);React.useEffect(()=>{sl.setInputAction(Sa,Cesium$1.ScreenSpaceEventType.LEFT_DOWN),sl.setInputAction(fa,Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),sl.setInputAction(ya,Cesium$1.ScreenSpaceEventType.LEFT_UP)},[sl,Sa,fa,ya]),React.useEffect(()=>()=>{requestAnimationFrame(()=>{sl.isDestroyed()||sl.destroy()})},[sl]);const Vd=React.useMemo(()=>({...zi,...yt,allowEnterGround:c}),[zi,yt,c]),Xd=React.useMemo(()=>o?{visible:s,handleLayerEdit:Wa,geometry:{type:"Point",coordinates:nt||d||[0,0,0]},property:Vd}:void 0,[Vd,d,nt,Wa,o,s]);return{...t,planes:o?BUILTIN_BOX_SIDE_PLANES:t==null?void 0:t.planes,width:o?yt==null?void 0:yt.width:t==null?void 0:t.width,height:o?yt==null?void 0:yt.height:t==null?void 0:t.height,length:o?yt==null?void 0:yt.length:t==null?void 0:t.length,heading:o?yt==null?void 0:yt.heading:t==null?void 0:t.heading,pitch:o?yt==null?void 0:yt.pitch:t==null?void 0:t.pitch,roll:o?yt==null?void 0:yt.roll:t==null?void 0:t.roll,coordinates:o?nt:t==null?void 0:t.coordinates,builtinBoxProps:Xd}};function getLayerId$1(t){var n,o;if(t&&"id"in t&&t.id instanceof Cesium$1.Entity)return(n=getTag(t.id))==null?void 0:n.layerId;if(t&&t instanceof Cesium$1.Cesium3DTileFeature)return(o=getTag(t.tileset))==null?void 0:o.layerId}const useDrawClipping=({enabled:t,surfacePoints:n,direction:o="inside",top:s,bottom:c,visible:d=!0,style:h,tilesetRef:p,viewer:y,clippingPlanes:E,isTilesetReady:L})=>{const[F,N]=React.useState(0),z=React.useMemo(()=>s??100,[s]),oe=React.useMemo(()=>c??10,[c]),[W,lt]=React.useState(!1),{requestRender:nt}=useContext();React.useEffect(()=>{(async()=>{if(!(p!=null&&p.current)||!L)return;if(!t||!n||(n==null?void 0:n.length)<2){E.removeAll(),N(0),nt==null||nt();return}E.modelMatrix=Cesium$1.Matrix4.IDENTITY.clone(),lt(!1);const Ai=polygon([n.map(ya=>[ya.lng,ya.lat])]),zi=centroid(Ai),ha=y!=null&&y.scene?await sampleTerrainHeight(y==null?void 0:y.scene,zi.geometry.coordinates[0],zi.geometry.coordinates[1])??0:0;N(ha);const ba=Cesium$1.Matrix4.inverse(Cesium$1.Transforms.eastNorthUpToFixedFrame(p.current.boundingSphere.center),new Cesium$1.Matrix4);let Sa=0;for(let ya=0;ya<n.length;ya++){const ms=n[ya],bs=n[(ya+1)%n.length];Sa+=(bs.lng-ms.lng)*(bs.lat+ms.lat)}Sa>0&&n.reverse(),E.removeAll();for(let ya=0;ya<n.length-1;ya++){const ms=n[ya],bs=n[ya+1];E.add(createSidePlane(ms,bs,ba,o))}E.add(createHorizontalPlane(n[0],ha+z,ba,o==="inside"?1:-1)),E.add(createHorizontalPlane(n[0],ha-oe,ba,o==="inside"?-1:1)),lt(!0)})()},[n,p,E,z,oe,t,o,y,L,nt]),React.useEffect(()=>{E.unionClippingRegions=o==="outside"},[E,o,t]);const Ee=React.useMemo(()=>({coordiantes:(n==null?void 0:n.map(yt=>[yt.lng,yt.lat]))??[],top:F+z,bottom:F-oe,visible:d,style:h,ready:W}),[n,F,z,oe,d,h,W]);return{drawClippingEnabled:t,drawClippingEdgeProps:Ee}},getOriginCoordinateSystemPoint=(t,n,o)=>{const s=Cesium$1.Cartesian3.fromDegrees(t.lng,t.lat,o);return Cesium$1.Matrix4.multiplyByPoint(n,s,new Cesium$1.Cartesian3)},createSidePlane=(t,n,o,s)=>{const c=getOriginCoordinateSystemPoint(t,o),d=getOriginCoordinateSystemPoint(n,o),h=new Cesium$1.Cartesian3(0,0,1),p=new Cesium$1.Cartesian3(0,0,-1),y=Cesium$1.Cartesian3.subtract(d,c,new Cesium$1.Cartesian3),E=s==="inside"?Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(y,h,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3):Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(y,p,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),L=Cesium$1.Plane.fromPointNormal(c,E);return Cesium$1.ClippingPlane.fromPlane(L)},createHorizontalPlane=(t,n,o,s)=>{const c=getOriginCoordinateSystemPoint(t,o,n),d=new Cesium$1.Cartesian3(0,0,s),h=Cesium$1.Plane.fromPointNormal(c,d);return Cesium$1.ClippingPlane.fromPlane(h)},DEFAULT_FEATURE_COLOR=Cesium$1.Color.WHITE,useData=t=>React.useMemo(()=>{var o;const n=extractSimpleLayerData(t);return{type:n==null?void 0:n.type,url:n==null?void 0:n.url,idProperty:n==null?void 0:n.idProperty,layers:n!=null&&n.layers?Array.isArray(n.layers)?n.layers.join(","):n==null?void 0:n.layers:void 0,googleMapApiKey:(o=n==null?void 0:n.serviceTokens)==null?void 0:o.googleMapApiKey}},[t]),makeFeatureId=(t,n,o)=>{const s=n.tile.boundingSphere.center,c=o&&!(t instanceof Cesium$1.Model)?t.getProperty(o):void 0;if(c)return c;const d=getBuiltinFeatureId(t);return generateIDWithMD5(`${s.x}-${s.y}-${s.z}-${d}-${t instanceof Cesium$1.Model?"":JSON.stringify(Object.entries(convertCesium3DTileFeatureProperties(t)).filter((h,p)=>typeof p=="string"||typeof p=="number").map(([h,p])=>`${h}${p}`))}`)},makeFeatureFrom3DTile=(t,n,o)=>{const s=n.tile.boundingSphere.center;return{type:"feature",id:makeFeatureId(t,n,o),geometry:{type:"Point",coordinates:[s.x,s.y,s.z]},range:{x:s.x,y:s.y,z:s.z}}},getBuiltinFeatureId=t=>(t instanceof Cesium$1.Model?t.id:t instanceof Cesium$1.Cesium3DTileFeature?t.featureId:"")??"",MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES=5e3,COMMON_STYLE_PROPERTIES=[{name:"color",convert:"color"},{name:"show"}],MODEL_STYLE_PROPERTIES=[{name:"color",convert:"colorFunctionString"},{name:"show"},{name:"pointSize"},{name:"meta"}],POINT_STYLE_PROPERTIES=[{name:"pointSize"}],TILESET_APPEARANCE_FIELDS=["show","color","pointSize","meta"],convertStyle=(t,n)=>n==="color"?toColor(t):n==="colorFunctionString"?t===void 0?t:`color("${t}")`:t,useFeature=({id:t,tileset:n,idProperty:o,layer:s,viewer:c,featureIndex:d,selectedFeatureIdsRef:h,evalFeature:p,onComputedFeatureFetch:y,shouldUseFeatureIndex:E,isTilesetReady:L})=>{const F=React.useRef([]),N=React.useRef(s),z=React.useRef(new Set),oe=(s==null?void 0:s.id)||t,W=useRefValue(oe),lt=React.useCallback(async pi=>{var fa;const mt=(fa=N==null?void 0:N.current)==null?void 0:fa.layer;if((mt==null?void 0:mt.type)==="simple"&&(pi!=null&&pi.feature)){const Wa=pi.raw,sl=getTag(Wa),Vd=c&&!(Wa instanceof Cesium$1.Model)?convertCesium3DTileFeatureProperties(Wa):{},Xd=E?h.current.includes((sl==null?void 0:sl.featureId)??""):sl==null?void 0:sl.isFeatureSelected,pu=p(mt,{...pi==null?void 0:pi.feature,properties:Vd}),gl=pu==null?void 0:pu["3dtiles"];return COMMON_STYLE_PROPERTIES.forEach(({name:md,convert:Gd})=>{var nf,lf;if(md==="color"){if(Xd){Wa.color=typeof((nf=mt["3dtiles"])==null?void 0:nf.selectedFeatureColor)=="string"?toColor((lf=mt["3dtiles"])==null?void 0:lf.selectedFeatureColor)??Wa.color:Wa.color;return}Wa.color=DEFAULT_FEATURE_COLOR}const tf=convertStyle(gl==null?void 0:gl[md],Gd);tf!==void 0&&(Wa[md]=tf)}),Wa instanceof Cesium$1.Cesium3DTilePointFeature&&POINT_STYLE_PROPERTIES.forEach(({name:md,convert:Gd})=>{const tf=convertStyle(gl==null?void 0:gl[md],Gd);tf!==void 0&&(Wa[md]=tf)}),"style"in Wa&&(Wa.style=new Cesium$1.Cesium3DTileStyle(MODEL_STYLE_PROPERTIES.reduce((md,{name:Gd,convert:tf})=>{const nf=convertStyle(gl==null?void 0:gl[Gd],tf);return nf===void 0?md:{...md,[Gd]:nf}},{}))),attachTag(pi.raw,{layerId:oe,featureId:pi.feature.id,computedFeature:pu,isFeatureSelected:sl==null?void 0:sl.isFeatureSelected}),pu}},[p,oe,c,E,h]),nt=React.useCallback(async pi=>{if(pi.tileset.isDestroyed())return;const mt=new Set;await lookupFeatures(pi.content,async(fa,Wa,sl)=>{const Vd={feature:makeFeatureFrom3DTile(fa,Wa,o),raw:fa};attachTag(Vd.raw,{layerId:W.current,featureId:Vd.feature.id}),sl!=null&&E&&d.addFeature(Wa,sl,Vd.feature.id),await lt(Vd),F.current.push(Vd),z.current.add(Vd.feature.id),mt.add(pick(Vd.feature,["id","type","range"]))}),y==null||y(Array.from(mt.values()),[])},[F,lt,y,o,d,E,W]),Ee=React.useRef(nt);Ee.current=nt,React.useEffect(()=>{var pi;return(pi=n.current)==null?void 0:pi.tileLoad.addEventListener(mt=>Ee.current(mt))},[n,L]);const yt=React.useCallback(async pi=>{pi.tileset.isDestroyed()||!E||await lookupFeatures(pi.content,async(mt,fa)=>{d.deleteFeature(makeFeatureId(mt,fa,o))})},[o,d,E]),Ai=React.useRef(yt);Ai.current=yt,React.useEffect(()=>{var pi;return(pi=n.current)==null?void 0:pi.tileUnload.addEventListener(mt=>Ai.current(mt))},[n,L]),React.useEffect(()=>{N.current=s},[s]);const zi=React.useMemo(()=>{var pi;return(pi=extractSimpleLayer(s))==null?void 0:pi["3dtiles"]},[s]),ha=usePick(zi,TILESET_APPEARANCE_FIELDS),ba=E?0:s==null?void 0:s.layer._updateStyle,Sa=React.useRef(ba),ya=React.useRef();React.useEffect(()=>{ya.current=Date.now()},[ha,ba]);const ms=React.useCallback(async(pi,mt)=>new Promise(fa=>requestAnimationFrame(()=>{if(ya.current&&ya.current>mt){fa(void 0);return}(ha||ba)&<(pi),fa(void 0)})),[ha,lt,ba]),bs=React.useCallback(async pi=>{const mt=[];let fa=!1;for(const Wa of F.current){if(ya.current&&ya.current>pi){fa=!0;break}mt.push(ms(Wa,pi)),mt.length>MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES&&(await Promise.all(mt),mt.length=0)}fa||await Promise.all(mt),Sa.current=ba,mt.length=0},[ms,ba]),{requestRender:Ra}=useContext();React.useEffect(()=>{(async()=>{const mt=Date.now();await bs(mt),Ra==null||Ra()})()},[bs,Ra,ba])},useHooks$2=({id:t,boxId:n,isVisible:o,property:s,viewerProperty:c,layer:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E})=>{var Nf,Jf,qf,Bf,zm,Tf;const{viewer:L}=$e$1(),F=React.useRef(),{onLayerLoad:N,updateCredits:z}=useContext(),oe=React.useRef(d==null?void 0:d.id);oe.current=d==null?void 0:d.id;const{tileset:W,styleUrl:lt,edgeColor:nt,edgeWidth:Ee,experimental_clipping:yt,selectedFeatureColor:Ai,disableIndexingFeature:zi}=s??{},{width:ha,height:ba,length:Sa,location:ya,coordinates:ms,heading:bs,roll:Ra,pitch:pi,planes:mt,visible:fa=!0,direction:Wa="inside",builtinBoxProps:sl,allowEnterGround:Vd}=useClippingBox({clipping:yt,boxId:n}),[Xd,pu]=React.useState(),{url:gl,type:md,idProperty:Gd,googleMapApiKey:tf}=useData(d),nf=!zi&&!!Gd,[lf,ff]=React.useState(!1),_f=React.useRef(mt),pf=React.useMemo(()=>{var Cf,Df;return(!((Cf=_f.current)!=null&&Cf.length)||!((Df=_f.current)!=null&&Df.every((Wf,$f)=>{var Em,Qf,Am,wm,_m,xf;return((Em=Wf.normal)==null?void 0:Em.x)===((Qf=mt==null?void 0:mt[$f].normal)==null?void 0:Qf.x)&&((Am=Wf.normal)==null?void 0:Am.y)===((wm=mt==null?void 0:mt[$f].normal)==null?void 0:wm.y)&&((_m=Wf.normal)==null?void 0:_m.z)===((xf=mt==null?void 0:mt[$f].normal)==null?void 0:xf.z)&&Wf.distance===(mt==null?void 0:mt[$f].distance)})))&&(_f.current=mt),_f.current},[mt]),vf=Wa==="inside"?-1:1,[Mf,Af]=React.useState(()=>new Cesium$1.ClippingPlaneCollection({planes:pf==null?void 0:pf.map(Cf=>{var Df,Wf,$f;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Df=Cf.normal)==null?void 0:Df.x,(Wf=Cf.normal)==null?void 0:Wf.y,($f=Cf.normal)==null?void 0:$f.z),(Cf.distance||0)*vf)}),unionClippingRegions:Wa==="outside",edgeWidth:Ee,edgeColor:toColor(nt)}));React.useEffect(()=>()=>{Af(new Cesium$1.ClippingPlaneCollection({planes:pf==null?void 0:pf.map(Cf=>{var Df,Wf,$f;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Df=Cf.normal)==null?void 0:Df.x,(Wf=Cf.normal)==null?void 0:Wf.y,($f=Cf.normal)==null?void 0:$f.z),(Cf.distance||0)*vf)}),unionClippingRegions:Wa==="outside",edgeWidth:Ee,edgeColor:toColor(nt)}))},[]);const{drawClippingEnabled:Lf,drawClippingEdgeProps:Wc}=useDrawClipping({...yt==null?void 0:yt.draw,tilesetRef:F,viewer:L,clippingPlanes:Mf,isTilesetReady:lf}),[uf]=React.useState(()=>new TilesetFeatureIndex),rf=React.useCallback(Cf=>{Cf!=null&&Cf.cesiumElement&&attachTag(Cf.cesiumElement,{layerId:(d==null?void 0:d.id)||t,featureIndex:nf?uf:void 0,appearanceType:"3dtiles"}),d!=null&&d.id&&(Cf!=null&&Cf.cesiumElement)&&((Cf==null?void 0:Cf.cesiumElement)[layerIdField]=d.id),F.current=Cf==null?void 0:Cf.cesiumElement},[t,d==null?void 0:d.id,uf,nf]),ef=React.useRef([]),Zd=React.useRef(Ai);Zd.current=Ai;const[of]=React.useState(()=>new Map);React.useEffect(()=>{!F.current||!nf||!lf||Object.assign(F.current,{onSelectFeature:Cf=>{const Df=getTag(Cf);Df!=null&&Df.featureId&&(ef.current.push(Df.featureId),of.set(Df.featureId,Cf.color)),Zd.current&&(Cf.color=toColor(Zd.current)??Cf.color)},onUnselectFeature:Cf=>{const Df=getTag(Cf);Df!=null&&Df.featureId&&(ef.current=ef.current.filter(Wf=>Wf!==Df.featureId)),Cf.color=of.get((Df==null?void 0:Df.featureId)??"")??DEFAULT_FEATURE_COLOR}})},[of,uf,nf,lf]),useFeature({id:t,tileset:F,layer:d,idProperty:Gd,viewer:L,evalFeature:p,onComputedFeatureFetch:y,featureIndex:uf,selectedFeatureIdsRef:ef,shouldUseFeatureIndex:nf,isTilesetReady:lf});const[hf,df]=React.useState(0),cf=React.useRef(!1),gf=React.useCallback(Cf=>{cf.current||!L||Vd||(cf.current=!0,sampleTerrainHeightFromCartesian(L.scene,Cf).then(Df=>{df(Df??0),cf.current=!1}))},[Vd,L]);React.useEffect(()=>{if(yt!=null&&yt.draw)return;const Cf=ms||(ya?[ya.lng,ya.lat,ya.height??0]:void 0),Df=Cesium$1.Cartesian3.fromDegrees((Cf==null?void 0:Cf[0])||0,(Cf==null?void 0:Cf[1])||0,(Cf==null?void 0:Cf[2])||0);(async()=>{if(!F.current||!lf)return;const $f=F.current.clippingPlanesOriginMatrix.clone(),Em=new Cesium$1.Cartesian3(ha||100,Sa||100,ba||100);if(!Vd){const _m=new Cesium$1.TranslationRotationScale(Df,void 0,Em);translationWithClamping(_m,!!Vd,hf),Df.x=_m.translation.x,Df.y=_m.translation.y,Df.z=_m.translation.z}const Qf=bs&&pi&&Ra?new Cesium$1.HeadingPitchRoll(bs,pi,Ra):void 0,Am=Cesium$1.Matrix4.multiply(Qf?Cesium$1.Matrix4.fromRotationTranslation(Cesium$1.Matrix3.fromHeadingPitchRoll(Qf),Df):Cesium$1.Transforms.eastNorthUpToFixedFrame(Df),Cesium$1.Matrix4.fromScale(Em,new Cesium$1.Matrix4),new Cesium$1.Matrix4),wm=Cesium$1.Matrix4.inverse($f,new Cesium$1.Matrix4);Cesium$1.Matrix4.multiply(wm,Am,Mf.modelMatrix)})(),Vd||gf(Df)},[ha,Sa,ba,bs,pi,Ra,ya,ms,Mf.modelMatrix,gf,Vd,hf,yt==null?void 0:yt.draw,lf]),React.useEffect(()=>{yt!=null&&yt.draw||(Mf.enabled=fa)},[Mf,fa,yt==null?void 0:yt.draw]),React.useEffect(()=>{yt!=null&&yt.draw||(Mf.unionClippingRegions=Wa==="outside")},[Mf,Wa,yt==null?void 0:yt.draw]),React.useEffect(()=>{yt!=null&&yt.draw||(Mf.removeAll(),pf==null||pf.forEach(Cf=>{var Df,Wf,$f;return Mf.add(new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Df=Cf.normal)==null?void 0:Df.x,(Wf=Cf.normal)==null?void 0:Wf.y,($f=Cf.normal)==null?void 0:$f.z),(Cf.distance||0)*vf))}))},[pf,Mf,vf,yt==null?void 0:yt.draw]),React.useEffect(()=>{if(!lt){pu(void 0);return}(async()=>{const Cf=await fetch(lt);Cf.ok&&pu(new Cesium$1.Cesium3DTileStyle(await Cf.json()))})()},[lt]);const Sf=React.useMemo(()=>md!=="google-photorealistic"||!o?null:(async()=>{try{return(await Cesium$1.createGooglePhotorealistic3DTileset(tf)).resource}catch(Df){throw console.error(`Error loading Photorealistic 3D Tiles tileset: ${Df}`),Df}})(),[md,o,tf]),bf=React.useMemo(()=>md==="osm-buildings"&&o?Cesium$1.IonResource.fromAssetId(96188,{accessToken:h==null?void 0:h.cesiumIonAccessToken}):Sf&&o?Sf:md==="3dtiles"&&o?gl??W:null,[md,o,h==null?void 0:h.cesiumIonAccessToken,Sf,gl,W]),Pf=React.useMemo(()=>{var Em,Qf,Am,wm,_m,xf,zf,wf,yf,Of;if(!(s!=null&&s.specularEnvironmentMaps)&&!(s!=null&&s.sphericalHarmonicCoefficients)&&!((Qf=(Em=c==null?void 0:c.scene)==null?void 0:Em.imageBasedLighting)!=null&&Qf.specularEnvironmentMaps)&&!((wm=(Am=c==null?void 0:c.scene)==null?void 0:Am.imageBasedLighting)!=null&&wm.sphericalHarmonicCoefficients))return;const Cf=new Cesium$1.ImageBasedLighting,Df=(s==null?void 0:s.specularEnvironmentMaps)??((xf=(_m=c==null?void 0:c.scene)==null?void 0:_m.imageBasedLighting)==null?void 0:xf.specularEnvironmentMaps),Wf=(s==null?void 0:s.imageBasedLightIntensity)??((wf=(zf=c==null?void 0:c.scene)==null?void 0:zf.imageBasedLighting)==null?void 0:wf.intensity),$f=arrayToCartecian3((s==null?void 0:s.sphericalHarmonicCoefficients)??((Of=(yf=c==null?void 0:c.scene)==null?void 0:yf.imageBasedLighting)==null?void 0:Of.sphericalHarmonicCoefficients),Wf);return Df&&(Cf.specularEnvironmentMaps=Df),$f&&(Cf.sphericalHarmonicCoefficients=$f),Cf},[s==null?void 0:s.specularEnvironmentMaps,s==null?void 0:s.sphericalHarmonicCoefficients,s==null?void 0:s.imageBasedLightIntensity,(Jf=(Nf=c==null?void 0:c.scene)==null?void 0:Nf.imageBasedLighting)==null?void 0:Jf.specularEnvironmentMaps,(Bf=(qf=c==null?void 0:c.scene)==null?void 0:qf.imageBasedLighting)==null?void 0:Bf.sphericalHarmonicCoefficients,(Tf=(zm=c==null?void 0:c.scene)==null?void 0:zm.imageBasedLighting)==null?void 0:Tf.intensity]),If=React.useCallback(Cf=>{ff(!0),E==null||E({properties:Cf.properties}),N==null||N({layerId:oe.current})},[E,N]);return React.useEffect(()=>(z==null||z(),()=>{z==null||z()}),[md,z]),{tilesetUrl:bf,ref:rf,style:Xd,clippingPlanes:Mf,drawClippingEnabled:Lf,drawClippingEdgeProps:Wc,builtinBoxProps:sl,imageBasedLighting:Pf,handleReady:If}};function Tileset({id:t,isVisible:n,property:o,layer:s,feature:c,viewerProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E,...L}){const{shadows:F,colorBlendMode:N,pbr:z,showWireframe:oe,showBoundingVolume:W,cacheBytes:lt}=o??{},nt=`${s==null?void 0:s.id}_box`,{tilesetUrl:Ee,ref:yt,style:Ai,clippingPlanes:zi,drawClippingEnabled:ha,drawClippingEdgeProps:ba,builtinBoxProps:Sa,imageBasedLighting:ya,handleReady:ms}=useHooks$2({id:t,boxId:nt,isVisible:n,layer:s,feature:c,property:o,viewerProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:E}),bs=React.useMemo(()=>{var pi,mt;return{...((pi=s==null?void 0:s.layer)==null?void 0:pi.type)==="simple"?(mt=s==null?void 0:s.layer)==null?void 0:mt.box:{},...(Sa==null?void 0:Sa.property)||{}}},[s==null?void 0:s.layer,Sa==null?void 0:Sa.property]),Ra=React.useMemo(()=>({...s,id:nt}),[s,nt]);return!n||!Ee?null:jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(Ds$1,{ref:yt,url:Ee,customShader:z===!1?NonPBRLightingShader:z==="withTexture"?NonPBRWithTextureLightingShader:void 0,cacheBytes:lt,style:Ai,shadows:shadowMode(F),clippingPlanes:zi,colorBlendMode:colorBlendModeFor3DTile(N),imageBasedLighting:ya,onReady:ms,debugWireframe:oe,debugShowBoundingVolume:W}),Sa&&jsxRuntimeExports.jsx(Box,{...L,id:nt,viewerProperty:d,property:bs,geometry:Sa.geometry,feature:c,layer:Ra,isVisible:Sa.visible,evalFeature:p,onLayerEdit:Sa.handleLayerEdit}),ha&&jsxRuntimeExports.jsx(DrawClippingPolygon,{...ba})]})}const Tileset$1=React.memo(Tileset,(t,n)=>{var o,s;return t.id===n.id&&t.isVisible===n.isVisible&&t.property===n.property&&((o=t.layer)==null?void 0:o.layer)===((s=n.layer)==null?void 0:s.layer)&&t.viewerProperty===n.viewerProperty&&t.meta===n.meta&&t.evalFeature===n.evalFeature&&t.onComputedFeatureFetch===n.onComputedFeatureFetch&&t.onFeatureDelete===n.onFeatureDelete}),config$1={noFeature:!0},NON_RENDERABLE_APPEARANCE=["transition"],isRenderableAppearance=t=>!NON_RENDERABLE_APPEARANCE.includes(t),components={marker:[Marker,config$8],polyline:[Polyline,config$4],polygon:[Polygon,config$5],ellipsoid:[Ellipsoid,config$b],ellipse:[Ellipse,config$c],model:[Model,config$7],"3dtiles":[Tileset$1,config$1],box:[Box,config$d],photooverlay:[PhotoOverlay,config$6],resource:[Resource,config$2],raster:[Raster$1,config$3],heatMap:[HeatMap,config$9],frustum:[Frustum,config$a]},displayConfig={geojson:"auto",csv:"auto",czml:["resource"],kml:["resource"],wms:["raster"],mvt:["raster"],tms:["raster"],"3dtiles":["3dtiles"],"osm-buildings":["3dtiles"],"google-photorealistic":["3dtiles"],gpx:"auto",shapefile:"auto",gtfs:"auto",georss:[],gml:[],gltf:["model"],tiles:["raster"],heatMap:["heatMap"]},PICKABLE_APPEARANCE=["raster","3dtiles"],pickProperty=(t,n)=>{if(PICKABLE_APPEARANCE.includes(t)&&n.layer.type==="simple")return n.layer[t]},CACHED_COMPONENTS=new LRUCache({max:1e4}),FEATURE_DELEGATE_THRESHOLD=6e3;function Feature$1({layer:t,isHidden:n,sketchEditingFeature:o,...s}){var oe,W,lt;const c=extractSimpleLayerData(t),d=!(c!=null&&c.type)||c.type==="auto"?guessType(c==null?void 0:c.url):void 0;let h=(c==null?void 0:c.type)&&displayConfig[d??c.type];(((oe=t.features)==null?void 0:oe.length)>FEATURE_DELEGATE_THRESHOLD||(W=c==null?void 0:c.geojson)!=null&&W.useAsResource)&&(h=["resource"]);const p=Array.isArray(h)&&h.every(nt=>components[nt][1].noFeature&&!components[nt][1].noLayer),y=!!((lt=t==null?void 0:t.transition)!=null&<.useTransition),E=!(c!=null&&c.updateInterval)&&!y,L=React.useMemo(()=>c!=null&&c.url?generateIDWithMD5(c.url):"",[c==null?void 0:c.url]),{requestRender:F}=useContext();React.useEffect(()=>{setTimeout(()=>{F==null||F()},300)}),React.useEffect(()=>()=>F==null?void 0:F(),[F]);const N=(nt,Ee)=>{var ba,Sa,ya,ms,bs,Ra,pi;if(!isRenderableAppearance(nt))return null;const yt=!!((ya=(Sa=(ba=s.viewerProperty)==null?void 0:ba.scene)==null?void 0:Sa.imageBasedLighting)!=null&&ya.sphericalHarmonicCoefficients),Ai=!!((Ra=(bs=(ms=s.viewerProperty)==null?void 0:ms.scene)==null?void 0:bs.imageBasedLighting)!=null&&Ra.specularEnvironmentMaps),zi=t.layer.visible!==!1&&!n&&!((o==null?void 0:o.layerId)===t.id&&((pi=o==null?void 0:o.feature)==null?void 0:pi.id)===(Ee==null?void 0:Ee.id)),ha=L+generateIDWithMD5(`${t.id}_${(Ee==null?void 0:Ee.id)??""}_${nt}_${zi}_${yt}_${Ai}_${JSON.stringify(Ee==null?void 0:Ee[nt])??""}_${JSON.stringify(t.transition)??""}_${JSON.stringify(Ee==null?void 0:Ee.geometry)??""}`);if(E){const mt=CACHED_COMPONENTS.get(ha);if(E&&mt)return mt}try{const[mt,fa]=components[nt]??[];if(!mt||Ee&&!Ee[nt]||fa.noLayer&&!Ee||fa.noFeature&&Ee||Array.isArray(h)&&!h.includes(nt)||!Array.isArray(h)&&h!=="auto"||(c==null?void 0:c.type)==="geojson"&&h==="auto"&&nt==="resource")return null;const Wa=React.createElement(mt,{...s,key:y?void 0:ha,id:y?(Ee==null?void 0:Ee.id)??t.id:ha,property:Ee?Ee[nt]:t[nt]||pickProperty(nt,t),geometry:Ee==null?void 0:Ee.geometry,feature:Ee,layer:t,isVisible:zi});return E&&CACHED_COMPONENTS.set(ha,Wa),Wa}catch(mt){return console.error(`Error rendering component ${ha}`,mt),null}},z=React.useMemo(()=>!p||!h||!Array.isArray(h)?null:jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:h.map(nt=>{var ya,ms,bs,Ra,pi,mt,fa,Wa,sl,Vd,Xd,pu;const[Ee]=components[nt]??[],yt=t.layer.visible!==!1&&!n,Ai=!!((bs=(ms=(ya=s.viewerProperty)==null?void 0:ya.scene)==null?void 0:ms.imageBasedLighting)!=null&&bs.sphericalHarmonicCoefficients),zi=!!((mt=(pi=(Ra=s.viewerProperty)==null?void 0:Ra.scene)==null?void 0:pi.imageBasedLighting)!=null&&mt.specularEnvironmentMaps),ha=((fa=t==null?void 0:t.layer)==null?void 0:fa.type)==="simple"&&!!((sl=(Wa=t==null?void 0:t.layer)==null?void 0:Wa["3dtiles"])!=null&&sl.sphericalHarmonicCoefficients),ba=((Vd=t==null?void 0:t.layer)==null?void 0:Vd.type)==="simple"&&!!((pu=(Xd=t==null?void 0:t.layer)==null?void 0:Xd["3dtiles"])!=null&&pu.specularEnvironmentMaps),Sa=L+generateIDWithMD5(`${(t==null?void 0:t.id)||""}_${nt}_${yt}_${Ai}_${zi}_${ha}}_${ba}`);return React.createElement(Ee,{...s,key:Sa,id:`${t.id}_${nt}`,property:pickProperty(nt,t)||t[nt],layer:t,isVisible:yt})})}),[p,h,t,n,L,s]);return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:z||[void 0,...t.features].flatMap(nt=>Object.keys(components).map(Ee=>N(Ee,nt)))})}function e2eAccessToken(){return window.REEARTH_E2E_ACCESS_TOKEN}function setE2ECesiumViewer(t){t?window.REEARTH_E2E_CESIUM_VIEWER=t:delete window.REEARTH_E2E_CESIUM_VIEWER}const targetWidth=1e6,targetLength=1e6;function useCameraLimiter(t,n,o){var p,y;const s=React.useMemo(()=>{var L,F;const E=(L=t.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()||!(o!=null&&o.enabled)||!((F=o.targetArea)!=null&&F.lng)||!o.targetArea.lat))return getGeodesic(E,o.targetArea.lng,o.targetArea.lat)},[t,o==null?void 0:o.enabled,(p=o==null?void 0:o.targetArea)==null?void 0:p.lng,(y=o==null?void 0:o.targetArea)==null?void 0:y.lat]),c=React.useMemo(()=>{if(!s)return;const E=typeof(o==null?void 0:o.targetWidth)=="number"?o.targetWidth:targetWidth,L=typeof(o==null?void 0:o.targetLength)=="number"?o.targetLength:targetLength,{cartesianArray:F,cartographicDimensions:N}=calcBoundaryBox(s,L/2,E/2);return{cartographicDimensions:N,cartesianArray:F}},[o==null?void 0:o.targetWidth,o==null?void 0:o.targetLength,s]),[d,h]=React.useState();return React.useEffect(()=>{var nt;const E=(nt=t.current)==null?void 0:nt.cesiumElement;if(!E||E.isDestroyed()||!(o!=null&&o.targetArea)||!s)return;const L=new Cesium$1.Camera(E.scene);L.setView({destination:Cesium$1.Cartesian3.fromDegrees(o.targetArea.lng,o.targetArea.lat,o.targetArea.height),orientation:{heading:o==null?void 0:o.targetArea.heading,pitch:o==null?void 0:o.targetArea.pitch,roll:o==null?void 0:o.targetArea.roll,up:L.up}});const F=L.computeViewRectangle();if(!F)return;const N=Cesium$1.Rectangle.computeWidth(F)*Cesium$1.Math.PI*1e6,z=Cesium$1.Rectangle.computeHeight(F)*Cesium$1.Math.PI*1e6,{targetWidth:oe=targetWidth,targetLength:W=targetLength}=o??{},{cartesianArray:lt}=calcBoundaryBox(s,W/2+z,oe/2+N);h(lt)},[t,o,s]),React.useEffect(()=>{var F,N;const E=(F=t==null?void 0:t.current)==null?void 0:F.cesiumElement,L=getCamera((N=t==null?void 0:t.current)==null?void 0:N.cesiumElement);!E||E.isDestroyed()||!L||!(o!=null&&o.enabled)||!c||E.camera.setView({destination:getAllowedCameraDestination(L,c),orientation:{heading:E.camera.heading,pitch:E.camera.pitch,roll:E.camera.roll,up:E.camera.up}})},[n,t,o,c]),{cameraViewBoundaries:c==null?void 0:c.cartesianArray,cameraViewOuterBoundaries:d,cameraViewBoundariesMaterial}}const cameraViewBoundariesMaterial=new Cesium$1.PolylineDashMaterialProperty({color:Cesium$1.Color.RED}),getGeodesic=(t,n,o)=>{const s=t.scene.globe.ellipsoid,c=Cesium$1.Cartesian3.fromDegrees(n,o,0),d=Cesium$1.Cartographic.fromCartesian(c),h=s.geodeticSurfaceNormal(c),p=Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(Cesium$1.Cartesian3.UNIT_Z,h,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),y=Cesium$1.Cartesian3.normalize(Cesium$1.Cartesian3.cross(h,p,new Cesium$1.Cartesian3),new Cesium$1.Cartesian3),E=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(y),s),L=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(p),s);return{vertical:E,horizontal:L}},calcBoundaryBox=(t,n,o)=>{const s=t.vertical.interpolateUsingSurfaceDistance(n),c=t.vertical.interpolateUsingSurfaceDistance(-n),d=t.horizontal.interpolateUsingSurfaceDistance(o),h=t.horizontal.interpolateUsingSurfaceDistance(-o),p=new Cesium$1.Cartographic(d.longitude,s.latitude,0),y=new Cesium$1.Cartographic(h.longitude,s.latitude,0),E=new Cesium$1.Cartographic(d.longitude,c.latitude,0),L=new Cesium$1.Cartographic(h.longitude,c.latitude,0);return{cartographicDimensions:{rightDimension:d,leftDimension:h,topDimension:s,bottomDimension:c},cartesianArray:[Cesium$1.Cartographic.toCartesian(p),Cesium$1.Cartographic.toCartesian(y),Cesium$1.Cartographic.toCartesian(L),Cesium$1.Cartographic.toCartesian(E),Cesium$1.Cartographic.toCartesian(p)]}},getAllowedCameraDestination=(t,n)=>{const o=Cesium$1.Cartographic.fromDegrees(t==null?void 0:t.lng,t==null?void 0:t.lat,t==null?void 0:t.height),s=new Cesium$1.Cartographic(Cesium$1.Math.clamp(o.longitude,n.cartographicDimensions.leftDimension.longitude,n.cartographicDimensions.rightDimension.longitude),Cesium$1.Math.clamp(o.latitude,n.cartographicDimensions.bottomDimension.latitude,n.cartographicDimensions.topDimension.latitude),o.height);return Cesium$1.Cartographic.toCartesian(s)},useCamera=({cesium:t,property:n,camera:o,featureFlags:s,engineAPI:c,cameraForceHorizontalRoll:d=!1,onCameraChange:h})=>{var Ee,yt,Ai;const p=React.useRef([]),y=React.useCallback(()=>{var ba;const zi=(ba=t==null?void 0:t.current)==null?void 0:ba.cesiumElement;if(!zi||zi.isDestroyed()||!h)return;const ha=getCamera(zi);ha&&!isEqual(ha,o)&&(p.current.push(ha),p.current.length>10&&p.current.shift(),h==null||h(ha))},[t,o,h]),E=React.useCallback(()=>{y()},[y]),L=React.useCallback(()=>{y()},[y]);React.useEffect(()=>{o&&!p.current.includes(o)&&(c.flyTo(o,{duration:0}),p.current=[])},[o,c]),React.useEffect(()=>{var ya;if(!((ya=t.current)!=null&&ya.cesiumElement))return;const zi=!!(s&FEATURE_FLAGS.CAMERA_MOVE),ha=!!(s&FEATURE_FLAGS.CAMERA_ZOOM),ba=!!(s&FEATURE_FLAGS.CAMERA_TILT),Sa=!!(s&FEATURE_FLAGS.CAMERA_LOOK);t.current.cesiumElement.scene.screenSpaceCameraController.enableTranslate=zi,t.current.cesiumElement.scene.screenSpaceCameraController.enableRotate=zi,t.current.cesiumElement.scene.screenSpaceCameraController.enableLook=Sa,t.current.cesiumElement.scene.screenSpaceCameraController.enableTilt=ba,t.current.cesiumElement.scene.screenSpaceCameraController.enableZoom=ha},[t,s]);const F=React.useRef(!1),N=useCustomCompareCallback(()=>{var zi,ha,ba,Sa,ya,ms;F.current||(F.current=!0,(ha=(zi=n==null?void 0:n.camera)==null?void 0:zi.limiter)!=null&&ha.enabled&&((Sa=(ba=n==null?void 0:n.camera)==null?void 0:ba.limiter)!=null&&Sa.targetArea)?c.flyTo((ms=(ya=n==null?void 0:n.camera)==null?void 0:ya.limiter)==null?void 0:ms.targetArea,{duration:0}):o&&c.flyTo(o,{duration:0}))},[c,(yt=(Ee=n==null?void 0:n.camera)==null?void 0:Ee.limiter)==null?void 0:yt.enabled],(zi,ha)=>zi[0]===ha[0]&&zi[1]===ha[1]),z=React.useCallback(()=>{F.current=!1},[]),{cameraViewBoundaries:oe,cameraViewOuterBoundaries:W,cameraViewBoundariesMaterial:lt}=useCameraLimiter(t,o,(Ai=n==null?void 0:n.camera)==null?void 0:Ai.limiter),nt=React.useCallback(zi=>{!zi.camera||!d||Math.abs(Cesium$1.Math.negativePiToPi(zi.camera.roll))>Math.PI/86400&&zi.camera.setView({orientation:{heading:zi.camera.heading,pitch:zi.camera.pitch,roll:0}})},[d]);return React.useEffect(()=>{var ha;const zi=(ha=t.current)==null?void 0:ha.cesiumElement;if(zi)return zi.scene.preRender.addEventListener(nt)},[t,nt]),{cameraViewBoundaries:oe,cameraViewOuterBoundaries:W,cameraViewBoundariesMaterial:lt,mountCamera:N,unmountCamera:z,handleCameraChange:E,handleCameraMoveEnd:L}},colorScratch=new Cesium$1.Color;function pickFramebufferEnd(t){const n=t.width??1,o=t.height??1,s=this._context,c=s.readPixels({x:t.x,y:t.y,width:n,height:o,framebuffer:this._fb.framebuffer}),d=new Set;for(let h=0;h<c.length;h+=4)try{colorScratch.red=Cesium$1.Color.byteToFloat(c[h]),colorScratch.green=Cesium$1.Color.byteToFloat(c[h+1]),colorScratch.blue=Cesium$1.Color.byteToFloat(c[h+2]),colorScratch.alpha=Cesium$1.Color.byteToFloat(c[h+3]);const p=s.getObjectByPickColor(colorScratch);p!=null&&d.add(p)}catch(p){console.error(p)}return Array.from(d.values())}const pickingFrustumScratch=new Cesium$1.PerspectiveOffCenterFrustum,pixelSizeScratch=new Cesium$1.Cartesian2;function getPickCullingVolume(t,n,o,s,c){const d=t.camera,h=d.frustum;invariant$1(h instanceof Cesium$1.PerspectiveFrustum);const p=h.near,y=Math.tan(h.fovy/2),E=h.aspectRatio*y,L=n.x,F=n.y,N=2*(L-c.x)/c.width-1,z=2*(c.height-F-c.y)/c.height-1,oe=N*p*E,W=z*p*y,lt=h.getPixelDimensions(c.width,c.height,p,getPixelRatio(t),pixelSizeScratch),nt=lt.x*o/2,Ee=lt.y*s/2,yt=pickingFrustumScratch;return yt.top=W+Ee,yt.bottom=W-Ee,yt.right=oe+nt,yt.left=oe-nt,yt.near=p,yt.far=h.far,yt.computeCullingVolume(d.positionWC,d.directionWC,d.upWC)}function getIntersection(t,n,o=new Cesium$1.BoundingRectangle){invariant$1(t.width>=0&&t.height>=0),invariant$1(n.width>=0&&n.height>=0);const s=Math.max(t.x,n.x),c=Math.min(t.x+t.width,n.x+n.width),d=Math.max(t.y,n.y),h=Math.min(t.y+t.height,n.y+n.height);if(!(s>=c||d>=h))return o.x=s,o.y=d,o.width=c-s,o.height=h-d,o.clone(new Cesium$1.BoundingRectangle)}const pickTilesetPassState=new Cesium3DTilePassState({pass:Cesium3DTilePass$1.PICK}),zeroColor=new Cesium$1.Color(0,0,0,0),positionScratch=new Cesium$1.Cartesian2,rectangleScratch=new Cesium$1.BoundingRectangle;function pickManyFromViewport(t,n,o,s){const c=t.groundPrimitives.show;t.groundPrimitives.show=!1,invariant$1(o>0&&s>0);const d=t.context,h=t.defaultView;t.view=h;const p=h.viewport;p.x=0,p.y=0,p.width=d.drawingBufferWidth,p.height=d.drawingBufferHeight,h.passState.viewport=Cesium$1.BoundingRectangle.clone(p,h.passState.viewport),t.jobScheduler.disableThisFrame(),t.updateFrameState();const y=SceneTransforms.transformWindowToDrawingBuffer(t,n,positionScratch),E=getPixelRatio(t),L=o*E,F=s*E,N=t.frameState;N.cullingVolume=getPickCullingVolume(t,y,L,F,p),N.invertClassification=!1,N.passes.pick=!0,N.tilesetPassState=pickTilesetPassState,d.uniformState.update(N),t.updateEnvironment(),rectangleScratch.x=y.x-L/2,rectangleScratch.y=t.drawingBufferHeight-y.y-F/2,rectangleScratch.height=F,rectangleScratch.width=L;const z=getIntersection(rectangleScratch,h.viewport,rectangleScratch);invariant$1(z!=null);const oe=h.pickFramebuffer.begin(z,h.viewport);t.updateAndExecuteCommands(oe,zeroColor),t.resolveFramebuffers(oe);const W=pickFramebufferEnd.apply(h.pickFramebuffer,[rectangleScratch]);return d.endFrame(),t.groundPrimitives.show=c,W}const pickManyFromViewportAsFeature=(t,n,o,s,c)=>{const d=pickManyFromViewport(t.scene,n,o,s),h=[];for(const p of d){const[y,E]=convertObjToComputedFeature(t.clock.currentTime,p)??[],L=E?{...E,layerId:y}:void 0;!L||c&&!c(L)||h.push(L)}return h},cartographicScratch=new Cartographic,cartesianScratch1$2=new Cartesian3,cartesianScratch2=new Cartesian3;function createPoint(t,n){if(t.length===1)try{const o=Cartographic.fromCartesian(t[0],n,cartographicScratch);return point([CesiumMath.toDegrees(o.longitude),CesiumMath.toDegrees(o.latitude)]).geometry}catch(o){console.error(o)}}function createCircle(t,n){if(t.length!==2)return;const o=Cartesian3.distance(t[0],t[1]);if(o!==0)try{const s=Cartographic.fromCartesian(t[0],n,cartographicScratch);return ellipse([CesiumMath.toDegrees(s.longitude),CesiumMath.toDegrees(s.latitude)],o,o,{units:"meters"}).geometry}catch(s){console.error(s)}}function createRectangle(t,n){if(!(t.length!==2&&t.length!==3))try{if(t.length===2)return lineString(t.map(F=>{const N=Cartographic.fromCartesian(F,n,cartographicScratch);return[CesiumMath.toDegrees(N.longitude),CesiumMath.toDegrees(N.latitude)]})).geometry;const[o,s,c]=t,d=Cartesian3.projectVector(Cartesian3.subtract(c,o,cartesianScratch1$2),Cartesian3.subtract(s,o,cartesianScratch2),cartesianScratch1$2),h=Cartesian3.subtract(c,Cartesian3.add(o,d,cartesianScratch1$2),cartesianScratch2),p=Cartesian3.add(o,h,cartesianScratch1$2),y=Cartesian3.add(s,h,cartesianScratch2);return polygon([[o,s,y,p,o].map(L=>{const F=Cartographic.fromCartesian(L,n,cartographicScratch);return[CesiumMath.toDegrees(F.longitude),CesiumMath.toDegrees(F.latitude)]})]).geometry}catch(o){console.error(o)}}function createPolyline(t,n){if(!(t.length<2))try{return lineString(t.map(s=>{const c=Cartographic.fromCartesian(s,n,cartographicScratch);return[CesiumMath.toDegrees(c.longitude),CesiumMath.toDegrees(c.latitude)]})).geometry}catch(o){console.error(o)}}function createPolygon(t,n){if(!(t.length<2))try{return t.length===2?lineString(t.map(c=>{const d=Cartographic.fromCartesian(c,n,cartographicScratch);return[CesiumMath.toDegrees(d.longitude),CesiumMath.toDegrees(d.latitude)]})).geometry:polygon([[...t,t[0]].map(s=>{const c=Cartographic.fromCartesian(s,n,cartographicScratch);return[CesiumMath.toDegrees(c.longitude),CesiumMath.toDegrees(c.latitude)]})]).geometry}catch(o){console.error(o)}}function createGeometry({type:t,controlPoints:n}){switch(t){case"marker":return createPoint(n);case"polyline":return createPolyline(n);case"circle":case"extrudedCircle":return createCircle(n);case"rectangle":case"extrudedRectangle":return createRectangle(n);case"polygon":case"extrudedPolygon":return createPolygon(n);default:return}}function useEngineRef(t,n){const o=React.useRef(),s=React.useRef({click:[],doubleClick:[],mouseDown:[],mouseUp:[],rightClick:[],rightDown:[],rightUp:[],middleClick:[],middleDown:[],middleUp:[],mouseMove:[],mouseEnter:[],mouseLeave:[],wheel:[]}),c=React.useRef([]),d=React.useMemo(()=>({name:"cesium",requestRender:()=>{var p,y;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(y=h.scene)==null||y.requestRender()},getCamera:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return getCamera(h)},getLocationFromScreen:(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()))return getLocationFromScreen(E.scene,h,p,y)},getCameraFovInfo:({withTerrain:h,calcViewSize:p})=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))try{let L,F,N;return h&&(F=getCameraTerrainIntersection(y.scene),F&&(L=cartesianToLatLngHeight(F,y.scene))),L||(F=new Cesium__namespace.Cartesian3,getCameraEllipsoidIntersection(y.scene,F),L=cartesianToLatLngHeight(F,y.scene)),p&&F&&y.scene.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(N=Cesium__namespace.Cartesian3.distance(y.scene.camera.positionWC,F)*Math.tan(y.scene.camera.frustum.fov/2)),{center:L,viewSize:N}}catch{return}},sampleTerrainHeight:async(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return await sampleTerrainHeight(y.scene,h,p)},computeGlobeHeight:(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;if(!(!E||E.isDestroyed()))return E.scene.globe.getHeight(Cesium__namespace.Cartographic.fromDegrees(h,p,y))},getGlobeHeight:()=>{var E;const h=(E=n.current)==null?void 0:E.cesiumElement;if(!h||h.isDestroyed())return;const p=h.scene,{globeHeight:y}=p;if(!(!p||y==null))return y},toXYZ:(h,p,y,E)=>{var N;const L=(N=n.current)==null?void 0:N.cesiumElement;if(!L||L.isDestroyed())return;const F=Cesium__namespace.Cartesian3.fromDegrees(h,p,y,E!=null&&E.useGlobeEllipsoid?L.scene.globe.ellipsoid:void 0);return[F.x,F.y,F.z]},toLngLatHeight:(h,p,y,E)=>{var N;const L=(N=n.current)==null?void 0:N.cesiumElement;if(!L||L.isDestroyed())return;const F=Cesium__namespace.Cartographic.fromCartesian(Cesium__namespace.Cartesian3.fromElements(h,p,y),E!=null&&E.useGlobeEllipsoid?L.scene.globe.ellipsoid:void 0);return[Cesium$1.Math.toDegrees(F.longitude),Cesium$1.Math.toDegrees(F.latitude),F.height]},toWindowPosition:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=Cesium__namespace.SceneTransforms.wgs84ToWindowCoordinates(p.scene,Cesium__namespace.Cartesian3.fromElements(...h));return[y.x,y.y]},convertScreenToPositionOffset:(h,p)=>{var ya;const y=(ya=n.current)==null?void 0:ya.cesiumElement;if(!y||y.isDestroyed())return;const E=Cesium__namespace.Cartesian3.fromElements(...h),L=new Cesium__namespace.Cartesian3,F=new Cesium__namespace.Cartographic,N=new Cesium__namespace.Cartesian3,z=new Cesium__namespace.Ellipsoid,oe=new Cesium__namespace.Ray,W=new Cesium__namespace.Cartesian3,lt=y.scene,nt=lt.globe.ellipsoid;let Ee;try{Ee=Cesium__namespace.Cartographic.fromCartesian(E,nt,F)}catch{return}N.x=nt.radii.x+Ee.height,N.y=nt.radii.y+Ee.height,N.z=nt.radii.z+Ee.height;const yt=Cesium__namespace.Ellipsoid.fromCartesian3(N,z),Ai=new Cesium__namespace.Cartesian2;try{[Ai.x,Ai.y]=d.toWindowPosition(h)??[0,0]}catch{return}Ai.x+=p[0],Ai.y+=p[1];const zi=lt.camera.getPickRay(Ai,oe);if(zi==null)return;const ha=Cesium__namespace.IntersectionTests.rayEllipsoid(zi,yt);if(ha==null)return;const ba=Cesium__namespace.Ray.getPoint(zi,ha.start,W),Sa=Cesium__namespace.Cartesian3.subtract(ba,E,L);return[Sa.x,Sa.y,Sa.z]},isPositionVisible:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return!1;const y=new EllipsoidalOccluder(Cesium__namespace.Ellipsoid.WGS84,Cesium__namespace.Cartesian3.ZERO);return y.cameraPosition=p.scene.camera.position,y.isPointVisible(Cesium__namespace.Cartesian3.fromElements(...h))},setView:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed()||h.lat===void 0||h.lng===void 0||h.height===void 0)return!1;const y=p.scene;if(h.lng||h.lat||h.height){const L=Cesium__namespace.Cartesian3.fromDegrees(h.lng,h.lat,h.height);y.camera.position.x=L.x,y.camera.position.y=L.y,y.camera.position.z=L.z}(h.heading||h.pitch)&&y.camera.setView({orientation:{heading:h.heading,pitch:h.pitch}}),h.fov&&y.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(y.camera.frustum.fov=h.fov)},getExtrudedHeight:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return getExtrudedHeight(y.scene,new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian2(p[0],p[1]))},getExtrudedPoint:(h,p)=>{var z,oe;if(!h||!p)return;const y=(z=n.current)==null?void 0:z.cesiumElement;if(!y||y.isDestroyed())return;const E=new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),L=new Cesium__namespace.Cartesian3,F=(oe=y.scene)==null?void 0:oe.globe.ellipsoid.geodeticSurfaceNormal(E,L);if(!F)return;const N=Cesium__namespace.Cartesian3.add(E,Cesium__namespace.Cartesian3.multiplyByScalar(F,p,L),L);return[N.x,N.y,N.z]},getSurfaceDistance:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=y.scene,L=new Cesium__namespace.EllipsoidGeodesic(void 0,void 0,E.globe.ellipsoid);return L.setEndPoints(Cesium__namespace.Cartographic.fromCartesian(h,E.globe.ellipsoid,new Cesium__namespace.Cartographic),Cesium__namespace.Cartographic.fromCartesian(p,E.globe.ellipsoid,new Cesium__namespace.Cartographic)),L.surfaceDistance},equalsEpsilon2d:(h,p,y=0,E=0)=>Cesium__namespace.Cartesian2.equalsEpsilon(new Cesium__namespace.Cartesian2(h[0],h[1]),new Cesium__namespace.Cartesian2(p[0],p[1]),y,E),equalsEpsilon3d:(h,p,y=0,E=0)=>Cesium__namespace.Cartesian3.equalsEpsilon(new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian3(p[0],p[1],p[2]),y,E),createGeometry:({type:h,controlPoints:p})=>createGeometry({type:h,controlPoints:p.map(y=>new Cesium__namespace.Cartesian3(...y))}),setCursor:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;if(!(!p||p.isDestroyed()))return p.canvas.style.cursor=h??"auto",null},flyTo:(h,p)=>{var y,E,L,F,N;if(h&&typeof h=="object"){const z=(y=n.current)==null?void 0:y.cesiumElement;if(!z||z.isDestroyed())return;(E=o.current)==null||E.call(o),o.current=flyTo((L=z.scene)==null?void 0:L.camera,{...getCamera(z),...h},p)}if(h&&typeof h=="string"){const z=(F=n.current)==null?void 0:F.cesiumElement;if(!z||z.isDestroyed())return;const oe=h,W=findEntity(z,oe,oe,!0),lt=getTag(W);if(W instanceof Cesium__namespace.Primitive){z.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(W.modelMatrix));return}if(W instanceof Cesium__namespace.GroundPrimitive){z.scene.camera.flyToBoundingSphere(lt==null?void 0:lt.originalProperties);return}if(W&&!(W instanceof Cesium__namespace.Cesium3DTileFeature||W instanceof Cesium__namespace.Cesium3DTilePointFeature||W instanceof Cesium__namespace.Model||W instanceof Cesium__namespace.Primitive||W instanceof Cesium__namespace.GroundPrimitive))z.flyTo(W,p);else{for(const yt of[z.dataSourceDisplay.dataSources,z.dataSources])for(let Ai=0;Ai<yt.length;Ai++){const zi=yt.get(Ai);if(zi.entities.values.find(Sa=>{var ya;return((ya=getTag(Sa))==null?void 0:ya.layerId)===oe})){z.flyTo(zi,p);return}}const nt=[];for(const yt of z.entities.values)((N=getTag(yt))==null?void 0:N.layerId)===oe&&nt.push(yt);if(nt.length){z.flyTo(nt,p);return}const Ee=findEntity(z,oe);if(Ee instanceof Cesium__namespace.Primitive){z.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(Ee.modelMatrix));return}Ee&&!(Ee instanceof Cesium__namespace.Cesium3DTileFeature||Ee instanceof Cesium__namespace.Cesium3DTilePointFeature||Ee instanceof Cesium__namespace.Model||Ee instanceof Cesium__namespace.Primitive||Ee instanceof Cesium__namespace.GroundPrimitive)&&z.flyTo(Ee,p)}}},flyToBBox:(h,p)=>{var F,N;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;(N=o.current)==null||N.call(o);const E=Cesium__namespace.BoundingSphere.fromRectangle3D(Cesium__namespace.Rectangle.fromDegrees(...h)),L=y.scene.camera;y.camera.flyToBoundingSphere(E,{offset:{heading:p!=null&&p.heading?Cesium$1.Math.toDegrees(p.heading):y.scene.camera.heading,pitch:p!=null&&p.pitch?Cesium$1.Math.toDegrees(p.pitch):L.pitch,range:(p==null?void 0:p.range)??0},duration:p==null?void 0:p.duration}),o.current=()=>{L==null||L.cancelFlight()}},rotateOnCenter:h=>{var L;const p=(L=n.current)==null?void 0:L.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=getCameraEllipsoidIntersection(y,new Cesium__namespace.Cartesian3);E&&y.camera.rotate(E,h)},overrideScreenSpaceController:h=>{var L,F;const p=(L=n.current)==null?void 0:L.cesiumElement;if(!p||p.isDestroyed())return;const y=(F=p.scene)==null?void 0:F.screenSpaceCameraController,E=getOverriddenScreenSpaceCameraOptions(h);Object.assign(y,E)},lookAt:(h,p)=>{var E,L,F;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed())){if(p!=null&&p.withoutAnimation)return lookAtWithoutAnimation(y.scene,{...getCamera(y),...h});(L=o.current)==null||L.call(o),o.current=lookAt((F=y.scene)==null?void 0:F.camera,{...getCamera(y),...h},p)}},lookAtLayer:h=>{var oe,W;const p=(oe=n.current)==null?void 0:oe.cesiumElement;if(!p||p.isDestroyed())return;const y=p.entities.getById(h);if(!y)return;const E=(W=y.position)==null?void 0:W.getValue(p.clock.currentTime);if(!E)return;const L=p.camera.positionWC,F=Cesium__namespace.Cartesian3.distance(E,L);if(Math.round(F*1e3)/1e3===5e3)return;const N=getCamera(p),z=new Cesium__namespace.HeadingPitchRange((N==null?void 0:N.heading)??0,(N==null?void 0:N.pitch)??-90,5e3);p.zoomTo(y,z)},getViewport:()=>{var y;const h=(y=n.current)==null?void 0:y.cesiumElement;if(!h||h.isDestroyed())return;const p=h.camera.computeViewRectangle();return p?{north:Cesium$1.Math.toDegrees(p.north),south:Cesium$1.Math.toDegrees(p.south),west:Cesium$1.Math.toDegrees(p.west),east:Cesium$1.Math.toDegrees(p.east)}:void 0},zoomIn:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:1/h},p)},zoomOut:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:h},p)},orbit:h=>{var lt;const p=(lt=n.current)==null?void 0:lt.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=y.camera,L=.02,F=h+Cesium$1.Math.PI_OVER_TWO,N=Math.cos(F)*L,z=Math.sin(F)*L,oe=Cesium__namespace.Matrix4.clone(E.transform),W=getCenterCamera({camera:E,scene:y});if(W||E.positionWC){const nt=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(W||E.positionWC,y.globe.ellipsoid);E.lookAtTransform(nt)}p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?E.move(new Cesium__namespace.Cartesian3(N,z,0),Math.max(y.canvas.clientWidth,y.canvas.clientHeight)/100*E.positionCartographic.height*L):W?(E.rotateLeft(N),E.rotateUp(z)):(E.look(Cesium__namespace.Cartesian3.UNIT_Z,N),E.look(E.right,z)),E.lookAtTransform(oe)},rotateRight:h=>{var N;const p=(N=n.current)==null?void 0:N.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,E=y.camera,L=Cesium__namespace.Matrix4.clone(E.transform),F=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(E.positionWC,y.globe.ellipsoid);p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?(E.twistRight(h- -E.heading),E.twistLeft(h- -E.heading)):(E.lookAtTransform(F),E.rotateRight(h- -E.heading),E.lookAtTransform(L))},changeSceneMode:(h,p=2)=>{var E,L,F,N;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()||!y.scene))switch(h){case"2d":(L=y==null?void 0:y.scene)==null||L.morphTo2D(p);break;case"columbus":(F=y==null?void 0:y.scene)==null||F.morphToColumbusView(p);break;case"3d":default:(N=y==null?void 0:y.scene)==null||N.morphTo3D(p);break}},getClock:()=>{var y;const h=(y=n.current)==null?void 0:y.cesiumElement;if(!h||h.isDestroyed()||!h.clock)return;const p=h.clock;return getClock(p)},captureScreen:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return y.scene.requestRender(),y.render(),y.canvas.toDataURL(h,p)},enableScreenSpaceCameraController:(h=!0)=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed()||!p.scene)return;const y=!!h;p.scene.screenSpaceCameraController.enableRotate=y,p.scene.screenSpaceCameraController.enableTranslate=y,p.scene.screenSpaceCameraController.enableZoom=y,p.scene.screenSpaceCameraController.enableTilt=y,p.scene.screenSpaceCameraController.enableLook=y},lookHorizontal:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||lookHorizontal(p.scene,h)},lookVertical:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||lookVertical(p.scene,h)},moveForward:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveForward(p.scene,h)},moveBackward:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveBackward(p.scene,h)},moveUp:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveUp(p.scene,h)},moveDown:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveDown(p.scene,h)},moveLeft:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveLeft(p.scene,h)},moveRight:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||!p.scene||!h||moveRight(p.scene,h)},moveOverTerrain:async h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||moveOverTerrain(p,h)},flyToGround:async(h,p,y)=>{var L;const E=(L=n.current)==null?void 0:L.cesiumElement;!E||E.isDestroyed()||flyToGround(E,o,h,p,y)},onClick:h=>{s.current.click.push(h)},onDoubleClick:h=>{s.current.doubleClick.push(h)},onMouseDown:h=>{s.current.mouseDown.push(h)},onMouseUp:h=>{s.current.mouseUp.push(h)},onRightClick:h=>{s.current.rightClick.push(h)},onRightDown:h=>{s.current.rightDown.push(h)},onRightUp:h=>{s.current.rightUp.push(h)},onMiddleClick:h=>{s.current.middleClick.push(h)},onMiddleDown:h=>{s.current.middleDown.push(h)},onMiddleUp:h=>{s.current.middleUp.push(h)},onMouseMove:h=>{s.current.mouseMove.push(h)},onMouseEnter:h=>{s.current.mouseEnter.push(h)},onMouseLeave:h=>{s.current.mouseLeave.push(h)},onWheel:h=>{s.current.wheel.push(h)},mouseEventCallbacks:s.current,changeSpeed:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.multiplier=h,p.clock.clockStep=Cesium$1.ClockStep.SYSTEM_CLOCK_MULTIPLIER)},changeTime:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.currentTime=Cesium$1.JulianDate.fromDate(h))},pause:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(h.clock.shouldAnimate=!1)},play:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;!h||h.isDestroyed()||(h.clock.shouldAnimate=!0)},tick:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return Cesium$1.JulianDate.toDate(h.clock.tick())},changeStart:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.startTime=Cesium$1.JulianDate.fromDate(h))},changeStop:h=>{var y;const p=(y=n.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||(p.clock.stopTime=Cesium$1.JulianDate.fromDate(h))},inViewport:h=>{const p=d.getViewport();return!!(p&&h&&typeof h.lng=="number"&&typeof h.lat=="number"&&Cesium__namespace.Rectangle.contains(new Cesium__namespace.Rectangle(Cesium$1.Math.toRadians(p.west),Cesium$1.Math.toRadians(p.south),Cesium$1.Math.toRadians(p.east),Cesium$1.Math.toRadians(p.north)),Cesium__namespace.Cartographic.fromDegrees(h.lng,h.lat)))},findFeatureById:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=findEntity(y,h,p),L=getTag(E);if(L!=null&&L.featureId){if(E instanceof Cesium__namespace.Entity)return{type:"feature",id:L.featureId,properties:convertEntityProperties(y.clock.currentTime,E),metaData:{description:convertEntityDescription(y.clock.currentTime,E)}};if(E instanceof Cesium__namespace.Cesium3DTileFeature||E instanceof Cesium__namespace.Cesium3DTilePointFeature)return{type:"feature",id:L.featureId,properties:convertCesium3DTileFeatureProperties(E)}}},findFeaturesByIds:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,L=>{var N;const F=(N=convertObjToComputedFeature(y.clock.currentTime,L))==null?void 0:N[1];return F?{...F,type:"feature"}:void 0})},findComputedFeatureById:(h,p)=>{var F;const y=(F=n.current)==null?void 0:F.cesiumElement;if(!y||y.isDestroyed())return;const E=findEntity(y,h,p),L=getTag(E);if(L!=null&&L.featureId){if(E instanceof Cesium__namespace.Entity)return L.computedFeature??{type:"computedFeature",id:L.featureId,geometry:getGeometryFromEntity(y.clock.currentTime,E),properties:convertEntityProperties(y.clock.currentTime,E),metaData:{description:convertEntityDescription(y.clock.currentTime,E)}};if(E instanceof Cesium__namespace.Cesium3DTileFeature||E instanceof Cesium__namespace.Cesium3DTilePointFeature)return L.computedFeature??{type:"computedFeature",id:L.featureId,properties:convertCesium3DTileFeatureProperties(E)}}},findComputedFeaturesByIds:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,L=>{var F;return(F=convertObjToComputedFeature(y.clock.currentTime,L))==null?void 0:F[1]})},bringToFront:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"bringToFront"in y&&typeof y.bringToFront=="function"&&y.bringToFront()},sendToBack:h=>{var E;const p=(E=n.current)==null?void 0:E.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"sendToBack"in y&&typeof y.sendToBack=="function"&&y.sendToBack()},selectFeatures:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(L,F)=>{F&&"onSelectFeature"in F&&typeof F.onSelectFeature=="function"&&F.onSelectFeature(L);const z={...getTag(L)??{},isFeatureSelected:!0};return attachTag(L,z),L})},unselectFeatures:(h,p)=>{var E;const y=(E=n.current)==null?void 0:E.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(L,F)=>{F&&"onUnselectFeature"in F&&typeof F.onUnselectFeature=="function"&&F.onUnselectFeature(L);const N=getTag(L)??{};return N.isFeatureSelected=!1,attachTag(L,N),L})},pickManyFromViewport:(h,p,y,E)=>{var F;const L=(F=n.current)==null?void 0:F.cesiumElement;if(!(!L||L.isDestroyed()))return pickManyFromViewportAsFeature(L,new Cesium__namespace.Cartesian2(h[0],h[1]),p,y,E)},onTick:h=>{c.current.push(h)},removeTickEventListener:h=>{c.current=c.current.filter(p=>p!==h)||[]},tickEventCallback:c,calcRectangleControlPoint:(h,p,y)=>{const E=new Cesium__namespace.Cartesian3(...h),L=new Cesium__namespace.Cartesian3(...p),F=new Cesium__namespace.Cartesian3(...y),N=new Cesium__namespace.Cartesian3,z=new Cesium__namespace.Cartesian3,oe=Cesium__namespace.Cartesian3.projectVector(Cesium__namespace.Cartesian3.subtract(F,E,N),Cesium__namespace.Cartesian3.subtract(L,E,z),N),W=Cesium__namespace.Cartesian3.subtract(F,Cesium__namespace.Cartesian3.add(E,oe,N),z),lt=Cesium__namespace.Cartesian3.midpoint(E,L,N),nt=Cesium__namespace.Cartesian3.add(lt,W,z),Ee=[nt.x,nt.y,nt.z];return[h,p,Ee]},getCredits:()=>{var p;const h=(p=n.current)==null?void 0:p.cesiumElement;if(!(!h||h.isDestroyed()))return getCredits(h)}}),[n]);return React.useImperativeHandle(t,()=>d,[d]),d}const useExplicitRender=({cesium:t,requestingRenderMode:n,isLayerDragging:o,shouldRender:s,property:c})=>{const d=React.useCallback(()=>{var y;const p=(y=t.current)==null?void 0:y.cesiumElement;!(n!=null&&n.current)||!p||p.isDestroyed()||(p.scene.requestRender(),n.current===REQUEST_RENDER_ONCE&&(n.current=NO_REQUEST_RENDER))},[t,n]),h=React.useRef();React.useEffect(()=>{h.current=d},[d]),React.useEffect(()=>{var y;const p=(y=t.current)==null?void 0:y.cesiumElement;if(!(!p||p.isDestroyed()))return p.scene.postUpdate.addEventListener(()=>{var E;(E=h.current)==null||E.call(h)})},[t]),React.useEffect(()=>{n&&(n.current=REQUEST_RENDER_ONCE)},[c,n]),React.useEffect(()=>{var y;const p=(y=t.current)==null?void 0:y.cesiumElement;!p||p.isDestroyed()||n&&(n.current=o||s?FORCE_REQUEST_RENDER:n.current===REQUEST_RENDER_ONCE?REQUEST_RENDER_ONCE:NO_REQUEST_RENDER)},[t,o,s,n])};var __defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropSymbols=Object.getOwnPropertySymbols,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(t,n,o)=>n in t?__defProp(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o,__spreadValues=(t,n)=>{for(var o in n||(n={}))__hasOwnProp.call(n,o)&&__defNormalProp(t,o,n[o]);if(__getOwnPropSymbols)for(var o of __getOwnPropSymbols(n))__propIsEnum.call(n,o)&&__defNormalProp(t,o,n[o]);return t},__spreadProps=(t,n)=>__defProps(t,__getOwnPropDescs(n));class CesiumDnD{constructor(n,o){this._initialEnableRotate=!0,this._initialEnableTranslate=!0,this._callbackProperty=new Cesium$1.CallbackProperty(()=>{var s;return(s=this._position)!=null?s:this._initialPosition},!1),this.cancelDragging=()=>{clearTimeout(this._timeout),this._entity&&(this._entity.position=this._initialPosition),this._entity=void 0,this._initialPosition=void 0,this._initialScreenPosition=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging)},this._handleDrag=s=>{var c;if(this._entity||this.viewer.isDestroyed()||!(s!=null&&s.position))return;const d=this._pick(s.position);if(!d)return;const h=()=>{var p,y,E;if(this._entity||this.viewer.isDestroyed())return;this._timeout=void 0,this._initialPosition=d.position,this._initialScreenPosition=s.position.clone();const L=(p=d.position)==null?void 0:p.getValue(this.viewer.clock.currentTime);if(L){const z=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(L).height;this._ellipsoid=CesiumDnD.enlargeEllipsoid(this.viewer.scene.globe.ellipsoid,z),this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW?this._initialHeight=z:this._initialHeight=void 0}const F=this._resetHeight(this._convertCartesian2ToPosition(s.position)),N=this._context(F,s.position);if(N&&((E=(y=this.options)==null?void 0:y.onDrag)==null?void 0:E.call(y,d,F,N))===!1){this._initialPosition=void 0,this._initialScreenPosition=void 0,this._ellipsoid=void 0;return}this._position=F,this._entity=d,this._initialEnableRotate=this.viewer.scene.screenSpaceCameraController.enableRotate,this._initialEnableTranslate=this.viewer.scene.screenSpaceCameraController.enableTranslate,this.viewer.scene.mode===Cesium$1.SceneMode.SCENE3D?this.viewer.scene.screenSpaceCameraController.enableRotate=!1:this.viewer.scene.screenSpaceCameraController.enableTranslate=!1,this.viewer.canvas.addEventListener("blur",this.cancelDragging),d.position=this._callbackProperty};if(window.clearTimeout(this._timeout),typeof((c=this.options)==null?void 0:c.dragDelay)>"u"){h();return}this._timeout=window.setTimeout(h,this.options.dragDelay)},this._handleDragging=s=>{var c,d;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!(s!=null&&s.endPosition))return;const h=this._resetHeight(this._convertCartesian2ToPosition(s.endPosition)),p=this._context(h,s.endPosition);if(!p)return;const y=(d=(c=this.options)==null?void 0:c.onDragging)==null?void 0:d.call(c,this._entity,h,__spreadProps(__spreadValues({},p),{previousScreenPosition:s.startPosition}));y!==!1&&(typeof y<"u"?this._position=y:h&&(this._position=h))},this._handleDrop=s=>{var c,d;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!(s!=null&&s.position))return;const h=this._entity;h.position=this._initialPosition,this._position=void 0,this._entity=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging);const p=this._resetHeight(this._convertCartesian2ToPosition(s.position)),y=this._context(p,s.position);this._initialPosition=void 0,this._initialScreenPosition=void 0,this._initialHeight=void 0,this._ellipsoid=void 0,y&&((d=(c=this.options)==null?void 0:c.onDrop)==null?void 0:d.call(c,h,p,y))!==!1&&p&&(h.position=p)},this.viewer=n,this.options=o,o!=null&&o.initialDisabled||this.enable()}get isDragging(){return!!this._entity}enable(){var n,o,s,c,d,h;this._handler=new Cesium$1.ScreenSpaceEventHandler(this.viewer.canvas),this._handler.setInputAction(this._handleDrag,(o=(n=this.options)==null?void 0:n.dragInputType)!=null?o:Cesium$1.ScreenSpaceEventType.LEFT_DOWN),this._handler.setInputAction(this._handleDragging,(c=(s=this.options)==null?void 0:s.draggingInputType)!=null?c:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),this._handler.setInputAction(this._handleDrop,(h=(d=this.options)==null?void 0:d.dropInputType)!=null?h:Cesium$1.ScreenSpaceEventType.LEFT_UP)}disable(){var n;this.cancelDragging(),(n=this._handler)==null||n.destroy(),this._handler=void 0}get isActive(){return!!this._handler}_pick(n){var o;return(o=this.viewer.scene.pick(n))==null?void 0:o.id}_context(n,o){if(this._initialScreenPosition)return{position:n,screenPosition:o,initialPosition:this._initialPosition,initialScreenPosition:this._initialScreenPosition}}_convertCartesian2ToPosition(n){var o;return this.viewer.scene.camera.pickEllipsoid(n,(o=this._ellipsoid)!=null?o:this.viewer.scene.globe.ellipsoid)}_resetHeight(n){if(n&&(this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW)&&this._initialHeight){const o=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(n);return Cesium$1.Cartesian3.fromRadians(o.longitude,o.latitude,this._initialHeight)}return n}static enlargeEllipsoid(n,o){return new Cesium$1.Ellipsoid(n.radii.x+o,n.radii.y+o,n.radii.z+o)}}const useLayerDragDrop=({cesium:t,isLayerDraggable:n,onLayerDrag:o,onLayerDrop:s})=>{const c=React.useCallback((p,y,E)=>{var z,oe;const L=(z=t.current)==null?void 0:z.cesiumElement;if(!L||L.isDestroyed()||!isSelectable(p)||!isDraggable(p))return!1;const F=convertCartesian3ToPosition((oe=t.current)==null?void 0:oe.cesiumElement,y);if(!F)return!1;const N=getTag(p);if(!N)return!1;o==null||o(N.layerId||"",N.featureId,F)},[t,o]),d=React.useCallback((p,y)=>{var N,z;const E=(N=t.current)==null?void 0:N.cesiumElement;if(!E||E.isDestroyed())return!1;const L=getTag(p),F=convertCartesian3ToPosition((z=t.current)==null?void 0:z.cesiumElement,y);return s==null||s((L==null?void 0:L.layerId)||"",(L==null?void 0:L.featureId)||"",F),!1},[t,s]),h=React.useRef();return React.useEffect(()=>{var y;const p=(y=t.current)==null?void 0:y.cesiumElement;if(!(!p||p.isDestroyed()))return h.current=new CesiumDnD(p,{onDrag:c,onDrop:d,dragDelay:1e3,initialDisabled:!n}),()=>{var E;!p||p.isDestroyed()||(E=h.current)==null||E.disable()}},[t,n,c,d]),{handleLayerDrag:c,handleLayerDrop:d}},makeMouseEventProps=(t,n)=>{if(!t||t.isDestroyed())return;const o=n.position||n.startPosition;return{x:o==null?void 0:o.x,y:o==null?void 0:o.y,...o?getLocationFromScreen(t.scene,o.x,o.y,!0)??{}:{}}},useLayerSelectWithRect=({cesium:t,engineAPI:n,featureFlags:o,onLayerSelectWithRectStart:s,onLayerSelectWithRectMove:c,onLayerSelectWithRectEnd:d})=>{const h=React.useRef([0,0]),p=React.useRef(!1),y=React.useRef(!1),E=React.useCallback((z,oe)=>{var lt;if(p.current||y.current||o!==INTERACTION_MODES.selection||!((lt=t.current)!=null&<.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const W=makeMouseEventProps(t.current.cesiumElement,z)??{};h.current=[W.x??0,W.y??0],y.current=!0,p.current=!1,s==null||s({...W,pressedKey:oe})},[s,t,o]),L=React.useCallback((z,oe,W)=>{var ha;if(!y.current||!((ha=t.current)!=null&&ha.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const lt=makeMouseEventProps(t.current.cesiumElement,z)??{};let[nt,Ee]=h.current,[yt,Ai]=[lt.x??0,lt.y??0];if(yt-nt===0&&Ai-Ee===0)return lt;W||(p.current=!0),nt>yt&&([yt,nt]=[nt,yt]),Ee>Ai&&([Ai,Ee]=[Ee,Ai]);const zi={...lt,pressedKey:oe,x:yt,y:Ai,startX:nt,startY:Ee,width:yt-nt,height:Ai-Ee};return c==null||c(zi),zi},[c,t]),F=React.useCallback((z,oe)=>{var ya;if(!y.current||!((ya=t.current)!=null&&ya.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const W=L(z,oe,!0),{startX:lt=0,startY:nt=0,x:Ee=0,y:yt=0,width:Ai=0,height:zi=0}=W??{},[ha,ba]=[lt+Ai/2,nt+zi/2],Sa=p.current?n.pickManyFromViewport([ha,ba],Ai,zi):n.pickManyFromViewport([Ee,yt],1,1);d==null||d({...W,pressedKey:oe,features:Sa??[],isClick:!p.current}),p.current=!1,y.current=!1},[d,t,n,L]);return React.useMemo(()=>Object.fromEntries(Object.entries({start:{handler:E,keys:["shift"]},move:{handler:L,keys:["shift"]},end:{handler:F,keys:["shift"]}}).map(([oe,W])=>[oe,{handler:W.handler,...Object.fromEntries(W.keys.map(lt=>[lt,nt=>W.handler(nt,lt)]))}])),[F,L,E])},GlobeFSDefinitions=`uniform vec3 u_reearth_sphericalHarmonicCoefficients[9];
|
|
6103
6103
|
uniform bool u_reearth_globeImageBasedLighting;
|
|
6104
6104
|
|
|
6105
6105
|
vec4 reearth_computeImageBasedLightingColor(vec4 color);
|
|
@@ -6742,7 +6742,7 @@ vec3 getTurboColormap(const float v) {
|
|
|
6742
6742
|
${reconstructPosition}
|
|
6743
6743
|
${turboColorMap}
|
|
6744
6744
|
${ambientOcclusionModulate}
|
|
6745
|
-
`,uniforms:{...pick(L,["color","frustumLength","blackPoint","whitePoint","gamma"]),globeDepthTexture:()=>(y==null?void 0:y())??N._depthTexture}});if(c){const z=createBilateralFilterStage({prefix:t,outputType:h,useGlobeDepth:p,getGlobeDepthTexture:y,uniforms:{textureScale:n,...pick(L,["frustumLength","normalExponent","depthExponent"])}}),oe=new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion_generate_and_filter`,stages:[F,z]});return N.uniforms.ambientOcclusionTexture=oe.name,new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion`,stages:[oe,N],inputPreviousStageTexture:!1,uniforms:createUniforms([{stage:F,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:z,uniforms:["frustumLength","normalExponent","depthExponent"]},{stage:N,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}else return N.uniforms.ambientOcclusionTexture=F.name,new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion`,stages:[F,N],inputPreviousStageTexture:!1,uniforms:createUniforms([{stage:F,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:N,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}const AmbientOcclusionStage=({enabled:t=!0,textureScale:n,directions:o,steps:s,denoise:c,accurateNormalReconstruction:d,outputType:h,useGlobeDepth:p,...y})=>{const{viewer:E}=$e$1(),L=E==null?void 0:E.scene,F=useInstance({owner:L==null?void 0:L.postProcessStages,keys:[n,s,o,c,d,h,p],create:()=>{const N=createAmbientOcclusionStage({textureScale:n,steps:s,directions:o,denoise:c,accurateNormalReconstruction:d,outputType:h,useGlobeDepth:p,getGlobeDepthTexture:()=>L.context.uniformState.globeDepthTexture,uniforms:y});return N.enabled=t,N},transferOwnership:(N,z)=>(z==null||z.add(N),()=>{z==null||z.remove(N)})});return F.enabled=t,Object.assign(F.uniforms,y),L==null||L.requestRender(),usePreRender(()=>{const N=L==null?void 0:L.camera.frustum;if(N instanceof Cesium$1.PerspectiveFrustum){const z=1/Math.tan(N.fovy/2);F.uniforms.focalLength.x=z*N.aspectRatio,F.uniforms.focalLength.y=z}}),null},AmbientOcclusion=t=>{const n=$e$1(),[o,s]=React.useState(!1);return usePreRender(()=>{const c=n.scene;s(!(c!=null&&c.globe.depthTestAgainstTerrain));const{globeHeight:d}=c;if(!c||d==null)return;const h=c.camera.positionCartographic.height-d,p=c==null?void 0:c.camera.frustum;p instanceof Cesium$1.PerspectiveFrustum&&(c.camera.frustum.near=Cesium$1.Math.clamp(h-1,1,5)/Math.tan(p.fov/2))}),jsxRuntimeExports.jsx(AmbientOcclusionStage,{...t,useGlobeDepth:o})};var AmbientOcclusionOutputType=(t=>(t[t.Occlusion=1]="Occlusion",t[t.Normal=2]="Normal",t[t.Depth=3]="Depth",t[t.Weight=4]="Weight",t[t.Shade=5]="Shade",t))(AmbientOcclusionOutputType||{});const AMBIENT_OCCLUSION_QUALITY={low:{directions:4,steps:4,textureScale:.5,maxRadius:30},medium:{directions:4,steps:8,textureScale:.5,maxRadius:40},high:{directions:8,steps:8,textureScale:1,maxRadius:40},extreme:{directions:16,steps:16,textureScale:1,maxRadius:40}},DEFAULT_SKETCH_COLOR="#00bebe",DEFAULT_EDIT_COLOR="#3B3CD0",SELECTED_EDIT_COLOR="#FF9900",ADDING_POINT_COLOR="#3B3CD0";let drawPointImage,editPointImage,selectedPointImage,addingPointImage;const ControlPoint=({position:t,clampToGround:n=!1,index:o,isEditing:s,isSelected:c,isAddingPoint:d,isExtrudedControlPoint:h,handleControlPointMouseEvent:p})=>{const y=React.useRef(t);y.current=t;const E=useConstant$2(()=>new CallbackProperty((z,oe)=>"getValue"in y.current?y.current.getValue(z,oe):y.current,!1)),L=React.useMemo(()=>({position:E,billboard:{image:s?d?getAddingPointImage():c?getSelectedPointImage():getEditPointImage():getDrawPointImage(),width:s?16:8,height:s?16:8,heightReference:n?HeightReference$1.CLAMP_TO_GROUND:HeightReference$1.NONE,disableDepthTestDistance:1/0}}),[n,E,d,s,c]),F=React.useCallback(()=>{p==null||p(o,!!h,"mousedown")},[o,h,p]),N=React.useCallback(()=>{p==null||p(o,!!h,"click")},[o,h,p]);return jsxRuntimeExports.jsx(Is$1,{...L,onMouseDown:F,onClick:N})};function getDrawPointImage(){if(drawPointImage!=null)return drawPointImage;drawPointImage=document.createElement("canvas"),drawPointImage.width=16,drawPointImage.height=16;const t=drawPointImage.getContext("2d");return invariant$1(t!=null),t.fillStyle="white",t.fillRect(3,3,10,10),t.strokeStyle="black",t.lineWidth=2,t.strokeRect(3,3,10,10),drawPointImage}function getEditPointImage(){return getImage(editPointImage,{size:32,color:"white",strokeColor:DEFAULT_EDIT_COLOR})}function getSelectedPointImage(){return getImage(selectedPointImage,{size:32,color:"white",strokeColor:SELECTED_EDIT_COLOR})}function getAddingPointImage(){if(addingPointImage!=null)return addingPointImage;addingPointImage=document.createElement("canvas"),addingPointImage.width=32,addingPointImage.height=32;const t=addingPointImage.getContext("2d");return invariant$1(t!=null),t.beginPath(),t.arc(16,16,12,0,2*Math.PI),t.fillStyle="white",t.fill(),t.strokeStyle=ADDING_POINT_COLOR,t.lineWidth=4,t.stroke(),t.beginPath(),t.moveTo(16,8),t.lineTo(16,24),t.stroke(),t.moveTo(8,16),t.lineTo(24,16),t.stroke(),addingPointImage}function getImage(t,n){if(t!=null)return t;t=document.createElement("canvas"),t.width=n.size,t.height=n.size;const o=t.getContext("2d");return invariant$1(o!=null),o.beginPath(),o.arc(n.size/2,n.size/2,n.size/2-4,0,2*Math.PI),o.fillStyle=n.color,o.fill(),o.strokeStyle=n.strokeColor,o.lineWidth=4,o.stroke(),t}function assignForwardedRef(t,n){if(typeof t=="function")return t(n),()=>{t(null)};if(t!=null)return t.current=n,()=>{t.current=null}}const Entity=React.memo(React.forwardRef(({entities:t,...n},o)=>{const{viewer:s}=$e$1(),c=s==null?void 0:s.scene,d=s==null?void 0:s.entities,h=t??d,[p,y]=React.useState(()=>new Entity$1(n));return React.useEffect(()=>{y(new Entity$1(n))},[n.id]),React.useEffect(()=>(h==null||h.add(p),()=>{h==null||h.remove(p),c==null||c.requestRender()}),[c,h,p]),React.useEffect(()=>assignForwardedRef(o,p),[o,p]),Object.assign(p,omit(n,"id")),c==null||c.requestRender(),null})),textStyle={padding:"5px",color:"#fff",backgroundColor:"#000",borderRadius:"5px",lineHeight:1},MeasurementText=({children:t})=>jsxRuntimeExports.jsx("div",{style:textStyle,children:t}),MotionConfigContext=React.createContext({transformPagePoint:t=>t,isStatic:!1,reducedMotion:"never"}),MotionContext=React.createContext({}),PresenceContext=React.createContext(null),isBrowser=typeof document<"u",useIsomorphicLayoutEffect$1=isBrowser?React.useLayoutEffect:React.useEffect,LazyContext=React.createContext({strict:!1}),camelToDash=t=>t.replace(/([a-z])([A-Z])/gu,"$1-$2").toLowerCase(),optimizedAppearDataId="framerAppearId",optimizedAppearDataAttribute="data-"+camelToDash(optimizedAppearDataId),MotionGlobalConfig={skipAnimations:!1,useManualTiming:!1};class Queue{constructor(){this.order=[],this.scheduled=new Set}add(n){if(!this.scheduled.has(n))return this.scheduled.add(n),this.order.push(n),!0}remove(n){const o=this.order.indexOf(n);o!==-1&&(this.order.splice(o,1),this.scheduled.delete(n))}clear(){this.order.length=0,this.scheduled.clear()}}function createRenderStep(t){let n=new Queue,o=new Queue,s=0,c=!1,d=!1;const h=new WeakSet,p={schedule:(y,E=!1,L=!1)=>{const F=L&&c,N=F?n:o;return E&&h.add(y),N.add(y)&&F&&c&&(s=n.order.length),y},cancel:y=>{o.remove(y),h.delete(y)},process:y=>{if(c){d=!0;return}if(c=!0,[n,o]=[o,n],o.clear(),s=n.order.length,s)for(let E=0;E<s;E++){const L=n.order[E];h.has(L)&&(p.schedule(L),t()),L(y)}c=!1,d&&(d=!1,p.process(y))}};return p}const stepsOrder=["read","resolveKeyframes","update","preRender","render","postRender"],maxElapsed=40;function createRenderBatcher(t,n){let o=!1,s=!0;const c={delta:0,timestamp:0,isProcessing:!1},d=stepsOrder.reduce((F,N)=>(F[N]=createRenderStep(()=>o=!0),F),{}),h=F=>{d[F].process(c)},p=()=>{const F=performance.now();o=!1,c.delta=s?1e3/60:Math.max(Math.min(F-c.timestamp,maxElapsed),1),c.timestamp=F,c.isProcessing=!0,stepsOrder.forEach(h),c.isProcessing=!1,o&&n&&(s=!1,t(p))},y=()=>{o=!0,s=!0,c.isProcessing||t(p)};return{schedule:stepsOrder.reduce((F,N)=>{const z=d[N];return F[N]=(oe,W=!1,lt=!1)=>(o||y(),z.schedule(oe,W,lt)),F},{}),cancel:F=>stepsOrder.forEach(N=>d[N].cancel(F)),state:c,steps:d}}const{schedule:microtask,cancel:cancelMicrotask}=createRenderBatcher(queueMicrotask,!1);function useVisualElement(t,n,o,s){const{visualElement:c}=React.useContext(MotionContext),d=React.useContext(LazyContext),h=React.useContext(PresenceContext),p=React.useContext(MotionConfigContext).reducedMotion,y=React.useRef();s=s||d.renderer,!y.current&&s&&(y.current=s(t,{visualState:n,parent:c,props:o,presenceContext:h,blockInitialAnimation:h?h.initial===!1:!1,reducedMotionConfig:p}));const E=y.current;React.useInsertionEffect(()=>{E&&E.update(o,h)});const L=React.useRef(!!(o[optimizedAppearDataAttribute]&&!window.HandoffComplete));return useIsomorphicLayoutEffect$1(()=>{E&&(microtask.postRender(E.render),L.current&&E.animationState&&E.animationState.animateChanges())}),React.useEffect(()=>{E&&(E.updateFeatures(),!L.current&&E.animationState&&E.animationState.animateChanges(),L.current&&(L.current=!1,window.HandoffComplete=!0))}),E}function isRefObject(t){return t&&typeof t=="object"&&Object.prototype.hasOwnProperty.call(t,"current")}function useMotionRef(t,n,o){return React.useCallback(s=>{s&&t.mount&&t.mount(s),n&&(s?n.mount(s):n.unmount()),o&&(typeof o=="function"?o(s):isRefObject(o)&&(o.current=s))},[n])}function isVariantLabel(t){return typeof t=="string"||Array.isArray(t)}function isAnimationControls(t){return t!==null&&typeof t=="object"&&typeof t.start=="function"}const variantPriorityOrder=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],variantProps=["initial",...variantPriorityOrder];function isControllingVariants(t){return isAnimationControls(t.animate)||variantProps.some(n=>isVariantLabel(t[n]))}function isVariantNode(t){return!!(isControllingVariants(t)||t.variants)}function getCurrentTreeVariants(t,n){if(isControllingVariants(t)){const{initial:o,animate:s}=t;return{initial:o===!1||isVariantLabel(o)?o:void 0,animate:isVariantLabel(s)?s:void 0}}return t.inherit!==!1?n:{}}function useCreateMotionContext(t){const{initial:n,animate:o}=getCurrentTreeVariants(t,React.useContext(MotionContext));return React.useMemo(()=>({initial:n,animate:o}),[variantLabelsAsDependency(n),variantLabelsAsDependency(o)])}function variantLabelsAsDependency(t){return Array.isArray(t)?t.join(" "):t}const featureProps={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},featureDefinitions={};for(const t in featureProps)featureDefinitions[t]={isEnabled:n=>featureProps[t].some(o=>!!n[o])};function loadFeatures(t){for(const n in t)featureDefinitions[n]={...featureDefinitions[n],...t[n]}}const LayoutGroupContext=React.createContext({}),SwitchLayoutGroupContext=React.createContext({}),motionComponentSymbol=Symbol.for("motionComponentSymbol");function createMotionComponent({preloadedFeatures:t,createVisualElement:n,useRender:o,useVisualState:s,Component:c}){t&&loadFeatures(t);function d(p,y){let E;const L={...React.useContext(MotionConfigContext),...p,layoutId:useLayoutId(p)},{isStatic:F}=L,N=useCreateMotionContext(p),z=s(p,F);if(!F&&isBrowser){N.visualElement=useVisualElement(c,z,L,n);const oe=React.useContext(SwitchLayoutGroupContext),W=React.useContext(LazyContext).strict;N.visualElement&&(E=N.visualElement.loadFeatures(L,W,t,oe))}return React__namespace.createElement(MotionContext.Provider,{value:N},E&&N.visualElement?React__namespace.createElement(E,{visualElement:N.visualElement,...L}):null,o(c,p,useMotionRef(z,N.visualElement,y),z,F,N.visualElement))}const h=React.forwardRef(d);return h[motionComponentSymbol]=c,h}function useLayoutId({layoutId:t}){const n=React.useContext(LayoutGroupContext).id;return n&&t!==void 0?n+"-"+t:t}function createMotionProxy(t){function n(s,c={}){return createMotionComponent(t(s,c))}if(typeof Proxy>"u")return n;const o=new Map;return new Proxy(n,{get:(s,c)=>(o.has(c)||o.set(c,n(c)),o.get(c))})}const lowercaseSVGElements=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function isSVGComponent(t){return typeof t!="string"||t.includes("-")?!1:!!(lowercaseSVGElements.indexOf(t)>-1||/[A-Z]/u.test(t))}const scaleCorrectors={};function addScaleCorrector(t){Object.assign(scaleCorrectors,t)}const transformPropOrder=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],transformProps=new Set(transformPropOrder);function isForcedMotionValue(t,{layout:n,layoutId:o}){return transformProps.has(t)||t.startsWith("origin")||(n||o!==void 0)&&(!!scaleCorrectors[t]||t==="opacity")}const isMotionValue=t=>!!(t&&t.getVelocity),translateAlias={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},numTransforms=transformPropOrder.length;function buildTransform(t,{enableHardwareAcceleration:n=!0,allowTransformNone:o=!0},s,c){let d="";for(let h=0;h<numTransforms;h++){const p=transformPropOrder[h];if(t[p]!==void 0){const y=translateAlias[p]||p;d+=`${y}(${t[p]}) `}}return n&&!t.z&&(d+="translateZ(0)"),d=d.trim(),c?d=c(t,s?"":d):o&&s&&(d="none"),d}const checkStringStartsWith=t=>n=>typeof n=="string"&&n.startsWith(t),isCSSVariableName=checkStringStartsWith("--"),startsAsVariableToken=checkStringStartsWith("var(--"),isCSSVariableToken=t=>startsAsVariableToken(t)?singleCssVariableRegex.test(t.split("/*")[0].trim()):!1,singleCssVariableRegex=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu,getValueAsType=(t,n)=>n&&typeof t=="number"?n.transform(t):t,clamp=(t,n,o)=>o>n?n:o<t?t:o,number={test:t=>typeof t=="number",parse:parseFloat,transform:t=>t},alpha={...number,transform:t=>clamp(0,1,t)},scale={...number,default:1},sanitize=t=>Math.round(t*1e5)/1e5,floatRegex=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu,colorRegex=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu,singleColorRegex=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu;function isString$1(t){return typeof t=="string"}const createUnitType=t=>({test:n=>isString$1(n)&&n.endsWith(t)&&n.split(" ").length===1,parse:parseFloat,transform:n=>`${n}${t}`}),degrees=createUnitType("deg"),percent=createUnitType("%"),px=createUnitType("px"),vh=createUnitType("vh"),vw=createUnitType("vw"),progressPercentage={...percent,parse:t=>percent.parse(t)/100,transform:t=>percent.transform(t*100)},int={...number,transform:Math.round},numberValueTypes={borderWidth:px,borderTopWidth:px,borderRightWidth:px,borderBottomWidth:px,borderLeftWidth:px,borderRadius:px,radius:px,borderTopLeftRadius:px,borderTopRightRadius:px,borderBottomRightRadius:px,borderBottomLeftRadius:px,width:px,maxWidth:px,height:px,maxHeight:px,size:px,top:px,right:px,bottom:px,left:px,padding:px,paddingTop:px,paddingRight:px,paddingBottom:px,paddingLeft:px,margin:px,marginTop:px,marginRight:px,marginBottom:px,marginLeft:px,rotate:degrees,rotateX:degrees,rotateY:degrees,rotateZ:degrees,scale,scaleX:scale,scaleY:scale,scaleZ:scale,skew:degrees,skewX:degrees,skewY:degrees,distance:px,translateX:px,translateY:px,translateZ:px,x:px,y:px,z:px,perspective:px,transformPerspective:px,opacity:alpha,originX:progressPercentage,originY:progressPercentage,originZ:px,zIndex:int,backgroundPositionX:px,backgroundPositionY:px,fillOpacity:alpha,strokeOpacity:alpha,numOctaves:int};function buildHTMLStyles(t,n,o,s){const{style:c,vars:d,transform:h,transformOrigin:p}=t;let y=!1,E=!1,L=!0;for(const F in n){const N=n[F];if(isCSSVariableName(F)){d[F]=N;continue}const z=numberValueTypes[F],oe=getValueAsType(N,z);if(transformProps.has(F)){if(y=!0,h[F]=oe,!L)continue;N!==(z.default||0)&&(L=!1)}else F.startsWith("origin")?(E=!0,p[F]=oe):c[F]=oe}if(n.transform||(y||s?c.transform=buildTransform(t.transform,o,L,s):c.transform&&(c.transform="none")),E){const{originX:F="50%",originY:N="50%",originZ:z=0}=p;c.transformOrigin=`${F} ${N} ${z}`}}const createHtmlRenderState=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function copyRawValuesOnly(t,n,o){for(const s in n)!isMotionValue(n[s])&&!isForcedMotionValue(s,o)&&(t[s]=n[s])}function useInitialMotionValues({transformTemplate:t},n,o){return React.useMemo(()=>{const s=createHtmlRenderState();return buildHTMLStyles(s,n,{enableHardwareAcceleration:!o},t),Object.assign({},s.vars,s.style)},[n])}function useStyle(t,n,o){const s=t.style||{},c={};return copyRawValuesOnly(c,s,t),Object.assign(c,useInitialMotionValues(t,n,o)),c}function useHTMLProps(t,n,o){const s={},c=useStyle(t,n,o);return t.drag&&t.dragListener!==!1&&(s.draggable=!1,c.userSelect=c.WebkitUserSelect=c.WebkitTouchCallout="none",c.touchAction=t.drag===!0?"none":`pan-${t.drag==="x"?"y":"x"}`),t.tabIndex===void 0&&(t.onTap||t.onTapStart||t.whileTap)&&(s.tabIndex=0),s.style=c,s}const validMotionProps=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function isValidMotionProp(t){return t.startsWith("while")||t.startsWith("drag")&&t!=="draggable"||t.startsWith("layout")||t.startsWith("onTap")||t.startsWith("onPan")||t.startsWith("onLayout")||validMotionProps.has(t)}let shouldForward=t=>!isValidMotionProp(t);function loadExternalIsValidProp(t){t&&(shouldForward=n=>n.startsWith("on")?!isValidMotionProp(n):t(n))}try{loadExternalIsValidProp(require("@emotion/is-prop-valid").default)}catch(t){}function filterProps(t,n,o){const s={};for(const c in t)c==="values"&&typeof t.values=="object"||(shouldForward(c)||o===!0&&isValidMotionProp(c)||!n&&!isValidMotionProp(c)||t.draggable&&c.startsWith("onDrag"))&&(s[c]=t[c]);return s}function calcOrigin$1(t,n,o){return typeof t=="string"?t:px.transform(n+o*t)}function calcSVGTransformOrigin(t,n,o){const s=calcOrigin$1(n,t.x,t.width),c=calcOrigin$1(o,t.y,t.height);return`${s} ${c}`}const dashKeys={offset:"stroke-dashoffset",array:"stroke-dasharray"},camelKeys={offset:"strokeDashoffset",array:"strokeDasharray"};function buildSVGPath(t,n,o=1,s=0,c=!0){t.pathLength=1;const d=c?dashKeys:camelKeys;t[d.offset]=px.transform(-s);const h=px.transform(n),p=px.transform(o);t[d.array]=`${h} ${p}`}function buildSVGAttrs(t,{attrX:n,attrY:o,attrScale:s,originX:c,originY:d,pathLength:h,pathSpacing:p=1,pathOffset:y=0,...E},L,F,N){if(buildHTMLStyles(t,E,L,N),F){t.style.viewBox&&(t.attrs.viewBox=t.style.viewBox);return}t.attrs=t.style,t.style={};const{attrs:z,style:oe,dimensions:W}=t;z.transform&&(W&&(oe.transform=z.transform),delete z.transform),W&&(c!==void 0||d!==void 0||oe.transform)&&(oe.transformOrigin=calcSVGTransformOrigin(W,c!==void 0?c:.5,d!==void 0?d:.5)),n!==void 0&&(z.x=n),o!==void 0&&(z.y=o),s!==void 0&&(z.scale=s),h!==void 0&&buildSVGPath(z,h,p,y,!1)}const createSvgRenderState=()=>({...createHtmlRenderState(),attrs:{}}),isSVGTag=t=>typeof t=="string"&&t.toLowerCase()==="svg";function useSVGProps(t,n,o,s){const c=React.useMemo(()=>{const d=createSvgRenderState();return buildSVGAttrs(d,n,{enableHardwareAcceleration:!1},isSVGTag(s),t.transformTemplate),{...d.attrs,style:{...d.style}}},[n]);if(t.style){const d={};copyRawValuesOnly(d,t.style,t),c.style={...d,...c.style}}return c}function createUseRender(t=!1){return(o,s,c,{latestValues:d},h)=>{const y=(isSVGComponent(o)?useSVGProps:useHTMLProps)(s,d,h,o),E=filterProps(s,typeof o=="string",t),L=o!==React.Fragment?{...E,...y,ref:c}:{},{children:F}=s,N=React.useMemo(()=>isMotionValue(F)?F.get():F,[F]);return React.createElement(o,{...L,children:N})}}function renderHTML(t,{style:n,vars:o},s,c){Object.assign(t.style,n,c&&c.getProjectionStyles(s));for(const d in o)t.style.setProperty(d,o[d])}const camelCaseAttributes=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function renderSVG(t,n,o,s){renderHTML(t,n,void 0,s);for(const c in n.attrs)t.setAttribute(camelCaseAttributes.has(c)?c:camelToDash(c),n.attrs[c])}function scrapeMotionValuesFromProps$1(t,n,o){var s;const{style:c}=t,d={};for(const h in c)(isMotionValue(c[h])||n.style&&isMotionValue(n.style[h])||isForcedMotionValue(h,t)||((s=o==null?void 0:o.getValue(h))===null||s===void 0?void 0:s.liveStyle)!==void 0)&&(d[h]=c[h]);return d}function scrapeMotionValuesFromProps(t,n,o){const s=scrapeMotionValuesFromProps$1(t,n,o);for(const c in t)if(isMotionValue(t[c])||isMotionValue(n[c])){const d=transformPropOrder.indexOf(c)!==-1?"attr"+c.charAt(0).toUpperCase()+c.substring(1):c;s[d]=t[c]}return s}function resolveVariantFromProps(t,n,o,s={},c={}){return typeof n=="function"&&(n=n(o!==void 0?o:t.custom,s,c)),typeof n=="string"&&(n=t.variants&&t.variants[n]),typeof n=="function"&&(n=n(o!==void 0?o:t.custom,s,c)),n}function useConstant(t){const n=React.useRef(null);return n.current===null&&(n.current=t()),n.current}const isKeyframesTarget=t=>Array.isArray(t),isCustomValue=t=>!!(t&&typeof t=="object"&&t.mix&&t.toValue),resolveFinalValueInKeyframes=t=>isKeyframesTarget(t)?t[t.length-1]||0:t;function resolveMotionValue(t){const n=isMotionValue(t)?t.get():t;return isCustomValue(n)?n.toValue():n}function makeState({scrapeMotionValuesFromProps:t,createRenderState:n,onMount:o},s,c,d){const h={latestValues:makeLatestValues(s,c,d,t),renderState:n()};return o&&(h.mount=p=>o(s,p,h)),h}const makeUseVisualState=t=>(n,o)=>{const s=React.useContext(MotionContext),c=React.useContext(PresenceContext),d=()=>makeState(t,n,s,c);return o?d():useConstant(d)};function makeLatestValues(t,n,o,s){const c={},d=s(t,{});for(const N in d)c[N]=resolveMotionValue(d[N]);let{initial:h,animate:p}=t;const y=isControllingVariants(t),E=isVariantNode(t);n&&E&&!y&&t.inherit!==!1&&(h===void 0&&(h=n.initial),p===void 0&&(p=n.animate));let L=o?o.initial===!1:!1;L=L||h===!1;const F=L?p:h;return F&&typeof F!="boolean"&&!isAnimationControls(F)&&(Array.isArray(F)?F:[F]).forEach(z=>{const oe=resolveVariantFromProps(t,z);if(!oe)return;const{transitionEnd:W,transition:lt,...nt}=oe;for(const Ee in nt){let yt=nt[Ee];if(Array.isArray(yt)){const Ai=L?yt.length-1:0;yt=yt[Ai]}yt!==null&&(c[Ee]=yt)}for(const Ee in W)c[Ee]=W[Ee]}),c}const noop$1=t=>t,{schedule:frame,cancel:cancelFrame,state:frameData,steps}=createRenderBatcher(typeof requestAnimationFrame<"u"?requestAnimationFrame:noop$1,!0),svgMotionConfig={useVisualState:makeUseVisualState({scrapeMotionValuesFromProps,createRenderState:createSvgRenderState,onMount:(t,n,{renderState:o,latestValues:s})=>{frame.read(()=>{try{o.dimensions=typeof n.getBBox=="function"?n.getBBox():n.getBoundingClientRect()}catch{o.dimensions={x:0,y:0,width:0,height:0}}}),frame.render(()=>{buildSVGAttrs(o,s,{enableHardwareAcceleration:!1},isSVGTag(n.tagName),t.transformTemplate),renderSVG(n,o)})}})},htmlMotionConfig={useVisualState:makeUseVisualState({scrapeMotionValuesFromProps:scrapeMotionValuesFromProps$1,createRenderState:createHtmlRenderState})};function createDomMotionConfig(t,{forwardMotionProps:n=!1},o,s){return{...isSVGComponent(t)?svgMotionConfig:htmlMotionConfig,preloadedFeatures:o,useRender:createUseRender(n),createVisualElement:s,Component:t}}function addDomEvent(t,n,o,s={passive:!0}){return t.addEventListener(n,o,s),()=>t.removeEventListener(n,o)}const isPrimaryPointer=t=>t.pointerType==="mouse"?typeof t.button!="number"||t.button<=0:t.isPrimary!==!1;function extractEventInfo(t,n="page"){return{point:{x:t[n+"X"],y:t[n+"Y"]}}}const addPointerInfo=t=>n=>isPrimaryPointer(n)&&t(n,extractEventInfo(n));function addPointerEvent(t,n,o,s){return addDomEvent(t,n,addPointerInfo(o),s)}const combineFunctions=(t,n)=>o=>n(t(o)),pipe=(...t)=>t.reduce(combineFunctions);function createLock(t){let n=null;return()=>{const o=()=>{n=null};return n===null?(n=t,o):!1}}const globalHorizontalLock=createLock("dragHorizontal"),globalVerticalLock=createLock("dragVertical");function getGlobalLock(t){let n=!1;if(t==="y")n=globalVerticalLock();else if(t==="x")n=globalHorizontalLock();else{const o=globalHorizontalLock(),s=globalVerticalLock();o&&s?n=()=>{o(),s()}:(o&&o(),s&&s())}return n}function isDragActive(){const t=getGlobalLock(!0);return t?(t(),!1):!0}class Feature{constructor(n){this.isMounted=!1,this.node=n}update(){}}function addHoverEvent(t,n){const o="pointer"+(n?"enter":"leave"),s="onHover"+(n?"Start":"End"),c=(d,h)=>{if(d.pointerType==="touch"||isDragActive())return;const p=t.getProps();t.animationState&&p.whileHover&&t.animationState.setActive("whileHover",n),p[s]&&p[s](d,h)};return addPointerEvent(t.current,o,c,{passive:!t.getProps()[s]})}class HoverGesture extends Feature{mount(){this.unmount=pipe(addHoverEvent(this.node,!0),addHoverEvent(this.node,!1))}unmount(){}}class FocusGesture extends Feature{constructor(){super(...arguments),this.isActive=!1}onFocus(){let n=!1;try{n=this.node.current.matches(":focus-visible")}catch{n=!0}!n||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=pipe(addDomEvent(this.node.current,"focus",()=>this.onFocus()),addDomEvent(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}const isNodeOrChild=(t,n)=>n?t===n?!0:isNodeOrChild(t,n.parentElement):!1;function fireSyntheticPointerEvent(t,n){if(!n)return;const o=new PointerEvent("pointer"+t);n(o,extractEventInfo(o))}class PressGesture extends Feature{constructor(){super(...arguments),this.removeStartListeners=noop$1,this.removeEndListeners=noop$1,this.removeAccessibleListeners=noop$1,this.startPointerPress=(n,o)=>{if(this.isPressing)return;this.removeEndListeners();const s=this.node.getProps(),d=addPointerEvent(window,"pointerup",(p,y)=>{if(!this.checkPressEnd())return;const{onTap:E,onTapCancel:L,globalTapTarget:F}=this.node.getProps();!F&&!isNodeOrChild(this.node.current,p.target)?L&&L(p,y):E&&E(p,y)},{passive:!(s.onTap||s.onPointerUp)}),h=addPointerEvent(window,"pointercancel",(p,y)=>this.cancelPress(p,y),{passive:!(s.onTapCancel||s.onPointerCancel)});this.removeEndListeners=pipe(d,h),this.startPress(n,o)},this.startAccessiblePress=()=>{const n=d=>{if(d.key!=="Enter"||this.isPressing)return;const h=p=>{p.key!=="Enter"||!this.checkPressEnd()||fireSyntheticPointerEvent("up",(y,E)=>{const{onTap:L}=this.node.getProps();L&&L(y,E)})};this.removeEndListeners(),this.removeEndListeners=addDomEvent(this.node.current,"keyup",h),fireSyntheticPointerEvent("down",(p,y)=>{this.startPress(p,y)})},o=addDomEvent(this.node.current,"keydown",n),s=()=>{this.isPressing&&fireSyntheticPointerEvent("cancel",(d,h)=>this.cancelPress(d,h))},c=addDomEvent(this.node.current,"blur",s);this.removeAccessibleListeners=pipe(o,c)}}startPress(n,o){this.isPressing=!0;const{onTapStart:s,whileTap:c}=this.node.getProps();c&&this.node.animationState&&this.node.animationState.setActive("whileTap",!0),s&&s(n,o)}checkPressEnd(){return this.removeEndListeners(),this.isPressing=!1,this.node.getProps().whileTap&&this.node.animationState&&this.node.animationState.setActive("whileTap",!1),!isDragActive()}cancelPress(n,o){if(!this.checkPressEnd())return;const{onTapCancel:s}=this.node.getProps();s&&s(n,o)}mount(){const n=this.node.getProps(),o=addPointerEvent(n.globalTapTarget?window:this.node.current,"pointerdown",this.startPointerPress,{passive:!(n.onTapStart||n.onPointerStart)}),s=addDomEvent(this.node.current,"focus",this.startAccessiblePress);this.removeStartListeners=pipe(o,s)}unmount(){this.removeStartListeners(),this.removeEndListeners(),this.removeAccessibleListeners()}}const observerCallbacks=new WeakMap,observers=new WeakMap,fireObserverCallback=t=>{const n=observerCallbacks.get(t.target);n&&n(t)},fireAllObserverCallbacks=t=>{t.forEach(fireObserverCallback)};function initIntersectionObserver({root:t,...n}){const o=t||document;observers.has(o)||observers.set(o,{});const s=observers.get(o),c=JSON.stringify(n);return s[c]||(s[c]=new IntersectionObserver(fireAllObserverCallbacks,{root:t,...n})),s[c]}function observeIntersection(t,n,o){const s=initIntersectionObserver(n);return observerCallbacks.set(t,o),s.observe(t),()=>{observerCallbacks.delete(t),s.unobserve(t)}}const thresholdNames={some:0,all:1};class InViewFeature extends Feature{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:n={}}=this.node.getProps(),{root:o,margin:s,amount:c="some",once:d}=n,h={root:o?o.current:void 0,rootMargin:s,threshold:typeof c=="number"?c:thresholdNames[c]},p=y=>{const{isIntersecting:E}=y;if(this.isInView===E||(this.isInView=E,d&&!E&&this.hasEnteredView))return;E&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",E);const{onViewportEnter:L,onViewportLeave:F}=this.node.getProps(),N=E?L:F;N&&N(y)};return observeIntersection(this.node.current,h,p)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:n,prevProps:o}=this.node;["amount","margin","root"].some(hasViewportOptionChanged(n,o))&&this.startObserver()}unmount(){}}function hasViewportOptionChanged({viewport:t={}},{viewport:n={}}={}){return o=>t[o]!==n[o]}const gestureAnimations={inView:{Feature:InViewFeature},tap:{Feature:PressGesture},focus:{Feature:FocusGesture},hover:{Feature:HoverGesture}};function shallowCompare(t,n){if(!Array.isArray(n))return!1;const o=n.length;if(o!==t.length)return!1;for(let s=0;s<o;s++)if(n[s]!==t[s])return!1;return!0}function getCurrent(t){const n={};return t.values.forEach((o,s)=>n[s]=o.get()),n}function getVelocity$1(t){const n={};return t.values.forEach((o,s)=>n[s]=o.getVelocity()),n}function resolveVariant(t,n,o){const s=t.getProps();return resolveVariantFromProps(s,n,o!==void 0?o:s.custom,getCurrent(t),getVelocity$1(t))}const secondsToMilliseconds=t=>t*1e3,millisecondsToSeconds=t=>t/1e3,underDampedSpring={type:"spring",stiffness:500,damping:25,restSpeed:10},criticallyDampedSpring=t=>({type:"spring",stiffness:550,damping:t===0?2*Math.sqrt(550):30,restSpeed:10}),keyframesTransition={type:"keyframes",duration:.8},ease={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},getDefaultTransition=(t,{keyframes:n})=>n.length>2?keyframesTransition:transformProps.has(t)?t.startsWith("scale")?criticallyDampedSpring(n[1]):underDampedSpring:ease;function isTransitionDefined({when:t,delay:n,delayChildren:o,staggerChildren:s,staggerDirection:c,repeat:d,repeatType:h,repeatDelay:p,from:y,elapsed:E,...L}){return!!Object.keys(L).length}function getValueTransition(t,n){return t[n]||t.default||t}const isNotNull=t=>t!==null;function getFinalKeyframe(t,{repeat:n,repeatType:o="loop"},s){const c=t.filter(isNotNull),d=n&&o!=="loop"&&n%2===1?0:c.length-1;return!d||s===void 0?c[d]:s}let now;function clearTime(){now=void 0}const time={now:()=>(now===void 0&&time.set(frameData.isProcessing||MotionGlobalConfig.useManualTiming?frameData.timestamp:performance.now()),now),set:t=>{now=t,queueMicrotask(clearTime)}},isZeroValueString=t=>/^0[^.\s]+$/u.test(t);function isNone(t){return typeof t=="number"?t===0:t!==null?t==="none"||t==="0"||isZeroValueString(t):!0}let warning=noop$1,invariant=noop$1;process.env.NODE_ENV!=="production"&&(warning=(t,n)=>{!t&&typeof console<"u"&&console.warn(n)},invariant=(t,n)=>{if(!t)throw new Error(n)});const isNumericalString=t=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(t),splitCSSVariableRegex=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function parseCSSVariable(t){const n=splitCSSVariableRegex.exec(t);if(!n)return[,];const[,o,s,c]=n;return[`--${o??s}`,c]}const maxDepth=4;function getVariableValue(t,n,o=1){invariant(o<=maxDepth,`Max CSS variable fallback depth detected in property "${t}". This may indicate a circular fallback dependency.`);const[s,c]=parseCSSVariable(t);if(!s)return;const d=window.getComputedStyle(n).getPropertyValue(s);if(d){const h=d.trim();return isNumericalString(h)?parseFloat(h):h}return isCSSVariableToken(c)?getVariableValue(c,n,o+1):c}const positionalKeys=new Set(["width","height","top","left","right","bottom","x","y","translateX","translateY"]),isNumOrPxType=t=>t===number||t===px,getPosFromMatrix=(t,n)=>parseFloat(t.split(", ")[n]),getTranslateFromMatrix=(t,n)=>(o,{transform:s})=>{if(s==="none"||!s)return 0;const c=s.match(/^matrix3d\((.+)\)$/u);if(c)return getPosFromMatrix(c[1],n);{const d=s.match(/^matrix\((.+)\)$/u);return d?getPosFromMatrix(d[1],t):0}},transformKeys=new Set(["x","y","z"]),nonTranslationalTransformKeys=transformPropOrder.filter(t=>!transformKeys.has(t));function removeNonTranslationalTransform(t){const n=[];return nonTranslationalTransformKeys.forEach(o=>{const s=t.getValue(o);s!==void 0&&(n.push([o,s.get()]),s.set(o.startsWith("scale")?1:0))}),n}const positionalValues={width:({x:t},{paddingLeft:n="0",paddingRight:o="0"})=>t.max-t.min-parseFloat(n)-parseFloat(o),height:({y:t},{paddingTop:n="0",paddingBottom:o="0"})=>t.max-t.min-parseFloat(n)-parseFloat(o),top:(t,{top:n})=>parseFloat(n),left:(t,{left:n})=>parseFloat(n),bottom:({y:t},{top:n})=>parseFloat(n)+(t.max-t.min),right:({x:t},{left:n})=>parseFloat(n)+(t.max-t.min),x:getTranslateFromMatrix(4,13),y:getTranslateFromMatrix(5,14)};positionalValues.translateX=positionalValues.x,positionalValues.translateY=positionalValues.y;const testValueType=t=>n=>n.test(t),auto={test:t=>t==="auto",parse:t=>t},dimensionValueTypes=[number,px,percent,degrees,vw,vh,auto],findDimensionValueType=t=>dimensionValueTypes.find(testValueType(t)),toResolve=new Set;let isScheduled=!1,anyNeedsMeasurement=!1;function measureAllKeyframes(){if(anyNeedsMeasurement){const t=Array.from(toResolve).filter(s=>s.needsMeasurement),n=new Set(t.map(s=>s.element)),o=new Map;n.forEach(s=>{removeNonTranslationalTransform(s).length&&(o.set(s,removeNonTranslationalTransform(s)),s.render())}),t.forEach(s=>s.measureInitialState()),n.forEach(s=>{s.render()}),t.forEach(s=>s.measureEndState()),t.forEach(s=>{s.suspendedScrollY!==void 0&&window.scrollTo(0,s.suspendedScrollY)})}anyNeedsMeasurement=!1,isScheduled=!1,toResolve.forEach(t=>t.complete()),toResolve.clear()}function readAllKeyframes(){toResolve.forEach(t=>{t.readKeyframes(),t.needsMeasurement&&(anyNeedsMeasurement=!0)})}function flushKeyframeResolvers(){readAllKeyframes(),measureAllKeyframes()}class KeyframeResolver{constructor(n,o,s,c,d,h=!1){this.isComplete=!1,this.isAsync=!1,this.needsMeasurement=!1,this.isScheduled=!1,this.unresolvedKeyframes=[...n],this.onComplete=o,this.name=s,this.motionValue=c,this.element=d,this.isAsync=h}scheduleResolve(){this.isScheduled=!0,this.isAsync?(toResolve.add(this),isScheduled||(isScheduled=!0,frame.read(readAllKeyframes),frame.resolveKeyframes(measureAllKeyframes))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:n,name:o,element:s,motionValue:c}=this;for(let d=0;d<n.length;d++)if(n[d]===null)if(d===0){const h=c==null?void 0:c.get(),p=n[n.length-1];if(h!==void 0)n[0]=h;else if(s&&o){const y=s.readValue(o,p);y!=null&&(n[0]=y)}n[0]===void 0&&(n[0]=p),c&&h===void 0&&c.set(n[0])}else n[d]=n[d-1]}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(){this.isComplete=!0,this.onComplete(this.unresolvedKeyframes,this.finalKeyframe),toResolve.delete(this)}cancel(){this.isComplete||(this.isScheduled=!1,toResolve.delete(this))}resume(){this.isComplete||this.scheduleResolve()}}const isColorString=(t,n)=>o=>!!(isString$1(o)&&singleColorRegex.test(o)&&o.startsWith(t)||n&&Object.prototype.hasOwnProperty.call(o,n)),splitColor=(t,n,o)=>s=>{if(!isString$1(s))return s;const[c,d,h,p]=s.match(floatRegex);return{[t]:parseFloat(c),[n]:parseFloat(d),[o]:parseFloat(h),alpha:p!==void 0?parseFloat(p):1}},clampRgbUnit=t=>clamp(0,255,t),rgbUnit={...number,transform:t=>Math.round(clampRgbUnit(t))},rgba={test:isColorString("rgb","red"),parse:splitColor("red","green","blue"),transform:({red:t,green:n,blue:o,alpha:s=1})=>"rgba("+rgbUnit.transform(t)+", "+rgbUnit.transform(n)+", "+rgbUnit.transform(o)+", "+sanitize(alpha.transform(s))+")"};function parseHex(t){let n="",o="",s="",c="";return t.length>5?(n=t.substring(1,3),o=t.substring(3,5),s=t.substring(5,7),c=t.substring(7,9)):(n=t.substring(1,2),o=t.substring(2,3),s=t.substring(3,4),c=t.substring(4,5),n+=n,o+=o,s+=s,c+=c),{red:parseInt(n,16),green:parseInt(o,16),blue:parseInt(s,16),alpha:c?parseInt(c,16)/255:1}}const hex={test:isColorString("#"),parse:parseHex,transform:rgba.transform},hsla={test:isColorString("hsl","hue"),parse:splitColor("hue","saturation","lightness"),transform:({hue:t,saturation:n,lightness:o,alpha:s=1})=>"hsla("+Math.round(t)+", "+percent.transform(sanitize(n))+", "+percent.transform(sanitize(o))+", "+sanitize(alpha.transform(s))+")"},color={test:t=>rgba.test(t)||hex.test(t)||hsla.test(t),parse:t=>rgba.test(t)?rgba.parse(t):hsla.test(t)?hsla.parse(t):hex.parse(t),transform:t=>isString$1(t)?t:t.hasOwnProperty("red")?rgba.transform(t):hsla.transform(t)};function test(t){var n,o;return isNaN(t)&&isString$1(t)&&(((n=t.match(floatRegex))===null||n===void 0?void 0:n.length)||0)+(((o=t.match(colorRegex))===null||o===void 0?void 0:o.length)||0)>0}const NUMBER_TOKEN="number",COLOR_TOKEN="color",VAR_TOKEN="var",VAR_FUNCTION_TOKEN="var(",SPLIT_TOKEN="${}",complexRegex=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function analyseComplexValue(t){const n=t.toString(),o=[],s={color:[],number:[],var:[]},c=[];let d=0;const p=n.replace(complexRegex,y=>(color.test(y)?(s.color.push(d),c.push(COLOR_TOKEN),o.push(color.parse(y))):y.startsWith(VAR_FUNCTION_TOKEN)?(s.var.push(d),c.push(VAR_TOKEN),o.push(y)):(s.number.push(d),c.push(NUMBER_TOKEN),o.push(parseFloat(y))),++d,SPLIT_TOKEN)).split(SPLIT_TOKEN);return{values:o,split:p,indexes:s,types:c}}function parseComplexValue(t){return analyseComplexValue(t).values}function createTransformer(t){const{split:n,types:o}=analyseComplexValue(t),s=n.length;return c=>{let d="";for(let h=0;h<s;h++)if(d+=n[h],c[h]!==void 0){const p=o[h];p===NUMBER_TOKEN?d+=sanitize(c[h]):p===COLOR_TOKEN?d+=color.transform(c[h]):d+=c[h]}return d}}const convertNumbersToZero=t=>typeof t=="number"?0:t;function getAnimatableNone$1(t){const n=parseComplexValue(t);return createTransformer(t)(n.map(convertNumbersToZero))}const complex={test,parse:parseComplexValue,createTransformer,getAnimatableNone:getAnimatableNone$1},maxDefaults=new Set(["brightness","contrast","saturate","opacity"]);function applyDefaultFilter(t){const[n,o]=t.slice(0,-1).split("(");if(n==="drop-shadow")return t;const[s]=o.match(floatRegex)||[];if(!s)return t;const c=o.replace(s,"");let d=maxDefaults.has(n)?1:0;return s!==o&&(d*=100),n+"("+d+c+")"}const functionRegex=/\b([a-z-]*)\(.*?\)/gu,filter={...complex,getAnimatableNone:t=>{const n=t.match(functionRegex);return n?n.map(applyDefaultFilter).join(" "):t}},defaultValueTypes={...numberValueTypes,color,backgroundColor:color,outlineColor:color,fill:color,stroke:color,borderColor:color,borderTopColor:color,borderRightColor:color,borderBottomColor:color,borderLeftColor:color,filter,WebkitFilter:filter},getDefaultValueType=t=>defaultValueTypes[t];function getAnimatableNone(t,n){let o=getDefaultValueType(t);return o!==filter&&(o=complex),o.getAnimatableNone?o.getAnimatableNone(n):void 0}function makeNoneKeyframesAnimatable(t,n,o){let s=0,c;for(;s<t.length&&!c;)typeof t[s]=="string"&&t[s]!=="none"&&t[s]!=="0"&&(c=t[s]),s++;if(c&&o)for(const d of n)t[d]=getAnimatableNone(o,c)}class DOMKeyframesResolver extends KeyframeResolver{constructor(n,o,s,c){super(n,o,s,c,c==null?void 0:c.owner,!0)}readKeyframes(){const{unresolvedKeyframes:n,element:o,name:s}=this;if(!o.current)return;super.readKeyframes();for(let y=0;y<n.length;y++){const E=n[y];if(typeof E=="string"&&isCSSVariableToken(E)){const L=getVariableValue(E,o.current);L!==void 0&&(n[y]=L)}}if(!positionalKeys.has(s)||n.length!==2)return this.resolveNoneKeyframes();const[c,d]=n,h=findDimensionValueType(c),p=findDimensionValueType(d);if(h!==p)if(isNumOrPxType(h)&&isNumOrPxType(p))for(let y=0;y<n.length;y++){const E=n[y];typeof E=="string"&&(n[y]=parseFloat(E))}else this.needsMeasurement=!0}resolveNoneKeyframes(){const{unresolvedKeyframes:n,name:o}=this,s=[];for(let c=0;c<n.length;c++)isNone(n[c])&&s.push(c);s.length&&makeNoneKeyframesAnimatable(n,s,o)}measureInitialState(){const{element:n,unresolvedKeyframes:o,name:s}=this;if(!n.current)return;s==="height"&&(this.suspendedScrollY=window.pageYOffset),this.measuredOrigin=positionalValues[s](n.measureViewportBox(),window.getComputedStyle(n.current)),o[0]=this.measuredOrigin;const c=o[o.length-1];c!==void 0&&n.getValue(s,c).jump(c,!1)}measureEndState(){var n;const{element:o,name:s,unresolvedKeyframes:c}=this;if(!o.current)return;const d=o.getValue(s);d&&d.jump(this.measuredOrigin,!1);const h=c.length-1,p=c[h];c[h]=positionalValues[s](o.measureViewportBox(),window.getComputedStyle(o.current)),p!==null&&(this.finalKeyframe=p),!((n=this.removedTransforms)===null||n===void 0)&&n.length&&this.removedTransforms.forEach(([y,E])=>{o.getValue(y).set(E)}),this.resolveNoneKeyframes()}}function memo(t){let n;return()=>(n===void 0&&(n=t()),n)}const isAnimatable=(t,n)=>n==="zIndex"?!1:!!(typeof t=="number"||Array.isArray(t)||typeof t=="string"&&(complex.test(t)||t==="0")&&!t.startsWith("url("));function hasKeyframesChanged(t){const n=t[0];if(t.length===1)return!0;for(let o=0;o<t.length;o++)if(t[o]!==n)return!0}function canAnimate(t,n,o,s){const c=t[0];if(c===null)return!1;const d=t[t.length-1],h=isAnimatable(c,n),p=isAnimatable(d,n);return warning(h===p,`You are trying to animate ${n} from "${c}" to "${d}". ${c} is not an animatable value - to enable this animation set ${c} to a value animatable to ${d} via the \`style\` property.`),!h||!p?!1:hasKeyframesChanged(t)||o==="spring"&&s}class BaseAnimation{constructor({autoplay:n=!0,delay:o=0,type:s="keyframes",repeat:c=0,repeatDelay:d=0,repeatType:h="loop",...p}){this.isStopped=!1,this.hasAttemptedResolve=!1,this.options={autoplay:n,delay:o,type:s,repeat:c,repeatDelay:d,repeatType:h,...p},this.updateFinishedPromise()}get resolved(){return!this._resolved&&!this.hasAttemptedResolve&&flushKeyframeResolvers(),this._resolved}onKeyframesResolved(n,o){this.hasAttemptedResolve=!0;const{name:s,type:c,velocity:d,delay:h,onComplete:p,onUpdate:y,isGenerator:E}=this.options;if(!E&&!canAnimate(n,s,c,d))if(h)this.options.duration=0;else{y==null||y(getFinalKeyframe(n,this.options,o)),p==null||p(),this.resolveFinishedPromise();return}const L=this.initPlayback(n,o);L!==!1&&(this._resolved={keyframes:n,finalKeyframe:o,...L},this.onPostResolved())}onPostResolved(){}then(n,o){return this.currentFinishedPromise.then(n,o)}updateFinishedPromise(){this.currentFinishedPromise=new Promise(n=>{this.resolveFinishedPromise=n})}}function velocityPerSecond(t,n){return n?t*(1e3/n):0}const velocitySampleDuration=5;function calcGeneratorVelocity(t,n,o){const s=Math.max(n-velocitySampleDuration,0);return velocityPerSecond(o-t(s),n-s)}const safeMin=.001,minDuration=.01,maxDuration$1=10,minDamping=.05,maxDamping=1;function findSpring({duration:t=800,bounce:n=.25,velocity:o=0,mass:s=1}){let c,d;warning(t<=secondsToMilliseconds(maxDuration$1),"Spring duration must be 10 seconds or less");let h=1-n;h=clamp(minDamping,maxDamping,h),t=clamp(minDuration,maxDuration$1,millisecondsToSeconds(t)),h<1?(c=E=>{const L=E*h,F=L*t,N=L-o,z=calcAngularFreq(E,h),oe=Math.exp(-F);return safeMin-N/z*oe},d=E=>{const F=E*h*t,N=F*o+o,z=Math.pow(h,2)*Math.pow(E,2)*t,oe=Math.exp(-F),W=calcAngularFreq(Math.pow(E,2),h);return(-c(E)+safeMin>0?-1:1)*((N-z)*oe)/W}):(c=E=>{const L=Math.exp(-E*t),F=(E-o)*t+1;return-safeMin+L*F},d=E=>{const L=Math.exp(-E*t),F=(o-E)*(t*t);return L*F});const p=5/t,y=approximateRoot(c,d,p);if(t=secondsToMilliseconds(t),isNaN(y))return{stiffness:100,damping:10,duration:t};{const E=Math.pow(y,2)*s;return{stiffness:E,damping:h*2*Math.sqrt(s*E),duration:t}}}const rootIterations=12;function approximateRoot(t,n,o){let s=o;for(let c=1;c<rootIterations;c++)s=s-t(s)/n(s);return s}function calcAngularFreq(t,n){return t*Math.sqrt(1-n*n)}const durationKeys=["duration","bounce"],physicsKeys=["stiffness","damping","mass"];function isSpringType(t,n){return n.some(o=>t[o]!==void 0)}function getSpringOptions(t){let n={velocity:0,stiffness:100,damping:10,mass:1,isResolvedFromDuration:!1,...t};if(!isSpringType(t,physicsKeys)&&isSpringType(t,durationKeys)){const o=findSpring(t);n={...n,...o,mass:1},n.isResolvedFromDuration=!0}return n}function spring({keyframes:t,restDelta:n,restSpeed:o,...s}){const c=t[0],d=t[t.length-1],h={done:!1,value:c},{stiffness:p,damping:y,mass:E,duration:L,velocity:F,isResolvedFromDuration:N}=getSpringOptions({...s,velocity:-millisecondsToSeconds(s.velocity||0)}),z=F||0,oe=y/(2*Math.sqrt(p*E)),W=d-c,lt=millisecondsToSeconds(Math.sqrt(p/E)),nt=Math.abs(W)<5;o||(o=nt?.01:2),n||(n=nt?.005:.5);let Ee;if(oe<1){const yt=calcAngularFreq(lt,oe);Ee=Ai=>{const zi=Math.exp(-oe*lt*Ai);return d-zi*((z+oe*lt*W)/yt*Math.sin(yt*Ai)+W*Math.cos(yt*Ai))}}else if(oe===1)Ee=yt=>d-Math.exp(-lt*yt)*(W+(z+lt*W)*yt);else{const yt=lt*Math.sqrt(oe*oe-1);Ee=Ai=>{const zi=Math.exp(-oe*lt*Ai),ha=Math.min(yt*Ai,300);return d-zi*((z+oe*lt*W)*Math.sinh(ha)+yt*W*Math.cosh(ha))/yt}}return{calculatedDuration:N&&L||null,next:yt=>{const Ai=Ee(yt);if(N)h.done=yt>=L;else{let zi=z;yt!==0&&(oe<1?zi=calcGeneratorVelocity(Ee,yt,Ai):zi=0);const ha=Math.abs(zi)<=o,ba=Math.abs(d-Ai)<=n;h.done=ha&&ba}return h.value=h.done?d:Ai,h}}}function inertia({keyframes:t,velocity:n=0,power:o=.8,timeConstant:s=325,bounceDamping:c=10,bounceStiffness:d=500,modifyTarget:h,min:p,max:y,restDelta:E=.5,restSpeed:L}){const F=t[0],N={done:!1,value:F},z=Sa=>p!==void 0&&Sa<p||y!==void 0&&Sa>y,oe=Sa=>p===void 0?y:y===void 0||Math.abs(p-Sa)<Math.abs(y-Sa)?p:y;let W=o*n;const lt=F+W,nt=h===void 0?lt:h(lt);nt!==lt&&(W=nt-F);const Ee=Sa=>-W*Math.exp(-Sa/s),yt=Sa=>nt+Ee(Sa),Ai=Sa=>{const ya=Ee(Sa),ms=yt(Sa);N.done=Math.abs(ya)<=E,N.value=N.done?nt:ms};let zi,ha;const ba=Sa=>{z(N.value)&&(zi=Sa,ha=spring({keyframes:[N.value,oe(N.value)],velocity:calcGeneratorVelocity(yt,Sa,N.value),damping:c,stiffness:d,restDelta:E,restSpeed:L}))};return ba(0),{calculatedDuration:null,next:Sa=>{let ya=!1;return!ha&&zi===void 0&&(ya=!0,Ai(Sa),ba(Sa)),zi!==void 0&&Sa>=zi?ha.next(Sa-zi):(!ya&&Ai(Sa),N)}}}const calcBezier=(t,n,o)=>(((1-3*o+3*n)*t+(3*o-6*n))*t+3*n)*t,subdivisionPrecision=1e-7,subdivisionMaxIterations=12;function binarySubdivide(t,n,o,s,c){let d,h,p=0;do h=n+(o-n)/2,d=calcBezier(h,s,c)-t,d>0?o=h:n=h;while(Math.abs(d)>subdivisionPrecision&&++p<subdivisionMaxIterations);return h}function cubicBezier(t,n,o,s){if(t===n&&o===s)return noop$1;const c=d=>binarySubdivide(d,0,1,t,o);return d=>d===0||d===1?d:calcBezier(c(d),n,s)}const easeIn=cubicBezier(.42,0,1,1),easeOut=cubicBezier(0,0,.58,1),easeInOut=cubicBezier(.42,0,.58,1),isEasingArray=t=>Array.isArray(t)&&typeof t[0]!="number",mirrorEasing=t=>n=>n<=.5?t(2*n)/2:(2-t(2*(1-n)))/2,reverseEasing=t=>n=>1-t(1-n),circIn=t=>1-Math.sin(Math.acos(t)),circOut=reverseEasing(circIn),circInOut=mirrorEasing(circIn),backOut=cubicBezier(.33,1.53,.69,.99),backIn=reverseEasing(backOut),backInOut=mirrorEasing(backIn),anticipate=t=>(t*=2)<1?.5*backIn(t):.5*(2-Math.pow(2,-10*(t-1))),easingLookup={linear:noop$1,easeIn,easeInOut,easeOut,circIn,circInOut,circOut,backIn,backInOut,backOut,anticipate},easingDefinitionToFunction=t=>{if(Array.isArray(t)){invariant(t.length===4,"Cubic bezier arrays must contain four numerical values.");const[n,o,s,c]=t;return cubicBezier(n,o,s,c)}else if(typeof t=="string")return invariant(easingLookup[t]!==void 0,`Invalid easing type '${t}'`),easingLookup[t];return t},progress=(t,n,o)=>{const s=n-t;return s===0?1:(o-t)/s},mixNumber$1=(t,n,o)=>t+(n-t)*o;function hueToRgb(t,n,o){return o<0&&(o+=1),o>1&&(o-=1),o<1/6?t+(n-t)*6*o:o<1/2?n:o<2/3?t+(n-t)*(2/3-o)*6:t}function hslaToRgba({hue:t,saturation:n,lightness:o,alpha:s}){t/=360,n/=100,o/=100;let c=0,d=0,h=0;if(!n)c=d=h=o;else{const p=o<.5?o*(1+n):o+n-o*n,y=2*o-p;c=hueToRgb(y,p,t+1/3),d=hueToRgb(y,p,t),h=hueToRgb(y,p,t-1/3)}return{red:Math.round(c*255),green:Math.round(d*255),blue:Math.round(h*255),alpha:s}}const mixLinearColor=(t,n,o)=>{const s=t*t,c=o*(n*n-s)+s;return c<0?0:Math.sqrt(c)},colorTypes=[hex,rgba,hsla],getColorType=t=>colorTypes.find(n=>n.test(t));function asRGBA(t){const n=getColorType(t);invariant(!!n,`'${t}' is not an animatable color. Use the equivalent color code instead.`);let o=n.parse(t);return n===hsla&&(o=hslaToRgba(o)),o}const mixColor=(t,n)=>{const o=asRGBA(t),s=asRGBA(n),c={...o};return d=>(c.red=mixLinearColor(o.red,s.red,d),c.green=mixLinearColor(o.green,s.green,d),c.blue=mixLinearColor(o.blue,s.blue,d),c.alpha=mixNumber$1(o.alpha,s.alpha,d),rgba.transform(c))};function mixImmediate(t,n){return o=>o>0?n:t}function mixNumber(t,n){return o=>mixNumber$1(t,n,o)}function getMixer(t){return typeof t=="number"?mixNumber:typeof t=="string"?isCSSVariableToken(t)?mixImmediate:color.test(t)?mixColor:mixComplex:Array.isArray(t)?mixArray:typeof t=="object"?color.test(t)?mixColor:mixObject:mixImmediate}function mixArray(t,n){const o=[...t],s=o.length,c=t.map((d,h)=>getMixer(d)(d,n[h]));return d=>{for(let h=0;h<s;h++)o[h]=c[h](d);return o}}function mixObject(t,n){const o={...t,...n},s={};for(const c in o)t[c]!==void 0&&n[c]!==void 0&&(s[c]=getMixer(t[c])(t[c],n[c]));return c=>{for(const d in s)o[d]=s[d](c);return o}}function matchOrder(t,n){var o;const s=[],c={color:0,var:0,number:0};for(let d=0;d<n.values.length;d++){const h=n.types[d],p=t.indexes[h][c[h]],y=(o=t.values[p])!==null&&o!==void 0?o:0;s[d]=y,c[h]++}return s}const mixComplex=(t,n)=>{const o=complex.createTransformer(n),s=analyseComplexValue(t),c=analyseComplexValue(n);return s.indexes.var.length===c.indexes.var.length&&s.indexes.color.length===c.indexes.color.length&&s.indexes.number.length>=c.indexes.number.length?pipe(mixArray(matchOrder(s,c),c.values),o):(warning(!0,`Complex values '${t}' and '${n}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`),mixImmediate(t,n))};function mix(t,n,o){return typeof t=="number"&&typeof n=="number"&&typeof o=="number"?mixNumber$1(t,n,o):getMixer(t)(t,n)}function createMixers(t,n,o){const s=[],c=o||mix,d=t.length-1;for(let h=0;h<d;h++){let p=c(t[h],t[h+1]);if(n){const y=Array.isArray(n)?n[h]||noop$1:n;p=pipe(y,p)}s.push(p)}return s}function interpolate(t,n,{clamp:o=!0,ease:s,mixer:c}={}){const d=t.length;if(invariant(d===n.length,"Both input and output ranges must be the same length"),d===1)return()=>n[0];if(d===2&&t[0]===t[1])return()=>n[1];t[0]>t[d-1]&&(t=[...t].reverse(),n=[...n].reverse());const h=createMixers(n,s,c),p=h.length,y=E=>{let L=0;if(p>1)for(;L<t.length-2&&!(E<t[L+1]);L++);const F=progress(t[L],t[L+1],E);return h[L](F)};return o?E=>y(clamp(t[0],t[d-1],E)):y}function fillOffset(t,n){const o=t[t.length-1];for(let s=1;s<=n;s++){const c=progress(0,n,s);t.push(mixNumber$1(o,1,c))}}function defaultOffset(t){const n=[0];return fillOffset(n,t.length-1),n}function convertOffsetToTimes(t,n){return t.map(o=>o*n)}function defaultEasing(t,n){return t.map(()=>n||easeInOut).splice(0,t.length-1)}function keyframes({duration:t=300,keyframes:n,times:o,ease:s="easeInOut"}){const c=isEasingArray(s)?s.map(easingDefinitionToFunction):easingDefinitionToFunction(s),d={done:!1,value:n[0]},h=convertOffsetToTimes(o&&o.length===n.length?o:defaultOffset(n),t),p=interpolate(h,n,{ease:Array.isArray(c)?c:defaultEasing(n,c)});return{calculatedDuration:t,next:y=>(d.value=p(y),d.done=y>=t,d)}}const maxGeneratorDuration=2e4;function calcGeneratorDuration(t){let n=0;const o=50;let s=t.next(n);for(;!s.done&&n<maxGeneratorDuration;)n+=o,s=t.next(n);return n>=maxGeneratorDuration?1/0:n}const frameloopDriver=t=>{const n=({timestamp:o})=>t(o);return{start:()=>frame.update(n,!0),stop:()=>cancelFrame(n),now:()=>frameData.isProcessing?frameData.timestamp:time.now()}},generators={decay:inertia,inertia,tween:keyframes,keyframes,spring},percentToProgress=t=>t/100;class MainThreadAnimation extends BaseAnimation{constructor({KeyframeResolver:n=KeyframeResolver,...o}){super(o),this.holdTime=null,this.startTime=null,this.cancelTime=null,this.currentTime=0,this.playbackSpeed=1,this.pendingPlayState="running",this.state="idle";const{name:s,motionValue:c,keyframes:d}=this.options,h=(p,y)=>this.onKeyframesResolved(p,y);s&&c&&c.owner?this.resolver=c.owner.resolveKeyframes(d,h,s,c):this.resolver=new n(d,h,s,c),this.resolver.scheduleResolve()}initPlayback(n){const{type:o="keyframes",repeat:s=0,repeatDelay:c=0,repeatType:d,velocity:h=0}=this.options,p=generators[o]||keyframes;let y,E;p!==keyframes&&typeof n[0]!="number"&&(process.env.NODE_ENV!=="production"&&invariant(n.length===2,`Only two keyframes currently supported with spring and inertia animations. Trying to animate ${n}`),y=pipe(percentToProgress,mix(n[0],n[1])),n=[0,100]);const L=p({...this.options,keyframes:n});d==="mirror"&&(E=p({...this.options,keyframes:[...n].reverse(),velocity:-h})),L.calculatedDuration===null&&(L.calculatedDuration=calcGeneratorDuration(L));const{calculatedDuration:F}=L,N=F+c,z=N*(s+1)-c;return{generator:L,mirroredGenerator:E,mapPercentToKeyframes:y,calculatedDuration:F,resolvedDuration:N,totalDuration:z}}onPostResolved(){const{autoplay:n=!0}=this.options;this.play(),this.pendingPlayState==="paused"||!n?this.pause():this.state=this.pendingPlayState}tick(n,o=!1){const{resolved:s}=this;if(!s){const{keyframes:Sa}=this.options;return{done:!0,value:Sa[Sa.length-1]}}const{finalKeyframe:c,generator:d,mirroredGenerator:h,mapPercentToKeyframes:p,keyframes:y,calculatedDuration:E,totalDuration:L,resolvedDuration:F}=s;if(this.startTime===null)return d.next(0);const{delay:N,repeat:z,repeatType:oe,repeatDelay:W,onUpdate:lt}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,n):this.speed<0&&(this.startTime=Math.min(n-L/this.speed,this.startTime)),o?this.currentTime=n:this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=Math.round(n-this.startTime)*this.speed;const nt=this.currentTime-N*(this.speed>=0?1:-1),Ee=this.speed>=0?nt<0:nt>L;this.currentTime=Math.max(nt,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=L);let yt=this.currentTime,Ai=d;if(z){const Sa=Math.min(this.currentTime,L)/F;let ya=Math.floor(Sa),ms=Sa%1;!ms&&Sa>=1&&(ms=1),ms===1&&ya--,ya=Math.min(ya,z+1),!!(ya%2)&&(oe==="reverse"?(ms=1-ms,W&&(ms-=W/F)):oe==="mirror"&&(Ai=h)),yt=clamp(0,1,ms)*F}const zi=Ee?{done:!1,value:y[0]}:Ai.next(yt);p&&(zi.value=p(zi.value));let{done:ha}=zi;!Ee&&E!==null&&(ha=this.speed>=0?this.currentTime>=L:this.currentTime<=0);const ba=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&ha);return ba&&c!==void 0&&(zi.value=getFinalKeyframe(y,this.options,c)),lt&<(zi.value),ba&&this.finish(),zi}get duration(){const{resolved:n}=this;return n?millisecondsToSeconds(n.calculatedDuration):0}get time(){return millisecondsToSeconds(this.currentTime)}set time(n){n=secondsToMilliseconds(n),this.currentTime=n,this.holdTime!==null||this.speed===0?this.holdTime=n:this.driver&&(this.startTime=this.driver.now()-n/this.speed)}get speed(){return this.playbackSpeed}set speed(n){const o=this.playbackSpeed!==n;this.playbackSpeed=n,o&&(this.time=millisecondsToSeconds(this.currentTime))}play(){if(this.resolver.isScheduled||this.resolver.resume(),!this._resolved){this.pendingPlayState="running";return}if(this.isStopped)return;const{driver:n=frameloopDriver,onPlay:o}=this.options;this.driver||(this.driver=n(c=>this.tick(c))),o&&o();const s=this.driver.now();this.holdTime!==null?this.startTime=s-this.holdTime:(!this.startTime||this.state==="finished")&&(this.startTime=s),this.state==="finished"&&this.updateFinishedPromise(),this.cancelTime=this.startTime,this.holdTime=null,this.state="running",this.driver.start()}pause(){var n;if(!this._resolved){this.pendingPlayState="paused";return}this.state="paused",this.holdTime=(n=this.currentTime)!==null&&n!==void 0?n:0}stop(){if(this.resolver.cancel(),this.isStopped=!0,this.state==="idle")return;this.teardown();const{onStop:n}=this.options;n&&n()}complete(){this.state!=="running"&&this.play(),this.pendingPlayState=this.state="finished",this.holdTime=null}finish(){this.teardown(),this.state="finished";const{onComplete:n}=this.options;n&&n()}cancel(){this.cancelTime!==null&&this.tick(this.cancelTime),this.teardown(),this.updateFinishedPromise()}teardown(){this.state="idle",this.stopDriver(),this.resolveFinishedPromise(),this.updateFinishedPromise(),this.startTime=this.cancelTime=null,this.resolver.cancel()}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(n){return this.startTime=0,this.tick(n,!0)}}const isBezierDefinition=t=>Array.isArray(t)&&typeof t[0]=="number";function isWaapiSupportedEasing(t){return!!(!t||typeof t=="string"&&supportedWaapiEasing[t]||isBezierDefinition(t)||Array.isArray(t)&&t.every(isWaapiSupportedEasing))}const cubicBezierAsString=([t,n,o,s])=>`cubic-bezier(${t}, ${n}, ${o}, ${s})`,supportedWaapiEasing={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:cubicBezierAsString([0,.65,.55,1]),circOut:cubicBezierAsString([.55,0,1,.45]),backIn:cubicBezierAsString([.31,.01,.66,-.59]),backOut:cubicBezierAsString([.33,1.53,.69,.99])};function mapEasingToNativeEasing(t){if(t)return isBezierDefinition(t)?cubicBezierAsString(t):Array.isArray(t)?t.map(mapEasingToNativeEasing):supportedWaapiEasing[t]}function animateStyle(t,n,o,{delay:s=0,duration:c=300,repeat:d=0,repeatType:h="loop",ease:p,times:y}={}){const E={[n]:o};y&&(E.offset=y);const L=mapEasingToNativeEasing(p);return Array.isArray(L)&&(E.easing=L),t.animate(E,{delay:s,duration:c,easing:Array.isArray(L)?"linear":L,fill:"both",iterations:d+1,direction:h==="reverse"?"alternate":"normal"})}const supportsWaapi=memo(()=>Object.hasOwnProperty.call(Element.prototype,"animate")),acceleratedValues=new Set(["opacity","clipPath","filter","transform"]),sampleDelta=10,maxDuration=2e4;function requiresPregeneratedKeyframes(t){return t.type==="spring"||t.name==="backgroundColor"||!isWaapiSupportedEasing(t.ease)}function pregenerateKeyframes(t,n){const o=new MainThreadAnimation({...n,keyframes:t,repeat:0,delay:0,isGenerator:!0});let s={done:!1,value:t[0]};const c=[];let d=0;for(;!s.done&&d<maxDuration;)s=o.sample(d),c.push(s.value),d+=sampleDelta;return{times:void 0,keyframes:c,duration:d-sampleDelta,ease:"linear"}}class AcceleratedAnimation extends BaseAnimation{constructor(n){super(n);const{name:o,motionValue:s,keyframes:c}=this.options;this.resolver=new DOMKeyframesResolver(c,(d,h)=>this.onKeyframesResolved(d,h),o,s),this.resolver.scheduleResolve()}initPlayback(n,o){var s;let{duration:c=300,times:d,ease:h,type:p,motionValue:y,name:E}=this.options;if(!(!((s=y.owner)===null||s===void 0)&&s.current))return!1;if(requiresPregeneratedKeyframes(this.options)){const{onComplete:F,onUpdate:N,motionValue:z,...oe}=this.options,W=pregenerateKeyframes(n,oe);n=W.keyframes,n.length===1&&(n[1]=n[0]),c=W.duration,d=W.times,h=W.ease,p="keyframes"}const L=animateStyle(y.owner.current,E,n,{...this.options,duration:c,times:d,ease:h});return L.startTime=time.now(),this.pendingTimeline?(L.timeline=this.pendingTimeline,this.pendingTimeline=void 0):L.onfinish=()=>{const{onComplete:F}=this.options;y.set(getFinalKeyframe(n,this.options,o)),F&&F(),this.cancel(),this.resolveFinishedPromise()},{animation:L,duration:c,times:d,type:p,ease:h,keyframes:n}}get duration(){const{resolved:n}=this;if(!n)return 0;const{duration:o}=n;return millisecondsToSeconds(o)}get time(){const{resolved:n}=this;if(!n)return 0;const{animation:o}=n;return millisecondsToSeconds(o.currentTime||0)}set time(n){const{resolved:o}=this;if(!o)return;const{animation:s}=o;s.currentTime=secondsToMilliseconds(n)}get speed(){const{resolved:n}=this;if(!n)return 1;const{animation:o}=n;return o.playbackRate}set speed(n){const{resolved:o}=this;if(!o)return;const{animation:s}=o;s.playbackRate=n}get state(){const{resolved:n}=this;if(!n)return"idle";const{animation:o}=n;return o.playState}attachTimeline(n){if(!this._resolved)this.pendingTimeline=n;else{const{resolved:o}=this;if(!o)return noop$1;const{animation:s}=o;s.timeline=n,s.onfinish=null}return noop$1}play(){if(this.isStopped)return;const{resolved:n}=this;if(!n)return;const{animation:o}=n;o.playState==="finished"&&this.updateFinishedPromise(),o.play()}pause(){const{resolved:n}=this;if(!n)return;const{animation:o}=n;o.pause()}stop(){if(this.resolver.cancel(),this.isStopped=!0,this.state==="idle")return;const{resolved:n}=this;if(!n)return;const{animation:o,keyframes:s,duration:c,type:d,ease:h,times:p}=n;if(!(o.playState==="idle"||o.playState==="finished")){if(this.time){const{motionValue:y,onUpdate:E,onComplete:L,...F}=this.options,N=new MainThreadAnimation({...F,keyframes:s,duration:c,type:d,ease:h,times:p,isGenerator:!0}),z=secondsToMilliseconds(this.time);y.setWithVelocity(N.sample(z-sampleDelta).value,N.sample(z).value,sampleDelta)}this.cancel()}}complete(){const{resolved:n}=this;n&&n.animation.finish()}cancel(){const{resolved:n}=this;n&&n.animation.cancel()}static supports(n){const{motionValue:o,name:s,repeatDelay:c,repeatType:d,damping:h,type:p}=n;return supportsWaapi()&&s&&acceleratedValues.has(s)&&o&&o.owner&&o.owner.current instanceof HTMLElement&&!o.owner.getProps().onUpdate&&!c&&d!=="mirror"&&h!==0&&p!=="inertia"}}const animateMotionValue=(t,n,o,s={},c,d)=>h=>{const p=getValueTransition(s,t)||{},y=p.delay||s.delay||0;let{elapsed:E=0}=s;E=E-secondsToMilliseconds(y);let L={keyframes:Array.isArray(o)?o:[null,o],ease:"easeOut",velocity:n.getVelocity(),...p,delay:-E,onUpdate:N=>{n.set(N),p.onUpdate&&p.onUpdate(N)},onComplete:()=>{h(),p.onComplete&&p.onComplete()},name:t,motionValue:n,element:d?void 0:c};isTransitionDefined(p)||(L={...L,...getDefaultTransition(t,L)}),L.duration&&(L.duration=secondsToMilliseconds(L.duration)),L.repeatDelay&&(L.repeatDelay=secondsToMilliseconds(L.repeatDelay)),L.from!==void 0&&(L.keyframes[0]=L.from);let F=!1;if((L.type===!1||L.duration===0&&!L.repeatDelay)&&(L.duration=0,L.delay===0&&(F=!0)),F&&!d&&n.get()!==void 0){const N=getFinalKeyframe(L.keyframes,p);if(N!==void 0){frame.update(()=>{L.onUpdate(N),L.onComplete()});return}}return!d&&AcceleratedAnimation.supports(L)?new AcceleratedAnimation(L):new MainThreadAnimation(L)};function isWillChangeMotionValue(t){return!!(isMotionValue(t)&&t.add)}function addUniqueItem(t,n){t.indexOf(n)===-1&&t.push(n)}function removeItem(t,n){const o=t.indexOf(n);o>-1&&t.splice(o,1)}class SubscriptionManager{constructor(){this.subscriptions=[]}add(n){return addUniqueItem(this.subscriptions,n),()=>removeItem(this.subscriptions,n)}notify(n,o,s){const c=this.subscriptions.length;if(c)if(c===1)this.subscriptions[0](n,o,s);else for(let d=0;d<c;d++){const h=this.subscriptions[d];h&&h(n,o,s)}}getSize(){return this.subscriptions.length}clear(){this.subscriptions.length=0}}const warned=new Set;function warnOnce(t,n,o){t||warned.has(n)||(console.warn(n),warned.add(n))}const MAX_VELOCITY_DELTA=30,isFloat=t=>!isNaN(parseFloat(t));class MotionValue{constructor(n,o={}){this.version="11.0.27",this.canTrackVelocity=!1,this.events={},this.updateAndNotify=(s,c=!0)=>{const d=time.now();this.updatedAt!==d&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(s),this.current!==this.prev&&this.events.change&&this.events.change.notify(this.current),c&&this.events.renderRequest&&this.events.renderRequest.notify(this.current)},this.hasAnimated=!1,this.setCurrent(n),this.canTrackVelocity=isFloat(this.current),this.owner=o.owner}setCurrent(n){this.current=n,this.updatedAt=time.now()}setPrevFrameValue(n=this.current){this.prevFrameValue=n,this.prevUpdatedAt=this.updatedAt}onChange(n){return process.env.NODE_ENV!=="production"&&warnOnce(!1,'value.onChange(callback) is deprecated. Switch to value.on("change", callback).'),this.on("change",n)}on(n,o){this.events[n]||(this.events[n]=new SubscriptionManager);const s=this.events[n].add(o);return n==="change"?()=>{s(),frame.read(()=>{this.events.change.getSize()||this.stop()})}:s}clearListeners(){for(const n in this.events)this.events[n].clear()}attach(n,o){this.passiveEffect=n,this.stopPassiveEffect=o}set(n,o=!0){!o||!this.passiveEffect?this.updateAndNotify(n,o):this.passiveEffect(n,this.updateAndNotify)}setWithVelocity(n,o,s){this.set(o),this.prev=void 0,this.prevFrameValue=n,this.prevUpdatedAt=this.updatedAt-s}jump(n,o=!0){this.updateAndNotify(n),this.prev=n,this.prevUpdatedAt=this.prevFrameValue=void 0,o&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const n=time.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||n-this.updatedAt>MAX_VELOCITY_DELTA)return 0;const o=Math.min(this.updatedAt-this.prevUpdatedAt,MAX_VELOCITY_DELTA);return velocityPerSecond(parseFloat(this.current)-parseFloat(this.prevFrameValue),o)}start(n){return this.stop(),new Promise(o=>{this.hasAnimated=!0,this.animation=n(o),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function motionValue(t,n){return new MotionValue(t,n)}function setMotionValue(t,n,o){t.hasValue(n)?t.getValue(n).set(o):t.addValue(n,motionValue(o))}function setTarget(t,n){const o=resolveVariant(t,n);let{transitionEnd:s={},transition:c={},...d}=o||{};d={...d,...s};for(const h in d){const p=resolveFinalValueInKeyframes(d[h]);setMotionValue(t,h,p)}}function shouldBlockAnimation({protectedKeys:t,needsAnimating:n},o){const s=t.hasOwnProperty(o)&&n[o]!==!0;return n[o]=!1,s}function animateTarget(t,n,{delay:o=0,transitionOverride:s,type:c}={}){var d;let{transition:h=t.getDefaultTransition(),transitionEnd:p,...y}=n;const E=t.getValue("willChange");s&&(h=s);const L=[],F=c&&t.animationState&&t.animationState.getState()[c];for(const N in y){const z=t.getValue(N,(d=t.latestValues[N])!==null&&d!==void 0?d:null),oe=y[N];if(oe===void 0||F&&shouldBlockAnimation(F,N))continue;const W={delay:o,elapsed:0,...getValueTransition(h||{},N)};let lt=!1;if(window.HandoffAppearAnimations){const Ee=t.getProps()[optimizedAppearDataAttribute];if(Ee){const yt=window.HandoffAppearAnimations(Ee,N);yt!==null&&(W.elapsed=yt,lt=!0)}}z.start(animateMotionValue(N,z,oe,t.shouldReduceMotion&&transformProps.has(N)?{type:!1}:W,t,lt));const nt=z.animation;nt&&(isWillChangeMotionValue(E)&&(E.add(N),nt.then(()=>E.remove(N))),L.push(nt))}return p&&Promise.all(L).then(()=>{frame.update(()=>{p&&setTarget(t,p)})}),L}function animateVariant(t,n,o={}){var s;const c=resolveVariant(t,n,o.type==="exit"?(s=t.presenceContext)===null||s===void 0?void 0:s.custom:void 0);let{transition:d=t.getDefaultTransition()||{}}=c||{};o.transitionOverride&&(d=o.transitionOverride);const h=c?()=>Promise.all(animateTarget(t,c,o)):()=>Promise.resolve(),p=t.variantChildren&&t.variantChildren.size?(E=0)=>{const{delayChildren:L=0,staggerChildren:F,staggerDirection:N}=d;return animateChildren(t,n,L+E,F,N,o)}:()=>Promise.resolve(),{when:y}=d;if(y){const[E,L]=y==="beforeChildren"?[h,p]:[p,h];return E().then(()=>L())}else return Promise.all([h(),p(o.delay)])}function animateChildren(t,n,o=0,s=0,c=1,d){const h=[],p=(t.variantChildren.size-1)*s,y=c===1?(E=0)=>E*s:(E=0)=>p-E*s;return Array.from(t.variantChildren).sort(sortByTreeOrder).forEach((E,L)=>{E.notify("AnimationStart",n),h.push(animateVariant(E,n,{...d,delay:o+y(L)}).then(()=>E.notify("AnimationComplete",n)))}),Promise.all(h)}function sortByTreeOrder(t,n){return t.sortNodePosition(n)}function animateVisualElement(t,n,o={}){t.notify("AnimationStart",n);let s;if(Array.isArray(n)){const c=n.map(d=>animateVariant(t,d,o));s=Promise.all(c)}else if(typeof n=="string")s=animateVariant(t,n,o);else{const c=typeof n=="function"?resolveVariant(t,n,o.custom):n;s=Promise.all(animateTarget(t,c,o))}return s.then(()=>{frame.postRender(()=>{t.notify("AnimationComplete",n)})})}const reversePriorityOrder=[...variantPriorityOrder].reverse(),numAnimationTypes=variantPriorityOrder.length;function animateList(t){return n=>Promise.all(n.map(({animation:o,options:s})=>animateVisualElement(t,o,s)))}function createAnimationState(t){let n=animateList(t);const o=createState();let s=!0;const c=y=>(E,L)=>{var F;const N=resolveVariant(t,L,y==="exit"?(F=t.presenceContext)===null||F===void 0?void 0:F.custom:void 0);if(N){const{transition:z,transitionEnd:oe,...W}=N;E={...E,...W,...oe}}return E};function d(y){n=y(t)}function h(y){const E=t.getProps(),L=t.getVariantContext(!0)||{},F=[],N=new Set;let z={},oe=1/0;for(let lt=0;lt<numAnimationTypes;lt++){const nt=reversePriorityOrder[lt],Ee=o[nt],yt=E[nt]!==void 0?E[nt]:L[nt],Ai=isVariantLabel(yt),zi=nt===y?Ee.isActive:null;zi===!1&&(oe=lt);let ha=yt===L[nt]&&yt!==E[nt]&&Ai;if(ha&&s&&t.manuallyAnimateOnMount&&(ha=!1),Ee.protectedKeys={...z},!Ee.isActive&&zi===null||!yt&&!Ee.prevProp||isAnimationControls(yt)||typeof yt=="boolean")continue;let Sa=checkVariantsDidChange(Ee.prevProp,yt)||nt===y&&Ee.isActive&&!ha&&Ai||lt>oe&&Ai,ya=!1;const ms=Array.isArray(yt)?yt:[yt];let bs=ms.reduce(c(nt),{});zi===!1&&(bs={});const{prevResolvedValues:Ra={}}=Ee,pi={...Ra,...bs},mt=fa=>{Sa=!0,N.has(fa)&&(ya=!0,N.delete(fa)),Ee.needsAnimating[fa]=!0;const Wa=t.getValue(fa);Wa&&(Wa.liveStyle=!1)};for(const fa in pi){const Wa=bs[fa],sl=Ra[fa];if(z.hasOwnProperty(fa))continue;let Vd=!1;isKeyframesTarget(Wa)&&isKeyframesTarget(sl)?Vd=!shallowCompare(Wa,sl):Vd=Wa!==sl,Vd?Wa!=null?mt(fa):N.add(fa):Wa!==void 0&&N.has(fa)?mt(fa):Ee.protectedKeys[fa]=!0}Ee.prevProp=yt,Ee.prevResolvedValues=bs,Ee.isActive&&(z={...z,...bs}),s&&t.blockInitialAnimation&&(Sa=!1),Sa&&(!ha||ya)&&F.push(...ms.map(fa=>({animation:fa,options:{type:nt}})))}if(N.size){const lt={};N.forEach(nt=>{const Ee=t.getBaseTarget(nt),yt=t.getValue(nt);yt&&(yt.liveStyle=!0),lt[nt]=Ee===void 0?null:Ee}),F.push({animation:lt})}let W=!!F.length;return s&&(E.initial===!1||E.initial===E.animate)&&!t.manuallyAnimateOnMount&&(W=!1),s=!1,W?n(F):Promise.resolve()}function p(y,E){var L;if(o[y].isActive===E)return Promise.resolve();(L=t.variantChildren)===null||L===void 0||L.forEach(N=>{var z;return(z=N.animationState)===null||z===void 0?void 0:z.setActive(y,E)}),o[y].isActive=E;const F=h(y);for(const N in o)o[N].protectedKeys={};return F}return{animateChanges:h,setActive:p,setAnimateFunction:d,getState:()=>o}}function checkVariantsDidChange(t,n){return typeof n=="string"?n!==t:Array.isArray(n)?!shallowCompare(n,t):!1}function createTypeState(t=!1){return{isActive:t,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function createState(){return{animate:createTypeState(!0),whileInView:createTypeState(),whileHover:createTypeState(),whileTap:createTypeState(),whileDrag:createTypeState(),whileFocus:createTypeState(),exit:createTypeState()}}class AnimationFeature extends Feature{constructor(n){super(n),n.animationState||(n.animationState=createAnimationState(n))}updateAnimationControlsSubscription(){const{animate:n}=this.node.getProps();this.unmount(),isAnimationControls(n)&&(this.unmount=n.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:n}=this.node.getProps(),{animate:o}=this.node.prevProps||{};n!==o&&this.updateAnimationControlsSubscription()}unmount(){}}let id$1=0;class ExitAnimationFeature extends Feature{constructor(){super(...arguments),this.id=id$1++}update(){if(!this.node.presenceContext)return;const{isPresent:n,onExitComplete:o}=this.node.presenceContext,{isPresent:s}=this.node.prevPresenceContext||{};if(!this.node.animationState||n===s)return;const c=this.node.animationState.setActive("exit",!n);o&&!n&&c.then(()=>o(this.id))}mount(){const{register:n}=this.node.presenceContext||{};n&&(this.unmount=n(this.id))}unmount(){}}const animations={animation:{Feature:AnimationFeature},exit:{Feature:ExitAnimationFeature}},distance=(t,n)=>Math.abs(t-n);function distance2D(t,n){const o=distance(t.x,n.x),s=distance(t.y,n.y);return Math.sqrt(o**2+s**2)}class PanSession{constructor(n,o,{transformPagePoint:s,contextWindow:c,dragSnapToOrigin:d=!1}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const F=getPanInfo(this.lastMoveEventInfo,this.history),N=this.startEvent!==null,z=distance2D(F.offset,{x:0,y:0})>=3;if(!N&&!z)return;const{point:oe}=F,{timestamp:W}=frameData;this.history.push({...oe,timestamp:W});const{onStart:lt,onMove:nt}=this.handlers;N||(lt&<(this.lastMoveEvent,F),this.startEvent=this.lastMoveEvent),nt&&nt(this.lastMoveEvent,F)},this.handlePointerMove=(F,N)=>{this.lastMoveEvent=F,this.lastMoveEventInfo=transformPoint(N,this.transformPagePoint),frame.update(this.updatePoint,!0)},this.handlePointerUp=(F,N)=>{this.end();const{onEnd:z,onSessionEnd:oe,resumeAnimation:W}=this.handlers;if(this.dragSnapToOrigin&&W&&W(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const lt=getPanInfo(F.type==="pointercancel"?this.lastMoveEventInfo:transformPoint(N,this.transformPagePoint),this.history);this.startEvent&&z&&z(F,lt),oe&&oe(F,lt)},!isPrimaryPointer(n))return;this.dragSnapToOrigin=d,this.handlers=o,this.transformPagePoint=s,this.contextWindow=c||window;const h=extractEventInfo(n),p=transformPoint(h,this.transformPagePoint),{point:y}=p,{timestamp:E}=frameData;this.history=[{...y,timestamp:E}];const{onSessionStart:L}=o;L&&L(n,getPanInfo(p,this.history)),this.removeListeners=pipe(addPointerEvent(this.contextWindow,"pointermove",this.handlePointerMove),addPointerEvent(this.contextWindow,"pointerup",this.handlePointerUp),addPointerEvent(this.contextWindow,"pointercancel",this.handlePointerUp))}updateHandlers(n){this.handlers=n}end(){this.removeListeners&&this.removeListeners(),cancelFrame(this.updatePoint)}}function transformPoint(t,n){return n?{point:n(t.point)}:t}function subtractPoint(t,n){return{x:t.x-n.x,y:t.y-n.y}}function getPanInfo({point:t},n){return{point:t,delta:subtractPoint(t,lastDevicePoint(n)),offset:subtractPoint(t,startDevicePoint(n)),velocity:getVelocity(n,.1)}}function startDevicePoint(t){return t[0]}function lastDevicePoint(t){return t[t.length-1]}function getVelocity(t,n){if(t.length<2)return{x:0,y:0};let o=t.length-1,s=null;const c=lastDevicePoint(t);for(;o>=0&&(s=t[o],!(c.timestamp-s.timestamp>secondsToMilliseconds(n)));)o--;if(!s)return{x:0,y:0};const d=millisecondsToSeconds(c.timestamp-s.timestamp);if(d===0)return{x:0,y:0};const h={x:(c.x-s.x)/d,y:(c.y-s.y)/d};return h.x===1/0&&(h.x=0),h.y===1/0&&(h.y=0),h}function calcLength(t){return t.max-t.min}function isNear(t,n=0,o=.01){return Math.abs(t-n)<=o}function calcAxisDelta(t,n,o,s=.5){t.origin=s,t.originPoint=mixNumber$1(n.min,n.max,t.origin),t.scale=calcLength(o)/calcLength(n),(isNear(t.scale,1,1e-4)||isNaN(t.scale))&&(t.scale=1),t.translate=mixNumber$1(o.min,o.max,t.origin)-t.originPoint,(isNear(t.translate)||isNaN(t.translate))&&(t.translate=0)}function calcBoxDelta(t,n,o,s){calcAxisDelta(t.x,n.x,o.x,s?s.originX:void 0),calcAxisDelta(t.y,n.y,o.y,s?s.originY:void 0)}function calcRelativeAxis(t,n,o){t.min=o.min+n.min,t.max=t.min+calcLength(n)}function calcRelativeBox(t,n,o){calcRelativeAxis(t.x,n.x,o.x),calcRelativeAxis(t.y,n.y,o.y)}function calcRelativeAxisPosition(t,n,o){t.min=n.min-o.min,t.max=t.min+calcLength(n)}function calcRelativePosition(t,n,o){calcRelativeAxisPosition(t.x,n.x,o.x),calcRelativeAxisPosition(t.y,n.y,o.y)}function applyConstraints(t,{min:n,max:o},s){return n!==void 0&&t<n?t=s?mixNumber$1(n,t,s.min):Math.max(t,n):o!==void 0&&t>o&&(t=s?mixNumber$1(o,t,s.max):Math.min(t,o)),t}function calcRelativeAxisConstraints(t,n,o){return{min:n!==void 0?t.min+n:void 0,max:o!==void 0?t.max+o-(t.max-t.min):void 0}}function calcRelativeConstraints(t,{top:n,left:o,bottom:s,right:c}){return{x:calcRelativeAxisConstraints(t.x,o,c),y:calcRelativeAxisConstraints(t.y,n,s)}}function calcViewportAxisConstraints(t,n){let o=n.min-t.min,s=n.max-t.max;return n.max-n.min<t.max-t.min&&([o,s]=[s,o]),{min:o,max:s}}function calcViewportConstraints(t,n){return{x:calcViewportAxisConstraints(t.x,n.x),y:calcViewportAxisConstraints(t.y,n.y)}}function calcOrigin(t,n){let o=.5;const s=calcLength(t),c=calcLength(n);return c>s?o=progress(n.min,n.max-s,t.min):s>c&&(o=progress(t.min,t.max-c,n.min)),clamp(0,1,o)}function rebaseAxisConstraints(t,n){const o={};return n.min!==void 0&&(o.min=n.min-t.min),n.max!==void 0&&(o.max=n.max-t.min),o}const defaultElastic=.35;function resolveDragElastic(t=defaultElastic){return t===!1?t=0:t===!0&&(t=defaultElastic),{x:resolveAxisElastic(t,"left","right"),y:resolveAxisElastic(t,"top","bottom")}}function resolveAxisElastic(t,n,o){return{min:resolvePointElastic(t,n),max:resolvePointElastic(t,o)}}function resolvePointElastic(t,n){return typeof t=="number"?t:t[n]||0}const createAxisDelta=()=>({translate:0,scale:1,origin:0,originPoint:0}),createDelta=()=>({x:createAxisDelta(),y:createAxisDelta()}),createAxis=()=>({min:0,max:0}),createBox=()=>({x:createAxis(),y:createAxis()});function eachAxis(t){return[t("x"),t("y")]}function convertBoundingBoxToBox({top:t,left:n,right:o,bottom:s}){return{x:{min:n,max:o},y:{min:t,max:s}}}function convertBoxToBoundingBox({x:t,y:n}){return{top:n.min,right:t.max,bottom:n.max,left:t.min}}function transformBoxPoints(t,n){if(!n)return t;const o=n({x:t.left,y:t.top}),s=n({x:t.right,y:t.bottom});return{top:o.y,left:o.x,bottom:s.y,right:s.x}}function isIdentityScale(t){return t===void 0||t===1}function hasScale({scale:t,scaleX:n,scaleY:o}){return!isIdentityScale(t)||!isIdentityScale(n)||!isIdentityScale(o)}function hasTransform(t){return hasScale(t)||has2DTranslate(t)||t.z||t.rotate||t.rotateX||t.rotateY||t.skewX||t.skewY}function has2DTranslate(t){return is2DTranslate(t.x)||is2DTranslate(t.y)}function is2DTranslate(t){return t&&t!=="0%"}function scalePoint(t,n,o){const s=t-o,c=n*s;return o+c}function applyPointDelta(t,n,o,s,c){return c!==void 0&&(t=scalePoint(t,c,s)),scalePoint(t,o,s)+n}function applyAxisDelta(t,n=0,o=1,s,c){t.min=applyPointDelta(t.min,n,o,s,c),t.max=applyPointDelta(t.max,n,o,s,c)}function applyBoxDelta(t,{x:n,y:o}){applyAxisDelta(t.x,n.translate,n.scale,n.originPoint),applyAxisDelta(t.y,o.translate,o.scale,o.originPoint)}function applyTreeDeltas(t,n,o,s=!1){const c=o.length;if(!c)return;n.x=n.y=1;let d,h;for(let p=0;p<c;p++){d=o[p],h=d.projectionDelta;const y=d.instance;y&&y.style&&y.style.display==="contents"||(s&&d.options.layoutScroll&&d.scroll&&d!==d.root&&transformBox(t,{x:-d.scroll.offset.x,y:-d.scroll.offset.y}),h&&(n.x*=h.x.scale,n.y*=h.y.scale,applyBoxDelta(t,h)),s&&hasTransform(d.latestValues)&&transformBox(t,d.latestValues))}n.x=snapToDefault(n.x),n.y=snapToDefault(n.y)}function snapToDefault(t){return Number.isInteger(t)||t>1.0000000000001||t<.999999999999?t:1}function translateAxis(t,n){t.min=t.min+n,t.max=t.max+n}function transformAxis(t,n,[o,s,c]){const d=n[c]!==void 0?n[c]:.5,h=mixNumber$1(t.min,t.max,d);applyAxisDelta(t,n[o],n[s],h,n.scale)}const xKeys$1=["x","scaleX","originX"],yKeys$1=["y","scaleY","originY"];function transformBox(t,n){transformAxis(t.x,n,xKeys$1),transformAxis(t.y,n,yKeys$1)}function measureViewportBox(t,n){return convertBoundingBoxToBox(transformBoxPoints(t.getBoundingClientRect(),n))}function measurePageBox(t,n,o){const s=measureViewportBox(t,o),{scroll:c}=n;return c&&(translateAxis(s.x,c.offset.x),translateAxis(s.y,c.offset.y)),s}const getContextWindow=({current:t})=>t?t.ownerDocument.defaultView:null,elementDragControls=new WeakMap;class VisualElementDragControls{constructor(n){this.openGlobalLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=createBox(),this.visualElement=n}start(n,{snapToCursor:o=!1}={}){const{presenceContext:s}=this.visualElement;if(s&&s.isPresent===!1)return;const c=L=>{const{dragSnapToOrigin:F}=this.getProps();F?this.pauseAnimation():this.stopAnimation(),o&&this.snapToCursor(extractEventInfo(L,"page").point)},d=(L,F)=>{const{drag:N,dragPropagation:z,onDragStart:oe}=this.getProps();if(N&&!z&&(this.openGlobalLock&&this.openGlobalLock(),this.openGlobalLock=getGlobalLock(N),!this.openGlobalLock))return;this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),eachAxis(lt=>{let nt=this.getAxisMotionValue(lt).get()||0;if(percent.test(nt)){const{projection:Ee}=this.visualElement;if(Ee&&Ee.layout){const yt=Ee.layout.layoutBox[lt];yt&&(nt=calcLength(yt)*(parseFloat(nt)/100))}}this.originPoint[lt]=nt}),oe&&oe(L,F);const{animationState:W}=this.visualElement;W&&W.setActive("whileDrag",!0)},h=(L,F)=>{const{dragPropagation:N,dragDirectionLock:z,onDirectionLock:oe,onDrag:W}=this.getProps();if(!N&&!this.openGlobalLock)return;const{offset:lt}=F;if(z&&this.currentDirection===null){this.currentDirection=getCurrentDirection(lt),this.currentDirection!==null&&oe&&oe(this.currentDirection);return}this.updateAxis("x",F.point,lt),this.updateAxis("y",F.point,lt),this.visualElement.render(),W&&W(L,F)},p=(L,F)=>this.stop(L,F),y=()=>eachAxis(L=>{var F;return this.getAnimationState(L)==="paused"&&((F=this.getAxisMotionValue(L).animation)===null||F===void 0?void 0:F.play())}),{dragSnapToOrigin:E}=this.getProps();this.panSession=new PanSession(n,{onSessionStart:c,onStart:d,onMove:h,onSessionEnd:p,resumeAnimation:y},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:E,contextWindow:getContextWindow(this.visualElement)})}stop(n,o){const s=this.isDragging;if(this.cancel(),!s)return;const{velocity:c}=o;this.startAnimation(c);const{onDragEnd:d}=this.getProps();d&&d(n,o)}cancel(){this.isDragging=!1;const{projection:n,animationState:o}=this.visualElement;n&&(n.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:s}=this.getProps();!s&&this.openGlobalLock&&(this.openGlobalLock(),this.openGlobalLock=null),o&&o.setActive("whileDrag",!1)}updateAxis(n,o,s){const{drag:c}=this.getProps();if(!s||!shouldDrag(n,c,this.currentDirection))return;const d=this.getAxisMotionValue(n);let h=this.originPoint[n]+s[n];this.constraints&&this.constraints[n]&&(h=applyConstraints(h,this.constraints[n],this.elastic[n])),d.set(h)}resolveConstraints(){var n;const{dragConstraints:o,dragElastic:s}=this.getProps(),c=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):(n=this.visualElement.projection)===null||n===void 0?void 0:n.layout,d=this.constraints;o&&isRefObject(o)?this.constraints||(this.constraints=this.resolveRefConstraints()):o&&c?this.constraints=calcRelativeConstraints(c.layoutBox,o):this.constraints=!1,this.elastic=resolveDragElastic(s),d!==this.constraints&&c&&this.constraints&&!this.hasMutatedConstraints&&eachAxis(h=>{this.getAxisMotionValue(h)&&(this.constraints[h]=rebaseAxisConstraints(c.layoutBox[h],this.constraints[h]))})}resolveRefConstraints(){const{dragConstraints:n,onMeasureDragConstraints:o}=this.getProps();if(!n||!isRefObject(n))return!1;const s=n.current;invariant(s!==null,"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.");const{projection:c}=this.visualElement;if(!c||!c.layout)return!1;const d=measurePageBox(s,c.root,this.visualElement.getTransformPagePoint());let h=calcViewportConstraints(c.layout.layoutBox,d);if(o){const p=o(convertBoxToBoundingBox(h));this.hasMutatedConstraints=!!p,p&&(h=convertBoundingBoxToBox(p))}return h}startAnimation(n){const{drag:o,dragMomentum:s,dragElastic:c,dragTransition:d,dragSnapToOrigin:h,onDragTransitionEnd:p}=this.getProps(),y=this.constraints||{},E=eachAxis(L=>{if(!shouldDrag(L,o,this.currentDirection))return;let F=y&&y[L]||{};h&&(F={min:0,max:0});const N=c?200:1e6,z=c?40:1e7,oe={type:"inertia",velocity:s?n[L]:0,bounceStiffness:N,bounceDamping:z,timeConstant:750,restDelta:1,restSpeed:10,...d,...F};return this.startAxisValueAnimation(L,oe)});return Promise.all(E).then(p)}startAxisValueAnimation(n,o){const s=this.getAxisMotionValue(n);return s.start(animateMotionValue(n,s,0,o,this.visualElement))}stopAnimation(){eachAxis(n=>this.getAxisMotionValue(n).stop())}pauseAnimation(){eachAxis(n=>{var o;return(o=this.getAxisMotionValue(n).animation)===null||o===void 0?void 0:o.pause()})}getAnimationState(n){var o;return(o=this.getAxisMotionValue(n).animation)===null||o===void 0?void 0:o.state}getAxisMotionValue(n){const o="_drag"+n.toUpperCase(),s=this.visualElement.getProps(),c=s[o];return c||this.visualElement.getValue(n,(s.initial?s.initial[n]:void 0)||0)}snapToCursor(n){eachAxis(o=>{const{drag:s}=this.getProps();if(!shouldDrag(o,s,this.currentDirection))return;const{projection:c}=this.visualElement,d=this.getAxisMotionValue(o);if(c&&c.layout){const{min:h,max:p}=c.layout.layoutBox[o];d.set(n[o]-mixNumber$1(h,p,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:n,dragConstraints:o}=this.getProps(),{projection:s}=this.visualElement;if(!isRefObject(o)||!s||!this.constraints)return;this.stopAnimation();const c={x:0,y:0};eachAxis(h=>{const p=this.getAxisMotionValue(h);if(p){const y=p.get();c[h]=calcOrigin({min:y,max:y},this.constraints[h])}});const{transformTemplate:d}=this.visualElement.getProps();this.visualElement.current.style.transform=d?d({},""):"none",s.root&&s.root.updateScroll(),s.updateLayout(),this.resolveConstraints(),eachAxis(h=>{if(!shouldDrag(h,n,null))return;const p=this.getAxisMotionValue(h),{min:y,max:E}=this.constraints[h];p.set(mixNumber$1(y,E,c[h]))})}addListeners(){if(!this.visualElement.current)return;elementDragControls.set(this.visualElement,this);const n=this.visualElement.current,o=addPointerEvent(n,"pointerdown",y=>{const{drag:E,dragListener:L=!0}=this.getProps();E&&L&&this.start(y)}),s=()=>{const{dragConstraints:y}=this.getProps();isRefObject(y)&&(this.constraints=this.resolveRefConstraints())},{projection:c}=this.visualElement,d=c.addEventListener("measure",s);c&&!c.layout&&(c.root&&c.root.updateScroll(),c.updateLayout()),s();const h=addDomEvent(window,"resize",()=>this.scalePositionWithinConstraints()),p=c.addEventListener("didUpdate",({delta:y,hasLayoutChanged:E})=>{this.isDragging&&E&&(eachAxis(L=>{const F=this.getAxisMotionValue(L);F&&(this.originPoint[L]+=y[L].translate,F.set(F.get()+y[L].translate))}),this.visualElement.render())});return()=>{h(),o(),d(),p&&p()}}getProps(){const n=this.visualElement.getProps(),{drag:o=!1,dragDirectionLock:s=!1,dragPropagation:c=!1,dragConstraints:d=!1,dragElastic:h=defaultElastic,dragMomentum:p=!0}=n;return{...n,drag:o,dragDirectionLock:s,dragPropagation:c,dragConstraints:d,dragElastic:h,dragMomentum:p}}}function shouldDrag(t,n,o){return(n===!0||n===t)&&(o===null||o===t)}function getCurrentDirection(t,n=10){let o=null;return Math.abs(t.y)>n?o="y":Math.abs(t.x)>n&&(o="x"),o}class DragGesture extends Feature{constructor(n){super(n),this.removeGroupControls=noop$1,this.removeListeners=noop$1,this.controls=new VisualElementDragControls(n)}mount(){const{dragControls:n}=this.node.getProps();n&&(this.removeGroupControls=n.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||noop$1}unmount(){this.removeGroupControls(),this.removeListeners()}}const asyncHandler=t=>(n,o)=>{t&&t(n,o)};class PanGesture extends Feature{constructor(){super(...arguments),this.removePointerDownListener=noop$1}onPointerDown(n){this.session=new PanSession(n,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:getContextWindow(this.node)})}createPanHandlers(){const{onPanSessionStart:n,onPanStart:o,onPan:s,onPanEnd:c}=this.node.getProps();return{onSessionStart:asyncHandler(n),onStart:asyncHandler(o),onMove:s,onEnd:(d,h)=>{delete this.session,c&&c(d,h)}}}mount(){this.removePointerDownListener=addPointerEvent(this.node.current,"pointerdown",n=>this.onPointerDown(n))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}function usePresence(){const t=React.useContext(PresenceContext);if(t===null)return[!0,null];const{isPresent:n,onExitComplete:o,register:s}=t,c=React.useId();return React.useEffect(()=>s(c),[]),!n&&o?[!1,()=>o&&o(c)]:[!0]}const globalProjectionState={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function pixelsToPercent(t,n){return n.max===n.min?0:t/(n.max-n.min)*100}const correctBorderRadius={correct:(t,n)=>{if(!n.target)return t;if(typeof t=="string")if(px.test(t))t=parseFloat(t);else return t;const o=pixelsToPercent(t,n.target.x),s=pixelsToPercent(t,n.target.y);return`${o}% ${s}%`}},correctBoxShadow={correct:(t,{treeScale:n,projectionDelta:o})=>{const s=t,c=complex.parse(t);if(c.length>5)return s;const d=complex.createTransformer(t),h=typeof c[0]!="number"?1:0,p=o.x.scale*n.x,y=o.y.scale*n.y;c[0+h]/=p,c[1+h]/=y;const E=mixNumber$1(p,y,.5);return typeof c[2+h]=="number"&&(c[2+h]/=E),typeof c[3+h]=="number"&&(c[3+h]/=E),d(c)}};class MeasureLayoutWithContext extends React.Component{componentDidMount(){const{visualElement:n,layoutGroup:o,switchLayoutGroup:s,layoutId:c}=this.props,{projection:d}=n;addScaleCorrector(defaultScaleCorrectors),d&&(o.group&&o.group.add(d),s&&s.register&&c&&s.register(d),d.root.didUpdate(),d.addEventListener("animationComplete",()=>{this.safeToRemove()}),d.setOptions({...d.options,onExitComplete:()=>this.safeToRemove()})),globalProjectionState.hasEverUpdated=!0}getSnapshotBeforeUpdate(n){const{layoutDependency:o,visualElement:s,drag:c,isPresent:d}=this.props,h=s.projection;return h&&(h.isPresent=d,c||n.layoutDependency!==o||o===void 0?h.willUpdate():this.safeToRemove(),n.isPresent!==d&&(d?h.promote():h.relegate()||frame.postRender(()=>{const p=h.getStack();(!p||!p.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:n}=this.props.visualElement;n&&(n.root.didUpdate(),microtask.postRender(()=>{!n.currentAnimation&&n.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:n,layoutGroup:o,switchLayoutGroup:s}=this.props,{projection:c}=n;c&&(c.scheduleCheckAfterUnmount(),o&&o.group&&o.group.remove(c),s&&s.deregister&&s.deregister(c))}safeToRemove(){const{safeToRemove:n}=this.props;n&&n()}render(){return null}}function MeasureLayout(t){const[n,o]=usePresence(),s=React.useContext(LayoutGroupContext);return React.createElement(MeasureLayoutWithContext,{...t,layoutGroup:s,switchLayoutGroup:React.useContext(SwitchLayoutGroupContext),isPresent:n,safeToRemove:o})}const defaultScaleCorrectors={borderRadius:{...correctBorderRadius,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:correctBorderRadius,borderTopRightRadius:correctBorderRadius,borderBottomLeftRadius:correctBorderRadius,borderBottomRightRadius:correctBorderRadius,boxShadow:correctBoxShadow},borders=["TopLeft","TopRight","BottomLeft","BottomRight"],numBorders=borders.length,asNumber=t=>typeof t=="string"?parseFloat(t):t,isPx=t=>typeof t=="number"||px.test(t);function mixValues(t,n,o,s,c,d){c?(t.opacity=mixNumber$1(0,o.opacity!==void 0?o.opacity:1,easeCrossfadeIn(s)),t.opacityExit=mixNumber$1(n.opacity!==void 0?n.opacity:1,0,easeCrossfadeOut(s))):d&&(t.opacity=mixNumber$1(n.opacity!==void 0?n.opacity:1,o.opacity!==void 0?o.opacity:1,s));for(let h=0;h<numBorders;h++){const p=`border${borders[h]}Radius`;let y=getRadius(n,p),E=getRadius(o,p);if(y===void 0&&E===void 0)continue;y||(y=0),E||(E=0),y===0||E===0||isPx(y)===isPx(E)?(t[p]=Math.max(mixNumber$1(asNumber(y),asNumber(E),s),0),(percent.test(E)||percent.test(y))&&(t[p]+="%")):t[p]=E}(n.rotate||o.rotate)&&(t.rotate=mixNumber$1(n.rotate||0,o.rotate||0,s))}function getRadius(t,n){return t[n]!==void 0?t[n]:t.borderRadius}const easeCrossfadeIn=compress(0,.5,circOut),easeCrossfadeOut=compress(.5,.95,noop$1);function compress(t,n,o){return s=>s<t?0:s>n?1:o(progress(t,n,s))}function copyAxisInto(t,n){t.min=n.min,t.max=n.max}function copyBoxInto(t,n){copyAxisInto(t.x,n.x),copyAxisInto(t.y,n.y)}function removePointDelta(t,n,o,s,c){return t-=n,t=scalePoint(t,1/o,s),c!==void 0&&(t=scalePoint(t,1/c,s)),t}function removeAxisDelta(t,n=0,o=1,s=.5,c,d=t,h=t){if(percent.test(n)&&(n=parseFloat(n),n=mixNumber$1(h.min,h.max,n/100)-h.min),typeof n!="number")return;let p=mixNumber$1(d.min,d.max,s);t===d&&(p-=n),t.min=removePointDelta(t.min,n,o,p,c),t.max=removePointDelta(t.max,n,o,p,c)}function removeAxisTransforms(t,n,[o,s,c],d,h){removeAxisDelta(t,n[o],n[s],n[c],n.scale,d,h)}const xKeys=["x","scaleX","originX"],yKeys=["y","scaleY","originY"];function removeBoxTransforms(t,n,o,s){removeAxisTransforms(t.x,n,xKeys,o?o.x:void 0,s?s.x:void 0),removeAxisTransforms(t.y,n,yKeys,o?o.y:void 0,s?s.y:void 0)}function isAxisDeltaZero(t){return t.translate===0&&t.scale===1}function isDeltaZero(t){return isAxisDeltaZero(t.x)&&isAxisDeltaZero(t.y)}function boxEquals(t,n){return t.x.min===n.x.min&&t.x.max===n.x.max&&t.y.min===n.y.min&&t.y.max===n.y.max}function boxEqualsRounded(t,n){return Math.round(t.x.min)===Math.round(n.x.min)&&Math.round(t.x.max)===Math.round(n.x.max)&&Math.round(t.y.min)===Math.round(n.y.min)&&Math.round(t.y.max)===Math.round(n.y.max)}function aspectRatio(t){return calcLength(t.x)/calcLength(t.y)}class NodeStack{constructor(){this.members=[]}add(n){addUniqueItem(this.members,n),n.scheduleRender()}remove(n){if(removeItem(this.members,n),n===this.prevLead&&(this.prevLead=void 0),n===this.lead){const o=this.members[this.members.length-1];o&&this.promote(o)}}relegate(n){const o=this.members.findIndex(c=>n===c);if(o===0)return!1;let s;for(let c=o;c>=0;c--){const d=this.members[c];if(d.isPresent!==!1){s=d;break}}return s?(this.promote(s),!0):!1}promote(n,o){const s=this.lead;if(n!==s&&(this.prevLead=s,this.lead=n,n.show(),s)){s.instance&&s.scheduleRender(),n.scheduleRender(),n.resumeFrom=s,o&&(n.resumeFrom.preserveOpacity=!0),s.snapshot&&(n.snapshot=s.snapshot,n.snapshot.latestValues=s.animationValues||s.latestValues),n.root&&n.root.isUpdating&&(n.isLayoutDirty=!0);const{crossfade:c}=n.options;c===!1&&s.hide()}}exitAnimationComplete(){this.members.forEach(n=>{const{options:o,resumingFrom:s}=n;o.onExitComplete&&o.onExitComplete(),s&&s.options.onExitComplete&&s.options.onExitComplete()})}scheduleRender(){this.members.forEach(n=>{n.instance&&n.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}function buildProjectionTransform(t,n,o){let s="";const c=t.x.translate/n.x,d=t.y.translate/n.y,h=(o==null?void 0:o.z)||0;if((c||d||h)&&(s=`translate3d(${c}px, ${d}px, ${h}px) `),(n.x!==1||n.y!==1)&&(s+=`scale(${1/n.x}, ${1/n.y}) `),o){const{transformPerspective:E,rotate:L,rotateX:F,rotateY:N,skewX:z,skewY:oe}=o;E&&(s=`perspective(${E}px) ${s}`),L&&(s+=`rotate(${L}deg) `),F&&(s+=`rotateX(${F}deg) `),N&&(s+=`rotateY(${N}deg) `),z&&(s+=`skewX(${z}deg) `),oe&&(s+=`skewY(${oe}deg) `)}const p=t.x.scale*n.x,y=t.y.scale*n.y;return(p!==1||y!==1)&&(s+=`scale(${p}, ${y})`),s||"none"}const compareByDepth=(t,n)=>t.depth-n.depth;class FlatTree{constructor(){this.children=[],this.isDirty=!1}add(n){addUniqueItem(this.children,n),this.isDirty=!0}remove(n){removeItem(this.children,n),this.isDirty=!0}forEach(n){this.isDirty&&this.children.sort(compareByDepth),this.isDirty=!1,this.children.forEach(n)}}function delay(t,n){const o=time.now(),s=({timestamp:c})=>{const d=c-o;d>=n&&(cancelFrame(s),t(d-n))};return frame.read(s,!0),()=>cancelFrame(s)}function record(t){window.MotionDebug&&window.MotionDebug.record(t)}function isSVGElement(t){return t instanceof SVGElement&&t.tagName!=="svg"}function animateSingleValue(t,n,o){const s=isMotionValue(t)?t:motionValue(t);return s.start(animateMotionValue("",s,n,o)),s.animation}const transformAxes=["","X","Y","Z"],hiddenVisibility={visibility:"hidden"},animationTarget=1e3;let id=0;const projectionFrameData={type:"projectionFrame",totalNodes:0,resolvedTargetDeltas:0,recalculatedProjection:0};function resetDistortingTransform(t,n,o,s){const{latestValues:c}=n;c[t]&&(o[t]=c[t],n.setStaticValue(t,0),s&&(s[t]=0))}function createProjectionNode({attachResizeListener:t,defaultParent:n,measureScroll:o,checkIsScrollRoot:s,resetTransform:c}){return class{constructor(h={},p=n==null?void 0:n()){this.id=id++,this.animationId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,projectionFrameData.totalNodes=projectionFrameData.resolvedTargetDeltas=projectionFrameData.recalculatedProjection=0,this.nodes.forEach(propagateDirtyNodes),this.nodes.forEach(resolveTargetDelta),this.nodes.forEach(calcProjection),this.nodes.forEach(cleanDirtyNodes),record(projectionFrameData)},this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=h,this.root=p?p.root||p:this,this.path=p?[...p.path,p]:[],this.parent=p,this.depth=p?p.depth+1:0;for(let y=0;y<this.path.length;y++)this.path[y].shouldResetTransform=!0;this.root===this&&(this.nodes=new FlatTree)}addEventListener(h,p){return this.eventHandlers.has(h)||this.eventHandlers.set(h,new SubscriptionManager),this.eventHandlers.get(h).add(p)}notifyListeners(h,...p){const y=this.eventHandlers.get(h);y&&y.notify(...p)}hasListeners(h){return this.eventHandlers.has(h)}mount(h,p=this.root.hasTreeAnimated){if(this.instance)return;this.isSVG=isSVGElement(h),this.instance=h;const{layoutId:y,layout:E,visualElement:L}=this.options;if(L&&!L.current&&L.mount(h),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),p&&(E||y)&&(this.isLayoutDirty=!0),t){let F;const N=()=>this.root.updateBlockedByResize=!1;t(h,()=>{this.root.updateBlockedByResize=!0,F&&F(),F=delay(N,250),globalProjectionState.hasAnimatedSinceResize&&(globalProjectionState.hasAnimatedSinceResize=!1,this.nodes.forEach(finishAnimation))})}y&&this.root.registerSharedNode(y,this),this.options.animate!==!1&&L&&(y||E)&&this.addEventListener("didUpdate",({delta:F,hasLayoutChanged:N,hasRelativeTargetChanged:z,layout:oe})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const W=this.options.transition||L.getDefaultTransition()||defaultLayoutTransition,{onLayoutAnimationStart:lt,onLayoutAnimationComplete:nt}=L.getProps(),Ee=!this.targetLayout||!boxEqualsRounded(this.targetLayout,oe)||z,yt=!N&&z;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||yt||N&&(Ee||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(F,yt);const Ai={...getValueTransition(W,"layout"),onPlay:lt,onComplete:nt};(L.shouldReduceMotion||this.options.layoutRoot)&&(Ai.delay=0,Ai.type=!1),this.startAnimation(Ai)}else N||finishAnimation(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=oe})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const h=this.getStack();h&&h.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,cancelFrame(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(resetSkewAndRotation),this.animationId++)}getTransformTemplate(){const{visualElement:h}=this.options;return h&&h.getProps().transformTemplate}willUpdate(h=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let L=0;L<this.path.length;L++){const F=this.path[L];F.shouldResetTransform=!0,F.updateScroll("snapshot"),F.options.layoutRoot&&F.willUpdate(!1)}const{layoutId:p,layout:y}=this.options;if(p===void 0&&!y)return;const E=this.getTransformTemplate();this.prevTransformTemplateValue=E?E(this.latestValues,""):void 0,this.updateSnapshot(),h&&this.notifyListeners("willUpdate")}update(){if(this.updateScheduled=!1,this.isUpdateBlocked()){this.unblockUpdate(),this.clearAllSnapshots(),this.nodes.forEach(clearMeasurements);return}this.isUpdating||this.nodes.forEach(clearIsLayoutDirty),this.isUpdating=!1,window.HandoffCancelAllAnimations&&window.HandoffCancelAllAnimations(),this.nodes.forEach(resetTransformStyle),this.nodes.forEach(updateLayout),this.nodes.forEach(notifyLayoutUpdate),this.clearAllSnapshots();const p=time.now();frameData.delta=clamp(0,1e3/60,p-frameData.timestamp),frameData.timestamp=p,frameData.isProcessing=!0,steps.update.process(frameData),steps.preRender.process(frameData),steps.render.process(frameData),frameData.isProcessing=!1}didUpdate(){this.updateScheduled||(this.updateScheduled=!0,microtask.read(()=>this.update()))}clearAllSnapshots(){this.nodes.forEach(clearSnapshot),this.sharedNodes.forEach(removeLeadSnapshots)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,frame.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){frame.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure())}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let y=0;y<this.path.length;y++)this.path[y].updateScroll();const h=this.layout;this.layout=this.measure(!1),this.layoutCorrected=createBox(),this.isLayoutDirty=!1,this.projectionDelta=void 0,this.notifyListeners("measure",this.layout.layoutBox);const{visualElement:p}=this.options;p&&p.notify("LayoutMeasure",this.layout.layoutBox,h?h.layoutBox:void 0)}updateScroll(h="measure"){let p=!!(this.options.layoutScroll&&this.instance);this.scroll&&this.scroll.animationId===this.root.animationId&&this.scroll.phase===h&&(p=!1),p&&(this.scroll={animationId:this.root.animationId,phase:h,isRoot:s(this.instance),offset:o(this.instance)})}resetTransform(){if(!c)return;const h=this.isLayoutDirty||this.shouldResetTransform,p=this.projectionDelta&&!isDeltaZero(this.projectionDelta),y=this.getTransformTemplate(),E=y?y(this.latestValues,""):void 0,L=E!==this.prevTransformTemplateValue;h&&(p||hasTransform(this.latestValues)||L)&&(c(this.instance,E),this.shouldResetTransform=!1,this.scheduleRender())}measure(h=!0){const p=this.measurePageBox();let y=this.removeElementScroll(p);return h&&(y=this.removeTransform(y)),roundBox(y),{animationId:this.root.animationId,measuredBox:p,layoutBox:y,latestValues:{},source:this.id}}measurePageBox(){const{visualElement:h}=this.options;if(!h)return createBox();const p=h.measureViewportBox(),{scroll:y}=this.root;return y&&(translateAxis(p.x,y.offset.x),translateAxis(p.y,y.offset.y)),p}removeElementScroll(h){const p=createBox();copyBoxInto(p,h);for(let y=0;y<this.path.length;y++){const E=this.path[y],{scroll:L,options:F}=E;if(E!==this.root&&L&&F.layoutScroll){if(L.isRoot){copyBoxInto(p,h);const{scroll:N}=this.root;N&&(translateAxis(p.x,-N.offset.x),translateAxis(p.y,-N.offset.y))}translateAxis(p.x,L.offset.x),translateAxis(p.y,L.offset.y)}}return p}applyTransform(h,p=!1){const y=createBox();copyBoxInto(y,h);for(let E=0;E<this.path.length;E++){const L=this.path[E];!p&&L.options.layoutScroll&&L.scroll&&L!==L.root&&transformBox(y,{x:-L.scroll.offset.x,y:-L.scroll.offset.y}),hasTransform(L.latestValues)&&transformBox(y,L.latestValues)}return hasTransform(this.latestValues)&&transformBox(y,this.latestValues),y}removeTransform(h){const p=createBox();copyBoxInto(p,h);for(let y=0;y<this.path.length;y++){const E=this.path[y];if(!E.instance||!hasTransform(E.latestValues))continue;hasScale(E.latestValues)&&E.updateSnapshot();const L=createBox(),F=E.measurePageBox();copyBoxInto(L,F),removeBoxTransforms(p,E.latestValues,E.snapshot?E.snapshot.layoutBox:void 0,L)}return hasTransform(this.latestValues)&&removeBoxTransforms(p,this.latestValues),p}setTargetDelta(h){this.targetDelta=h,this.root.scheduleUpdateProjection(),this.isProjectionDirty=!0}setOptions(h){this.options={...this.options,...h,crossfade:h.crossfade!==void 0?h.crossfade:!0}}clearMeasurements(){this.scroll=void 0,this.layout=void 0,this.snapshot=void 0,this.prevTransformTemplateValue=void 0,this.targetDelta=void 0,this.target=void 0,this.isLayoutDirty=!1}forceRelativeParentToResolveTarget(){this.relativeParent&&this.relativeParent.resolvedRelativeTargetAt!==frameData.timestamp&&this.relativeParent.resolveTargetDelta(!0)}resolveTargetDelta(h=!1){var p;const y=this.getLead();this.isProjectionDirty||(this.isProjectionDirty=y.isProjectionDirty),this.isTransformDirty||(this.isTransformDirty=y.isTransformDirty),this.isSharedProjectionDirty||(this.isSharedProjectionDirty=y.isSharedProjectionDirty);const E=!!this.resumingFrom||this!==y;if(!(h||E&&this.isSharedProjectionDirty||this.isProjectionDirty||!((p=this.parent)===null||p===void 0)&&p.isProjectionDirty||this.attemptToResolveRelativeTarget))return;const{layout:F,layoutId:N}=this.options;if(!(!this.layout||!(F||N))){if(this.resolvedRelativeTargetAt=frameData.timestamp,!this.targetDelta&&!this.relativeTarget){const z=this.getClosestProjectingParent();z&&z.layout&&this.animationProgress!==1?(this.relativeParent=z,this.forceRelativeParentToResolveTarget(),this.relativeTarget=createBox(),this.relativeTargetOrigin=createBox(),calcRelativePosition(this.relativeTargetOrigin,this.layout.layoutBox,z.layout.layoutBox),copyBoxInto(this.relativeTarget,this.relativeTargetOrigin)):this.relativeParent=this.relativeTarget=void 0}if(!(!this.relativeTarget&&!this.targetDelta)){if(this.target||(this.target=createBox(),this.targetWithTransforms=createBox()),this.relativeTarget&&this.relativeTargetOrigin&&this.relativeParent&&this.relativeParent.target?(this.forceRelativeParentToResolveTarget(),calcRelativeBox(this.target,this.relativeTarget,this.relativeParent.target)):this.targetDelta?(this.resumingFrom?this.target=this.applyTransform(this.layout.layoutBox):copyBoxInto(this.target,this.layout.layoutBox),applyBoxDelta(this.target,this.targetDelta)):copyBoxInto(this.target,this.layout.layoutBox),this.attemptToResolveRelativeTarget){this.attemptToResolveRelativeTarget=!1;const z=this.getClosestProjectingParent();z&&!!z.resumingFrom==!!this.resumingFrom&&!z.options.layoutScroll&&z.target&&this.animationProgress!==1?(this.relativeParent=z,this.forceRelativeParentToResolveTarget(),this.relativeTarget=createBox(),this.relativeTargetOrigin=createBox(),calcRelativePosition(this.relativeTargetOrigin,this.target,z.target),copyBoxInto(this.relativeTarget,this.relativeTargetOrigin)):this.relativeParent=this.relativeTarget=void 0}projectionFrameData.resolvedTargetDeltas++}}}getClosestProjectingParent(){if(!(!this.parent||hasScale(this.parent.latestValues)||has2DTranslate(this.parent.latestValues)))return this.parent.isProjecting()?this.parent:this.parent.getClosestProjectingParent()}isProjecting(){return!!((this.relativeTarget||this.targetDelta||this.options.layoutRoot)&&this.layout)}calcProjection(){var h;const p=this.getLead(),y=!!this.resumingFrom||this!==p;let E=!0;if((this.isProjectionDirty||!((h=this.parent)===null||h===void 0)&&h.isProjectionDirty)&&(E=!1),y&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(E=!1),this.resolvedRelativeTargetAt===frameData.timestamp&&(E=!1),E)return;const{layout:L,layoutId:F}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(L||F))return;copyBoxInto(this.layoutCorrected,this.layout.layoutBox);const N=this.treeScale.x,z=this.treeScale.y;applyTreeDeltas(this.layoutCorrected,this.treeScale,this.path,y),p.layout&&!p.target&&(this.treeScale.x!==1||this.treeScale.y!==1)&&(p.target=p.layout.layoutBox,p.targetWithTransforms=createBox());const{target:oe}=p;if(!oe){this.projectionTransform&&(this.projectionDelta=createDelta(),this.projectionTransform="none",this.scheduleRender());return}this.projectionDelta||(this.projectionDelta=createDelta(),this.projectionDeltaWithTransform=createDelta());const W=this.projectionTransform;calcBoxDelta(this.projectionDelta,this.layoutCorrected,oe,this.latestValues),this.projectionTransform=buildProjectionTransform(this.projectionDelta,this.treeScale),(this.projectionTransform!==W||this.treeScale.x!==N||this.treeScale.y!==z)&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",oe)),projectionFrameData.recalculatedProjection++}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(h=!0){if(this.options.scheduleRender&&this.options.scheduleRender(),h){const p=this.getStack();p&&p.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}setAnimationOrigin(h,p=!1){const y=this.snapshot,E=y?y.latestValues:{},L={...this.latestValues},F=createDelta();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!p;const N=createBox(),z=y?y.source:void 0,oe=this.layout?this.layout.source:void 0,W=z!==oe,lt=this.getStack(),nt=!lt||lt.members.length<=1,Ee=!!(W&&!nt&&this.options.crossfade===!0&&!this.path.some(hasOpacityCrossfade));this.animationProgress=0;let yt;this.mixTargetDelta=Ai=>{const zi=Ai/1e3;mixAxisDelta(F.x,h.x,zi),mixAxisDelta(F.y,h.y,zi),this.setTargetDelta(F),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(calcRelativePosition(N,this.layout.layoutBox,this.relativeParent.layout.layoutBox),mixBox(this.relativeTarget,this.relativeTargetOrigin,N,zi),yt&&boxEquals(this.relativeTarget,yt)&&(this.isProjectionDirty=!1),yt||(yt=createBox()),copyBoxInto(yt,this.relativeTarget)),W&&(this.animationValues=L,mixValues(L,E,this.latestValues,zi,Ee,nt)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=zi},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(h){this.notifyListeners("animationStart"),this.currentAnimation&&this.currentAnimation.stop(),this.resumingFrom&&this.resumingFrom.currentAnimation&&this.resumingFrom.currentAnimation.stop(),this.pendingAnimation&&(cancelFrame(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=frame.update(()=>{globalProjectionState.hasAnimatedSinceResize=!0,this.currentAnimation=animateSingleValue(0,animationTarget,{...h,onUpdate:p=>{this.mixTargetDelta(p),h.onUpdate&&h.onUpdate(p)},onComplete:()=>{h.onComplete&&h.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const h=this.getStack();h&&h.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(animationTarget),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const h=this.getLead();let{targetWithTransforms:p,target:y,layout:E,latestValues:L}=h;if(!(!p||!y||!E)){if(this!==h&&this.layout&&E&&shouldAnimatePositionOnly(this.options.animationType,this.layout.layoutBox,E.layoutBox)){y=this.target||createBox();const F=calcLength(this.layout.layoutBox.x);y.x.min=h.target.x.min,y.x.max=y.x.min+F;const N=calcLength(this.layout.layoutBox.y);y.y.min=h.target.y.min,y.y.max=y.y.min+N}copyBoxInto(p,y),transformBox(p,L),calcBoxDelta(this.projectionDeltaWithTransform,this.layoutCorrected,p,L)}}registerSharedNode(h,p){this.sharedNodes.has(h)||this.sharedNodes.set(h,new NodeStack),this.sharedNodes.get(h).add(p);const E=p.options.initialPromotionConfig;p.promote({transition:E?E.transition:void 0,preserveFollowOpacity:E&&E.shouldPreserveFollowOpacity?E.shouldPreserveFollowOpacity(p):void 0})}isLead(){const h=this.getStack();return h?h.lead===this:!0}getLead(){var h;const{layoutId:p}=this.options;return p?((h=this.getStack())===null||h===void 0?void 0:h.lead)||this:this}getPrevLead(){var h;const{layoutId:p}=this.options;return p?(h=this.getStack())===null||h===void 0?void 0:h.prevLead:void 0}getStack(){const{layoutId:h}=this.options;if(h)return this.root.sharedNodes.get(h)}promote({needsReset:h,transition:p,preserveFollowOpacity:y}={}){const E=this.getStack();E&&E.promote(this,y),h&&(this.projectionDelta=void 0,this.needsReset=!0),p&&this.setOptions({transition:p})}relegate(){const h=this.getStack();return h?h.relegate(this):!1}resetSkewAndRotation(){const{visualElement:h}=this.options;if(!h)return;let p=!1;const{latestValues:y}=h;if((y.z||y.rotate||y.rotateX||y.rotateY||y.rotateZ||y.skewX||y.skewY)&&(p=!0),!p)return;const E={};y.z&&resetDistortingTransform("z",h,E,this.animationValues);for(let L=0;L<transformAxes.length;L++)resetDistortingTransform(`rotate${transformAxes[L]}`,h,E,this.animationValues),resetDistortingTransform(`skew${transformAxes[L]}`,h,E,this.animationValues);h.render();for(const L in E)h.setStaticValue(L,E[L]),this.animationValues&&(this.animationValues[L]=E[L]);h.scheduleRender()}getProjectionStyles(h){var p,y;if(!this.instance||this.isSVG)return;if(!this.isVisible)return hiddenVisibility;const E={visibility:""},L=this.getTransformTemplate();if(this.needsReset)return this.needsReset=!1,E.opacity="",E.pointerEvents=resolveMotionValue(h==null?void 0:h.pointerEvents)||"",E.transform=L?L(this.latestValues,""):"none",E;const F=this.getLead();if(!this.projectionDelta||!this.layout||!F.target){const W={};return this.options.layoutId&&(W.opacity=this.latestValues.opacity!==void 0?this.latestValues.opacity:1,W.pointerEvents=resolveMotionValue(h==null?void 0:h.pointerEvents)||""),this.hasProjected&&!hasTransform(this.latestValues)&&(W.transform=L?L({},""):"none",this.hasProjected=!1),W}const N=F.animationValues||F.latestValues;this.applyTransformsToTarget(),E.transform=buildProjectionTransform(this.projectionDeltaWithTransform,this.treeScale,N),L&&(E.transform=L(N,E.transform));const{x:z,y:oe}=this.projectionDelta;E.transformOrigin=`${z.origin*100}% ${oe.origin*100}% 0`,F.animationValues?E.opacity=F===this?(y=(p=N.opacity)!==null&&p!==void 0?p:this.latestValues.opacity)!==null&&y!==void 0?y:1:this.preserveOpacity?this.latestValues.opacity:N.opacityExit:E.opacity=F===this?N.opacity!==void 0?N.opacity:"":N.opacityExit!==void 0?N.opacityExit:0;for(const W in scaleCorrectors){if(N[W]===void 0)continue;const{correct:lt,applyTo:nt}=scaleCorrectors[W],Ee=E.transform==="none"?N[W]:lt(N[W],F);if(nt){const yt=nt.length;for(let Ai=0;Ai<yt;Ai++)E[nt[Ai]]=Ee}else E[W]=Ee}return this.options.layoutId&&(E.pointerEvents=F===this?resolveMotionValue(h==null?void 0:h.pointerEvents)||"":"none"),E}clearSnapshot(){this.resumeFrom=this.snapshot=void 0}resetTree(){this.root.nodes.forEach(h=>{var p;return(p=h.currentAnimation)===null||p===void 0?void 0:p.stop()}),this.root.nodes.forEach(clearMeasurements),this.root.sharedNodes.clear()}}}function updateLayout(t){t.updateLayout()}function notifyLayoutUpdate(t){var n;const o=((n=t.resumeFrom)===null||n===void 0?void 0:n.snapshot)||t.snapshot;if(t.isLead()&&t.layout&&o&&t.hasListeners("didUpdate")){const{layoutBox:s,measuredBox:c}=t.layout,{animationType:d}=t.options,h=o.source!==t.layout.source;d==="size"?eachAxis(F=>{const N=h?o.measuredBox[F]:o.layoutBox[F],z=calcLength(N);N.min=s[F].min,N.max=N.min+z}):shouldAnimatePositionOnly(d,o.layoutBox,s)&&eachAxis(F=>{const N=h?o.measuredBox[F]:o.layoutBox[F],z=calcLength(s[F]);N.max=N.min+z,t.relativeTarget&&!t.currentAnimation&&(t.isProjectionDirty=!0,t.relativeTarget[F].max=t.relativeTarget[F].min+z)});const p=createDelta();calcBoxDelta(p,s,o.layoutBox);const y=createDelta();h?calcBoxDelta(y,t.applyTransform(c,!0),o.measuredBox):calcBoxDelta(y,s,o.layoutBox);const E=!isDeltaZero(p);let L=!1;if(!t.resumeFrom){const F=t.getClosestProjectingParent();if(F&&!F.resumeFrom){const{snapshot:N,layout:z}=F;if(N&&z){const oe=createBox();calcRelativePosition(oe,o.layoutBox,N.layoutBox);const W=createBox();calcRelativePosition(W,s,z.layoutBox),boxEqualsRounded(oe,W)||(L=!0),F.options.layoutRoot&&(t.relativeTarget=W,t.relativeTargetOrigin=oe,t.relativeParent=F)}}}t.notifyListeners("didUpdate",{layout:s,snapshot:o,delta:y,layoutDelta:p,hasLayoutChanged:E,hasRelativeTargetChanged:L})}else if(t.isLead()){const{onExitComplete:s}=t.options;s&&s()}t.options.transition=void 0}function propagateDirtyNodes(t){projectionFrameData.totalNodes++,t.parent&&(t.isProjecting()||(t.isProjectionDirty=t.parent.isProjectionDirty),t.isSharedProjectionDirty||(t.isSharedProjectionDirty=!!(t.isProjectionDirty||t.parent.isProjectionDirty||t.parent.isSharedProjectionDirty)),t.isTransformDirty||(t.isTransformDirty=t.parent.isTransformDirty))}function cleanDirtyNodes(t){t.isProjectionDirty=t.isSharedProjectionDirty=t.isTransformDirty=!1}function clearSnapshot(t){t.clearSnapshot()}function clearMeasurements(t){t.clearMeasurements()}function clearIsLayoutDirty(t){t.isLayoutDirty=!1}function resetTransformStyle(t){const{visualElement:n}=t.options;n&&n.getProps().onBeforeLayoutMeasure&&n.notify("BeforeLayoutMeasure"),t.resetTransform()}function finishAnimation(t){t.finishAnimation(),t.targetDelta=t.relativeTarget=t.target=void 0,t.isProjectionDirty=!0}function resolveTargetDelta(t){t.resolveTargetDelta()}function calcProjection(t){t.calcProjection()}function resetSkewAndRotation(t){t.resetSkewAndRotation()}function removeLeadSnapshots(t){t.removeLeadSnapshot()}function mixAxisDelta(t,n,o){t.translate=mixNumber$1(n.translate,0,o),t.scale=mixNumber$1(n.scale,1,o),t.origin=n.origin,t.originPoint=n.originPoint}function mixAxis(t,n,o,s){t.min=mixNumber$1(n.min,o.min,s),t.max=mixNumber$1(n.max,o.max,s)}function mixBox(t,n,o,s){mixAxis(t.x,n.x,o.x,s),mixAxis(t.y,n.y,o.y,s)}function hasOpacityCrossfade(t){return t.animationValues&&t.animationValues.opacityExit!==void 0}const defaultLayoutTransition={duration:.45,ease:[.4,0,.1,1]},userAgentContains=t=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(t),roundPoint=userAgentContains("applewebkit/")&&!userAgentContains("chrome/")?Math.round:noop$1;function roundAxis(t){t.min=roundPoint(t.min),t.max=roundPoint(t.max)}function roundBox(t){roundAxis(t.x),roundAxis(t.y)}function shouldAnimatePositionOnly(t,n,o){return t==="position"||t==="preserve-aspect"&&!isNear(aspectRatio(n),aspectRatio(o),.2)}const DocumentProjectionNode=createProjectionNode({attachResizeListener:(t,n)=>addDomEvent(t,"resize",n),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),rootProjectionNode={current:void 0},HTMLProjectionNode=createProjectionNode({measureScroll:t=>({x:t.scrollLeft,y:t.scrollTop}),defaultParent:()=>{if(!rootProjectionNode.current){const t=new DocumentProjectionNode({});t.mount(window),t.setOptions({layoutScroll:!0}),rootProjectionNode.current=t}return rootProjectionNode.current},resetTransform:(t,n)=>{t.style.transform=n!==void 0?n:"none"},checkIsScrollRoot:t=>window.getComputedStyle(t).position==="fixed"}),drag={pan:{Feature:PanGesture},drag:{Feature:DragGesture,ProjectionNode:HTMLProjectionNode,MeasureLayout}},prefersReducedMotion={current:null},hasReducedMotionListener={current:!1};function initPrefersReducedMotion(){if(hasReducedMotionListener.current=!0,!!isBrowser)if(window.matchMedia){const t=window.matchMedia("(prefers-reduced-motion)"),n=()=>prefersReducedMotion.current=t.matches;t.addListener(n),n()}else prefersReducedMotion.current=!1}function updateMotionValuesFromProps(t,n,o){const{willChange:s}=n;for(const c in n){const d=n[c],h=o[c];if(isMotionValue(d))t.addValue(c,d),isWillChangeMotionValue(s)&&s.add(c),process.env.NODE_ENV==="development"&&warnOnce(d.version==="11.0.27",`Attempting to mix Framer Motion versions ${d.version} with 11.0.27 may not work as expected.`);else if(isMotionValue(h))t.addValue(c,motionValue(d,{owner:t})),isWillChangeMotionValue(s)&&s.remove(c);else if(h!==d)if(t.hasValue(c)){const p=t.getValue(c);p.liveStyle===!0?p.jump(d):p.hasAnimated||p.set(d)}else{const p=t.getStaticValue(c);t.addValue(c,motionValue(p!==void 0?p:d,{owner:t}))}}for(const c in o)n[c]===void 0&&t.removeValue(c);return n}const visualElementStore=new WeakMap,valueTypes=[...dimensionValueTypes,color,complex],findValueType=t=>valueTypes.find(testValueType(t)),featureNames=Object.keys(featureDefinitions),numFeatures=featureNames.length,propEventHandlers=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"],numVariantProps=variantProps.length;function getClosestProjectingNode(t){if(t)return t.options.allowProjection!==!1?t.projection:getClosestProjectingNode(t.parent)}class VisualElement{constructor({parent:n,props:o,presenceContext:s,reducedMotionConfig:c,blockInitialAnimation:d,visualState:h},p={}){this.resolveKeyframes=(N,z,oe,W)=>new this.KeyframeResolver(N,z,oe,W,this),this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=KeyframeResolver,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.scheduleRender=()=>frame.render(this.render,!1,!0);const{latestValues:y,renderState:E}=h;this.latestValues=y,this.baseTarget={...y},this.initialValues=o.initial?{...y}:{},this.renderState=E,this.parent=n,this.props=o,this.presenceContext=s,this.depth=n?n.depth+1:0,this.reducedMotionConfig=c,this.options=p,this.blockInitialAnimation=!!d,this.isControllingVariants=isControllingVariants(o),this.isVariantNode=isVariantNode(o),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(n&&n.current);const{willChange:L,...F}=this.scrapeMotionValuesFromProps(o,{},this);for(const N in F){const z=F[N];y[N]!==void 0&&isMotionValue(z)&&(z.set(y[N],!1),isWillChangeMotionValue(L)&&L.add(N))}}scrapeMotionValuesFromProps(n,o,s){return{}}mount(n){this.current=n,visualElementStore.set(n,this),this.projection&&!this.projection.instance&&this.projection.mount(n),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((o,s)=>this.bindToMotionValue(s,o)),hasReducedMotionListener.current||initPrefersReducedMotion(),this.shouldReduceMotion=this.reducedMotionConfig==="never"?!1:this.reducedMotionConfig==="always"?!0:prefersReducedMotion.current,process.env.NODE_ENV!=="production"&&warnOnce(this.shouldReduceMotion!==!0,"You have Reduced Motion enabled on your device. Animations may not appear as expected."),this.parent&&this.parent.children.add(this),this.update(this.props,this.presenceContext)}unmount(){visualElementStore.delete(this.current),this.projection&&this.projection.unmount(),cancelFrame(this.notifyUpdate),cancelFrame(this.render),this.valueSubscriptions.forEach(n=>n()),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent&&this.parent.children.delete(this);for(const n in this.events)this.events[n].clear();for(const n in this.features)this.features[n].unmount();this.current=null}bindToMotionValue(n,o){const s=transformProps.has(n),c=o.on("change",h=>{this.latestValues[n]=h,this.props.onUpdate&&frame.preRender(this.notifyUpdate),s&&this.projection&&(this.projection.isTransformDirty=!0)}),d=o.on("renderRequest",this.scheduleRender);this.valueSubscriptions.set(n,()=>{c(),d(),o.owner&&o.stop()})}sortNodePosition(n){return!this.current||!this.sortInstanceNodePosition||this.type!==n.type?0:this.sortInstanceNodePosition(this.current,n.current)}loadFeatures({children:n,...o},s,c,d){let h,p;if(process.env.NODE_ENV!=="production"&&c&&s){const y="You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.";o.ignoreStrict?warning(!1,y):invariant(!1,y)}for(let y=0;y<numFeatures;y++){const E=featureNames[y],{isEnabled:L,Feature:F,ProjectionNode:N,MeasureLayout:z}=featureDefinitions[E];N&&(h=N),L(o)&&(!this.features[E]&&F&&(this.features[E]=new F(this)),z&&(p=z))}if((this.type==="html"||this.type==="svg")&&!this.projection&&h){this.projection=new h(this.latestValues,getClosestProjectingNode(this.parent));const{layoutId:y,layout:E,drag:L,dragConstraints:F,layoutScroll:N,layoutRoot:z}=o;this.projection.setOptions({layoutId:y,layout:E,alwaysMeasureLayout:!!L||F&&isRefObject(F),visualElement:this,scheduleRender:()=>this.scheduleRender(),animationType:typeof E=="string"?E:"both",initialPromotionConfig:d,layoutScroll:N,layoutRoot:z})}return p}updateFeatures(){for(const n in this.features){const o=this.features[n];o.isMounted?o.update():(o.mount(),o.isMounted=!0)}}triggerBuild(){this.build(this.renderState,this.latestValues,this.options,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):createBox()}getStaticValue(n){return this.latestValues[n]}setStaticValue(n,o){this.latestValues[n]=o}update(n,o){(n.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=n,this.prevPresenceContext=this.presenceContext,this.presenceContext=o;for(let s=0;s<propEventHandlers.length;s++){const c=propEventHandlers[s];this.propEventSubscriptions[c]&&(this.propEventSubscriptions[c](),delete this.propEventSubscriptions[c]);const d=n["on"+c];d&&(this.propEventSubscriptions[c]=this.on(c,d))}this.prevMotionValues=updateMotionValuesFromProps(this,this.scrapeMotionValuesFromProps(n,this.prevProps,this),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(n){return this.props.variants?this.props.variants[n]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}getVariantContext(n=!1){if(n)return this.parent?this.parent.getVariantContext():void 0;if(!this.isControllingVariants){const s=this.parent?this.parent.getVariantContext()||{}:{};return this.props.initial!==void 0&&(s.initial=this.props.initial),s}const o={};for(let s=0;s<numVariantProps;s++){const c=variantProps[s],d=this.props[c];(isVariantLabel(d)||d===!1)&&(o[c]=d)}return o}addVariantChild(n){const o=this.getClosestVariantNode();if(o)return o.variantChildren&&o.variantChildren.add(n),()=>o.variantChildren.delete(n)}addValue(n,o){o!==this.values.get(n)&&(this.removeValue(n),this.bindToMotionValue(n,o)),this.values.set(n,o),this.latestValues[n]=o.get()}removeValue(n){this.values.delete(n);const o=this.valueSubscriptions.get(n);o&&(o(),this.valueSubscriptions.delete(n)),delete this.latestValues[n],this.removeValueFromRenderState(n,this.renderState)}hasValue(n){return this.values.has(n)}getValue(n,o){if(this.props.values&&this.props.values[n])return this.props.values[n];let s=this.values.get(n);return s===void 0&&o!==void 0&&(s=motionValue(o===null?void 0:o,{owner:this}),this.addValue(n,s)),s}readValue(n,o){var s;let c=this.latestValues[n]!==void 0||!this.current?this.latestValues[n]:(s=this.getBaseTargetFromProps(this.props,n))!==null&&s!==void 0?s:this.readValueFromInstance(this.current,n,this.options);return c!=null&&(typeof c=="string"&&(isNumericalString(c)||isZeroValueString(c))?c=parseFloat(c):!findValueType(c)&&complex.test(o)&&(c=getAnimatableNone(n,o)),this.setBaseTarget(n,isMotionValue(c)?c.get():c)),isMotionValue(c)?c.get():c}setBaseTarget(n,o){this.baseTarget[n]=o}getBaseTarget(n){var o,s;const{initial:c}=this.props,d=typeof c=="string"||typeof c=="object"?(s=resolveVariantFromProps(this.props,c,(o=this.presenceContext)===null||o===void 0?void 0:o.custom))===null||s===void 0?void 0:s[n]:void 0;if(c&&d!==void 0)return d;const h=this.getBaseTargetFromProps(this.props,n);return h!==void 0&&!isMotionValue(h)?h:this.initialValues[n]!==void 0&&d===void 0?void 0:this.baseTarget[n]}on(n,o){return this.events[n]||(this.events[n]=new SubscriptionManager),this.events[n].add(o)}notify(n,...o){this.events[n]&&this.events[n].notify(...o)}}class DOMVisualElement extends VisualElement{constructor(){super(...arguments),this.KeyframeResolver=DOMKeyframesResolver}sortInstanceNodePosition(n,o){return n.compareDocumentPosition(o)&2?1:-1}getBaseTargetFromProps(n,o){return n.style?n.style[o]:void 0}removeValueFromRenderState(n,{vars:o,style:s}){delete o[n],delete s[n]}}function getComputedStyle(t){return window.getComputedStyle(t)}class HTMLVisualElement extends DOMVisualElement{constructor(){super(...arguments),this.type="html"}readValueFromInstance(n,o){if(transformProps.has(o)){const s=getDefaultValueType(o);return s&&s.default||0}else{const s=getComputedStyle(n),c=(isCSSVariableName(o)?s.getPropertyValue(o):s[o])||0;return typeof c=="string"?c.trim():c}}measureInstanceViewportBox(n,{transformPagePoint:o}){return measureViewportBox(n,o)}build(n,o,s,c){buildHTMLStyles(n,o,s,c.transformTemplate)}scrapeMotionValuesFromProps(n,o,s){return scrapeMotionValuesFromProps$1(n,o,s)}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:n}=this.props;isMotionValue(n)&&(this.childSubscription=n.on("change",o=>{this.current&&(this.current.textContent=`${o}`)}))}renderInstance(n,o,s,c){renderHTML(n,o,s,c)}}class SVGVisualElement extends DOMVisualElement{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1}getBaseTargetFromProps(n,o){return n[o]}readValueFromInstance(n,o){if(transformProps.has(o)){const s=getDefaultValueType(o);return s&&s.default||0}return o=camelCaseAttributes.has(o)?o:camelToDash(o),n.getAttribute(o)}measureInstanceViewportBox(){return createBox()}scrapeMotionValuesFromProps(n,o){return scrapeMotionValuesFromProps(n,o,this)}build(n,o,s,c){buildSVGAttrs(n,o,s,this.isSVGTag,c.transformTemplate)}renderInstance(n,o,s,c){renderSVG(n,o,s,c)}mount(n){this.isSVGTag=isSVGTag(n.tagName),super.mount(n)}}const createDomVisualElement=(t,n)=>isSVGComponent(t)?new SVGVisualElement(n,{enableHardwareAcceleration:!1}):new HTMLVisualElement(n,{allowProjection:t!==React.Fragment,enableHardwareAcceleration:!0}),layout={layout:{ProjectionNode:HTMLProjectionNode,MeasureLayout}},preloadedFeatures={...animations,...gestureAnimations,...drag,...layout},motion=createMotionProxy((t,n)=>createDomMotionConfig(t,n,preloadedFeatures,createDomVisualElement));function useMotionValue(t){const n=useConstant(()=>motionValue(t)),{isStatic:o}=React.useContext(MotionConfigContext);if(o){const[,s]=React.useState(t);React.useEffect(()=>n.on("change",s),[])}return n}function assignRef(t,n){return typeof t=="function"?t(n):t&&(t.current=n),t}function useCallbackRef(t,n){var o=React.useState(function(){return{value:t,callback:n,facade:{get current(){return o.value},set current(s){var c=o.value;c!==s&&(o.value=s,o.callback(s,c))}}}})[0];return o.callback=n,o.facade}var useIsomorphicLayoutEffect=typeof window<"u"?React__namespace.useLayoutEffect:React__namespace.useEffect,currentValues=new WeakMap;function useMergeRefs(t,n){var o=useCallbackRef(null,function(s){return t.forEach(function(c){return assignRef(c,s)})});return useIsomorphicLayoutEffect(function(){var s=currentValues.get(o);if(s){var c=new Set(s),d=new Set(t),h=o.current;c.forEach(function(p){d.has(p)||assignRef(p,null)}),d.forEach(function(p){c.has(p)||assignRef(p,h)})}currentValues.set(o,t)},[t]),o}const occluder=new EllipsoidalOccluder(Ellipsoid$1.WGS84,Cartesian3.ZERO),ScreenSpaceElement=React.forwardRef(({position:t,children:n,...o},s)=>{const c=useConstant$2(()=>new Cartesian3);t==null||t.clone(c);const d=useMotionValue(""),h=useMotionValue("none"),{toWindowPosition:p,getCamera:y,toXYZ:E,isPositionVisible:L}=useContext(),F=React.useRef(null);usePreRender(()=>{if(F.current==null)return;let z;try{const Ee=p==null?void 0:p([c.x,c.y,c.z]);z=new Cartesian2(Ee==null?void 0:Ee[0],Ee==null?void 0:Ee[1])}catch{h.set("none");return}const oe=y==null?void 0:y();if(!oe)return;const W=E==null?void 0:E(oe==null?void 0:oe.lng,oe==null?void 0:oe.lat,oe==null?void 0:oe.height);if(!W)return;if(occluder.cameraPosition=new Cartesian3(W[0],W[1],W[2]),z==null||z.x<0||z.y<0||z.x>window.innerWidth||z.y>window.innerHeight||!(L!=null&&L([c.x,c.y,c.z]))){h.set("none");return}const lt=`calc(${z.x}px - 50%)`,nt=`calc(${z.y}px - 50%)`;d.set(`translate(${lt}, ${nt})`),h.set("block")});const N=useMergeRefs([F,s]);return jsxRuntimeExports.jsx(motion.div,{ref:N,...o,style:{...o.style,transform:d,display:h,position:"absolute",pointerEvents:"none",left:0,top:0},children:n})});ScreenSpaceElement.displayName="ScreenSpaceElement";const MeasurementLine$1=({a:t,b:n,color:o})=>{const s=React.useRef([t,n]);s.current=[t,n];const c=useConstant$2(()=>new CallbackProperty(()=>s.current,!1)),d=React.useMemo(()=>({polyline:{positions:c,width:1.5,material:new PolylineDashMaterialProperty({color:o,dashLength:8})}}),[o,c]);return jsxRuntimeExports.jsx(Entity,{...d})},ExtrudedMeasurement=({a:t,b:n,extrudedHeight:o,color:s,showLine:c})=>{const d=useConstant$2(()=>new Cartesian3);return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(ScreenSpaceElement,{position:Cartesian3.midpoint(t,n,d),children:jsxRuntimeExports.jsx(MeasurementText,{children:o<1e3?`${o.toFixed(1)} m`:`${(o/1e3).toFixed(1)} km`})}),c&&jsxRuntimeExports.jsx(MeasurementLine$1,{a:t,b:n,color:s})]})},ExtrudedControlPoints=React.memo(({geometryOptions:{controlPoints:t,type:n},extrudedHeight:o,color:s,isEditing:c,extrudedPoint:d,centroidBasePoint:h,centroidExtrudedPoint:p,catchedExtrudedPoint:y,handleControlPointMouseEvent:E})=>{const L=t[t.length-1],F=d?new Cartesian3(...d):void 0,N=h?new Cartesian3(...h):void 0,z=p?new Cartesian3(...p):void 0;return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[F&&jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:F,isEditing:c,isExtrudedControlPoint:!0,handleControlPointMouseEvent:E}),(!c||y)&&jsxRuntimeExports.jsx(ExtrudedMeasurement,{a:L,b:F,extrudedHeight:o,color:c?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):s,showLine:n!=="extrudedPolygon"})]}),N&&jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:N,isEditing:c,isExtrudedControlPoint:!0}),z&&jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:z,isEditing:c,isExtrudedControlPoint:!0})]})});ExtrudedControlPoints.displayName="ExtrudedControlPoints";const ExtrudedPolygonEntity=({id:t,hierarchy:n,extrudedHeight:o,color:s,disableShadow:c=!1,isEditing:d})=>{const h=React.useRef(n);h.current=n;const y=useConstant$2(()=>new CallbackProperty(()=>h.current,!1)),E=React.useRef(o);E.current=o;const F=useConstant$2(()=>new CallbackProperty(()=>E.current,!1)),N=React.useMemo(()=>({polygon:{hierarchy:y,heightReference:HeightReference$1.RELATIVE_TO_TERRAIN,extrudedHeight:F,extrudedHeightReference:HeightReference$1.RELATIVE_TO_TERRAIN,fill:!0,outline:!0,outlineWidth:1,outlineColor:d?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):s==null?void 0:s.withAlpha(1),material:new ColorMaterialProperty(d?s==null?void 0:s.withAlpha(.2):s),classificationType:ClassificationType$1.TERRAIN,shadows:c?ShadowMode$1.DISABLED:ShadowMode$1.ENABLED}}),[F,c,y,s,d]),{requestRender:z}=useContext();return z==null||z(),jsxRuntimeExports.jsx(Entity,{id:t,...N})},PolygonEntity=({dynamic:t=!1,hierarchy:n,color:o})=>{const s=React.useRef(n);s.current=n;const c=useConstant$2(()=>new CallbackProperty(()=>s.current,!1)),d=t?c:n,h=React.useMemo(()=>({polygon:{hierarchy:d,fill:!0,material:o==null?void 0:o.withAlpha(.5),classificationType:ClassificationType$1.TERRAIN}}),[o,d]),{requestRender:p}=useContext();return p==null||p(),jsxRuntimeExports.jsx(Entity,{...h})},PolylineEntity=({dynamic:t=!1,positions:n,color:o,isEditing:s})=>{const c=React.useRef(n);c.current=n;const d=useConstant$2(()=>new CallbackProperty(()=>c.current,!t)),h=t?d:n,p=React.useMemo(()=>({polyline:{positions:h,width:1.5,material:s?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):o,classificationType:ClassificationType$1.TERRAIN,clampToGround:!0}}),[o,h,s]),{requestRender:y}=useContext();return y==null||y(),jsxRuntimeExports.jsx(Entity,{...p})},cartesianScratch1$1=new Cartesian3,SurfaceAddingPoints=React.memo(({geometryOptions:{type:t,controlPoints:n},isEditing:o,handleAddControlPoint:s})=>{if(!["polyline","polygon","extrudedPolygon"].includes(t))return null;const c=[];for(let d=0;d<n.length-1;d++){const h=n[d+1],p=Cartesian3.midpoint(n[d],h,cartesianScratch1$1);c.push(p.clone())}if(t==="polygon"||t==="extrudedPolygon"){const d=Cartesian3.midpoint(n[n.length-1],n[0],cartesianScratch1$1);c.push(d.clone())}return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:c.map((d,h)=>jsxRuntimeExports.jsx(ControlPoint,{position:d,isAddingPoint:!0,index:h,clampToGround:!0,isEditing:o,handleControlPointMouseEvent:()=>s==null?void 0:s([d.x,d.y,d.z],h)},h))})});SurfaceAddingPoints.displayName="SurfaceAddingPoints";const MeasurementLine=({a:t,b:n,color:o})=>{const s=React.useRef([t,n]);s.current=[t,n];const c=useConstant$2(()=>new CallbackProperty(()=>s.current,!1)),d=React.useMemo(()=>({polyline:{positions:c,width:1.5,material:new PolylineDashMaterialProperty({color:o,dashLength:8}),classificationType:ClassificationType$1.TERRAIN,clampToGround:!0}}),[o,c]),{requestRender:h}=useContext();return h==null||h(),jsxRuntimeExports.jsx(Entity,{...d})},SurfaceMeasurement=({a:t,b:n,color:o,showLine:s=!1})=>{const c=useConstant$2(()=>new Cartesian3),{getSurfaceDistance:d}=useContext(),h=d==null?void 0:d(t,n);return h!==void 0?jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(ScreenSpaceElement,{position:Cartesian3.midpoint(t,n,c),children:jsxRuntimeExports.jsx(MeasurementText,{children:h<1e3?`${h.toFixed(1)} m`:`${(h/1e3).toFixed(1)} km`})}),s&&jsxRuntimeExports.jsx(MeasurementLine,{a:t,b:n,color:o})]}):null},cartesianScratch1=new Cartesian3,SurfaceControlPoints=React.memo(({geometryOptions:{type:t,controlPoints:n},color:o,isEditing:s,catchedControlPointIndex:c,selectedControlPointIndex:d,handleControlPointMouseEvent:h})=>{const p=[];if(n.length>=2)if(s){if(c!==void 0&&c!==-1)switch(t){case"polyline":c>0&&p.push({points:[n[c-1],n[c]],showLine:!1}),c<n.length-1&&p.push({points:[n[c],n[c+1]],showLine:!1});break;case"circle":case"extrudedCircle":c!==2&&p.push({points:[n[0],n[1]],showLine:!0});break;case"rectangle":case"extrudedRectangle":if(c<=1)p.push({points:[n[0],n[1]],showLine:!1});else if(c===2){const[y,E,L]=n,F=Cartesian3.midpoint(y,E,cartesianScratch1);p.push({points:[F,L],showLine:!0})}break;case"polygon":case"extrudedPolygon":p.push({points:[n[c],c===0?n[n.length-1]:n[c-1]],showLine:!1}),p.push({points:[n[c],c===n.length-1?n[0]:n[c+1]],showLine:!1});break}}else switch(t){case"rectangle":if(n.length===2)p.push({points:n,showLine:!0});else if(n.length===3){const[y,E,L]=n,F=Cartesian3.midpoint(y,E,cartesianScratch1);p.push({points:[F,L],showLine:!0})}break;default:p.push({points:n.slice(-2),showLine:t==="circle"});break}return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[n.map((y,E)=>jsxRuntimeExports.jsx(ControlPoint,{position:y,index:E,isSelected:d===E,clampToGround:!0,isEditing:s,handleControlPointMouseEvent:h},E)),p.map(({points:y,showLine:E},L)=>jsxRuntimeExports.jsx(SurfaceMeasurement,{a:y[0],b:y[1],color:s?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):o,showLine:E},L))]})});SurfaceControlPoints.displayName="SurfaceControlPoints";const SketchComponent=React.memo(({geometryOptions:t,extrudedHeight:n,disableShadow:o,color:s,isEditing:c,extrudedPoint:d,centroidBasePoint:h,centroidExtrudedPoint:p,catchedControlPointIndex:y,catchedExtrudedPoint:E,selectedControlPointIndex:L,handleControlPointMouseEvent:F,handleAddControlPoint:N})=>{const z=React.useMemo(()=>t?{...t,controlPoints:t==null?void 0:t.controlPoints.map(Ee=>new Cesium$1.Cartesian3(...Ee))}:null,[t]),oe=React.useMemo(()=>z?createGeometry(z):null,[z]),{positionsArray:W,hierarchyArray:lt}=React.useMemo(()=>(oe==null?void 0:oe.type)==="Point"?{}:(oe==null?void 0:oe.type)==="LineString"?{positionsArray:convertGeometryToPositionsArray(oe)}:oe!=null?{positionsArray:convertGeometryToPositionsArray(oe),hierarchyArray:convertPolygonToHierarchyArray(oe)}:{},[oe]),nt=React.useMemo(()=>Color$1.fromCssColorString(s??DEFAULT_SKETCH_COLOR),[s]);return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[W==null?void 0:W.map((Ee,yt)=>jsxRuntimeExports.jsx(PolylineEntity,{dynamic:!0,positions:Ee,color:nt,isEditing:c},yt)),lt==null?void 0:lt.map((Ee,yt)=>jsxRuntimeExports.jsx(PolygonEntity,{dynamic:!0,hierarchy:Ee,color:nt},yt)),z!=null&&(!n||c)&&jsxRuntimeExports.jsx(SurfaceControlPoints,{geometryOptions:z,color:nt,isEditing:c,catchedControlPointIndex:y,selectedControlPointIndex:L,handleControlPointMouseEvent:F}),z!=null&&c&&jsxRuntimeExports.jsx(SurfaceAddingPoints,{geometryOptions:z,isEditing:c,handleAddControlPoint:N}),z!=null&&n&&jsxRuntimeExports.jsx(ExtrudedControlPoints,{geometryOptions:z,extrudedHeight:n,extrudedPoint:d,centroidBasePoint:h,centroidExtrudedPoint:p,catchedExtrudedPoint:E,color:nt,isEditing:c,handleControlPointMouseEvent:F}),n&&(lt==null?void 0:lt.map((Ee,yt)=>jsxRuntimeExports.jsx(ExtrudedPolygonEntity,{hierarchy:Ee,extrudedHeight:n,disableShadow:o,color:nt,isEditing:c},yt)))]})});SketchComponent.displayName="SketchComponent";const Cesium=({className:t,style:n,property:o,time:s,camera:c,small:d,ready:h,children:p,selectedLayerId:y,isLayerDraggable:E,isLayerDragging:L,shouldRender:F,layerSelectionReason:N,meta:z,displayCredits:oe,layersRef:W,featureFlags:lt,requestingRenderMode:nt,timelineManagerRef:Ee,cameraForceHorizontalRoll:yt,onLayerSelect:Ai,onCameraChange:zi,onLayerDrag:ha,onLayerDrop:ba,onLayerEdit:Sa,onLayerSelectWithRectStart:ya,onLayerSelectWithRectMove:ms,onLayerSelectWithRectEnd:bs,onMount:Ra,onLayerVisibility:pi,onLayerLoad:mt,onCreditsUpdate:fa},Wa)=>{var ef,Zd,of,hf,df,cf,gf,Sf,bf,Pf,If,Nf,Jf,qf,Bf,zm,Tf,Cf,Df,Wf,$f,Em,Qf,Am,wm,_m,xf,zf,wf,yf,Of,Uf,Dm,Bm,$m,Qm,ap,dp,hp,fp,yu,sf;const{cesium:sl,mouseEventHandles:Vd,cesiumIonAccessToken:Xd,context:pu,layerSelectWithRectEventHandlers:gl,sceneLight:md,sceneBackgroundColor:Gd,sceneMsaaSamples:tf,sceneMode:nf,cameraViewBoundaries:lf,cameraViewOuterBoundaries:ff,cameraViewBoundariesMaterial:_f,handleCameraChange:pf,handleCameraMoveEnd:vf,handleUpdate:Mf,handleClick:Af,handleMount:Lf,handleUnmount:Wc,handleTilesChange:uf,handleTerrainProviderChange:rf}=useHooks$1({ref:Wa,property:o,time:s,selectedLayerId:y,selectionReason:N,meta:z,layersRef:W,featureFlags:lt,timelineManagerRef:Ee,isLayerDraggable:E,isLayerDragging:L,shouldRender:F,requestingRenderMode:nt,camera:c,cameraForceHorizontalRoll:yt,onLayerDrag:ha,onLayerDrop:ba,onLayerSelect:Ai,onLayerEdit:Sa,onLayerSelectWithRectStart:ya,onLayerSelectWithRectMove:ms,onLayerSelectWithRectEnd:bs,onLayerVisibility:pi,onLayerLoad:mt,onCameraChange:zi,onMount:Ra,onCreditsUpdate:fa});return jsxRuntimeExports.jsxs(Aa$1,{ref:sl,onUpdate:Mf,className:t,requestRenderMode:!0,animation:!1,timeline:!1,baseLayer:!1,fullscreenButton:!1,homeButton:!1,geocoder:!1,infoBox:!1,baseLayerPicker:!1,navigationHelpButton:!1,projectionPicker:!1,sceneModePicker:!1,creditContainer:oe?void 0:creditContainer,style:{width:d?"300px":"auto",height:d?"300px":"100%",display:h?void 0:"none",cursor:L?"grab":void 0,...n},shadows:!!((Zd=(ef=o==null?void 0:o.scene)==null?void 0:ef.shadow)!=null&&Zd.enabled),onClick:Af,onDoubleClick:Vd.doubleClick,onMouseDown:Vd.mouseDown,onMouseUp:Vd.mouseUp,onRightClick:Vd.rightClick,onRightDown:Vd.rightDown,onRightUp:Vd.rightUp,onMiddleClick:Vd.middleClick,onMiddleDown:Vd.middleDown,onMiddleUp:Vd.middleUp,onMouseMove:Vd.mouseMove,onMouseEnter:Vd.mouseEnter,onMouseLeave:Vd.mouseLeave,onWheel:Vd.wheel,children:[jsxRuntimeExports.jsx(Event,{onMount:Lf,onUnmount:Wc}),jsxRuntimeExports.jsx(ReearthClock,{timelineManagerRef:Ee}),jsxRuntimeExports.jsx(ImageryLayers,{tiles:o==null?void 0:o.tiles,cesiumIonAccessToken:Xd,onTilesChange:uf}),jsxRuntimeExports.jsx(LabelImageryLayers,{tileLabels:o==null?void 0:o.tileLabels}),jsxRuntimeExports.jsx(Indicator,{property:o,timelineManagerRef:Ee}),jsxRuntimeExports.jsxs(ka$1,{useDefault:!0,children:[jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_CLICK}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_DOUBLE_CLICK})]}),jsxRuntimeExports.jsxs(ka$1,{children:[jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_DOWN,action:gl.start.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_DOWN,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:gl.start.shift}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE,action:gl.move.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:gl.move.shift}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_UP,action:gl.end.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_UP,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:gl.end.shift})]}),jsxRuntimeExports.jsx(Ta$1,{maximumZoomDistance:(hf=(of=o==null?void 0:o.camera)==null?void 0:of.limiter)!=null&&hf.enabled?((gf=(cf=(df=o.camera)==null?void 0:df.limiter)==null?void 0:cf.targetArea)==null?void 0:gf.height)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,enableCollisionDetection:!((Sf=o==null?void 0:o.camera)!=null&&Sf.allowEnterGround)}),jsxRuntimeExports.jsx(Ps$1,{percentageChanged:.2,onChange:pf,onMoveEnd:vf}),lf&&((Pf=(bf=o==null?void 0:o.camera)==null?void 0:bf.limiter)==null?void 0:Pf.showHelper)&&jsxRuntimeExports.jsx(Is$1,{children:jsxRuntimeExports.jsx(ua$1,{positions:lf,width:1,material:Cesium$1.Color.RED,arcType:Cesium$1.ArcType.RHUMB})}),ff&&((Nf=(If=o==null?void 0:o.camera)==null?void 0:If.limiter)==null?void 0:Nf.showHelper)&&jsxRuntimeExports.jsx(Is$1,{children:jsxRuntimeExports.jsx(ua$1,{positions:ff,width:1,material:_f,arcType:Cesium$1.ArcType.RHUMB})}),jsxRuntimeExports.jsx($a$1,{backgroundColor:Gd,light:md,mode:nf,msaaSamples:tf,useDepthPicking:!1,useWebVR:!!((Jf=o==null?void 0:o.scene)!=null&&Jf.vr)||void 0,debugShowFramesPerSecond:!!((qf=o==null?void 0:o.debug)!=null&&qf.showFramesPerSecond),verticalExaggerationRelativeHeight:(Bf=o==null?void 0:o.scene)==null?void 0:Bf.verticalExaggerationRelativeHeight,verticalExaggeration:(zm=o==null?void 0:o.scene)==null?void 0:zm.verticalExaggeration}),jsxRuntimeExports.jsx(Oa$1,{show:((Cf=(Tf=o==null?void 0:o.sky)==null?void 0:Tf.skyBox)==null?void 0:Cf.show)??!0}),jsxRuntimeExports.jsx(Vs,{enabled:((Wf=(Df=o==null?void 0:o.sky)==null?void 0:Df.fog)==null?void 0:Wf.enabled)??!0,density:(Em=($f=o==null?void 0:o.sky)==null?void 0:$f.fog)==null?void 0:Em.density}),jsxRuntimeExports.jsx(Ga$1,{show:((Am=(Qf=o==null?void 0:o.sky)==null?void 0:Qf.sun)==null?void 0:Am.show)??!0}),jsxRuntimeExports.jsx(ea$1,{show:((_m=(wm=o==null?void 0:o.sky)==null?void 0:wm.moon)==null?void 0:_m.show)??!0}),jsxRuntimeExports.jsx(_a$2,{show:((zf=(xf=o==null?void 0:o.sky)==null?void 0:xf.skyAtmosphere)==null?void 0:zf.show)??!0,atmosphereLightIntensity:(yf=(wf=o==null?void 0:o.sky)==null?void 0:wf.skyAtmosphere)==null?void 0:yf.lightIntensity,saturationShift:(Uf=(Of=o==null?void 0:o.sky)==null?void 0:Of.skyAtmosphere)==null?void 0:Uf.saturationShift,brightnessShift:(Bm=(Dm=o==null?void 0:o.sky)==null?void 0:Dm.skyAtmosphere)==null?void 0:Bm.brightnessShift}),jsxRuntimeExports.jsx(Globe,{property:o,cesiumIonAccessToken:Xd,onTerrainProviderChange:rf}),jsxRuntimeExports.jsx(context.Provider,{value:pu,children:h?p:null}),jsxRuntimeExports.jsx(AmbientOcclusion,{...AMBIENT_OCCLUSION_QUALITY[((Qm=($m=o==null?void 0:o.render)==null?void 0:$m.ambientOcclusion)==null?void 0:Qm.quality)||"low"],enabled:!!((dp=(ap=o==null?void 0:o.render)==null?void 0:ap.ambientOcclusion)!=null&&dp.enabled),intensity:((fp=(hp=o==null?void 0:o.render)==null?void 0:hp.ambientOcclusion)==null?void 0:fp.intensity)??100,outputType:(sf=(yu=o==null?void 0:o.render)==null?void 0:yu.ambientOcclusion)!=null&&sf.ambientOcclusionOnly?AmbientOcclusionOutputType.Occlusion:null})]})},creditContainer=document.createElement("div"),Component=React.forwardRef(Cesium),engine={component:Component,featureComponent:Feature$1,clusterComponent:Cluster,sketchComponent:SketchComponent,delegatedDataTypes:["czml","wms","mvt","3dtiles","osm-buildings","kml"]},engines={cesium:engine};function Error$1({error:t,resetErrorBoundary:n}){return jsxRuntimeExports.jsxs("div",{children:[jsxRuntimeExports.jsx("h1",{children:"Oops! An Error Occurred"}),jsxRuntimeExports.jsx("p",{children:t.message}),jsxRuntimeExports.jsx("p",{children:jsxRuntimeExports.jsx("button",{style:{color:"#fff"},onClick:n,children:"Retry"})})]})}const version$1="0.0.7-alpha.22",useCoreAPI=({viewerProperty:t})=>{const n=React.useRef(t);n.current=t;const o=React.useMemo(()=>({get version(){return version$1},get viewerProperty(){return n.current}}),[]);React.useEffect(()=>{window.reearth_core=o},[o])},viewportMobileMaxWidth=768,useViewport=({wrapperRef:t})=>{const n=React.useMemo(()=>paramsToObject(new URLSearchParams(window.location.search)),[]),[o,s]=React.useState({width:void 0,height:void 0,isMobile:void 0,query:n});return React.useEffect(()=>{const c=new ResizeObserver(d=>{var E,L;const[h]=d;let p,y;if(h.contentBoxSize){const F=Array.isArray(h.contentBoxSize)?h.contentBoxSize[0]:h.contentBoxSize;p=F.inlineSize,y=F.blockSize}else h.contentRect?(p=h.contentRect.width,y=h.contentRect.height):(p=(E=t.current)==null?void 0:E.clientWidth,y=(L=t.current)==null?void 0:L.clientHeight);s(F=>({width:p,height:y,isMobile:p?p<=viewportMobileMaxWidth:void 0,query:F.query}))});return t.current&&c.observe(t.current),()=>{c.disconnect()}},[t]),o};function paramsToObject(t){const n={};for(const[o,s]of t)n[o]=s;return n}function useHooks({camera:t,interactionMode:n,zoomedLayerId:o,viewerProperty:s,onLayerSelect:c,onCameraChange:d,onInteractionModeChange:h,onZoomToLayer:p,onLayerDrop:y,onSketchTypeChangeProp:E},L){const F=React.useRef(null);React.useImperativeHandle(L,()=>F.current,[]);const N=React.useRef(null),z=useViewport({wrapperRef:N}),[oe,W]=React.useState({}),[lt,nt]=React.useState(),[Ee,yt]=React.useState(),Ai=React.useCallback(async(Tf,Cf,Df,Wf,$f)=>{var wm,_m,xf,zf,wf,yf,Of,Uf,Dm,Bm,$m;const Em=((wm=oe.layer)==null?void 0:wm.layer.type)==="simple"&&((zf=(xf=(_m=oe.layer)==null?void 0:_m.layer)==null?void 0:xf.data)==null?void 0:zf.isSketchLayer);if(oe.layerId===Tf&&oe.featureId===Cf&&!Em)return;const Qf=await(Df==null?void 0:Df()),Am=Tf&&Cf?(Em?(wf=Qf==null?void 0:Qf.features)==null?void 0:wf.find(Qm=>Qm.id===Cf):(Uf=(yf=F.current)==null?void 0:(Of=yf.engine).findComputedFeatureById)==null?void 0:Uf.call(Of,Tf,Cf))??($f==null?void 0:$f.feature):void 0;nt(Tf&&Cf?($m=(Dm=F.current)==null?void 0:(Bm=Dm.engine).findFeatureById)==null?void 0:$m.call(Bm,Tf,Cf):void 0),yt(Am),W(Qm=>Qm.layerId===Tf&&Qm.featureId===Cf?Qm:{layerId:Tf,featureId:Cf,layer:Qf,reason:Wf}),c==null||c(Tf,Df,Am,Wf)},[oe,c]),zi=React.useRef(),[ha,ba]=useValue(t,d),[Sa,ya]=React.useState(!1),ms=React.useCallback(Tf=>{ya(!!Tf)},[]),[bs,Ra]=useValue(n,h),pi=bs||"default",[mt,fa]=React.useState("auto");React.useEffect(()=>{fa(pi==="sketch"?"crosshair":pi==="move"?"grab":"auto")},[pi]);const Wa=INTERACTION_MODES[pi],sl=React.useRef(),Vd=React.useCallback(Tf=>{sl.current=Tf},[]),Xd=React.useCallback(Tf=>{var Cf;(Cf=sl.current)==null||Cf.call(sl,Tf)},[]),pu=React.useRef(),gl=React.useCallback(Tf=>{pu.current=Tf},[]),md=React.useCallback(Tf=>{var Cf;(Cf=pu.current)==null||Cf.call(pu,Tf)},[]),Gd=React.useRef(),tf=React.useCallback(Tf=>{Gd.current=Tf},[]),nf=React.useCallback(Tf=>{var Cf;(Cf=Gd.current)==null||Cf.call(Gd,Tf)},[]),lf=React.useRef(),ff=React.useCallback(Tf=>{lf.current=Tf},[]),_f=React.useCallback(Tf=>{var Cf;(Cf=lf.current)==null||Cf.call(lf,Tf)},[]),pf=React.useRef(),vf=React.useCallback(Tf=>{pf.current=Tf},[]),Mf=React.useCallback(Tf=>{var Cf;(Cf=pf.current)==null||Cf.call(pf,Tf)},[]),Af=React.useRef(),Lf=React.useCallback(Tf=>{Af.current=Tf},[]),Wc=React.useCallback(Tf=>{var Cf;(Cf=Af.current)==null||Cf.call(Af,Tf)},[]),uf=React.useRef([]),rf=React.useCallback(Tf=>{uf.current.push(Tf)},[]),ef=React.useCallback(Tf=>{uf.current.forEach(Cf=>Cf(Tf))},[]),Zd=React.useRef([]),of=React.useCallback(Tf=>{Zd.current.push(Tf)},[]),hf=React.useCallback(Tf=>{Zd.current.forEach(Cf=>Cf(Tf))},[]),df=React.useRef([]),cf=React.useCallback(Tf=>{df.current.push(Tf)},[]),gf=React.useCallback(Tf=>{df.current.forEach(Cf=>Cf(Tf))},[]),Sf=React.useRef([]),bf=React.useCallback(Tf=>{Sf.current.push(Tf)},[]),Pf=React.useCallback((Tf,Cf)=>{Sf.current.forEach(Df=>Df(Tf)),E==null||E(Tf,Cf)},[E]);React.useEffect(()=>{var Tf,Cf;o&&((Cf=(Tf=F.current)==null?void 0:Tf.engine)==null||Cf.lookAtLayer(o),p==null||p(void 0))},[o,p]);const[If,Nf]=React.useState(!1),Jf=React.useCallback(()=>{Nf(!0)},[]),qf=React.useCallback((Tf,Cf,Df)=>{var Em;Nf(!1);const Wf=(Em=F.current)==null?void 0:Em.layers.findById(Tf),$f=Wf!=null&&Wf.property.default.location?"default.location":Wf!=null&&Wf.property.default.position?"default.position":void 0;Df&&Wf&&Wf.propertyId&&$f&&(y==null||y(Wf.propertyId,$f,Df))},[y,F]),Bf=React.useMemo(()=>({interactionMode:pi,selectedLayer:oe,selectedComputedFeature:Ee,viewport:z,handleCameraForceHorizontalRollChange:ms,handleInteractionModeChange:Ra,onSketchPluginFeatureCreate:rf,onSketchPluginFeatureUpdate:of,onSketchPluginFeatureDelete:cf,onSketchTypeChange:bf,onLayerVisibility:gl,onLayerLoad:tf,onLayerEdit:Vd,onLayerSelectWithRectStart:ff,onLayerSelectWithRectMove:vf,onLayerSelectWithRectEnd:Lf}),[pi,oe,Ee,z,Ra,ms,Vd,rf,of,cf,bf,gl,tf,ff,vf,Lf]),zm=React.useMemo(()=>({position:"relative",width:"100%",height:"100%",overflow:"hidden"}),[]);return useCoreAPI({viewerProperty:s}),{mapRef:F,wrapperRef:N,selectedFeature:lt,camera:ha,featureFlags:Wa,isLayerDragging:If,timelineManagerRef:zi,cursor:mt,cameraForceHorizontalRoll:Sa,coreContextValue:Bf,containerStyle:zm,handleLayerSelect:Ai,handleLayerDrag:Jf,handleLayerDrop:qf,handleLayerEdit:Xd,handleCameraChange:ba,handleInteractionModeChange:Ra,handleSketchPluginFeatureCreate:ef,handleSketchPluginFeatureUpdate:hf,handleSketchPluginFeatureDelete:gf,handleSketchTypeChange:Pf,handleLayerVisibility:md,handleLayerLoad:nf,handleLayerSelectWithRectStart:_f,handleLayerSelectWithRectMove:Mf,handleLayerSelectWithRectEnd:Wc}}function useValue(t,n){const[o,s]=React.useState(t),c=React.useCallback(d=>{d&&(s(d),n==null||n(d))},[n]);return React.useEffect(()=>{s(t)},[t]),[o,c]}const CoreVisualizer=React.memo(React.forwardRef(({engine:t,isBuilt:n,isEditable:o,viewerProperty:s,layers:c,clusters:d,small:h,ready:p,hiddenLayers:y,camera:E,time:L,interactionMode:F,shouldRender:N,meta:z,displayCredits:oe=!0,style:W,zoomedLayerId:lt,children:nt,onLayerDrop:Ee,onLayerSelect:yt,onCameraChange:Ai,onZoomToLayer:zi,onInteractionModeChange:ha,onMount:ba,onSketchTypeChangeProp:Sa,onSketchFeatureCreate:ya,onSketchFeatureUpdate:ms,onSketchFeatureDelete:bs,onAPIReady:Ra,onCreditsUpdate:pi},mt)=>{const{mapRef:fa,wrapperRef:Wa,selectedFeature:sl,camera:Vd,featureFlags:Xd,isLayerDragging:pu,timelineManagerRef:gl,cursor:md,cameraForceHorizontalRoll:Gd,coreContextValue:tf,containerStyle:nf,handleLayerSelect:lf,handleLayerDrag:ff,handleLayerDrop:_f,handleLayerEdit:pf,handleCameraChange:vf,handleInteractionModeChange:Mf,handleSketchPluginFeatureCreate:Af,handleSketchPluginFeatureUpdate:Lf,handleSketchPluginFeatureDelete:Wc,handleSketchTypeChange:uf,handleLayerVisibility:rf,handleLayerLoad:ef,handleLayerSelectWithRectStart:Zd,handleLayerSelectWithRectMove:of,handleLayerSelectWithRectEnd:hf}=useHooks({camera:E,interactionMode:F,zoomedLayerId:lt,viewerProperty:s,onLayerSelect:yt,onCameraChange:Ai,onZoomToLayer:zi,onLayerDrop:Ee,onInteractionModeChange:ha,onSketchTypeChangeProp:Sa},mt);return jsxRuntimeExports.jsx(ErrorBoundary,{FallbackComponent:Error$1,children:jsxRuntimeExports.jsx(VisualizerProvider,{mapRef:fa,children:jsxRuntimeExports.jsxs("div",{ref:Wa,style:nf,children:[jsxRuntimeExports.jsx(Map$1,{ref:fa,isBuilt:n,isEditable:o,engine:t,layers:c,engines,camera:Vd,cameraForceHorizontalRoll:Gd,clusters:d,hiddenLayers:y,isLayerDragging:pu,isLayerDraggable:o,meta:z,displayCredits:oe,style:W,featureFlags:Xd,shouldRender:N,property:s,time:L,small:h,ready:p,timelineManagerRef:gl,interactionMode:F,selectedFeature:sl,cursor:md,onCameraChange:vf,onLayerDrag:ff,onLayerDrop:_f,onLayerSelect:lf,onLayerEdit:pf,overrideInteractionMode:Mf,onSketchFeatureCreate:ya,onSketchPluginFeatureCreate:Af,onSketchFeatureUpdate:ms,onSketchPluginFeatureUpdate:Lf,onSketchFeatureDelete:bs,onSketchPluginFeatureDelete:Wc,onSketchTypeChange:uf,onMount:ba,onLayerVisibility:rf,onLayerLoad:ef,onLayerSelectWithRectStart:Zd,onLayerSelectWithRectMove:of,onLayerSelectWithRectEnd:hf,onAPIReady:Ra,onCreditsUpdate:pi}),jsxRuntimeExports.jsx(coreContext.Provider,{value:tf,children:nt})]})})})}));var global$1=typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{},lookup=[],revLookup=[],Arr=typeof Uint8Array<"u"?Uint8Array:Array,inited=!1;function init(){inited=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=0,o=t.length;n<o;++n)lookup[n]=t[n],revLookup[t.charCodeAt(n)]=n;revLookup[45]=62,revLookup[95]=63}function toByteArray(t){inited||init();var n,o,s,c,d,h,p=t.length;if(p%4>0)throw new Error("Invalid string. Length must be a multiple of 4");d=t[p-2]==="="?2:t[p-1]==="="?1:0,h=new Arr(p*3/4-d),s=d>0?p-4:p;var y=0;for(n=0,o=0;n<s;n+=4,o+=3)c=revLookup[t.charCodeAt(n)]<<18|revLookup[t.charCodeAt(n+1)]<<12|revLookup[t.charCodeAt(n+2)]<<6|revLookup[t.charCodeAt(n+3)],h[y++]=c>>16&255,h[y++]=c>>8&255,h[y++]=c&255;return d===2?(c=revLookup[t.charCodeAt(n)]<<2|revLookup[t.charCodeAt(n+1)]>>4,h[y++]=c&255):d===1&&(c=revLookup[t.charCodeAt(n)]<<10|revLookup[t.charCodeAt(n+1)]<<4|revLookup[t.charCodeAt(n+2)]>>2,h[y++]=c>>8&255,h[y++]=c&255),h}function tripletToBase64(t){return lookup[t>>18&63]+lookup[t>>12&63]+lookup[t>>6&63]+lookup[t&63]}function encodeChunk(t,n,o){for(var s,c=[],d=n;d<o;d+=3)s=(t[d]<<16)+(t[d+1]<<8)+t[d+2],c.push(tripletToBase64(s));return c.join("")}function fromByteArray(t){inited||init();for(var n,o=t.length,s=o%3,c="",d=[],h=16383,p=0,y=o-s;p<y;p+=h)d.push(encodeChunk(t,p,p+h>y?y:p+h));return s===1?(n=t[o-1],c+=lookup[n>>2],c+=lookup[n<<4&63],c+="=="):s===2&&(n=(t[o-2]<<8)+t[o-1],c+=lookup[n>>10],c+=lookup[n>>4&63],c+=lookup[n<<2&63],c+="="),d.push(c),d.join("")}function read(t,n,o,s,c){var d,h,p=c*8-s-1,y=(1<<p)-1,E=y>>1,L=-7,F=o?c-1:0,N=o?-1:1,z=t[n+F];for(F+=N,d=z&(1<<-L)-1,z>>=-L,L+=p;L>0;d=d*256+t[n+F],F+=N,L-=8);for(h=d&(1<<-L)-1,d>>=-L,L+=s;L>0;h=h*256+t[n+F],F+=N,L-=8);if(d===0)d=1-E;else{if(d===y)return h?NaN:(z?-1:1)*(1/0);h=h+Math.pow(2,s),d=d-E}return(z?-1:1)*h*Math.pow(2,d-s)}function write(t,n,o,s,c,d){var h,p,y,E=d*8-c-1,L=(1<<E)-1,F=L>>1,N=c===23?Math.pow(2,-24)-Math.pow(2,-77):0,z=s?0:d-1,oe=s?1:-1,W=n<0||n===0&&1/n<0?1:0;for(n=Math.abs(n),isNaN(n)||n===1/0?(p=isNaN(n)?1:0,h=L):(h=Math.floor(Math.log(n)/Math.LN2),n*(y=Math.pow(2,-h))<1&&(h--,y*=2),h+F>=1?n+=N/y:n+=N*Math.pow(2,1-F),n*y>=2&&(h++,y/=2),h+F>=L?(p=0,h=L):h+F>=1?(p=(n*y-1)*Math.pow(2,c),h=h+F):(p=n*Math.pow(2,F-1)*Math.pow(2,c),h=0));c>=8;t[o+z]=p&255,z+=oe,p/=256,c-=8);for(h=h<<c|p,E+=c;E>0;t[o+z]=h&255,z+=oe,h/=256,E-=8);t[o+z-oe]|=W*128}var toString={}.toString,isArray$1=Array.isArray||function(t){return toString.call(t)=="[object Array]"},INSPECT_MAX_BYTES=50;Buffer$1.TYPED_ARRAY_SUPPORT=global$1.TYPED_ARRAY_SUPPORT!==void 0?global$1.TYPED_ARRAY_SUPPORT:!0,kMaxLength();function kMaxLength(){return Buffer$1.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function createBuffer(t,n){if(kMaxLength()<n)throw new RangeError("Invalid typed array length");return Buffer$1.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(n),t.__proto__=Buffer$1.prototype):(t===null&&(t=new Buffer$1(n)),t.length=n),t}function Buffer$1(t,n,o){if(!Buffer$1.TYPED_ARRAY_SUPPORT&&!(this instanceof Buffer$1))return new Buffer$1(t,n,o);if(typeof t=="number"){if(typeof n=="string")throw new Error("If encoding is specified then the first argument must be a string");return allocUnsafe(this,t)}return from(this,t,n,o)}Buffer$1.poolSize=8192,Buffer$1._augment=function(t){return t.__proto__=Buffer$1.prototype,t};function from(t,n,o,s){if(typeof n=="number")throw new TypeError('"value" argument must not be a number');return typeof ArrayBuffer<"u"&&n instanceof ArrayBuffer?fromArrayBuffer(t,n,o,s):typeof n=="string"?fromString(t,n,o):fromObject(t,n)}Buffer$1.from=function(t,n,o){return from(null,t,n,o)},Buffer$1.TYPED_ARRAY_SUPPORT&&(Buffer$1.prototype.__proto__=Uint8Array.prototype,Buffer$1.__proto__=Uint8Array,typeof Symbol<"u"&&Symbol.species&&Buffer$1[Symbol.species]);function assertSize(t){if(typeof t!="number")throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative')}function alloc(t,n,o,s){return assertSize(n),n<=0?createBuffer(t,n):o!==void 0?typeof s=="string"?createBuffer(t,n).fill(o,s):createBuffer(t,n).fill(o):createBuffer(t,n)}Buffer$1.alloc=function(t,n,o){return alloc(null,t,n,o)};function allocUnsafe(t,n){if(assertSize(n),t=createBuffer(t,n<0?0:checked(n)|0),!Buffer$1.TYPED_ARRAY_SUPPORT)for(var o=0;o<n;++o)t[o]=0;return t}Buffer$1.allocUnsafe=function(t){return allocUnsafe(null,t)},Buffer$1.allocUnsafeSlow=function(t){return allocUnsafe(null,t)};function fromString(t,n,o){if((typeof o!="string"||o==="")&&(o="utf8"),!Buffer$1.isEncoding(o))throw new TypeError('"encoding" must be a valid string encoding');var s=byteLength(n,o)|0;t=createBuffer(t,s);var c=t.write(n,o);return c!==s&&(t=t.slice(0,c)),t}function fromArrayLike(t,n){var o=n.length<0?0:checked(n.length)|0;t=createBuffer(t,o);for(var s=0;s<o;s+=1)t[s]=n[s]&255;return t}function fromArrayBuffer(t,n,o,s){if(n.byteLength,o<0||n.byteLength<o)throw new RangeError("'offset' is out of bounds");if(n.byteLength<o+(s||0))throw new RangeError("'length' is out of bounds");return o===void 0&&s===void 0?n=new Uint8Array(n):s===void 0?n=new Uint8Array(n,o):n=new Uint8Array(n,o,s),Buffer$1.TYPED_ARRAY_SUPPORT?(t=n,t.__proto__=Buffer$1.prototype):t=fromArrayLike(t,n),t}function fromObject(t,n){if(internalIsBuffer(n)){var o=checked(n.length)|0;return t=createBuffer(t,o),t.length===0||n.copy(t,0,0,o),t}if(n){if(typeof ArrayBuffer<"u"&&n.buffer instanceof ArrayBuffer||"length"in n)return typeof n.length!="number"||isnan(n.length)?createBuffer(t,0):fromArrayLike(t,n);if(n.type==="Buffer"&&isArray$1(n.data))return fromArrayLike(t,n.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function checked(t){if(t>=kMaxLength())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength().toString(16)+" bytes");return t|0}Buffer$1.isBuffer=isBuffer;function internalIsBuffer(t){return!!(t!=null&&t._isBuffer)}Buffer$1.compare=function t(n,o){if(!internalIsBuffer(n)||!internalIsBuffer(o))throw new TypeError("Arguments must be Buffers");if(n===o)return 0;for(var s=n.length,c=o.length,d=0,h=Math.min(s,c);d<h;++d)if(n[d]!==o[d]){s=n[d],c=o[d];break}return s<c?-1:c<s?1:0},Buffer$1.isEncoding=function t(n){switch(String(n).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},Buffer$1.concat=function t(n,o){if(!isArray$1(n))throw new TypeError('"list" argument must be an Array of Buffers');if(n.length===0)return Buffer$1.alloc(0);var s;if(o===void 0)for(o=0,s=0;s<n.length;++s)o+=n[s].length;var c=Buffer$1.allocUnsafe(o),d=0;for(s=0;s<n.length;++s){var h=n[s];if(!internalIsBuffer(h))throw new TypeError('"list" argument must be an Array of Buffers');h.copy(c,d),d+=h.length}return c};function byteLength(t,n){if(internalIsBuffer(t))return t.length;if(typeof ArrayBuffer<"u"&&typeof ArrayBuffer.isView=="function"&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;typeof t!="string"&&(t=""+t);var o=t.length;if(o===0)return 0;for(var s=!1;;)switch(n){case"ascii":case"latin1":case"binary":return o;case"utf8":case"utf-8":case void 0:return utf8ToBytes(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return o*2;case"hex":return o>>>1;case"base64":return base64ToBytes(t).length;default:if(s)return utf8ToBytes(t).length;n=(""+n).toLowerCase(),s=!0}}Buffer$1.byteLength=byteLength;function slowToString(t,n,o){var s=!1;if((n===void 0||n<0)&&(n=0),n>this.length||((o===void 0||o>this.length)&&(o=this.length),o<=0)||(o>>>=0,n>>>=0,o<=n))return"";for(t||(t="utf8");;)switch(t){case"hex":return hexSlice(this,n,o);case"utf8":case"utf-8":return utf8Slice(this,n,o);case"ascii":return asciiSlice(this,n,o);case"latin1":case"binary":return latin1Slice(this,n,o);case"base64":return base64Slice(this,n,o);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,n,o);default:if(s)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),s=!0}}Buffer$1.prototype._isBuffer=!0;function swap(t,n,o){var s=t[n];t[n]=t[o],t[o]=s}Buffer$1.prototype.swap16=function t(){var n=this.length;if(n%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var o=0;o<n;o+=2)swap(this,o,o+1);return this},Buffer$1.prototype.swap32=function t(){var n=this.length;if(n%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var o=0;o<n;o+=4)swap(this,o,o+3),swap(this,o+1,o+2);return this},Buffer$1.prototype.swap64=function t(){var n=this.length;if(n%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var o=0;o<n;o+=8)swap(this,o,o+7),swap(this,o+1,o+6),swap(this,o+2,o+5),swap(this,o+3,o+4);return this},Buffer$1.prototype.toString=function t(){var n=this.length|0;return n===0?"":arguments.length===0?utf8Slice(this,0,n):slowToString.apply(this,arguments)},Buffer$1.prototype.equals=function t(n){if(!internalIsBuffer(n))throw new TypeError("Argument must be a Buffer");return this===n?!0:Buffer$1.compare(this,n)===0},Buffer$1.prototype.inspect=function t(){var n="",o=INSPECT_MAX_BYTES;return this.length>0&&(n=this.toString("hex",0,o).match(/.{2}/g).join(" "),this.length>o&&(n+=" ... ")),"<Buffer "+n+">"},Buffer$1.prototype.compare=function t(n,o,s,c,d){if(!internalIsBuffer(n))throw new TypeError("Argument must be a Buffer");if(o===void 0&&(o=0),s===void 0&&(s=n?n.length:0),c===void 0&&(c=0),d===void 0&&(d=this.length),o<0||s>n.length||c<0||d>this.length)throw new RangeError("out of range index");if(c>=d&&o>=s)return 0;if(c>=d)return-1;if(o>=s)return 1;if(o>>>=0,s>>>=0,c>>>=0,d>>>=0,this===n)return 0;for(var h=d-c,p=s-o,y=Math.min(h,p),E=this.slice(c,d),L=n.slice(o,s),F=0;F<y;++F)if(E[F]!==L[F]){h=E[F],p=L[F];break}return h<p?-1:p<h?1:0};function bidirectionalIndexOf(t,n,o,s,c){if(t.length===0)return-1;if(typeof o=="string"?(s=o,o=0):o>2147483647?o=2147483647:o<-2147483648&&(o=-2147483648),o=+o,isNaN(o)&&(o=c?0:t.length-1),o<0&&(o=t.length+o),o>=t.length){if(c)return-1;o=t.length-1}else if(o<0)if(c)o=0;else return-1;if(typeof n=="string"&&(n=Buffer$1.from(n,s)),internalIsBuffer(n))return n.length===0?-1:arrayIndexOf(t,n,o,s,c);if(typeof n=="number")return n=n&255,Buffer$1.TYPED_ARRAY_SUPPORT&&typeof Uint8Array.prototype.indexOf=="function"?c?Uint8Array.prototype.indexOf.call(t,n,o):Uint8Array.prototype.lastIndexOf.call(t,n,o):arrayIndexOf(t,[n],o,s,c);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(t,n,o,s,c){var d=1,h=t.length,p=n.length;if(s!==void 0&&(s=String(s).toLowerCase(),s==="ucs2"||s==="ucs-2"||s==="utf16le"||s==="utf-16le")){if(t.length<2||n.length<2)return-1;d=2,h/=2,p/=2,o/=2}function y(z,oe){return d===1?z[oe]:z.readUInt16BE(oe*d)}var E;if(c){var L=-1;for(E=o;E<h;E++)if(y(t,E)===y(n,L===-1?0:E-L)){if(L===-1&&(L=E),E-L+1===p)return L*d}else L!==-1&&(E-=E-L),L=-1}else for(o+p>h&&(o=h-p),E=o;E>=0;E--){for(var F=!0,N=0;N<p;N++)if(y(t,E+N)!==y(n,N)){F=!1;break}if(F)return E}return-1}Buffer$1.prototype.includes=function t(n,o,s){return this.indexOf(n,o,s)!==-1},Buffer$1.prototype.indexOf=function t(n,o,s){return bidirectionalIndexOf(this,n,o,s,!0)},Buffer$1.prototype.lastIndexOf=function t(n,o,s){return bidirectionalIndexOf(this,n,o,s,!1)};function hexWrite(t,n,o,s){o=Number(o)||0;var c=t.length-o;s?(s=Number(s),s>c&&(s=c)):s=c;var d=n.length;if(d%2!==0)throw new TypeError("Invalid hex string");s>d/2&&(s=d/2);for(var h=0;h<s;++h){var p=parseInt(n.substr(h*2,2),16);if(isNaN(p))return h;t[o+h]=p}return h}function utf8Write(t,n,o,s){return blitBuffer(utf8ToBytes(n,t.length-o),t,o,s)}function asciiWrite(t,n,o,s){return blitBuffer(asciiToBytes(n),t,o,s)}function latin1Write(t,n,o,s){return asciiWrite(t,n,o,s)}function base64Write(t,n,o,s){return blitBuffer(base64ToBytes(n),t,o,s)}function ucs2Write(t,n,o,s){return blitBuffer(utf16leToBytes(n,t.length-o),t,o,s)}Buffer$1.prototype.write=function t(n,o,s,c){if(o===void 0)c="utf8",s=this.length,o=0;else if(s===void 0&&typeof o=="string")c=o,s=this.length,o=0;else if(isFinite(o))o=o|0,isFinite(s)?(s=s|0,c===void 0&&(c="utf8")):(c=s,s=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");var d=this.length-o;if((s===void 0||s>d)&&(s=d),n.length>0&&(s<0||o<0)||o>this.length)throw new RangeError("Attempt to write outside buffer bounds");c||(c="utf8");for(var h=!1;;)switch(c){case"hex":return hexWrite(this,n,o,s);case"utf8":case"utf-8":return utf8Write(this,n,o,s);case"ascii":return asciiWrite(this,n,o,s);case"latin1":case"binary":return latin1Write(this,n,o,s);case"base64":return base64Write(this,n,o,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,n,o,s);default:if(h)throw new TypeError("Unknown encoding: "+c);c=(""+c).toLowerCase(),h=!0}},Buffer$1.prototype.toJSON=function t(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function base64Slice(t,n,o){return n===0&&o===t.length?fromByteArray(t):fromByteArray(t.slice(n,o))}function utf8Slice(t,n,o){o=Math.min(t.length,o);for(var s=[],c=n;c<o;){var d=t[c],h=null,p=d>239?4:d>223?3:d>191?2:1;if(c+p<=o){var y,E,L,F;switch(p){case 1:d<128&&(h=d);break;case 2:y=t[c+1],(y&192)===128&&(F=(d&31)<<6|y&63,F>127&&(h=F));break;case 3:y=t[c+1],E=t[c+2],(y&192)===128&&(E&192)===128&&(F=(d&15)<<12|(y&63)<<6|E&63,F>2047&&(F<55296||F>57343)&&(h=F));break;case 4:y=t[c+1],E=t[c+2],L=t[c+3],(y&192)===128&&(E&192)===128&&(L&192)===128&&(F=(d&15)<<18|(y&63)<<12|(E&63)<<6|L&63,F>65535&&F<1114112&&(h=F))}}h===null?(h=65533,p=1):h>65535&&(h-=65536,s.push(h>>>10&1023|55296),h=56320|h&1023),s.push(h),c+=p}return decodeCodePointsArray(s)}var MAX_ARGUMENTS_LENGTH=4096;function decodeCodePointsArray(t){var n=t.length;if(n<=MAX_ARGUMENTS_LENGTH)return String.fromCharCode.apply(String,t);for(var o="",s=0;s<n;)o+=String.fromCharCode.apply(String,t.slice(s,s+=MAX_ARGUMENTS_LENGTH));return o}function asciiSlice(t,n,o){var s="";o=Math.min(t.length,o);for(var c=n;c<o;++c)s+=String.fromCharCode(t[c]&127);return s}function latin1Slice(t,n,o){var s="";o=Math.min(t.length,o);for(var c=n;c<o;++c)s+=String.fromCharCode(t[c]);return s}function hexSlice(t,n,o){var s=t.length;(!n||n<0)&&(n=0),(!o||o<0||o>s)&&(o=s);for(var c="",d=n;d<o;++d)c+=toHex(t[d]);return c}function utf16leSlice(t,n,o){for(var s=t.slice(n,o),c="",d=0;d<s.length;d+=2)c+=String.fromCharCode(s[d]+s[d+1]*256);return c}Buffer$1.prototype.slice=function t(n,o){var s=this.length;n=~~n,o=o===void 0?s:~~o,n<0?(n+=s,n<0&&(n=0)):n>s&&(n=s),o<0?(o+=s,o<0&&(o=0)):o>s&&(o=s),o<n&&(o=n);var c;if(Buffer$1.TYPED_ARRAY_SUPPORT)c=this.subarray(n,o),c.__proto__=Buffer$1.prototype;else{var d=o-n;c=new Buffer$1(d,void 0);for(var h=0;h<d;++h)c[h]=this[h+n]}return c};function checkOffset(t,n,o){if(t%1!==0||t<0)throw new RangeError("offset is not uint");if(t+n>o)throw new RangeError("Trying to access beyond buffer length")}Buffer$1.prototype.readUIntLE=function t(n,o,s){n=n|0,o=o|0,s||checkOffset(n,o,this.length);for(var c=this[n],d=1,h=0;++h<o&&(d*=256);)c+=this[n+h]*d;return c},Buffer$1.prototype.readUIntBE=function t(n,o,s){n=n|0,o=o|0,s||checkOffset(n,o,this.length);for(var c=this[n+--o],d=1;o>0&&(d*=256);)c+=this[n+--o]*d;return c},Buffer$1.prototype.readUInt8=function t(n,o){return o||checkOffset(n,1,this.length),this[n]},Buffer$1.prototype.readUInt16LE=function t(n,o){return o||checkOffset(n,2,this.length),this[n]|this[n+1]<<8},Buffer$1.prototype.readUInt16BE=function t(n,o){return o||checkOffset(n,2,this.length),this[n]<<8|this[n+1]},Buffer$1.prototype.readUInt32LE=function t(n,o){return o||checkOffset(n,4,this.length),(this[n]|this[n+1]<<8|this[n+2]<<16)+this[n+3]*16777216},Buffer$1.prototype.readUInt32BE=function t(n,o){return o||checkOffset(n,4,this.length),this[n]*16777216+(this[n+1]<<16|this[n+2]<<8|this[n+3])},Buffer$1.prototype.readIntLE=function t(n,o,s){n=n|0,o=o|0,s||checkOffset(n,o,this.length);for(var c=this[n],d=1,h=0;++h<o&&(d*=256);)c+=this[n+h]*d;return d*=128,c>=d&&(c-=Math.pow(2,8*o)),c},Buffer$1.prototype.readIntBE=function t(n,o,s){n=n|0,o=o|0,s||checkOffset(n,o,this.length);for(var c=o,d=1,h=this[n+--c];c>0&&(d*=256);)h+=this[n+--c]*d;return d*=128,h>=d&&(h-=Math.pow(2,8*o)),h},Buffer$1.prototype.readInt8=function t(n,o){return o||checkOffset(n,1,this.length),this[n]&128?(255-this[n]+1)*-1:this[n]},Buffer$1.prototype.readInt16LE=function t(n,o){o||checkOffset(n,2,this.length);var s=this[n]|this[n+1]<<8;return s&32768?s|4294901760:s},Buffer$1.prototype.readInt16BE=function t(n,o){o||checkOffset(n,2,this.length);var s=this[n+1]|this[n]<<8;return s&32768?s|4294901760:s},Buffer$1.prototype.readInt32LE=function t(n,o){return o||checkOffset(n,4,this.length),this[n]|this[n+1]<<8|this[n+2]<<16|this[n+3]<<24},Buffer$1.prototype.readInt32BE=function t(n,o){return o||checkOffset(n,4,this.length),this[n]<<24|this[n+1]<<16|this[n+2]<<8|this[n+3]},Buffer$1.prototype.readFloatLE=function t(n,o){return o||checkOffset(n,4,this.length),read(this,n,!0,23,4)},Buffer$1.prototype.readFloatBE=function t(n,o){return o||checkOffset(n,4,this.length),read(this,n,!1,23,4)},Buffer$1.prototype.readDoubleLE=function t(n,o){return o||checkOffset(n,8,this.length),read(this,n,!0,52,8)},Buffer$1.prototype.readDoubleBE=function t(n,o){return o||checkOffset(n,8,this.length),read(this,n,!1,52,8)};function checkInt(t,n,o,s,c,d){if(!internalIsBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(n>c||n<d)throw new RangeError('"value" argument is out of bounds');if(o+s>t.length)throw new RangeError("Index out of range")}Buffer$1.prototype.writeUIntLE=function t(n,o,s,c){if(n=+n,o=o|0,s=s|0,!c){var d=Math.pow(2,8*s)-1;checkInt(this,n,o,s,d,0)}var h=1,p=0;for(this[o]=n&255;++p<s&&(h*=256);)this[o+p]=n/h&255;return o+s},Buffer$1.prototype.writeUIntBE=function t(n,o,s,c){if(n=+n,o=o|0,s=s|0,!c){var d=Math.pow(2,8*s)-1;checkInt(this,n,o,s,d,0)}var h=s-1,p=1;for(this[o+h]=n&255;--h>=0&&(p*=256);)this[o+h]=n/p&255;return o+s},Buffer$1.prototype.writeUInt8=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,1,255,0),Buffer$1.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),this[o]=n&255,o+1};function objectWriteUInt16(t,n,o,s){n<0&&(n=65535+n+1);for(var c=0,d=Math.min(t.length-o,2);c<d;++c)t[o+c]=(n&255<<8*(s?c:1-c))>>>(s?c:1-c)*8}Buffer$1.prototype.writeUInt16LE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,2,65535,0),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n&255,this[o+1]=n>>>8):objectWriteUInt16(this,n,o,!0),o+2},Buffer$1.prototype.writeUInt16BE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,2,65535,0),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n>>>8,this[o+1]=n&255):objectWriteUInt16(this,n,o,!1),o+2};function objectWriteUInt32(t,n,o,s){n<0&&(n=4294967295+n+1);for(var c=0,d=Math.min(t.length-o,4);c<d;++c)t[o+c]=n>>>(s?c:3-c)*8&255}Buffer$1.prototype.writeUInt32LE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,4,4294967295,0),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o+3]=n>>>24,this[o+2]=n>>>16,this[o+1]=n>>>8,this[o]=n&255):objectWriteUInt32(this,n,o,!0),o+4},Buffer$1.prototype.writeUInt32BE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,4,4294967295,0),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n>>>24,this[o+1]=n>>>16,this[o+2]=n>>>8,this[o+3]=n&255):objectWriteUInt32(this,n,o,!1),o+4},Buffer$1.prototype.writeIntLE=function t(n,o,s,c){if(n=+n,o=o|0,!c){var d=Math.pow(2,8*s-1);checkInt(this,n,o,s,d-1,-d)}var h=0,p=1,y=0;for(this[o]=n&255;++h<s&&(p*=256);)n<0&&y===0&&this[o+h-1]!==0&&(y=1),this[o+h]=(n/p>>0)-y&255;return o+s},Buffer$1.prototype.writeIntBE=function t(n,o,s,c){if(n=+n,o=o|0,!c){var d=Math.pow(2,8*s-1);checkInt(this,n,o,s,d-1,-d)}var h=s-1,p=1,y=0;for(this[o+h]=n&255;--h>=0&&(p*=256);)n<0&&y===0&&this[o+h+1]!==0&&(y=1),this[o+h]=(n/p>>0)-y&255;return o+s},Buffer$1.prototype.writeInt8=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,1,127,-128),Buffer$1.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),n<0&&(n=255+n+1),this[o]=n&255,o+1},Buffer$1.prototype.writeInt16LE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,2,32767,-32768),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n&255,this[o+1]=n>>>8):objectWriteUInt16(this,n,o,!0),o+2},Buffer$1.prototype.writeInt16BE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,2,32767,-32768),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n>>>8,this[o+1]=n&255):objectWriteUInt16(this,n,o,!1),o+2},Buffer$1.prototype.writeInt32LE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,4,2147483647,-2147483648),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n&255,this[o+1]=n>>>8,this[o+2]=n>>>16,this[o+3]=n>>>24):objectWriteUInt32(this,n,o,!0),o+4},Buffer$1.prototype.writeInt32BE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,4,2147483647,-2147483648),n<0&&(n=4294967295+n+1),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n>>>24,this[o+1]=n>>>16,this[o+2]=n>>>8,this[o+3]=n&255):objectWriteUInt32(this,n,o,!1),o+4};function checkIEEE754(t,n,o,s,c,d){if(o+s>t.length)throw new RangeError("Index out of range");if(o<0)throw new RangeError("Index out of range")}function writeFloat(t,n,o,s,c){return c||checkIEEE754(t,n,o,4),write(t,n,o,s,23,4),o+4}Buffer$1.prototype.writeFloatLE=function t(n,o,s){return writeFloat(this,n,o,!0,s)},Buffer$1.prototype.writeFloatBE=function t(n,o,s){return writeFloat(this,n,o,!1,s)};function writeDouble(t,n,o,s,c){return c||checkIEEE754(t,n,o,8),write(t,n,o,s,52,8),o+8}Buffer$1.prototype.writeDoubleLE=function t(n,o,s){return writeDouble(this,n,o,!0,s)},Buffer$1.prototype.writeDoubleBE=function t(n,o,s){return writeDouble(this,n,o,!1,s)},Buffer$1.prototype.copy=function t(n,o,s,c){if(s||(s=0),!c&&c!==0&&(c=this.length),o>=n.length&&(o=n.length),o||(o=0),c>0&&c<s&&(c=s),c===s||n.length===0||this.length===0)return 0;if(o<0)throw new RangeError("targetStart out of bounds");if(s<0||s>=this.length)throw new RangeError("sourceStart out of bounds");if(c<0)throw new RangeError("sourceEnd out of bounds");c>this.length&&(c=this.length),n.length-o<c-s&&(c=n.length-o+s);var d=c-s,h;if(this===n&&s<o&&o<c)for(h=d-1;h>=0;--h)n[h+o]=this[h+s];else if(d<1e3||!Buffer$1.TYPED_ARRAY_SUPPORT)for(h=0;h<d;++h)n[h+o]=this[h+s];else Uint8Array.prototype.set.call(n,this.subarray(s,s+d),o);return d},Buffer$1.prototype.fill=function t(n,o,s,c){if(typeof n=="string"){if(typeof o=="string"?(c=o,o=0,s=this.length):typeof s=="string"&&(c=s,s=this.length),n.length===1){var d=n.charCodeAt(0);d<256&&(n=d)}if(c!==void 0&&typeof c!="string")throw new TypeError("encoding must be a string");if(typeof c=="string"&&!Buffer$1.isEncoding(c))throw new TypeError("Unknown encoding: "+c)}else typeof n=="number"&&(n=n&255);if(o<0||this.length<o||this.length<s)throw new RangeError("Out of range index");if(s<=o)return this;o=o>>>0,s=s===void 0?this.length:s>>>0,n||(n=0);var h;if(typeof n=="number")for(h=o;h<s;++h)this[h]=n;else{var p=internalIsBuffer(n)?n:utf8ToBytes(new Buffer$1(n,c).toString()),y=p.length;for(h=0;h<s-o;++h)this[h+o]=p[h%y]}return this};var INVALID_BASE64_RE=/[^+\/0-9A-Za-z-_]/g;function base64clean(t){if(t=stringtrim(t).replace(INVALID_BASE64_RE,""),t.length<2)return"";for(;t.length%4!==0;)t=t+"=";return t}function stringtrim(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function toHex(t){return t<16?"0"+t.toString(16):t.toString(16)}function utf8ToBytes(t,n){n=n||1/0;for(var o,s=t.length,c=null,d=[],h=0;h<s;++h){if(o=t.charCodeAt(h),o>55295&&o<57344){if(!c){if(o>56319){(n-=3)>-1&&d.push(239,191,189);continue}else if(h+1===s){(n-=3)>-1&&d.push(239,191,189);continue}c=o;continue}if(o<56320){(n-=3)>-1&&d.push(239,191,189),c=o;continue}o=(c-55296<<10|o-56320)+65536}else c&&(n-=3)>-1&&d.push(239,191,189);if(c=null,o<128){if((n-=1)<0)break;d.push(o)}else if(o<2048){if((n-=2)<0)break;d.push(o>>6|192,o&63|128)}else if(o<65536){if((n-=3)<0)break;d.push(o>>12|224,o>>6&63|128,o&63|128)}else if(o<1114112){if((n-=4)<0)break;d.push(o>>18|240,o>>12&63|128,o>>6&63|128,o&63|128)}else throw new Error("Invalid code point")}return d}function asciiToBytes(t){for(var n=[],o=0;o<t.length;++o)n.push(t.charCodeAt(o)&255);return n}function utf16leToBytes(t,n){for(var o,s,c,d=[],h=0;h<t.length&&!((n-=2)<0);++h)o=t.charCodeAt(h),s=o>>8,c=o%256,d.push(c),d.push(s);return d}function base64ToBytes(t){return toByteArray(base64clean(t))}function blitBuffer(t,n,o,s){for(var c=0;c<s&&!(c+o>=n.length||c>=t.length);++c)n[c+o]=t[c];return c}function isnan(t){return t!==t}function isBuffer(t){return t!=null&&(!!t._isBuffer||isFastBuffer(t)||isSlowBuffer(t))}function isFastBuffer(t){return!!t.constructor&&typeof t.constructor.isBuffer=="function"&&t.constructor.isBuffer(t)}function isSlowBuffer(t){return typeof t.readFloatLE=="function"&&typeof t.slice=="function"&&isFastBuffer(t.slice(0,0))}var domain;function EventHandlers(){}EventHandlers.prototype=Object.create(null);function EventEmitter(){EventEmitter.init.call(this)}EventEmitter.EventEmitter=EventEmitter,EventEmitter.usingDomains=!1,EventEmitter.prototype.domain=void 0,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.init=function(){this.domain=null,EventEmitter.usingDomains&&domain.active,(!this._events||this._events===Object.getPrototypeOf(this)._events)&&(this._events=new EventHandlers,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},EventEmitter.prototype.setMaxListeners=function t(n){if(typeof n!="number"||n<0||isNaN(n))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=n,this};function $getMaxListeners(t){return t._maxListeners===void 0?EventEmitter.defaultMaxListeners:t._maxListeners}EventEmitter.prototype.getMaxListeners=function t(){return $getMaxListeners(this)};function emitNone(t,n,o){if(n)t.call(o);else for(var s=t.length,c=arrayClone(t,s),d=0;d<s;++d)c[d].call(o)}function emitOne(t,n,o,s){if(n)t.call(o,s);else for(var c=t.length,d=arrayClone(t,c),h=0;h<c;++h)d[h].call(o,s)}function emitTwo(t,n,o,s,c){if(n)t.call(o,s,c);else for(var d=t.length,h=arrayClone(t,d),p=0;p<d;++p)h[p].call(o,s,c)}function emitThree(t,n,o,s,c,d){if(n)t.call(o,s,c,d);else for(var h=t.length,p=arrayClone(t,h),y=0;y<h;++y)p[y].call(o,s,c,d)}function emitMany(t,n,o,s){if(n)t.apply(o,s);else for(var c=t.length,d=arrayClone(t,c),h=0;h<c;++h)d[h].apply(o,s)}EventEmitter.prototype.emit=function t(n){var o,s,c,d,h,p,y,E=n==="error";if(p=this._events,p)E=E&&p.error==null;else if(!E)return!1;if(y=this.domain,E){if(o=arguments[1],y)o||(o=new Error('Uncaught, unspecified "error" event')),o.domainEmitter=this,o.domain=y,o.domainThrown=!1,y.emit("error",o);else{if(o instanceof Error)throw o;var L=new Error('Uncaught, unspecified "error" event. ('+o+")");throw L.context=o,L}return!1}if(s=p[n],!s)return!1;var F=typeof s=="function";switch(c=arguments.length,c){case 1:emitNone(s,F,this);break;case 2:emitOne(s,F,this,arguments[1]);break;case 3:emitTwo(s,F,this,arguments[1],arguments[2]);break;case 4:emitThree(s,F,this,arguments[1],arguments[2],arguments[3]);break;default:for(d=new Array(c-1),h=1;h<c;h++)d[h-1]=arguments[h];emitMany(s,F,this,d)}return!0};function _addListener(t,n,o,s){var c,d,h;if(typeof o!="function")throw new TypeError('"listener" argument must be a function');if(d=t._events,d?(d.newListener&&(t.emit("newListener",n,o.listener?o.listener:o),d=t._events),h=d[n]):(d=t._events=new EventHandlers,t._eventsCount=0),!h)h=d[n]=o,++t._eventsCount;else if(typeof h=="function"?h=d[n]=s?[o,h]:[h,o]:s?h.unshift(o):h.push(o),!h.warned&&(c=$getMaxListeners(t),c&&c>0&&h.length>c)){h.warned=!0;var p=new Error("Possible EventEmitter memory leak detected. "+h.length+" "+n+" listeners added. Use emitter.setMaxListeners() to increase limit");p.name="MaxListenersExceededWarning",p.emitter=t,p.type=n,p.count=h.length,emitWarning(p)}return t}function emitWarning(t){typeof console.warn=="function"?console.warn(t):console.log(t)}EventEmitter.prototype.addListener=function t(n,o){return _addListener(this,n,o,!1)},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.prependListener=function t(n,o){return _addListener(this,n,o,!0)};function _onceWrap(t,n,o){var s=!1;function c(){t.removeListener(n,c),s||(s=!0,o.apply(t,arguments))}return c.listener=o,c}EventEmitter.prototype.once=function t(n,o){if(typeof o!="function")throw new TypeError('"listener" argument must be a function');return this.on(n,_onceWrap(this,n,o)),this},EventEmitter.prototype.prependOnceListener=function t(n,o){if(typeof o!="function")throw new TypeError('"listener" argument must be a function');return this.prependListener(n,_onceWrap(this,n,o)),this},EventEmitter.prototype.removeListener=function t(n,o){var s,c,d,h,p;if(typeof o!="function")throw new TypeError('"listener" argument must be a function');if(c=this._events,!c)return this;if(s=c[n],!s)return this;if(s===o||s.listener&&s.listener===o)--this._eventsCount===0?this._events=new EventHandlers:(delete c[n],c.removeListener&&this.emit("removeListener",n,s.listener||o));else if(typeof s!="function"){for(d=-1,h=s.length;h-- >0;)if(s[h]===o||s[h].listener&&s[h].listener===o){p=s[h].listener,d=h;break}if(d<0)return this;if(s.length===1){if(s[0]=void 0,--this._eventsCount===0)return this._events=new EventHandlers,this;delete c[n]}else spliceOne(s,d);c.removeListener&&this.emit("removeListener",n,p||o)}return this},EventEmitter.prototype.removeAllListeners=function t(n){var o,s;if(s=this._events,!s)return this;if(!s.removeListener)return arguments.length===0?(this._events=new EventHandlers,this._eventsCount=0):s[n]&&(--this._eventsCount===0?this._events=new EventHandlers:delete s[n]),this;if(arguments.length===0){for(var c=Object.keys(s),d=0,h;d<c.length;++d)h=c[d],h!=="removeListener"&&this.removeAllListeners(h);return this.removeAllListeners("removeListener"),this._events=new EventHandlers,this._eventsCount=0,this}if(o=s[n],typeof o=="function")this.removeListener(n,o);else if(o)do this.removeListener(n,o[o.length-1]);while(o[0]);return this},EventEmitter.prototype.listeners=function t(n){var o,s,c=this._events;return c?(o=c[n],o?typeof o=="function"?s=[o.listener||o]:s=unwrapListeners(o):s=[]):s=[],s},EventEmitter.listenerCount=function(t,n){return typeof t.listenerCount=="function"?t.listenerCount(n):listenerCount$1.call(t,n)},EventEmitter.prototype.listenerCount=listenerCount$1;function listenerCount$1(t){var n=this._events;if(n){var o=n[t];if(typeof o=="function")return 1;if(o)return o.length}return 0}EventEmitter.prototype.eventNames=function t(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};function spliceOne(t,n){for(var o=n,s=o+1,c=t.length;s<c;o+=1,s+=1)t[o]=t[s];t.pop()}function arrayClone(t,n){for(var o=new Array(n);n--;)o[n]=t[n];return o}function unwrapListeners(t){for(var n=new Array(t.length),o=0;o<n.length;++o)n[o]=t[o].listener||t[o];return n}function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}var cachedSetTimeout=defaultSetTimout,cachedClearTimeout=defaultClearTimeout;typeof global$1.setTimeout=="function"&&(cachedSetTimeout=setTimeout),typeof global$1.clearTimeout=="function"&&(cachedClearTimeout=clearTimeout);function runTimeout(t){if(cachedSetTimeout===setTimeout)return setTimeout(t,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(t,0);try{return cachedSetTimeout(t,0)}catch{try{return cachedSetTimeout.call(null,t,0)}catch{return cachedSetTimeout.call(this,t,0)}}}function runClearTimeout(t){if(cachedClearTimeout===clearTimeout)return clearTimeout(t);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(t);try{return cachedClearTimeout(t)}catch{try{return cachedClearTimeout.call(null,t)}catch{return cachedClearTimeout.call(this,t)}}}var queue=[],draining=!1,currentQueue,queueIndex=-1;function cleanUpNextTick(){!draining||!currentQueue||(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var t=runTimeout(cleanUpNextTick);draining=!0;for(var n=queue.length;n;){for(currentQueue=queue,queue=[];++queueIndex<n;)currentQueue&¤tQueue[queueIndex].run();queueIndex=-1,n=queue.length}currentQueue=null,draining=!1,runClearTimeout(t)}}function nextTick(t){var n=new Array(arguments.length-1);if(arguments.length>1)for(var o=1;o<arguments.length;o++)n[o-1]=arguments[o];queue.push(new Item(t,n)),queue.length===1&&!draining&&runTimeout(drainQueue)}function Item(t,n){this.fun=t,this.array=n}Item.prototype.run=function(){this.fun.apply(null,this.array)};var title="browser",platform="browser",browser=!0,env={},argv=[],version="",versions={},release={},config={};function noop(){}var on=noop,addListener=noop,once=noop,off=noop,removeListener=noop,removeAllListeners=noop,emit=noop;function binding(t){throw new Error("process.binding is not supported")}function cwd(){return"/"}function chdir(t){throw new Error("process.chdir is not supported")}function umask(){return 0}var performance$1=global$1.performance||{},performanceNow=performance$1.now||performance$1.mozNow||performance$1.msNow||performance$1.oNow||performance$1.webkitNow||function(){return new Date().getTime()};function hrtime(t){var n=performanceNow.call(performance$1)*.001,o=Math.floor(n),s=Math.floor(n%1*1e9);return t&&(o=o-t[0],s=s-t[1],s<0&&(o--,s+=1e9)),[o,s]}var startTime=new Date;function uptime(){var t=new Date,n=t-startTime;return n/1e3}var process$1={nextTick,title,browser,env,argv,version,versions,on,addListener,once,off,removeListener,removeAllListeners,emit,binding,cwd,chdir,umask,hrtime,platform,release,config,uptime},inherits;typeof Object.create=="function"?inherits=function(n,o){n.super_=o,n.prototype=Object.create(o.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}})}:inherits=function(n,o){n.super_=o;var s=function(){};s.prototype=o.prototype,n.prototype=new s,n.prototype.constructor=n};var inherits$1=inherits,formatRegExp=/%[sdj%]/g;function format(t){if(!isString(t)){for(var n=[],o=0;o<arguments.length;o++)n.push(inspect(arguments[o]));return n.join(" ")}for(var o=1,s=arguments,c=s.length,d=String(t).replace(formatRegExp,function(p){if(p==="%%")return"%";if(o>=c)return p;switch(p){case"%s":return String(s[o++]);case"%d":return Number(s[o++]);case"%j":try{return JSON.stringify(s[o++])}catch{return"[Circular]"}default:return p}}),h=s[o];o<c;h=s[++o])isNull(h)||!isObject(h)?d+=" "+h:d+=" "+inspect(h);return d}function deprecate(t,n){if(isUndefined(global$1.process))return function(){return deprecate(t,n).apply(this,arguments)};if(process$1.noDeprecation===!0)return t;var o=!1;function s(){if(!o){if(process$1.throwDeprecation)throw new Error(n);process$1.traceDeprecation?console.trace(n):console.error(n),o=!0}return t.apply(this,arguments)}return s}var debugs={},debugEnviron;function debuglog(t){if(isUndefined(debugEnviron)&&(debugEnviron=process$1.env.NODE_DEBUG||""),t=t.toUpperCase(),!debugs[t])if(new RegExp("\\b"+t+"\\b","i").test(debugEnviron)){var n=0;debugs[t]=function(){var o=format.apply(null,arguments);console.error("%s %d: %s",t,n,o)}}else debugs[t]=function(){};return debugs[t]}function inspect(t,n){var o={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(o.depth=arguments[2]),arguments.length>=4&&(o.colors=arguments[3]),isBoolean(n)?o.showHidden=n:n&&_extend(o,n),isUndefined(o.showHidden)&&(o.showHidden=!1),isUndefined(o.depth)&&(o.depth=2),isUndefined(o.colors)&&(o.colors=!1),isUndefined(o.customInspect)&&(o.customInspect=!0),o.colors&&(o.stylize=stylizeWithColor),formatValue(o,t,o.depth)}inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};function stylizeWithColor(t,n){var o=inspect.styles[n];return o?"\x1B["+inspect.colors[o][0]+"m"+t+"\x1B["+inspect.colors[o][1]+"m":t}function stylizeNoColor(t,n){return t}function arrayToHash(t){var n={};return t.forEach(function(o,s){n[o]=!0}),n}function formatValue(t,n,o){if(t.customInspect&&n&&isFunction(n.inspect)&&n.inspect!==inspect&&!(n.constructor&&n.constructor.prototype===n)){var s=n.inspect(o,t);return isString(s)||(s=formatValue(t,s,o)),s}var c=formatPrimitive(t,n);if(c)return c;var d=Object.keys(n),h=arrayToHash(d);if(t.showHidden&&(d=Object.getOwnPropertyNames(n)),isError(n)&&(d.indexOf("message")>=0||d.indexOf("description")>=0))return formatError(n);if(d.length===0){if(isFunction(n)){var p=n.name?": "+n.name:"";return t.stylize("[Function"+p+"]","special")}if(isRegExp(n))return t.stylize(RegExp.prototype.toString.call(n),"regexp");if(isDate(n))return t.stylize(Date.prototype.toString.call(n),"date");if(isError(n))return formatError(n)}var y="",E=!1,L=["{","}"];if(isArray(n)&&(E=!0,L=["[","]"]),isFunction(n)){var F=n.name?": "+n.name:"";y=" [Function"+F+"]"}if(isRegExp(n)&&(y=" "+RegExp.prototype.toString.call(n)),isDate(n)&&(y=" "+Date.prototype.toUTCString.call(n)),isError(n)&&(y=" "+formatError(n)),d.length===0&&(!E||n.length==0))return L[0]+y+L[1];if(o<0)return isRegExp(n)?t.stylize(RegExp.prototype.toString.call(n),"regexp"):t.stylize("[Object]","special");t.seen.push(n);var N;return E?N=formatArray(t,n,o,h,d):N=d.map(function(z){return formatProperty(t,n,o,h,z,E)}),t.seen.pop(),reduceToSingleString(N,y,L)}function formatPrimitive(t,n){if(isUndefined(n))return t.stylize("undefined","undefined");if(isString(n)){var o="'"+JSON.stringify(n).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(o,"string")}if(isNumber(n))return t.stylize(""+n,"number");if(isBoolean(n))return t.stylize(""+n,"boolean");if(isNull(n))return t.stylize("null","null")}function formatError(t){return"["+Error.prototype.toString.call(t)+"]"}function formatArray(t,n,o,s,c){for(var d=[],h=0,p=n.length;h<p;++h)hasOwnProperty(n,String(h))?d.push(formatProperty(t,n,o,s,String(h),!0)):d.push("");return c.forEach(function(y){y.match(/^\d+$/)||d.push(formatProperty(t,n,o,s,y,!0))}),d}function formatProperty(t,n,o,s,c,d){var h,p,y;if(y=Object.getOwnPropertyDescriptor(n,c)||{value:n[c]},y.get?y.set?p=t.stylize("[Getter/Setter]","special"):p=t.stylize("[Getter]","special"):y.set&&(p=t.stylize("[Setter]","special")),hasOwnProperty(s,c)||(h="["+c+"]"),p||(t.seen.indexOf(y.value)<0?(isNull(o)?p=formatValue(t,y.value,null):p=formatValue(t,y.value,o-1),p.indexOf(`
|
|
6745
|
+
`,uniforms:{...pick(L,["color","frustumLength","blackPoint","whitePoint","gamma"]),globeDepthTexture:()=>(y==null?void 0:y())??N._depthTexture}});if(c){const z=createBilateralFilterStage({prefix:t,outputType:h,useGlobeDepth:p,getGlobeDepthTexture:y,uniforms:{textureScale:n,...pick(L,["frustumLength","normalExponent","depthExponent"])}}),oe=new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion_generate_and_filter`,stages:[F,z]});return N.uniforms.ambientOcclusionTexture=oe.name,new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion`,stages:[oe,N],inputPreviousStageTexture:!1,uniforms:createUniforms([{stage:F,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:z,uniforms:["frustumLength","normalExponent","depthExponent"]},{stage:N,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}else return N.uniforms.ambientOcclusionTexture=F.name,new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion`,stages:[F,N],inputPreviousStageTexture:!1,uniforms:createUniforms([{stage:F,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:N,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}const AmbientOcclusionStage=({enabled:t=!0,textureScale:n,directions:o,steps:s,denoise:c,accurateNormalReconstruction:d,outputType:h,useGlobeDepth:p,...y})=>{const{viewer:E}=$e$1(),L=E==null?void 0:E.scene,F=useInstance({owner:L==null?void 0:L.postProcessStages,keys:[n,s,o,c,d,h,p],create:()=>{const N=createAmbientOcclusionStage({textureScale:n,steps:s,directions:o,denoise:c,accurateNormalReconstruction:d,outputType:h,useGlobeDepth:p,getGlobeDepthTexture:()=>L.context.uniformState.globeDepthTexture,uniforms:y});return N.enabled=t,N},transferOwnership:(N,z)=>(z==null||z.add(N),()=>{z==null||z.remove(N)})});return F.enabled=t,Object.assign(F.uniforms,y),L==null||L.requestRender(),usePreRender(()=>{const N=L==null?void 0:L.camera.frustum;if(N instanceof Cesium$1.PerspectiveFrustum){const z=1/Math.tan(N.fovy/2);F.uniforms.focalLength.x=z*N.aspectRatio,F.uniforms.focalLength.y=z}}),null},AmbientOcclusion=t=>{const n=$e$1(),[o,s]=React.useState(!1);return usePreRender(()=>{const c=n.scene;s(!(c!=null&&c.globe.depthTestAgainstTerrain));const{globeHeight:d}=c;if(!c||d==null)return;const h=c.camera.positionCartographic.height-d,p=c==null?void 0:c.camera.frustum;p instanceof Cesium$1.PerspectiveFrustum&&(c.camera.frustum.near=Cesium$1.Math.clamp(h-1,1,5)/Math.tan(p.fov/2))}),jsxRuntimeExports.jsx(AmbientOcclusionStage,{...t,useGlobeDepth:o})};var AmbientOcclusionOutputType=(t=>(t[t.Occlusion=1]="Occlusion",t[t.Normal=2]="Normal",t[t.Depth=3]="Depth",t[t.Weight=4]="Weight",t[t.Shade=5]="Shade",t))(AmbientOcclusionOutputType||{});const AMBIENT_OCCLUSION_QUALITY={low:{directions:4,steps:4,textureScale:.5,maxRadius:30},medium:{directions:4,steps:8,textureScale:.5,maxRadius:40},high:{directions:8,steps:8,textureScale:1,maxRadius:40},extreme:{directions:16,steps:16,textureScale:1,maxRadius:40}},DEFAULT_SKETCH_COLOR="#00bebe",DEFAULT_EDIT_COLOR="#3B3CD0",SELECTED_EDIT_COLOR="#FF9900",ADDING_POINT_COLOR="#3B3CD0";let drawPointImage,editPointImage,selectedPointImage,addingPointImage;const ControlPoint=({position:t,clampToGround:n=!1,index:o,isEditing:s,isSelected:c,isAddingPoint:d,isExtrudedControlPoint:h,handleControlPointMouseEvent:p})=>{const y=React.useRef(t);y.current=t;const E=useConstant$2(()=>new CallbackProperty((z,oe)=>"getValue"in y.current?y.current.getValue(z,oe):y.current,!1)),L=React.useMemo(()=>({position:E,billboard:{image:s?d?getAddingPointImage():c?getSelectedPointImage():getEditPointImage():getDrawPointImage(),width:s?16:8,height:s?16:8,heightReference:n?HeightReference$1.CLAMP_TO_GROUND:HeightReference$1.NONE,disableDepthTestDistance:1/0}}),[n,E,d,s,c]),F=React.useCallback(()=>{p==null||p(o,!!h,"mousedown")},[o,h,p]),N=React.useCallback(()=>{p==null||p(o,!!h,"click")},[o,h,p]);return jsxRuntimeExports.jsx(Is$1,{...L,onMouseDown:F,onClick:N})};function getDrawPointImage(){if(drawPointImage!=null)return drawPointImage;drawPointImage=document.createElement("canvas"),drawPointImage.width=16,drawPointImage.height=16;const t=drawPointImage.getContext("2d");return invariant$1(t!=null),t.fillStyle="white",t.fillRect(3,3,10,10),t.strokeStyle="black",t.lineWidth=2,t.strokeRect(3,3,10,10),drawPointImage}function getEditPointImage(){return getImage(editPointImage,{size:32,color:"white",strokeColor:DEFAULT_EDIT_COLOR})}function getSelectedPointImage(){return getImage(selectedPointImage,{size:32,color:"white",strokeColor:SELECTED_EDIT_COLOR})}function getAddingPointImage(){if(addingPointImage!=null)return addingPointImage;addingPointImage=document.createElement("canvas"),addingPointImage.width=32,addingPointImage.height=32;const t=addingPointImage.getContext("2d");return invariant$1(t!=null),t.beginPath(),t.arc(16,16,12,0,2*Math.PI),t.fillStyle="white",t.fill(),t.strokeStyle=ADDING_POINT_COLOR,t.lineWidth=4,t.stroke(),t.beginPath(),t.moveTo(16,8),t.lineTo(16,24),t.stroke(),t.moveTo(8,16),t.lineTo(24,16),t.stroke(),addingPointImage}function getImage(t,n){if(t!=null)return t;t=document.createElement("canvas"),t.width=n.size,t.height=n.size;const o=t.getContext("2d");return invariant$1(o!=null),o.beginPath(),o.arc(n.size/2,n.size/2,n.size/2-4,0,2*Math.PI),o.fillStyle=n.color,o.fill(),o.strokeStyle=n.strokeColor,o.lineWidth=4,o.stroke(),t}function assignForwardedRef(t,n){if(typeof t=="function")return t(n),()=>{t(null)};if(t!=null)return t.current=n,()=>{t.current=null}}const Entity=React.memo(React.forwardRef(({entities:t,...n},o)=>{const{viewer:s}=$e$1(),c=s==null?void 0:s.scene,d=s==null?void 0:s.entities,h=t??d,[p,y]=React.useState(()=>new Entity$1(n));return React.useEffect(()=>{y(new Entity$1(n))},[n.id]),React.useEffect(()=>(h==null||h.add(p),()=>{h==null||h.remove(p),c==null||c.requestRender()}),[c,h,p]),React.useEffect(()=>assignForwardedRef(o,p),[o,p]),Object.assign(p,omit(n,"id")),c==null||c.requestRender(),null})),textStyle={padding:"5px",color:"#fff",backgroundColor:"#000",borderRadius:"5px",lineHeight:1},MeasurementText=({children:t})=>jsxRuntimeExports.jsx("div",{style:textStyle,children:t}),MotionConfigContext=React.createContext({transformPagePoint:t=>t,isStatic:!1,reducedMotion:"never"}),MotionContext=React.createContext({}),PresenceContext=React.createContext(null),isBrowser=typeof document<"u",useIsomorphicLayoutEffect$1=isBrowser?React.useLayoutEffect:React.useEffect,LazyContext=React.createContext({strict:!1}),camelToDash=t=>t.replace(/([a-z])([A-Z])/gu,"$1-$2").toLowerCase(),optimizedAppearDataId="framerAppearId",optimizedAppearDataAttribute="data-"+camelToDash(optimizedAppearDataId),MotionGlobalConfig={skipAnimations:!1,useManualTiming:!1};class Queue{constructor(){this.order=[],this.scheduled=new Set}add(n){if(!this.scheduled.has(n))return this.scheduled.add(n),this.order.push(n),!0}remove(n){const o=this.order.indexOf(n);o!==-1&&(this.order.splice(o,1),this.scheduled.delete(n))}clear(){this.order.length=0,this.scheduled.clear()}}function createRenderStep(t){let n=new Queue,o=new Queue,s=0,c=!1,d=!1;const h=new WeakSet,p={schedule:(y,E=!1,L=!1)=>{const F=L&&c,N=F?n:o;return E&&h.add(y),N.add(y)&&F&&c&&(s=n.order.length),y},cancel:y=>{o.remove(y),h.delete(y)},process:y=>{if(c){d=!0;return}if(c=!0,[n,o]=[o,n],o.clear(),s=n.order.length,s)for(let E=0;E<s;E++){const L=n.order[E];h.has(L)&&(p.schedule(L),t()),L(y)}c=!1,d&&(d=!1,p.process(y))}};return p}const stepsOrder=["read","resolveKeyframes","update","preRender","render","postRender"],maxElapsed=40;function createRenderBatcher(t,n){let o=!1,s=!0;const c={delta:0,timestamp:0,isProcessing:!1},d=stepsOrder.reduce((F,N)=>(F[N]=createRenderStep(()=>o=!0),F),{}),h=F=>{d[F].process(c)},p=()=>{const F=performance.now();o=!1,c.delta=s?1e3/60:Math.max(Math.min(F-c.timestamp,maxElapsed),1),c.timestamp=F,c.isProcessing=!0,stepsOrder.forEach(h),c.isProcessing=!1,o&&n&&(s=!1,t(p))},y=()=>{o=!0,s=!0,c.isProcessing||t(p)};return{schedule:stepsOrder.reduce((F,N)=>{const z=d[N];return F[N]=(oe,W=!1,lt=!1)=>(o||y(),z.schedule(oe,W,lt)),F},{}),cancel:F=>stepsOrder.forEach(N=>d[N].cancel(F)),state:c,steps:d}}const{schedule:microtask,cancel:cancelMicrotask}=createRenderBatcher(queueMicrotask,!1);function useVisualElement(t,n,o,s){const{visualElement:c}=React.useContext(MotionContext),d=React.useContext(LazyContext),h=React.useContext(PresenceContext),p=React.useContext(MotionConfigContext).reducedMotion,y=React.useRef();s=s||d.renderer,!y.current&&s&&(y.current=s(t,{visualState:n,parent:c,props:o,presenceContext:h,blockInitialAnimation:h?h.initial===!1:!1,reducedMotionConfig:p}));const E=y.current;React.useInsertionEffect(()=>{E&&E.update(o,h)});const L=React.useRef(!!(o[optimizedAppearDataAttribute]&&!window.HandoffComplete));return useIsomorphicLayoutEffect$1(()=>{E&&(microtask.postRender(E.render),L.current&&E.animationState&&E.animationState.animateChanges())}),React.useEffect(()=>{E&&(E.updateFeatures(),!L.current&&E.animationState&&E.animationState.animateChanges(),L.current&&(L.current=!1,window.HandoffComplete=!0))}),E}function isRefObject(t){return t&&typeof t=="object"&&Object.prototype.hasOwnProperty.call(t,"current")}function useMotionRef(t,n,o){return React.useCallback(s=>{s&&t.mount&&t.mount(s),n&&(s?n.mount(s):n.unmount()),o&&(typeof o=="function"?o(s):isRefObject(o)&&(o.current=s))},[n])}function isVariantLabel(t){return typeof t=="string"||Array.isArray(t)}function isAnimationControls(t){return t!==null&&typeof t=="object"&&typeof t.start=="function"}const variantPriorityOrder=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],variantProps=["initial",...variantPriorityOrder];function isControllingVariants(t){return isAnimationControls(t.animate)||variantProps.some(n=>isVariantLabel(t[n]))}function isVariantNode(t){return!!(isControllingVariants(t)||t.variants)}function getCurrentTreeVariants(t,n){if(isControllingVariants(t)){const{initial:o,animate:s}=t;return{initial:o===!1||isVariantLabel(o)?o:void 0,animate:isVariantLabel(s)?s:void 0}}return t.inherit!==!1?n:{}}function useCreateMotionContext(t){const{initial:n,animate:o}=getCurrentTreeVariants(t,React.useContext(MotionContext));return React.useMemo(()=>({initial:n,animate:o}),[variantLabelsAsDependency(n),variantLabelsAsDependency(o)])}function variantLabelsAsDependency(t){return Array.isArray(t)?t.join(" "):t}const featureProps={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},featureDefinitions={};for(const t in featureProps)featureDefinitions[t]={isEnabled:n=>featureProps[t].some(o=>!!n[o])};function loadFeatures(t){for(const n in t)featureDefinitions[n]={...featureDefinitions[n],...t[n]}}const LayoutGroupContext=React.createContext({}),SwitchLayoutGroupContext=React.createContext({}),motionComponentSymbol=Symbol.for("motionComponentSymbol");function createMotionComponent({preloadedFeatures:t,createVisualElement:n,useRender:o,useVisualState:s,Component:c}){t&&loadFeatures(t);function d(p,y){let E;const L={...React.useContext(MotionConfigContext),...p,layoutId:useLayoutId(p)},{isStatic:F}=L,N=useCreateMotionContext(p),z=s(p,F);if(!F&&isBrowser){N.visualElement=useVisualElement(c,z,L,n);const oe=React.useContext(SwitchLayoutGroupContext),W=React.useContext(LazyContext).strict;N.visualElement&&(E=N.visualElement.loadFeatures(L,W,t,oe))}return React__namespace.createElement(MotionContext.Provider,{value:N},E&&N.visualElement?React__namespace.createElement(E,{visualElement:N.visualElement,...L}):null,o(c,p,useMotionRef(z,N.visualElement,y),z,F,N.visualElement))}const h=React.forwardRef(d);return h[motionComponentSymbol]=c,h}function useLayoutId({layoutId:t}){const n=React.useContext(LayoutGroupContext).id;return n&&t!==void 0?n+"-"+t:t}function createMotionProxy(t){function n(s,c={}){return createMotionComponent(t(s,c))}if(typeof Proxy>"u")return n;const o=new Map;return new Proxy(n,{get:(s,c)=>(o.has(c)||o.set(c,n(c)),o.get(c))})}const lowercaseSVGElements=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function isSVGComponent(t){return typeof t!="string"||t.includes("-")?!1:!!(lowercaseSVGElements.indexOf(t)>-1||/[A-Z]/u.test(t))}const scaleCorrectors={};function addScaleCorrector(t){Object.assign(scaleCorrectors,t)}const transformPropOrder=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],transformProps=new Set(transformPropOrder);function isForcedMotionValue(t,{layout:n,layoutId:o}){return transformProps.has(t)||t.startsWith("origin")||(n||o!==void 0)&&(!!scaleCorrectors[t]||t==="opacity")}const isMotionValue=t=>!!(t&&t.getVelocity),translateAlias={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},numTransforms=transformPropOrder.length;function buildTransform(t,{enableHardwareAcceleration:n=!0,allowTransformNone:o=!0},s,c){let d="";for(let h=0;h<numTransforms;h++){const p=transformPropOrder[h];if(t[p]!==void 0){const y=translateAlias[p]||p;d+=`${y}(${t[p]}) `}}return n&&!t.z&&(d+="translateZ(0)"),d=d.trim(),c?d=c(t,s?"":d):o&&s&&(d="none"),d}const checkStringStartsWith=t=>n=>typeof n=="string"&&n.startsWith(t),isCSSVariableName=checkStringStartsWith("--"),startsAsVariableToken=checkStringStartsWith("var(--"),isCSSVariableToken=t=>startsAsVariableToken(t)?singleCssVariableRegex.test(t.split("/*")[0].trim()):!1,singleCssVariableRegex=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu,getValueAsType=(t,n)=>n&&typeof t=="number"?n.transform(t):t,clamp=(t,n,o)=>o>n?n:o<t?t:o,number={test:t=>typeof t=="number",parse:parseFloat,transform:t=>t},alpha={...number,transform:t=>clamp(0,1,t)},scale={...number,default:1},sanitize=t=>Math.round(t*1e5)/1e5,floatRegex=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu,colorRegex=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu,singleColorRegex=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu;function isString$1(t){return typeof t=="string"}const createUnitType=t=>({test:n=>isString$1(n)&&n.endsWith(t)&&n.split(" ").length===1,parse:parseFloat,transform:n=>`${n}${t}`}),degrees=createUnitType("deg"),percent=createUnitType("%"),px=createUnitType("px"),vh=createUnitType("vh"),vw=createUnitType("vw"),progressPercentage={...percent,parse:t=>percent.parse(t)/100,transform:t=>percent.transform(t*100)},int={...number,transform:Math.round},numberValueTypes={borderWidth:px,borderTopWidth:px,borderRightWidth:px,borderBottomWidth:px,borderLeftWidth:px,borderRadius:px,radius:px,borderTopLeftRadius:px,borderTopRightRadius:px,borderBottomRightRadius:px,borderBottomLeftRadius:px,width:px,maxWidth:px,height:px,maxHeight:px,size:px,top:px,right:px,bottom:px,left:px,padding:px,paddingTop:px,paddingRight:px,paddingBottom:px,paddingLeft:px,margin:px,marginTop:px,marginRight:px,marginBottom:px,marginLeft:px,rotate:degrees,rotateX:degrees,rotateY:degrees,rotateZ:degrees,scale,scaleX:scale,scaleY:scale,scaleZ:scale,skew:degrees,skewX:degrees,skewY:degrees,distance:px,translateX:px,translateY:px,translateZ:px,x:px,y:px,z:px,perspective:px,transformPerspective:px,opacity:alpha,originX:progressPercentage,originY:progressPercentage,originZ:px,zIndex:int,backgroundPositionX:px,backgroundPositionY:px,fillOpacity:alpha,strokeOpacity:alpha,numOctaves:int};function buildHTMLStyles(t,n,o,s){const{style:c,vars:d,transform:h,transformOrigin:p}=t;let y=!1,E=!1,L=!0;for(const F in n){const N=n[F];if(isCSSVariableName(F)){d[F]=N;continue}const z=numberValueTypes[F],oe=getValueAsType(N,z);if(transformProps.has(F)){if(y=!0,h[F]=oe,!L)continue;N!==(z.default||0)&&(L=!1)}else F.startsWith("origin")?(E=!0,p[F]=oe):c[F]=oe}if(n.transform||(y||s?c.transform=buildTransform(t.transform,o,L,s):c.transform&&(c.transform="none")),E){const{originX:F="50%",originY:N="50%",originZ:z=0}=p;c.transformOrigin=`${F} ${N} ${z}`}}const createHtmlRenderState=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function copyRawValuesOnly(t,n,o){for(const s in n)!isMotionValue(n[s])&&!isForcedMotionValue(s,o)&&(t[s]=n[s])}function useInitialMotionValues({transformTemplate:t},n,o){return React.useMemo(()=>{const s=createHtmlRenderState();return buildHTMLStyles(s,n,{enableHardwareAcceleration:!o},t),Object.assign({},s.vars,s.style)},[n])}function useStyle(t,n,o){const s=t.style||{},c={};return copyRawValuesOnly(c,s,t),Object.assign(c,useInitialMotionValues(t,n,o)),c}function useHTMLProps(t,n,o){const s={},c=useStyle(t,n,o);return t.drag&&t.dragListener!==!1&&(s.draggable=!1,c.userSelect=c.WebkitUserSelect=c.WebkitTouchCallout="none",c.touchAction=t.drag===!0?"none":`pan-${t.drag==="x"?"y":"x"}`),t.tabIndex===void 0&&(t.onTap||t.onTapStart||t.whileTap)&&(s.tabIndex=0),s.style=c,s}const validMotionProps=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function isValidMotionProp(t){return t.startsWith("while")||t.startsWith("drag")&&t!=="draggable"||t.startsWith("layout")||t.startsWith("onTap")||t.startsWith("onPan")||t.startsWith("onLayout")||validMotionProps.has(t)}let shouldForward=t=>!isValidMotionProp(t);function loadExternalIsValidProp(t){t&&(shouldForward=n=>n.startsWith("on")?!isValidMotionProp(n):t(n))}try{loadExternalIsValidProp(require("@emotion/is-prop-valid").default)}catch(t){}function filterProps(t,n,o){const s={};for(const c in t)c==="values"&&typeof t.values=="object"||(shouldForward(c)||o===!0&&isValidMotionProp(c)||!n&&!isValidMotionProp(c)||t.draggable&&c.startsWith("onDrag"))&&(s[c]=t[c]);return s}function calcOrigin$1(t,n,o){return typeof t=="string"?t:px.transform(n+o*t)}function calcSVGTransformOrigin(t,n,o){const s=calcOrigin$1(n,t.x,t.width),c=calcOrigin$1(o,t.y,t.height);return`${s} ${c}`}const dashKeys={offset:"stroke-dashoffset",array:"stroke-dasharray"},camelKeys={offset:"strokeDashoffset",array:"strokeDasharray"};function buildSVGPath(t,n,o=1,s=0,c=!0){t.pathLength=1;const d=c?dashKeys:camelKeys;t[d.offset]=px.transform(-s);const h=px.transform(n),p=px.transform(o);t[d.array]=`${h} ${p}`}function buildSVGAttrs(t,{attrX:n,attrY:o,attrScale:s,originX:c,originY:d,pathLength:h,pathSpacing:p=1,pathOffset:y=0,...E},L,F,N){if(buildHTMLStyles(t,E,L,N),F){t.style.viewBox&&(t.attrs.viewBox=t.style.viewBox);return}t.attrs=t.style,t.style={};const{attrs:z,style:oe,dimensions:W}=t;z.transform&&(W&&(oe.transform=z.transform),delete z.transform),W&&(c!==void 0||d!==void 0||oe.transform)&&(oe.transformOrigin=calcSVGTransformOrigin(W,c!==void 0?c:.5,d!==void 0?d:.5)),n!==void 0&&(z.x=n),o!==void 0&&(z.y=o),s!==void 0&&(z.scale=s),h!==void 0&&buildSVGPath(z,h,p,y,!1)}const createSvgRenderState=()=>({...createHtmlRenderState(),attrs:{}}),isSVGTag=t=>typeof t=="string"&&t.toLowerCase()==="svg";function useSVGProps(t,n,o,s){const c=React.useMemo(()=>{const d=createSvgRenderState();return buildSVGAttrs(d,n,{enableHardwareAcceleration:!1},isSVGTag(s),t.transformTemplate),{...d.attrs,style:{...d.style}}},[n]);if(t.style){const d={};copyRawValuesOnly(d,t.style,t),c.style={...d,...c.style}}return c}function createUseRender(t=!1){return(o,s,c,{latestValues:d},h)=>{const y=(isSVGComponent(o)?useSVGProps:useHTMLProps)(s,d,h,o),E=filterProps(s,typeof o=="string",t),L=o!==React.Fragment?{...E,...y,ref:c}:{},{children:F}=s,N=React.useMemo(()=>isMotionValue(F)?F.get():F,[F]);return React.createElement(o,{...L,children:N})}}function renderHTML(t,{style:n,vars:o},s,c){Object.assign(t.style,n,c&&c.getProjectionStyles(s));for(const d in o)t.style.setProperty(d,o[d])}const camelCaseAttributes=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function renderSVG(t,n,o,s){renderHTML(t,n,void 0,s);for(const c in n.attrs)t.setAttribute(camelCaseAttributes.has(c)?c:camelToDash(c),n.attrs[c])}function scrapeMotionValuesFromProps$1(t,n,o){var s;const{style:c}=t,d={};for(const h in c)(isMotionValue(c[h])||n.style&&isMotionValue(n.style[h])||isForcedMotionValue(h,t)||((s=o==null?void 0:o.getValue(h))===null||s===void 0?void 0:s.liveStyle)!==void 0)&&(d[h]=c[h]);return d}function scrapeMotionValuesFromProps(t,n,o){const s=scrapeMotionValuesFromProps$1(t,n,o);for(const c in t)if(isMotionValue(t[c])||isMotionValue(n[c])){const d=transformPropOrder.indexOf(c)!==-1?"attr"+c.charAt(0).toUpperCase()+c.substring(1):c;s[d]=t[c]}return s}function resolveVariantFromProps(t,n,o,s={},c={}){return typeof n=="function"&&(n=n(o!==void 0?o:t.custom,s,c)),typeof n=="string"&&(n=t.variants&&t.variants[n]),typeof n=="function"&&(n=n(o!==void 0?o:t.custom,s,c)),n}function useConstant(t){const n=React.useRef(null);return n.current===null&&(n.current=t()),n.current}const isKeyframesTarget=t=>Array.isArray(t),isCustomValue=t=>!!(t&&typeof t=="object"&&t.mix&&t.toValue),resolveFinalValueInKeyframes=t=>isKeyframesTarget(t)?t[t.length-1]||0:t;function resolveMotionValue(t){const n=isMotionValue(t)?t.get():t;return isCustomValue(n)?n.toValue():n}function makeState({scrapeMotionValuesFromProps:t,createRenderState:n,onMount:o},s,c,d){const h={latestValues:makeLatestValues(s,c,d,t),renderState:n()};return o&&(h.mount=p=>o(s,p,h)),h}const makeUseVisualState=t=>(n,o)=>{const s=React.useContext(MotionContext),c=React.useContext(PresenceContext),d=()=>makeState(t,n,s,c);return o?d():useConstant(d)};function makeLatestValues(t,n,o,s){const c={},d=s(t,{});for(const N in d)c[N]=resolveMotionValue(d[N]);let{initial:h,animate:p}=t;const y=isControllingVariants(t),E=isVariantNode(t);n&&E&&!y&&t.inherit!==!1&&(h===void 0&&(h=n.initial),p===void 0&&(p=n.animate));let L=o?o.initial===!1:!1;L=L||h===!1;const F=L?p:h;return F&&typeof F!="boolean"&&!isAnimationControls(F)&&(Array.isArray(F)?F:[F]).forEach(z=>{const oe=resolveVariantFromProps(t,z);if(!oe)return;const{transitionEnd:W,transition:lt,...nt}=oe;for(const Ee in nt){let yt=nt[Ee];if(Array.isArray(yt)){const Ai=L?yt.length-1:0;yt=yt[Ai]}yt!==null&&(c[Ee]=yt)}for(const Ee in W)c[Ee]=W[Ee]}),c}const noop$1=t=>t,{schedule:frame,cancel:cancelFrame,state:frameData,steps}=createRenderBatcher(typeof requestAnimationFrame<"u"?requestAnimationFrame:noop$1,!0),svgMotionConfig={useVisualState:makeUseVisualState({scrapeMotionValuesFromProps,createRenderState:createSvgRenderState,onMount:(t,n,{renderState:o,latestValues:s})=>{frame.read(()=>{try{o.dimensions=typeof n.getBBox=="function"?n.getBBox():n.getBoundingClientRect()}catch{o.dimensions={x:0,y:0,width:0,height:0}}}),frame.render(()=>{buildSVGAttrs(o,s,{enableHardwareAcceleration:!1},isSVGTag(n.tagName),t.transformTemplate),renderSVG(n,o)})}})},htmlMotionConfig={useVisualState:makeUseVisualState({scrapeMotionValuesFromProps:scrapeMotionValuesFromProps$1,createRenderState:createHtmlRenderState})};function createDomMotionConfig(t,{forwardMotionProps:n=!1},o,s){return{...isSVGComponent(t)?svgMotionConfig:htmlMotionConfig,preloadedFeatures:o,useRender:createUseRender(n),createVisualElement:s,Component:t}}function addDomEvent(t,n,o,s={passive:!0}){return t.addEventListener(n,o,s),()=>t.removeEventListener(n,o)}const isPrimaryPointer=t=>t.pointerType==="mouse"?typeof t.button!="number"||t.button<=0:t.isPrimary!==!1;function extractEventInfo(t,n="page"){return{point:{x:t[n+"X"],y:t[n+"Y"]}}}const addPointerInfo=t=>n=>isPrimaryPointer(n)&&t(n,extractEventInfo(n));function addPointerEvent(t,n,o,s){return addDomEvent(t,n,addPointerInfo(o),s)}const combineFunctions=(t,n)=>o=>n(t(o)),pipe=(...t)=>t.reduce(combineFunctions);function createLock(t){let n=null;return()=>{const o=()=>{n=null};return n===null?(n=t,o):!1}}const globalHorizontalLock=createLock("dragHorizontal"),globalVerticalLock=createLock("dragVertical");function getGlobalLock(t){let n=!1;if(t==="y")n=globalVerticalLock();else if(t==="x")n=globalHorizontalLock();else{const o=globalHorizontalLock(),s=globalVerticalLock();o&&s?n=()=>{o(),s()}:(o&&o(),s&&s())}return n}function isDragActive(){const t=getGlobalLock(!0);return t?(t(),!1):!0}class Feature{constructor(n){this.isMounted=!1,this.node=n}update(){}}function addHoverEvent(t,n){const o="pointer"+(n?"enter":"leave"),s="onHover"+(n?"Start":"End"),c=(d,h)=>{if(d.pointerType==="touch"||isDragActive())return;const p=t.getProps();t.animationState&&p.whileHover&&t.animationState.setActive("whileHover",n),p[s]&&p[s](d,h)};return addPointerEvent(t.current,o,c,{passive:!t.getProps()[s]})}class HoverGesture extends Feature{mount(){this.unmount=pipe(addHoverEvent(this.node,!0),addHoverEvent(this.node,!1))}unmount(){}}class FocusGesture extends Feature{constructor(){super(...arguments),this.isActive=!1}onFocus(){let n=!1;try{n=this.node.current.matches(":focus-visible")}catch{n=!0}!n||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=pipe(addDomEvent(this.node.current,"focus",()=>this.onFocus()),addDomEvent(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}const isNodeOrChild=(t,n)=>n?t===n?!0:isNodeOrChild(t,n.parentElement):!1;function fireSyntheticPointerEvent(t,n){if(!n)return;const o=new PointerEvent("pointer"+t);n(o,extractEventInfo(o))}class PressGesture extends Feature{constructor(){super(...arguments),this.removeStartListeners=noop$1,this.removeEndListeners=noop$1,this.removeAccessibleListeners=noop$1,this.startPointerPress=(n,o)=>{if(this.isPressing)return;this.removeEndListeners();const s=this.node.getProps(),d=addPointerEvent(window,"pointerup",(p,y)=>{if(!this.checkPressEnd())return;const{onTap:E,onTapCancel:L,globalTapTarget:F}=this.node.getProps();!F&&!isNodeOrChild(this.node.current,p.target)?L&&L(p,y):E&&E(p,y)},{passive:!(s.onTap||s.onPointerUp)}),h=addPointerEvent(window,"pointercancel",(p,y)=>this.cancelPress(p,y),{passive:!(s.onTapCancel||s.onPointerCancel)});this.removeEndListeners=pipe(d,h),this.startPress(n,o)},this.startAccessiblePress=()=>{const n=d=>{if(d.key!=="Enter"||this.isPressing)return;const h=p=>{p.key!=="Enter"||!this.checkPressEnd()||fireSyntheticPointerEvent("up",(y,E)=>{const{onTap:L}=this.node.getProps();L&&L(y,E)})};this.removeEndListeners(),this.removeEndListeners=addDomEvent(this.node.current,"keyup",h),fireSyntheticPointerEvent("down",(p,y)=>{this.startPress(p,y)})},o=addDomEvent(this.node.current,"keydown",n),s=()=>{this.isPressing&&fireSyntheticPointerEvent("cancel",(d,h)=>this.cancelPress(d,h))},c=addDomEvent(this.node.current,"blur",s);this.removeAccessibleListeners=pipe(o,c)}}startPress(n,o){this.isPressing=!0;const{onTapStart:s,whileTap:c}=this.node.getProps();c&&this.node.animationState&&this.node.animationState.setActive("whileTap",!0),s&&s(n,o)}checkPressEnd(){return this.removeEndListeners(),this.isPressing=!1,this.node.getProps().whileTap&&this.node.animationState&&this.node.animationState.setActive("whileTap",!1),!isDragActive()}cancelPress(n,o){if(!this.checkPressEnd())return;const{onTapCancel:s}=this.node.getProps();s&&s(n,o)}mount(){const n=this.node.getProps(),o=addPointerEvent(n.globalTapTarget?window:this.node.current,"pointerdown",this.startPointerPress,{passive:!(n.onTapStart||n.onPointerStart)}),s=addDomEvent(this.node.current,"focus",this.startAccessiblePress);this.removeStartListeners=pipe(o,s)}unmount(){this.removeStartListeners(),this.removeEndListeners(),this.removeAccessibleListeners()}}const observerCallbacks=new WeakMap,observers=new WeakMap,fireObserverCallback=t=>{const n=observerCallbacks.get(t.target);n&&n(t)},fireAllObserverCallbacks=t=>{t.forEach(fireObserverCallback)};function initIntersectionObserver({root:t,...n}){const o=t||document;observers.has(o)||observers.set(o,{});const s=observers.get(o),c=JSON.stringify(n);return s[c]||(s[c]=new IntersectionObserver(fireAllObserverCallbacks,{root:t,...n})),s[c]}function observeIntersection(t,n,o){const s=initIntersectionObserver(n);return observerCallbacks.set(t,o),s.observe(t),()=>{observerCallbacks.delete(t),s.unobserve(t)}}const thresholdNames={some:0,all:1};class InViewFeature extends Feature{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:n={}}=this.node.getProps(),{root:o,margin:s,amount:c="some",once:d}=n,h={root:o?o.current:void 0,rootMargin:s,threshold:typeof c=="number"?c:thresholdNames[c]},p=y=>{const{isIntersecting:E}=y;if(this.isInView===E||(this.isInView=E,d&&!E&&this.hasEnteredView))return;E&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",E);const{onViewportEnter:L,onViewportLeave:F}=this.node.getProps(),N=E?L:F;N&&N(y)};return observeIntersection(this.node.current,h,p)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:n,prevProps:o}=this.node;["amount","margin","root"].some(hasViewportOptionChanged(n,o))&&this.startObserver()}unmount(){}}function hasViewportOptionChanged({viewport:t={}},{viewport:n={}}={}){return o=>t[o]!==n[o]}const gestureAnimations={inView:{Feature:InViewFeature},tap:{Feature:PressGesture},focus:{Feature:FocusGesture},hover:{Feature:HoverGesture}};function shallowCompare(t,n){if(!Array.isArray(n))return!1;const o=n.length;if(o!==t.length)return!1;for(let s=0;s<o;s++)if(n[s]!==t[s])return!1;return!0}function getCurrent(t){const n={};return t.values.forEach((o,s)=>n[s]=o.get()),n}function getVelocity$1(t){const n={};return t.values.forEach((o,s)=>n[s]=o.getVelocity()),n}function resolveVariant(t,n,o){const s=t.getProps();return resolveVariantFromProps(s,n,o!==void 0?o:s.custom,getCurrent(t),getVelocity$1(t))}const secondsToMilliseconds=t=>t*1e3,millisecondsToSeconds=t=>t/1e3,underDampedSpring={type:"spring",stiffness:500,damping:25,restSpeed:10},criticallyDampedSpring=t=>({type:"spring",stiffness:550,damping:t===0?2*Math.sqrt(550):30,restSpeed:10}),keyframesTransition={type:"keyframes",duration:.8},ease={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},getDefaultTransition=(t,{keyframes:n})=>n.length>2?keyframesTransition:transformProps.has(t)?t.startsWith("scale")?criticallyDampedSpring(n[1]):underDampedSpring:ease;function isTransitionDefined({when:t,delay:n,delayChildren:o,staggerChildren:s,staggerDirection:c,repeat:d,repeatType:h,repeatDelay:p,from:y,elapsed:E,...L}){return!!Object.keys(L).length}function getValueTransition(t,n){return t[n]||t.default||t}const isNotNull=t=>t!==null;function getFinalKeyframe(t,{repeat:n,repeatType:o="loop"},s){const c=t.filter(isNotNull),d=n&&o!=="loop"&&n%2===1?0:c.length-1;return!d||s===void 0?c[d]:s}let now;function clearTime(){now=void 0}const time={now:()=>(now===void 0&&time.set(frameData.isProcessing||MotionGlobalConfig.useManualTiming?frameData.timestamp:performance.now()),now),set:t=>{now=t,queueMicrotask(clearTime)}},isZeroValueString=t=>/^0[^.\s]+$/u.test(t);function isNone(t){return typeof t=="number"?t===0:t!==null?t==="none"||t==="0"||isZeroValueString(t):!0}let warning=noop$1,invariant=noop$1;process.env.NODE_ENV!=="production"&&(warning=(t,n)=>{!t&&typeof console<"u"&&console.warn(n)},invariant=(t,n)=>{if(!t)throw new Error(n)});const isNumericalString=t=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(t),splitCSSVariableRegex=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function parseCSSVariable(t){const n=splitCSSVariableRegex.exec(t);if(!n)return[,];const[,o,s,c]=n;return[`--${o??s}`,c]}const maxDepth=4;function getVariableValue(t,n,o=1){invariant(o<=maxDepth,`Max CSS variable fallback depth detected in property "${t}". This may indicate a circular fallback dependency.`);const[s,c]=parseCSSVariable(t);if(!s)return;const d=window.getComputedStyle(n).getPropertyValue(s);if(d){const h=d.trim();return isNumericalString(h)?parseFloat(h):h}return isCSSVariableToken(c)?getVariableValue(c,n,o+1):c}const positionalKeys=new Set(["width","height","top","left","right","bottom","x","y","translateX","translateY"]),isNumOrPxType=t=>t===number||t===px,getPosFromMatrix=(t,n)=>parseFloat(t.split(", ")[n]),getTranslateFromMatrix=(t,n)=>(o,{transform:s})=>{if(s==="none"||!s)return 0;const c=s.match(/^matrix3d\((.+)\)$/u);if(c)return getPosFromMatrix(c[1],n);{const d=s.match(/^matrix\((.+)\)$/u);return d?getPosFromMatrix(d[1],t):0}},transformKeys=new Set(["x","y","z"]),nonTranslationalTransformKeys=transformPropOrder.filter(t=>!transformKeys.has(t));function removeNonTranslationalTransform(t){const n=[];return nonTranslationalTransformKeys.forEach(o=>{const s=t.getValue(o);s!==void 0&&(n.push([o,s.get()]),s.set(o.startsWith("scale")?1:0))}),n}const positionalValues={width:({x:t},{paddingLeft:n="0",paddingRight:o="0"})=>t.max-t.min-parseFloat(n)-parseFloat(o),height:({y:t},{paddingTop:n="0",paddingBottom:o="0"})=>t.max-t.min-parseFloat(n)-parseFloat(o),top:(t,{top:n})=>parseFloat(n),left:(t,{left:n})=>parseFloat(n),bottom:({y:t},{top:n})=>parseFloat(n)+(t.max-t.min),right:({x:t},{left:n})=>parseFloat(n)+(t.max-t.min),x:getTranslateFromMatrix(4,13),y:getTranslateFromMatrix(5,14)};positionalValues.translateX=positionalValues.x,positionalValues.translateY=positionalValues.y;const testValueType=t=>n=>n.test(t),auto={test:t=>t==="auto",parse:t=>t},dimensionValueTypes=[number,px,percent,degrees,vw,vh,auto],findDimensionValueType=t=>dimensionValueTypes.find(testValueType(t)),toResolve=new Set;let isScheduled=!1,anyNeedsMeasurement=!1;function measureAllKeyframes(){if(anyNeedsMeasurement){const t=Array.from(toResolve).filter(s=>s.needsMeasurement),n=new Set(t.map(s=>s.element)),o=new Map;n.forEach(s=>{removeNonTranslationalTransform(s).length&&(o.set(s,removeNonTranslationalTransform(s)),s.render())}),t.forEach(s=>s.measureInitialState()),n.forEach(s=>{s.render()}),t.forEach(s=>s.measureEndState()),t.forEach(s=>{s.suspendedScrollY!==void 0&&window.scrollTo(0,s.suspendedScrollY)})}anyNeedsMeasurement=!1,isScheduled=!1,toResolve.forEach(t=>t.complete()),toResolve.clear()}function readAllKeyframes(){toResolve.forEach(t=>{t.readKeyframes(),t.needsMeasurement&&(anyNeedsMeasurement=!0)})}function flushKeyframeResolvers(){readAllKeyframes(),measureAllKeyframes()}class KeyframeResolver{constructor(n,o,s,c,d,h=!1){this.isComplete=!1,this.isAsync=!1,this.needsMeasurement=!1,this.isScheduled=!1,this.unresolvedKeyframes=[...n],this.onComplete=o,this.name=s,this.motionValue=c,this.element=d,this.isAsync=h}scheduleResolve(){this.isScheduled=!0,this.isAsync?(toResolve.add(this),isScheduled||(isScheduled=!0,frame.read(readAllKeyframes),frame.resolveKeyframes(measureAllKeyframes))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:n,name:o,element:s,motionValue:c}=this;for(let d=0;d<n.length;d++)if(n[d]===null)if(d===0){const h=c==null?void 0:c.get(),p=n[n.length-1];if(h!==void 0)n[0]=h;else if(s&&o){const y=s.readValue(o,p);y!=null&&(n[0]=y)}n[0]===void 0&&(n[0]=p),c&&h===void 0&&c.set(n[0])}else n[d]=n[d-1]}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(){this.isComplete=!0,this.onComplete(this.unresolvedKeyframes,this.finalKeyframe),toResolve.delete(this)}cancel(){this.isComplete||(this.isScheduled=!1,toResolve.delete(this))}resume(){this.isComplete||this.scheduleResolve()}}const isColorString=(t,n)=>o=>!!(isString$1(o)&&singleColorRegex.test(o)&&o.startsWith(t)||n&&Object.prototype.hasOwnProperty.call(o,n)),splitColor=(t,n,o)=>s=>{if(!isString$1(s))return s;const[c,d,h,p]=s.match(floatRegex);return{[t]:parseFloat(c),[n]:parseFloat(d),[o]:parseFloat(h),alpha:p!==void 0?parseFloat(p):1}},clampRgbUnit=t=>clamp(0,255,t),rgbUnit={...number,transform:t=>Math.round(clampRgbUnit(t))},rgba={test:isColorString("rgb","red"),parse:splitColor("red","green","blue"),transform:({red:t,green:n,blue:o,alpha:s=1})=>"rgba("+rgbUnit.transform(t)+", "+rgbUnit.transform(n)+", "+rgbUnit.transform(o)+", "+sanitize(alpha.transform(s))+")"};function parseHex(t){let n="",o="",s="",c="";return t.length>5?(n=t.substring(1,3),o=t.substring(3,5),s=t.substring(5,7),c=t.substring(7,9)):(n=t.substring(1,2),o=t.substring(2,3),s=t.substring(3,4),c=t.substring(4,5),n+=n,o+=o,s+=s,c+=c),{red:parseInt(n,16),green:parseInt(o,16),blue:parseInt(s,16),alpha:c?parseInt(c,16)/255:1}}const hex={test:isColorString("#"),parse:parseHex,transform:rgba.transform},hsla={test:isColorString("hsl","hue"),parse:splitColor("hue","saturation","lightness"),transform:({hue:t,saturation:n,lightness:o,alpha:s=1})=>"hsla("+Math.round(t)+", "+percent.transform(sanitize(n))+", "+percent.transform(sanitize(o))+", "+sanitize(alpha.transform(s))+")"},color={test:t=>rgba.test(t)||hex.test(t)||hsla.test(t),parse:t=>rgba.test(t)?rgba.parse(t):hsla.test(t)?hsla.parse(t):hex.parse(t),transform:t=>isString$1(t)?t:t.hasOwnProperty("red")?rgba.transform(t):hsla.transform(t)};function test(t){var n,o;return isNaN(t)&&isString$1(t)&&(((n=t.match(floatRegex))===null||n===void 0?void 0:n.length)||0)+(((o=t.match(colorRegex))===null||o===void 0?void 0:o.length)||0)>0}const NUMBER_TOKEN="number",COLOR_TOKEN="color",VAR_TOKEN="var",VAR_FUNCTION_TOKEN="var(",SPLIT_TOKEN="${}",complexRegex=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function analyseComplexValue(t){const n=t.toString(),o=[],s={color:[],number:[],var:[]},c=[];let d=0;const p=n.replace(complexRegex,y=>(color.test(y)?(s.color.push(d),c.push(COLOR_TOKEN),o.push(color.parse(y))):y.startsWith(VAR_FUNCTION_TOKEN)?(s.var.push(d),c.push(VAR_TOKEN),o.push(y)):(s.number.push(d),c.push(NUMBER_TOKEN),o.push(parseFloat(y))),++d,SPLIT_TOKEN)).split(SPLIT_TOKEN);return{values:o,split:p,indexes:s,types:c}}function parseComplexValue(t){return analyseComplexValue(t).values}function createTransformer(t){const{split:n,types:o}=analyseComplexValue(t),s=n.length;return c=>{let d="";for(let h=0;h<s;h++)if(d+=n[h],c[h]!==void 0){const p=o[h];p===NUMBER_TOKEN?d+=sanitize(c[h]):p===COLOR_TOKEN?d+=color.transform(c[h]):d+=c[h]}return d}}const convertNumbersToZero=t=>typeof t=="number"?0:t;function getAnimatableNone$1(t){const n=parseComplexValue(t);return createTransformer(t)(n.map(convertNumbersToZero))}const complex={test,parse:parseComplexValue,createTransformer,getAnimatableNone:getAnimatableNone$1},maxDefaults=new Set(["brightness","contrast","saturate","opacity"]);function applyDefaultFilter(t){const[n,o]=t.slice(0,-1).split("(");if(n==="drop-shadow")return t;const[s]=o.match(floatRegex)||[];if(!s)return t;const c=o.replace(s,"");let d=maxDefaults.has(n)?1:0;return s!==o&&(d*=100),n+"("+d+c+")"}const functionRegex=/\b([a-z-]*)\(.*?\)/gu,filter={...complex,getAnimatableNone:t=>{const n=t.match(functionRegex);return n?n.map(applyDefaultFilter).join(" "):t}},defaultValueTypes={...numberValueTypes,color,backgroundColor:color,outlineColor:color,fill:color,stroke:color,borderColor:color,borderTopColor:color,borderRightColor:color,borderBottomColor:color,borderLeftColor:color,filter,WebkitFilter:filter},getDefaultValueType=t=>defaultValueTypes[t];function getAnimatableNone(t,n){let o=getDefaultValueType(t);return o!==filter&&(o=complex),o.getAnimatableNone?o.getAnimatableNone(n):void 0}function makeNoneKeyframesAnimatable(t,n,o){let s=0,c;for(;s<t.length&&!c;)typeof t[s]=="string"&&t[s]!=="none"&&t[s]!=="0"&&(c=t[s]),s++;if(c&&o)for(const d of n)t[d]=getAnimatableNone(o,c)}class DOMKeyframesResolver extends KeyframeResolver{constructor(n,o,s,c){super(n,o,s,c,c==null?void 0:c.owner,!0)}readKeyframes(){const{unresolvedKeyframes:n,element:o,name:s}=this;if(!o.current)return;super.readKeyframes();for(let y=0;y<n.length;y++){const E=n[y];if(typeof E=="string"&&isCSSVariableToken(E)){const L=getVariableValue(E,o.current);L!==void 0&&(n[y]=L)}}if(!positionalKeys.has(s)||n.length!==2)return this.resolveNoneKeyframes();const[c,d]=n,h=findDimensionValueType(c),p=findDimensionValueType(d);if(h!==p)if(isNumOrPxType(h)&&isNumOrPxType(p))for(let y=0;y<n.length;y++){const E=n[y];typeof E=="string"&&(n[y]=parseFloat(E))}else this.needsMeasurement=!0}resolveNoneKeyframes(){const{unresolvedKeyframes:n,name:o}=this,s=[];for(let c=0;c<n.length;c++)isNone(n[c])&&s.push(c);s.length&&makeNoneKeyframesAnimatable(n,s,o)}measureInitialState(){const{element:n,unresolvedKeyframes:o,name:s}=this;if(!n.current)return;s==="height"&&(this.suspendedScrollY=window.pageYOffset),this.measuredOrigin=positionalValues[s](n.measureViewportBox(),window.getComputedStyle(n.current)),o[0]=this.measuredOrigin;const c=o[o.length-1];c!==void 0&&n.getValue(s,c).jump(c,!1)}measureEndState(){var n;const{element:o,name:s,unresolvedKeyframes:c}=this;if(!o.current)return;const d=o.getValue(s);d&&d.jump(this.measuredOrigin,!1);const h=c.length-1,p=c[h];c[h]=positionalValues[s](o.measureViewportBox(),window.getComputedStyle(o.current)),p!==null&&(this.finalKeyframe=p),!((n=this.removedTransforms)===null||n===void 0)&&n.length&&this.removedTransforms.forEach(([y,E])=>{o.getValue(y).set(E)}),this.resolveNoneKeyframes()}}function memo(t){let n;return()=>(n===void 0&&(n=t()),n)}const isAnimatable=(t,n)=>n==="zIndex"?!1:!!(typeof t=="number"||Array.isArray(t)||typeof t=="string"&&(complex.test(t)||t==="0")&&!t.startsWith("url("));function hasKeyframesChanged(t){const n=t[0];if(t.length===1)return!0;for(let o=0;o<t.length;o++)if(t[o]!==n)return!0}function canAnimate(t,n,o,s){const c=t[0];if(c===null)return!1;const d=t[t.length-1],h=isAnimatable(c,n),p=isAnimatable(d,n);return warning(h===p,`You are trying to animate ${n} from "${c}" to "${d}". ${c} is not an animatable value - to enable this animation set ${c} to a value animatable to ${d} via the \`style\` property.`),!h||!p?!1:hasKeyframesChanged(t)||o==="spring"&&s}class BaseAnimation{constructor({autoplay:n=!0,delay:o=0,type:s="keyframes",repeat:c=0,repeatDelay:d=0,repeatType:h="loop",...p}){this.isStopped=!1,this.hasAttemptedResolve=!1,this.options={autoplay:n,delay:o,type:s,repeat:c,repeatDelay:d,repeatType:h,...p},this.updateFinishedPromise()}get resolved(){return!this._resolved&&!this.hasAttemptedResolve&&flushKeyframeResolvers(),this._resolved}onKeyframesResolved(n,o){this.hasAttemptedResolve=!0;const{name:s,type:c,velocity:d,delay:h,onComplete:p,onUpdate:y,isGenerator:E}=this.options;if(!E&&!canAnimate(n,s,c,d))if(h)this.options.duration=0;else{y==null||y(getFinalKeyframe(n,this.options,o)),p==null||p(),this.resolveFinishedPromise();return}const L=this.initPlayback(n,o);L!==!1&&(this._resolved={keyframes:n,finalKeyframe:o,...L},this.onPostResolved())}onPostResolved(){}then(n,o){return this.currentFinishedPromise.then(n,o)}updateFinishedPromise(){this.currentFinishedPromise=new Promise(n=>{this.resolveFinishedPromise=n})}}function velocityPerSecond(t,n){return n?t*(1e3/n):0}const velocitySampleDuration=5;function calcGeneratorVelocity(t,n,o){const s=Math.max(n-velocitySampleDuration,0);return velocityPerSecond(o-t(s),n-s)}const safeMin=.001,minDuration=.01,maxDuration$1=10,minDamping=.05,maxDamping=1;function findSpring({duration:t=800,bounce:n=.25,velocity:o=0,mass:s=1}){let c,d;warning(t<=secondsToMilliseconds(maxDuration$1),"Spring duration must be 10 seconds or less");let h=1-n;h=clamp(minDamping,maxDamping,h),t=clamp(minDuration,maxDuration$1,millisecondsToSeconds(t)),h<1?(c=E=>{const L=E*h,F=L*t,N=L-o,z=calcAngularFreq(E,h),oe=Math.exp(-F);return safeMin-N/z*oe},d=E=>{const F=E*h*t,N=F*o+o,z=Math.pow(h,2)*Math.pow(E,2)*t,oe=Math.exp(-F),W=calcAngularFreq(Math.pow(E,2),h);return(-c(E)+safeMin>0?-1:1)*((N-z)*oe)/W}):(c=E=>{const L=Math.exp(-E*t),F=(E-o)*t+1;return-safeMin+L*F},d=E=>{const L=Math.exp(-E*t),F=(o-E)*(t*t);return L*F});const p=5/t,y=approximateRoot(c,d,p);if(t=secondsToMilliseconds(t),isNaN(y))return{stiffness:100,damping:10,duration:t};{const E=Math.pow(y,2)*s;return{stiffness:E,damping:h*2*Math.sqrt(s*E),duration:t}}}const rootIterations=12;function approximateRoot(t,n,o){let s=o;for(let c=1;c<rootIterations;c++)s=s-t(s)/n(s);return s}function calcAngularFreq(t,n){return t*Math.sqrt(1-n*n)}const durationKeys=["duration","bounce"],physicsKeys=["stiffness","damping","mass"];function isSpringType(t,n){return n.some(o=>t[o]!==void 0)}function getSpringOptions(t){let n={velocity:0,stiffness:100,damping:10,mass:1,isResolvedFromDuration:!1,...t};if(!isSpringType(t,physicsKeys)&&isSpringType(t,durationKeys)){const o=findSpring(t);n={...n,...o,mass:1},n.isResolvedFromDuration=!0}return n}function spring({keyframes:t,restDelta:n,restSpeed:o,...s}){const c=t[0],d=t[t.length-1],h={done:!1,value:c},{stiffness:p,damping:y,mass:E,duration:L,velocity:F,isResolvedFromDuration:N}=getSpringOptions({...s,velocity:-millisecondsToSeconds(s.velocity||0)}),z=F||0,oe=y/(2*Math.sqrt(p*E)),W=d-c,lt=millisecondsToSeconds(Math.sqrt(p/E)),nt=Math.abs(W)<5;o||(o=nt?.01:2),n||(n=nt?.005:.5);let Ee;if(oe<1){const yt=calcAngularFreq(lt,oe);Ee=Ai=>{const zi=Math.exp(-oe*lt*Ai);return d-zi*((z+oe*lt*W)/yt*Math.sin(yt*Ai)+W*Math.cos(yt*Ai))}}else if(oe===1)Ee=yt=>d-Math.exp(-lt*yt)*(W+(z+lt*W)*yt);else{const yt=lt*Math.sqrt(oe*oe-1);Ee=Ai=>{const zi=Math.exp(-oe*lt*Ai),ha=Math.min(yt*Ai,300);return d-zi*((z+oe*lt*W)*Math.sinh(ha)+yt*W*Math.cosh(ha))/yt}}return{calculatedDuration:N&&L||null,next:yt=>{const Ai=Ee(yt);if(N)h.done=yt>=L;else{let zi=z;yt!==0&&(oe<1?zi=calcGeneratorVelocity(Ee,yt,Ai):zi=0);const ha=Math.abs(zi)<=o,ba=Math.abs(d-Ai)<=n;h.done=ha&&ba}return h.value=h.done?d:Ai,h}}}function inertia({keyframes:t,velocity:n=0,power:o=.8,timeConstant:s=325,bounceDamping:c=10,bounceStiffness:d=500,modifyTarget:h,min:p,max:y,restDelta:E=.5,restSpeed:L}){const F=t[0],N={done:!1,value:F},z=Sa=>p!==void 0&&Sa<p||y!==void 0&&Sa>y,oe=Sa=>p===void 0?y:y===void 0||Math.abs(p-Sa)<Math.abs(y-Sa)?p:y;let W=o*n;const lt=F+W,nt=h===void 0?lt:h(lt);nt!==lt&&(W=nt-F);const Ee=Sa=>-W*Math.exp(-Sa/s),yt=Sa=>nt+Ee(Sa),Ai=Sa=>{const ya=Ee(Sa),ms=yt(Sa);N.done=Math.abs(ya)<=E,N.value=N.done?nt:ms};let zi,ha;const ba=Sa=>{z(N.value)&&(zi=Sa,ha=spring({keyframes:[N.value,oe(N.value)],velocity:calcGeneratorVelocity(yt,Sa,N.value),damping:c,stiffness:d,restDelta:E,restSpeed:L}))};return ba(0),{calculatedDuration:null,next:Sa=>{let ya=!1;return!ha&&zi===void 0&&(ya=!0,Ai(Sa),ba(Sa)),zi!==void 0&&Sa>=zi?ha.next(Sa-zi):(!ya&&Ai(Sa),N)}}}const calcBezier=(t,n,o)=>(((1-3*o+3*n)*t+(3*o-6*n))*t+3*n)*t,subdivisionPrecision=1e-7,subdivisionMaxIterations=12;function binarySubdivide(t,n,o,s,c){let d,h,p=0;do h=n+(o-n)/2,d=calcBezier(h,s,c)-t,d>0?o=h:n=h;while(Math.abs(d)>subdivisionPrecision&&++p<subdivisionMaxIterations);return h}function cubicBezier(t,n,o,s){if(t===n&&o===s)return noop$1;const c=d=>binarySubdivide(d,0,1,t,o);return d=>d===0||d===1?d:calcBezier(c(d),n,s)}const easeIn=cubicBezier(.42,0,1,1),easeOut=cubicBezier(0,0,.58,1),easeInOut=cubicBezier(.42,0,.58,1),isEasingArray=t=>Array.isArray(t)&&typeof t[0]!="number",mirrorEasing=t=>n=>n<=.5?t(2*n)/2:(2-t(2*(1-n)))/2,reverseEasing=t=>n=>1-t(1-n),circIn=t=>1-Math.sin(Math.acos(t)),circOut=reverseEasing(circIn),circInOut=mirrorEasing(circIn),backOut=cubicBezier(.33,1.53,.69,.99),backIn=reverseEasing(backOut),backInOut=mirrorEasing(backIn),anticipate=t=>(t*=2)<1?.5*backIn(t):.5*(2-Math.pow(2,-10*(t-1))),easingLookup={linear:noop$1,easeIn,easeInOut,easeOut,circIn,circInOut,circOut,backIn,backInOut,backOut,anticipate},easingDefinitionToFunction=t=>{if(Array.isArray(t)){invariant(t.length===4,"Cubic bezier arrays must contain four numerical values.");const[n,o,s,c]=t;return cubicBezier(n,o,s,c)}else if(typeof t=="string")return invariant(easingLookup[t]!==void 0,`Invalid easing type '${t}'`),easingLookup[t];return t},progress=(t,n,o)=>{const s=n-t;return s===0?1:(o-t)/s},mixNumber$1=(t,n,o)=>t+(n-t)*o;function hueToRgb(t,n,o){return o<0&&(o+=1),o>1&&(o-=1),o<1/6?t+(n-t)*6*o:o<1/2?n:o<2/3?t+(n-t)*(2/3-o)*6:t}function hslaToRgba({hue:t,saturation:n,lightness:o,alpha:s}){t/=360,n/=100,o/=100;let c=0,d=0,h=0;if(!n)c=d=h=o;else{const p=o<.5?o*(1+n):o+n-o*n,y=2*o-p;c=hueToRgb(y,p,t+1/3),d=hueToRgb(y,p,t),h=hueToRgb(y,p,t-1/3)}return{red:Math.round(c*255),green:Math.round(d*255),blue:Math.round(h*255),alpha:s}}const mixLinearColor=(t,n,o)=>{const s=t*t,c=o*(n*n-s)+s;return c<0?0:Math.sqrt(c)},colorTypes=[hex,rgba,hsla],getColorType=t=>colorTypes.find(n=>n.test(t));function asRGBA(t){const n=getColorType(t);invariant(!!n,`'${t}' is not an animatable color. Use the equivalent color code instead.`);let o=n.parse(t);return n===hsla&&(o=hslaToRgba(o)),o}const mixColor=(t,n)=>{const o=asRGBA(t),s=asRGBA(n),c={...o};return d=>(c.red=mixLinearColor(o.red,s.red,d),c.green=mixLinearColor(o.green,s.green,d),c.blue=mixLinearColor(o.blue,s.blue,d),c.alpha=mixNumber$1(o.alpha,s.alpha,d),rgba.transform(c))};function mixImmediate(t,n){return o=>o>0?n:t}function mixNumber(t,n){return o=>mixNumber$1(t,n,o)}function getMixer(t){return typeof t=="number"?mixNumber:typeof t=="string"?isCSSVariableToken(t)?mixImmediate:color.test(t)?mixColor:mixComplex:Array.isArray(t)?mixArray:typeof t=="object"?color.test(t)?mixColor:mixObject:mixImmediate}function mixArray(t,n){const o=[...t],s=o.length,c=t.map((d,h)=>getMixer(d)(d,n[h]));return d=>{for(let h=0;h<s;h++)o[h]=c[h](d);return o}}function mixObject(t,n){const o={...t,...n},s={};for(const c in o)t[c]!==void 0&&n[c]!==void 0&&(s[c]=getMixer(t[c])(t[c],n[c]));return c=>{for(const d in s)o[d]=s[d](c);return o}}function matchOrder(t,n){var o;const s=[],c={color:0,var:0,number:0};for(let d=0;d<n.values.length;d++){const h=n.types[d],p=t.indexes[h][c[h]],y=(o=t.values[p])!==null&&o!==void 0?o:0;s[d]=y,c[h]++}return s}const mixComplex=(t,n)=>{const o=complex.createTransformer(n),s=analyseComplexValue(t),c=analyseComplexValue(n);return s.indexes.var.length===c.indexes.var.length&&s.indexes.color.length===c.indexes.color.length&&s.indexes.number.length>=c.indexes.number.length?pipe(mixArray(matchOrder(s,c),c.values),o):(warning(!0,`Complex values '${t}' and '${n}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`),mixImmediate(t,n))};function mix(t,n,o){return typeof t=="number"&&typeof n=="number"&&typeof o=="number"?mixNumber$1(t,n,o):getMixer(t)(t,n)}function createMixers(t,n,o){const s=[],c=o||mix,d=t.length-1;for(let h=0;h<d;h++){let p=c(t[h],t[h+1]);if(n){const y=Array.isArray(n)?n[h]||noop$1:n;p=pipe(y,p)}s.push(p)}return s}function interpolate(t,n,{clamp:o=!0,ease:s,mixer:c}={}){const d=t.length;if(invariant(d===n.length,"Both input and output ranges must be the same length"),d===1)return()=>n[0];if(d===2&&t[0]===t[1])return()=>n[1];t[0]>t[d-1]&&(t=[...t].reverse(),n=[...n].reverse());const h=createMixers(n,s,c),p=h.length,y=E=>{let L=0;if(p>1)for(;L<t.length-2&&!(E<t[L+1]);L++);const F=progress(t[L],t[L+1],E);return h[L](F)};return o?E=>y(clamp(t[0],t[d-1],E)):y}function fillOffset(t,n){const o=t[t.length-1];for(let s=1;s<=n;s++){const c=progress(0,n,s);t.push(mixNumber$1(o,1,c))}}function defaultOffset(t){const n=[0];return fillOffset(n,t.length-1),n}function convertOffsetToTimes(t,n){return t.map(o=>o*n)}function defaultEasing(t,n){return t.map(()=>n||easeInOut).splice(0,t.length-1)}function keyframes({duration:t=300,keyframes:n,times:o,ease:s="easeInOut"}){const c=isEasingArray(s)?s.map(easingDefinitionToFunction):easingDefinitionToFunction(s),d={done:!1,value:n[0]},h=convertOffsetToTimes(o&&o.length===n.length?o:defaultOffset(n),t),p=interpolate(h,n,{ease:Array.isArray(c)?c:defaultEasing(n,c)});return{calculatedDuration:t,next:y=>(d.value=p(y),d.done=y>=t,d)}}const maxGeneratorDuration=2e4;function calcGeneratorDuration(t){let n=0;const o=50;let s=t.next(n);for(;!s.done&&n<maxGeneratorDuration;)n+=o,s=t.next(n);return n>=maxGeneratorDuration?1/0:n}const frameloopDriver=t=>{const n=({timestamp:o})=>t(o);return{start:()=>frame.update(n,!0),stop:()=>cancelFrame(n),now:()=>frameData.isProcessing?frameData.timestamp:time.now()}},generators={decay:inertia,inertia,tween:keyframes,keyframes,spring},percentToProgress=t=>t/100;class MainThreadAnimation extends BaseAnimation{constructor({KeyframeResolver:n=KeyframeResolver,...o}){super(o),this.holdTime=null,this.startTime=null,this.cancelTime=null,this.currentTime=0,this.playbackSpeed=1,this.pendingPlayState="running",this.state="idle";const{name:s,motionValue:c,keyframes:d}=this.options,h=(p,y)=>this.onKeyframesResolved(p,y);s&&c&&c.owner?this.resolver=c.owner.resolveKeyframes(d,h,s,c):this.resolver=new n(d,h,s,c),this.resolver.scheduleResolve()}initPlayback(n){const{type:o="keyframes",repeat:s=0,repeatDelay:c=0,repeatType:d,velocity:h=0}=this.options,p=generators[o]||keyframes;let y,E;p!==keyframes&&typeof n[0]!="number"&&(process.env.NODE_ENV!=="production"&&invariant(n.length===2,`Only two keyframes currently supported with spring and inertia animations. Trying to animate ${n}`),y=pipe(percentToProgress,mix(n[0],n[1])),n=[0,100]);const L=p({...this.options,keyframes:n});d==="mirror"&&(E=p({...this.options,keyframes:[...n].reverse(),velocity:-h})),L.calculatedDuration===null&&(L.calculatedDuration=calcGeneratorDuration(L));const{calculatedDuration:F}=L,N=F+c,z=N*(s+1)-c;return{generator:L,mirroredGenerator:E,mapPercentToKeyframes:y,calculatedDuration:F,resolvedDuration:N,totalDuration:z}}onPostResolved(){const{autoplay:n=!0}=this.options;this.play(),this.pendingPlayState==="paused"||!n?this.pause():this.state=this.pendingPlayState}tick(n,o=!1){const{resolved:s}=this;if(!s){const{keyframes:Sa}=this.options;return{done:!0,value:Sa[Sa.length-1]}}const{finalKeyframe:c,generator:d,mirroredGenerator:h,mapPercentToKeyframes:p,keyframes:y,calculatedDuration:E,totalDuration:L,resolvedDuration:F}=s;if(this.startTime===null)return d.next(0);const{delay:N,repeat:z,repeatType:oe,repeatDelay:W,onUpdate:lt}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,n):this.speed<0&&(this.startTime=Math.min(n-L/this.speed,this.startTime)),o?this.currentTime=n:this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=Math.round(n-this.startTime)*this.speed;const nt=this.currentTime-N*(this.speed>=0?1:-1),Ee=this.speed>=0?nt<0:nt>L;this.currentTime=Math.max(nt,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=L);let yt=this.currentTime,Ai=d;if(z){const Sa=Math.min(this.currentTime,L)/F;let ya=Math.floor(Sa),ms=Sa%1;!ms&&Sa>=1&&(ms=1),ms===1&&ya--,ya=Math.min(ya,z+1),!!(ya%2)&&(oe==="reverse"?(ms=1-ms,W&&(ms-=W/F)):oe==="mirror"&&(Ai=h)),yt=clamp(0,1,ms)*F}const zi=Ee?{done:!1,value:y[0]}:Ai.next(yt);p&&(zi.value=p(zi.value));let{done:ha}=zi;!Ee&&E!==null&&(ha=this.speed>=0?this.currentTime>=L:this.currentTime<=0);const ba=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&ha);return ba&&c!==void 0&&(zi.value=getFinalKeyframe(y,this.options,c)),lt&<(zi.value),ba&&this.finish(),zi}get duration(){const{resolved:n}=this;return n?millisecondsToSeconds(n.calculatedDuration):0}get time(){return millisecondsToSeconds(this.currentTime)}set time(n){n=secondsToMilliseconds(n),this.currentTime=n,this.holdTime!==null||this.speed===0?this.holdTime=n:this.driver&&(this.startTime=this.driver.now()-n/this.speed)}get speed(){return this.playbackSpeed}set speed(n){const o=this.playbackSpeed!==n;this.playbackSpeed=n,o&&(this.time=millisecondsToSeconds(this.currentTime))}play(){if(this.resolver.isScheduled||this.resolver.resume(),!this._resolved){this.pendingPlayState="running";return}if(this.isStopped)return;const{driver:n=frameloopDriver,onPlay:o}=this.options;this.driver||(this.driver=n(c=>this.tick(c))),o&&o();const s=this.driver.now();this.holdTime!==null?this.startTime=s-this.holdTime:(!this.startTime||this.state==="finished")&&(this.startTime=s),this.state==="finished"&&this.updateFinishedPromise(),this.cancelTime=this.startTime,this.holdTime=null,this.state="running",this.driver.start()}pause(){var n;if(!this._resolved){this.pendingPlayState="paused";return}this.state="paused",this.holdTime=(n=this.currentTime)!==null&&n!==void 0?n:0}stop(){if(this.resolver.cancel(),this.isStopped=!0,this.state==="idle")return;this.teardown();const{onStop:n}=this.options;n&&n()}complete(){this.state!=="running"&&this.play(),this.pendingPlayState=this.state="finished",this.holdTime=null}finish(){this.teardown(),this.state="finished";const{onComplete:n}=this.options;n&&n()}cancel(){this.cancelTime!==null&&this.tick(this.cancelTime),this.teardown(),this.updateFinishedPromise()}teardown(){this.state="idle",this.stopDriver(),this.resolveFinishedPromise(),this.updateFinishedPromise(),this.startTime=this.cancelTime=null,this.resolver.cancel()}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(n){return this.startTime=0,this.tick(n,!0)}}const isBezierDefinition=t=>Array.isArray(t)&&typeof t[0]=="number";function isWaapiSupportedEasing(t){return!!(!t||typeof t=="string"&&supportedWaapiEasing[t]||isBezierDefinition(t)||Array.isArray(t)&&t.every(isWaapiSupportedEasing))}const cubicBezierAsString=([t,n,o,s])=>`cubic-bezier(${t}, ${n}, ${o}, ${s})`,supportedWaapiEasing={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:cubicBezierAsString([0,.65,.55,1]),circOut:cubicBezierAsString([.55,0,1,.45]),backIn:cubicBezierAsString([.31,.01,.66,-.59]),backOut:cubicBezierAsString([.33,1.53,.69,.99])};function mapEasingToNativeEasing(t){if(t)return isBezierDefinition(t)?cubicBezierAsString(t):Array.isArray(t)?t.map(mapEasingToNativeEasing):supportedWaapiEasing[t]}function animateStyle(t,n,o,{delay:s=0,duration:c=300,repeat:d=0,repeatType:h="loop",ease:p,times:y}={}){const E={[n]:o};y&&(E.offset=y);const L=mapEasingToNativeEasing(p);return Array.isArray(L)&&(E.easing=L),t.animate(E,{delay:s,duration:c,easing:Array.isArray(L)?"linear":L,fill:"both",iterations:d+1,direction:h==="reverse"?"alternate":"normal"})}const supportsWaapi=memo(()=>Object.hasOwnProperty.call(Element.prototype,"animate")),acceleratedValues=new Set(["opacity","clipPath","filter","transform"]),sampleDelta=10,maxDuration=2e4;function requiresPregeneratedKeyframes(t){return t.type==="spring"||t.name==="backgroundColor"||!isWaapiSupportedEasing(t.ease)}function pregenerateKeyframes(t,n){const o=new MainThreadAnimation({...n,keyframes:t,repeat:0,delay:0,isGenerator:!0});let s={done:!1,value:t[0]};const c=[];let d=0;for(;!s.done&&d<maxDuration;)s=o.sample(d),c.push(s.value),d+=sampleDelta;return{times:void 0,keyframes:c,duration:d-sampleDelta,ease:"linear"}}class AcceleratedAnimation extends BaseAnimation{constructor(n){super(n);const{name:o,motionValue:s,keyframes:c}=this.options;this.resolver=new DOMKeyframesResolver(c,(d,h)=>this.onKeyframesResolved(d,h),o,s),this.resolver.scheduleResolve()}initPlayback(n,o){var s;let{duration:c=300,times:d,ease:h,type:p,motionValue:y,name:E}=this.options;if(!(!((s=y.owner)===null||s===void 0)&&s.current))return!1;if(requiresPregeneratedKeyframes(this.options)){const{onComplete:F,onUpdate:N,motionValue:z,...oe}=this.options,W=pregenerateKeyframes(n,oe);n=W.keyframes,n.length===1&&(n[1]=n[0]),c=W.duration,d=W.times,h=W.ease,p="keyframes"}const L=animateStyle(y.owner.current,E,n,{...this.options,duration:c,times:d,ease:h});return L.startTime=time.now(),this.pendingTimeline?(L.timeline=this.pendingTimeline,this.pendingTimeline=void 0):L.onfinish=()=>{const{onComplete:F}=this.options;y.set(getFinalKeyframe(n,this.options,o)),F&&F(),this.cancel(),this.resolveFinishedPromise()},{animation:L,duration:c,times:d,type:p,ease:h,keyframes:n}}get duration(){const{resolved:n}=this;if(!n)return 0;const{duration:o}=n;return millisecondsToSeconds(o)}get time(){const{resolved:n}=this;if(!n)return 0;const{animation:o}=n;return millisecondsToSeconds(o.currentTime||0)}set time(n){const{resolved:o}=this;if(!o)return;const{animation:s}=o;s.currentTime=secondsToMilliseconds(n)}get speed(){const{resolved:n}=this;if(!n)return 1;const{animation:o}=n;return o.playbackRate}set speed(n){const{resolved:o}=this;if(!o)return;const{animation:s}=o;s.playbackRate=n}get state(){const{resolved:n}=this;if(!n)return"idle";const{animation:o}=n;return o.playState}attachTimeline(n){if(!this._resolved)this.pendingTimeline=n;else{const{resolved:o}=this;if(!o)return noop$1;const{animation:s}=o;s.timeline=n,s.onfinish=null}return noop$1}play(){if(this.isStopped)return;const{resolved:n}=this;if(!n)return;const{animation:o}=n;o.playState==="finished"&&this.updateFinishedPromise(),o.play()}pause(){const{resolved:n}=this;if(!n)return;const{animation:o}=n;o.pause()}stop(){if(this.resolver.cancel(),this.isStopped=!0,this.state==="idle")return;const{resolved:n}=this;if(!n)return;const{animation:o,keyframes:s,duration:c,type:d,ease:h,times:p}=n;if(!(o.playState==="idle"||o.playState==="finished")){if(this.time){const{motionValue:y,onUpdate:E,onComplete:L,...F}=this.options,N=new MainThreadAnimation({...F,keyframes:s,duration:c,type:d,ease:h,times:p,isGenerator:!0}),z=secondsToMilliseconds(this.time);y.setWithVelocity(N.sample(z-sampleDelta).value,N.sample(z).value,sampleDelta)}this.cancel()}}complete(){const{resolved:n}=this;n&&n.animation.finish()}cancel(){const{resolved:n}=this;n&&n.animation.cancel()}static supports(n){const{motionValue:o,name:s,repeatDelay:c,repeatType:d,damping:h,type:p}=n;return supportsWaapi()&&s&&acceleratedValues.has(s)&&o&&o.owner&&o.owner.current instanceof HTMLElement&&!o.owner.getProps().onUpdate&&!c&&d!=="mirror"&&h!==0&&p!=="inertia"}}const animateMotionValue=(t,n,o,s={},c,d)=>h=>{const p=getValueTransition(s,t)||{},y=p.delay||s.delay||0;let{elapsed:E=0}=s;E=E-secondsToMilliseconds(y);let L={keyframes:Array.isArray(o)?o:[null,o],ease:"easeOut",velocity:n.getVelocity(),...p,delay:-E,onUpdate:N=>{n.set(N),p.onUpdate&&p.onUpdate(N)},onComplete:()=>{h(),p.onComplete&&p.onComplete()},name:t,motionValue:n,element:d?void 0:c};isTransitionDefined(p)||(L={...L,...getDefaultTransition(t,L)}),L.duration&&(L.duration=secondsToMilliseconds(L.duration)),L.repeatDelay&&(L.repeatDelay=secondsToMilliseconds(L.repeatDelay)),L.from!==void 0&&(L.keyframes[0]=L.from);let F=!1;if((L.type===!1||L.duration===0&&!L.repeatDelay)&&(L.duration=0,L.delay===0&&(F=!0)),F&&!d&&n.get()!==void 0){const N=getFinalKeyframe(L.keyframes,p);if(N!==void 0){frame.update(()=>{L.onUpdate(N),L.onComplete()});return}}return!d&&AcceleratedAnimation.supports(L)?new AcceleratedAnimation(L):new MainThreadAnimation(L)};function isWillChangeMotionValue(t){return!!(isMotionValue(t)&&t.add)}function addUniqueItem(t,n){t.indexOf(n)===-1&&t.push(n)}function removeItem(t,n){const o=t.indexOf(n);o>-1&&t.splice(o,1)}class SubscriptionManager{constructor(){this.subscriptions=[]}add(n){return addUniqueItem(this.subscriptions,n),()=>removeItem(this.subscriptions,n)}notify(n,o,s){const c=this.subscriptions.length;if(c)if(c===1)this.subscriptions[0](n,o,s);else for(let d=0;d<c;d++){const h=this.subscriptions[d];h&&h(n,o,s)}}getSize(){return this.subscriptions.length}clear(){this.subscriptions.length=0}}const warned=new Set;function warnOnce(t,n,o){t||warned.has(n)||(console.warn(n),warned.add(n))}const MAX_VELOCITY_DELTA=30,isFloat=t=>!isNaN(parseFloat(t));class MotionValue{constructor(n,o={}){this.version="11.0.27",this.canTrackVelocity=!1,this.events={},this.updateAndNotify=(s,c=!0)=>{const d=time.now();this.updatedAt!==d&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(s),this.current!==this.prev&&this.events.change&&this.events.change.notify(this.current),c&&this.events.renderRequest&&this.events.renderRequest.notify(this.current)},this.hasAnimated=!1,this.setCurrent(n),this.canTrackVelocity=isFloat(this.current),this.owner=o.owner}setCurrent(n){this.current=n,this.updatedAt=time.now()}setPrevFrameValue(n=this.current){this.prevFrameValue=n,this.prevUpdatedAt=this.updatedAt}onChange(n){return process.env.NODE_ENV!=="production"&&warnOnce(!1,'value.onChange(callback) is deprecated. Switch to value.on("change", callback).'),this.on("change",n)}on(n,o){this.events[n]||(this.events[n]=new SubscriptionManager);const s=this.events[n].add(o);return n==="change"?()=>{s(),frame.read(()=>{this.events.change.getSize()||this.stop()})}:s}clearListeners(){for(const n in this.events)this.events[n].clear()}attach(n,o){this.passiveEffect=n,this.stopPassiveEffect=o}set(n,o=!0){!o||!this.passiveEffect?this.updateAndNotify(n,o):this.passiveEffect(n,this.updateAndNotify)}setWithVelocity(n,o,s){this.set(o),this.prev=void 0,this.prevFrameValue=n,this.prevUpdatedAt=this.updatedAt-s}jump(n,o=!0){this.updateAndNotify(n),this.prev=n,this.prevUpdatedAt=this.prevFrameValue=void 0,o&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const n=time.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||n-this.updatedAt>MAX_VELOCITY_DELTA)return 0;const o=Math.min(this.updatedAt-this.prevUpdatedAt,MAX_VELOCITY_DELTA);return velocityPerSecond(parseFloat(this.current)-parseFloat(this.prevFrameValue),o)}start(n){return this.stop(),new Promise(o=>{this.hasAnimated=!0,this.animation=n(o),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function motionValue(t,n){return new MotionValue(t,n)}function setMotionValue(t,n,o){t.hasValue(n)?t.getValue(n).set(o):t.addValue(n,motionValue(o))}function setTarget(t,n){const o=resolveVariant(t,n);let{transitionEnd:s={},transition:c={},...d}=o||{};d={...d,...s};for(const h in d){const p=resolveFinalValueInKeyframes(d[h]);setMotionValue(t,h,p)}}function shouldBlockAnimation({protectedKeys:t,needsAnimating:n},o){const s=t.hasOwnProperty(o)&&n[o]!==!0;return n[o]=!1,s}function animateTarget(t,n,{delay:o=0,transitionOverride:s,type:c}={}){var d;let{transition:h=t.getDefaultTransition(),transitionEnd:p,...y}=n;const E=t.getValue("willChange");s&&(h=s);const L=[],F=c&&t.animationState&&t.animationState.getState()[c];for(const N in y){const z=t.getValue(N,(d=t.latestValues[N])!==null&&d!==void 0?d:null),oe=y[N];if(oe===void 0||F&&shouldBlockAnimation(F,N))continue;const W={delay:o,elapsed:0,...getValueTransition(h||{},N)};let lt=!1;if(window.HandoffAppearAnimations){const Ee=t.getProps()[optimizedAppearDataAttribute];if(Ee){const yt=window.HandoffAppearAnimations(Ee,N);yt!==null&&(W.elapsed=yt,lt=!0)}}z.start(animateMotionValue(N,z,oe,t.shouldReduceMotion&&transformProps.has(N)?{type:!1}:W,t,lt));const nt=z.animation;nt&&(isWillChangeMotionValue(E)&&(E.add(N),nt.then(()=>E.remove(N))),L.push(nt))}return p&&Promise.all(L).then(()=>{frame.update(()=>{p&&setTarget(t,p)})}),L}function animateVariant(t,n,o={}){var s;const c=resolveVariant(t,n,o.type==="exit"?(s=t.presenceContext)===null||s===void 0?void 0:s.custom:void 0);let{transition:d=t.getDefaultTransition()||{}}=c||{};o.transitionOverride&&(d=o.transitionOverride);const h=c?()=>Promise.all(animateTarget(t,c,o)):()=>Promise.resolve(),p=t.variantChildren&&t.variantChildren.size?(E=0)=>{const{delayChildren:L=0,staggerChildren:F,staggerDirection:N}=d;return animateChildren(t,n,L+E,F,N,o)}:()=>Promise.resolve(),{when:y}=d;if(y){const[E,L]=y==="beforeChildren"?[h,p]:[p,h];return E().then(()=>L())}else return Promise.all([h(),p(o.delay)])}function animateChildren(t,n,o=0,s=0,c=1,d){const h=[],p=(t.variantChildren.size-1)*s,y=c===1?(E=0)=>E*s:(E=0)=>p-E*s;return Array.from(t.variantChildren).sort(sortByTreeOrder).forEach((E,L)=>{E.notify("AnimationStart",n),h.push(animateVariant(E,n,{...d,delay:o+y(L)}).then(()=>E.notify("AnimationComplete",n)))}),Promise.all(h)}function sortByTreeOrder(t,n){return t.sortNodePosition(n)}function animateVisualElement(t,n,o={}){t.notify("AnimationStart",n);let s;if(Array.isArray(n)){const c=n.map(d=>animateVariant(t,d,o));s=Promise.all(c)}else if(typeof n=="string")s=animateVariant(t,n,o);else{const c=typeof n=="function"?resolveVariant(t,n,o.custom):n;s=Promise.all(animateTarget(t,c,o))}return s.then(()=>{frame.postRender(()=>{t.notify("AnimationComplete",n)})})}const reversePriorityOrder=[...variantPriorityOrder].reverse(),numAnimationTypes=variantPriorityOrder.length;function animateList(t){return n=>Promise.all(n.map(({animation:o,options:s})=>animateVisualElement(t,o,s)))}function createAnimationState(t){let n=animateList(t);const o=createState();let s=!0;const c=y=>(E,L)=>{var F;const N=resolveVariant(t,L,y==="exit"?(F=t.presenceContext)===null||F===void 0?void 0:F.custom:void 0);if(N){const{transition:z,transitionEnd:oe,...W}=N;E={...E,...W,...oe}}return E};function d(y){n=y(t)}function h(y){const E=t.getProps(),L=t.getVariantContext(!0)||{},F=[],N=new Set;let z={},oe=1/0;for(let lt=0;lt<numAnimationTypes;lt++){const nt=reversePriorityOrder[lt],Ee=o[nt],yt=E[nt]!==void 0?E[nt]:L[nt],Ai=isVariantLabel(yt),zi=nt===y?Ee.isActive:null;zi===!1&&(oe=lt);let ha=yt===L[nt]&&yt!==E[nt]&&Ai;if(ha&&s&&t.manuallyAnimateOnMount&&(ha=!1),Ee.protectedKeys={...z},!Ee.isActive&&zi===null||!yt&&!Ee.prevProp||isAnimationControls(yt)||typeof yt=="boolean")continue;let Sa=checkVariantsDidChange(Ee.prevProp,yt)||nt===y&&Ee.isActive&&!ha&&Ai||lt>oe&&Ai,ya=!1;const ms=Array.isArray(yt)?yt:[yt];let bs=ms.reduce(c(nt),{});zi===!1&&(bs={});const{prevResolvedValues:Ra={}}=Ee,pi={...Ra,...bs},mt=fa=>{Sa=!0,N.has(fa)&&(ya=!0,N.delete(fa)),Ee.needsAnimating[fa]=!0;const Wa=t.getValue(fa);Wa&&(Wa.liveStyle=!1)};for(const fa in pi){const Wa=bs[fa],sl=Ra[fa];if(z.hasOwnProperty(fa))continue;let Vd=!1;isKeyframesTarget(Wa)&&isKeyframesTarget(sl)?Vd=!shallowCompare(Wa,sl):Vd=Wa!==sl,Vd?Wa!=null?mt(fa):N.add(fa):Wa!==void 0&&N.has(fa)?mt(fa):Ee.protectedKeys[fa]=!0}Ee.prevProp=yt,Ee.prevResolvedValues=bs,Ee.isActive&&(z={...z,...bs}),s&&t.blockInitialAnimation&&(Sa=!1),Sa&&(!ha||ya)&&F.push(...ms.map(fa=>({animation:fa,options:{type:nt}})))}if(N.size){const lt={};N.forEach(nt=>{const Ee=t.getBaseTarget(nt),yt=t.getValue(nt);yt&&(yt.liveStyle=!0),lt[nt]=Ee===void 0?null:Ee}),F.push({animation:lt})}let W=!!F.length;return s&&(E.initial===!1||E.initial===E.animate)&&!t.manuallyAnimateOnMount&&(W=!1),s=!1,W?n(F):Promise.resolve()}function p(y,E){var L;if(o[y].isActive===E)return Promise.resolve();(L=t.variantChildren)===null||L===void 0||L.forEach(N=>{var z;return(z=N.animationState)===null||z===void 0?void 0:z.setActive(y,E)}),o[y].isActive=E;const F=h(y);for(const N in o)o[N].protectedKeys={};return F}return{animateChanges:h,setActive:p,setAnimateFunction:d,getState:()=>o}}function checkVariantsDidChange(t,n){return typeof n=="string"?n!==t:Array.isArray(n)?!shallowCompare(n,t):!1}function createTypeState(t=!1){return{isActive:t,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function createState(){return{animate:createTypeState(!0),whileInView:createTypeState(),whileHover:createTypeState(),whileTap:createTypeState(),whileDrag:createTypeState(),whileFocus:createTypeState(),exit:createTypeState()}}class AnimationFeature extends Feature{constructor(n){super(n),n.animationState||(n.animationState=createAnimationState(n))}updateAnimationControlsSubscription(){const{animate:n}=this.node.getProps();this.unmount(),isAnimationControls(n)&&(this.unmount=n.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:n}=this.node.getProps(),{animate:o}=this.node.prevProps||{};n!==o&&this.updateAnimationControlsSubscription()}unmount(){}}let id$1=0;class ExitAnimationFeature extends Feature{constructor(){super(...arguments),this.id=id$1++}update(){if(!this.node.presenceContext)return;const{isPresent:n,onExitComplete:o}=this.node.presenceContext,{isPresent:s}=this.node.prevPresenceContext||{};if(!this.node.animationState||n===s)return;const c=this.node.animationState.setActive("exit",!n);o&&!n&&c.then(()=>o(this.id))}mount(){const{register:n}=this.node.presenceContext||{};n&&(this.unmount=n(this.id))}unmount(){}}const animations={animation:{Feature:AnimationFeature},exit:{Feature:ExitAnimationFeature}},distance=(t,n)=>Math.abs(t-n);function distance2D(t,n){const o=distance(t.x,n.x),s=distance(t.y,n.y);return Math.sqrt(o**2+s**2)}class PanSession{constructor(n,o,{transformPagePoint:s,contextWindow:c,dragSnapToOrigin:d=!1}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const F=getPanInfo(this.lastMoveEventInfo,this.history),N=this.startEvent!==null,z=distance2D(F.offset,{x:0,y:0})>=3;if(!N&&!z)return;const{point:oe}=F,{timestamp:W}=frameData;this.history.push({...oe,timestamp:W});const{onStart:lt,onMove:nt}=this.handlers;N||(lt&<(this.lastMoveEvent,F),this.startEvent=this.lastMoveEvent),nt&&nt(this.lastMoveEvent,F)},this.handlePointerMove=(F,N)=>{this.lastMoveEvent=F,this.lastMoveEventInfo=transformPoint(N,this.transformPagePoint),frame.update(this.updatePoint,!0)},this.handlePointerUp=(F,N)=>{this.end();const{onEnd:z,onSessionEnd:oe,resumeAnimation:W}=this.handlers;if(this.dragSnapToOrigin&&W&&W(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const lt=getPanInfo(F.type==="pointercancel"?this.lastMoveEventInfo:transformPoint(N,this.transformPagePoint),this.history);this.startEvent&&z&&z(F,lt),oe&&oe(F,lt)},!isPrimaryPointer(n))return;this.dragSnapToOrigin=d,this.handlers=o,this.transformPagePoint=s,this.contextWindow=c||window;const h=extractEventInfo(n),p=transformPoint(h,this.transformPagePoint),{point:y}=p,{timestamp:E}=frameData;this.history=[{...y,timestamp:E}];const{onSessionStart:L}=o;L&&L(n,getPanInfo(p,this.history)),this.removeListeners=pipe(addPointerEvent(this.contextWindow,"pointermove",this.handlePointerMove),addPointerEvent(this.contextWindow,"pointerup",this.handlePointerUp),addPointerEvent(this.contextWindow,"pointercancel",this.handlePointerUp))}updateHandlers(n){this.handlers=n}end(){this.removeListeners&&this.removeListeners(),cancelFrame(this.updatePoint)}}function transformPoint(t,n){return n?{point:n(t.point)}:t}function subtractPoint(t,n){return{x:t.x-n.x,y:t.y-n.y}}function getPanInfo({point:t},n){return{point:t,delta:subtractPoint(t,lastDevicePoint(n)),offset:subtractPoint(t,startDevicePoint(n)),velocity:getVelocity(n,.1)}}function startDevicePoint(t){return t[0]}function lastDevicePoint(t){return t[t.length-1]}function getVelocity(t,n){if(t.length<2)return{x:0,y:0};let o=t.length-1,s=null;const c=lastDevicePoint(t);for(;o>=0&&(s=t[o],!(c.timestamp-s.timestamp>secondsToMilliseconds(n)));)o--;if(!s)return{x:0,y:0};const d=millisecondsToSeconds(c.timestamp-s.timestamp);if(d===0)return{x:0,y:0};const h={x:(c.x-s.x)/d,y:(c.y-s.y)/d};return h.x===1/0&&(h.x=0),h.y===1/0&&(h.y=0),h}function calcLength(t){return t.max-t.min}function isNear(t,n=0,o=.01){return Math.abs(t-n)<=o}function calcAxisDelta(t,n,o,s=.5){t.origin=s,t.originPoint=mixNumber$1(n.min,n.max,t.origin),t.scale=calcLength(o)/calcLength(n),(isNear(t.scale,1,1e-4)||isNaN(t.scale))&&(t.scale=1),t.translate=mixNumber$1(o.min,o.max,t.origin)-t.originPoint,(isNear(t.translate)||isNaN(t.translate))&&(t.translate=0)}function calcBoxDelta(t,n,o,s){calcAxisDelta(t.x,n.x,o.x,s?s.originX:void 0),calcAxisDelta(t.y,n.y,o.y,s?s.originY:void 0)}function calcRelativeAxis(t,n,o){t.min=o.min+n.min,t.max=t.min+calcLength(n)}function calcRelativeBox(t,n,o){calcRelativeAxis(t.x,n.x,o.x),calcRelativeAxis(t.y,n.y,o.y)}function calcRelativeAxisPosition(t,n,o){t.min=n.min-o.min,t.max=t.min+calcLength(n)}function calcRelativePosition(t,n,o){calcRelativeAxisPosition(t.x,n.x,o.x),calcRelativeAxisPosition(t.y,n.y,o.y)}function applyConstraints(t,{min:n,max:o},s){return n!==void 0&&t<n?t=s?mixNumber$1(n,t,s.min):Math.max(t,n):o!==void 0&&t>o&&(t=s?mixNumber$1(o,t,s.max):Math.min(t,o)),t}function calcRelativeAxisConstraints(t,n,o){return{min:n!==void 0?t.min+n:void 0,max:o!==void 0?t.max+o-(t.max-t.min):void 0}}function calcRelativeConstraints(t,{top:n,left:o,bottom:s,right:c}){return{x:calcRelativeAxisConstraints(t.x,o,c),y:calcRelativeAxisConstraints(t.y,n,s)}}function calcViewportAxisConstraints(t,n){let o=n.min-t.min,s=n.max-t.max;return n.max-n.min<t.max-t.min&&([o,s]=[s,o]),{min:o,max:s}}function calcViewportConstraints(t,n){return{x:calcViewportAxisConstraints(t.x,n.x),y:calcViewportAxisConstraints(t.y,n.y)}}function calcOrigin(t,n){let o=.5;const s=calcLength(t),c=calcLength(n);return c>s?o=progress(n.min,n.max-s,t.min):s>c&&(o=progress(t.min,t.max-c,n.min)),clamp(0,1,o)}function rebaseAxisConstraints(t,n){const o={};return n.min!==void 0&&(o.min=n.min-t.min),n.max!==void 0&&(o.max=n.max-t.min),o}const defaultElastic=.35;function resolveDragElastic(t=defaultElastic){return t===!1?t=0:t===!0&&(t=defaultElastic),{x:resolveAxisElastic(t,"left","right"),y:resolveAxisElastic(t,"top","bottom")}}function resolveAxisElastic(t,n,o){return{min:resolvePointElastic(t,n),max:resolvePointElastic(t,o)}}function resolvePointElastic(t,n){return typeof t=="number"?t:t[n]||0}const createAxisDelta=()=>({translate:0,scale:1,origin:0,originPoint:0}),createDelta=()=>({x:createAxisDelta(),y:createAxisDelta()}),createAxis=()=>({min:0,max:0}),createBox=()=>({x:createAxis(),y:createAxis()});function eachAxis(t){return[t("x"),t("y")]}function convertBoundingBoxToBox({top:t,left:n,right:o,bottom:s}){return{x:{min:n,max:o},y:{min:t,max:s}}}function convertBoxToBoundingBox({x:t,y:n}){return{top:n.min,right:t.max,bottom:n.max,left:t.min}}function transformBoxPoints(t,n){if(!n)return t;const o=n({x:t.left,y:t.top}),s=n({x:t.right,y:t.bottom});return{top:o.y,left:o.x,bottom:s.y,right:s.x}}function isIdentityScale(t){return t===void 0||t===1}function hasScale({scale:t,scaleX:n,scaleY:o}){return!isIdentityScale(t)||!isIdentityScale(n)||!isIdentityScale(o)}function hasTransform(t){return hasScale(t)||has2DTranslate(t)||t.z||t.rotate||t.rotateX||t.rotateY||t.skewX||t.skewY}function has2DTranslate(t){return is2DTranslate(t.x)||is2DTranslate(t.y)}function is2DTranslate(t){return t&&t!=="0%"}function scalePoint(t,n,o){const s=t-o,c=n*s;return o+c}function applyPointDelta(t,n,o,s,c){return c!==void 0&&(t=scalePoint(t,c,s)),scalePoint(t,o,s)+n}function applyAxisDelta(t,n=0,o=1,s,c){t.min=applyPointDelta(t.min,n,o,s,c),t.max=applyPointDelta(t.max,n,o,s,c)}function applyBoxDelta(t,{x:n,y:o}){applyAxisDelta(t.x,n.translate,n.scale,n.originPoint),applyAxisDelta(t.y,o.translate,o.scale,o.originPoint)}function applyTreeDeltas(t,n,o,s=!1){const c=o.length;if(!c)return;n.x=n.y=1;let d,h;for(let p=0;p<c;p++){d=o[p],h=d.projectionDelta;const y=d.instance;y&&y.style&&y.style.display==="contents"||(s&&d.options.layoutScroll&&d.scroll&&d!==d.root&&transformBox(t,{x:-d.scroll.offset.x,y:-d.scroll.offset.y}),h&&(n.x*=h.x.scale,n.y*=h.y.scale,applyBoxDelta(t,h)),s&&hasTransform(d.latestValues)&&transformBox(t,d.latestValues))}n.x=snapToDefault(n.x),n.y=snapToDefault(n.y)}function snapToDefault(t){return Number.isInteger(t)||t>1.0000000000001||t<.999999999999?t:1}function translateAxis(t,n){t.min=t.min+n,t.max=t.max+n}function transformAxis(t,n,[o,s,c]){const d=n[c]!==void 0?n[c]:.5,h=mixNumber$1(t.min,t.max,d);applyAxisDelta(t,n[o],n[s],h,n.scale)}const xKeys$1=["x","scaleX","originX"],yKeys$1=["y","scaleY","originY"];function transformBox(t,n){transformAxis(t.x,n,xKeys$1),transformAxis(t.y,n,yKeys$1)}function measureViewportBox(t,n){return convertBoundingBoxToBox(transformBoxPoints(t.getBoundingClientRect(),n))}function measurePageBox(t,n,o){const s=measureViewportBox(t,o),{scroll:c}=n;return c&&(translateAxis(s.x,c.offset.x),translateAxis(s.y,c.offset.y)),s}const getContextWindow=({current:t})=>t?t.ownerDocument.defaultView:null,elementDragControls=new WeakMap;class VisualElementDragControls{constructor(n){this.openGlobalLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=createBox(),this.visualElement=n}start(n,{snapToCursor:o=!1}={}){const{presenceContext:s}=this.visualElement;if(s&&s.isPresent===!1)return;const c=L=>{const{dragSnapToOrigin:F}=this.getProps();F?this.pauseAnimation():this.stopAnimation(),o&&this.snapToCursor(extractEventInfo(L,"page").point)},d=(L,F)=>{const{drag:N,dragPropagation:z,onDragStart:oe}=this.getProps();if(N&&!z&&(this.openGlobalLock&&this.openGlobalLock(),this.openGlobalLock=getGlobalLock(N),!this.openGlobalLock))return;this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),eachAxis(lt=>{let nt=this.getAxisMotionValue(lt).get()||0;if(percent.test(nt)){const{projection:Ee}=this.visualElement;if(Ee&&Ee.layout){const yt=Ee.layout.layoutBox[lt];yt&&(nt=calcLength(yt)*(parseFloat(nt)/100))}}this.originPoint[lt]=nt}),oe&&oe(L,F);const{animationState:W}=this.visualElement;W&&W.setActive("whileDrag",!0)},h=(L,F)=>{const{dragPropagation:N,dragDirectionLock:z,onDirectionLock:oe,onDrag:W}=this.getProps();if(!N&&!this.openGlobalLock)return;const{offset:lt}=F;if(z&&this.currentDirection===null){this.currentDirection=getCurrentDirection(lt),this.currentDirection!==null&&oe&&oe(this.currentDirection);return}this.updateAxis("x",F.point,lt),this.updateAxis("y",F.point,lt),this.visualElement.render(),W&&W(L,F)},p=(L,F)=>this.stop(L,F),y=()=>eachAxis(L=>{var F;return this.getAnimationState(L)==="paused"&&((F=this.getAxisMotionValue(L).animation)===null||F===void 0?void 0:F.play())}),{dragSnapToOrigin:E}=this.getProps();this.panSession=new PanSession(n,{onSessionStart:c,onStart:d,onMove:h,onSessionEnd:p,resumeAnimation:y},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:E,contextWindow:getContextWindow(this.visualElement)})}stop(n,o){const s=this.isDragging;if(this.cancel(),!s)return;const{velocity:c}=o;this.startAnimation(c);const{onDragEnd:d}=this.getProps();d&&d(n,o)}cancel(){this.isDragging=!1;const{projection:n,animationState:o}=this.visualElement;n&&(n.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:s}=this.getProps();!s&&this.openGlobalLock&&(this.openGlobalLock(),this.openGlobalLock=null),o&&o.setActive("whileDrag",!1)}updateAxis(n,o,s){const{drag:c}=this.getProps();if(!s||!shouldDrag(n,c,this.currentDirection))return;const d=this.getAxisMotionValue(n);let h=this.originPoint[n]+s[n];this.constraints&&this.constraints[n]&&(h=applyConstraints(h,this.constraints[n],this.elastic[n])),d.set(h)}resolveConstraints(){var n;const{dragConstraints:o,dragElastic:s}=this.getProps(),c=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):(n=this.visualElement.projection)===null||n===void 0?void 0:n.layout,d=this.constraints;o&&isRefObject(o)?this.constraints||(this.constraints=this.resolveRefConstraints()):o&&c?this.constraints=calcRelativeConstraints(c.layoutBox,o):this.constraints=!1,this.elastic=resolveDragElastic(s),d!==this.constraints&&c&&this.constraints&&!this.hasMutatedConstraints&&eachAxis(h=>{this.getAxisMotionValue(h)&&(this.constraints[h]=rebaseAxisConstraints(c.layoutBox[h],this.constraints[h]))})}resolveRefConstraints(){const{dragConstraints:n,onMeasureDragConstraints:o}=this.getProps();if(!n||!isRefObject(n))return!1;const s=n.current;invariant(s!==null,"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.");const{projection:c}=this.visualElement;if(!c||!c.layout)return!1;const d=measurePageBox(s,c.root,this.visualElement.getTransformPagePoint());let h=calcViewportConstraints(c.layout.layoutBox,d);if(o){const p=o(convertBoxToBoundingBox(h));this.hasMutatedConstraints=!!p,p&&(h=convertBoundingBoxToBox(p))}return h}startAnimation(n){const{drag:o,dragMomentum:s,dragElastic:c,dragTransition:d,dragSnapToOrigin:h,onDragTransitionEnd:p}=this.getProps(),y=this.constraints||{},E=eachAxis(L=>{if(!shouldDrag(L,o,this.currentDirection))return;let F=y&&y[L]||{};h&&(F={min:0,max:0});const N=c?200:1e6,z=c?40:1e7,oe={type:"inertia",velocity:s?n[L]:0,bounceStiffness:N,bounceDamping:z,timeConstant:750,restDelta:1,restSpeed:10,...d,...F};return this.startAxisValueAnimation(L,oe)});return Promise.all(E).then(p)}startAxisValueAnimation(n,o){const s=this.getAxisMotionValue(n);return s.start(animateMotionValue(n,s,0,o,this.visualElement))}stopAnimation(){eachAxis(n=>this.getAxisMotionValue(n).stop())}pauseAnimation(){eachAxis(n=>{var o;return(o=this.getAxisMotionValue(n).animation)===null||o===void 0?void 0:o.pause()})}getAnimationState(n){var o;return(o=this.getAxisMotionValue(n).animation)===null||o===void 0?void 0:o.state}getAxisMotionValue(n){const o="_drag"+n.toUpperCase(),s=this.visualElement.getProps(),c=s[o];return c||this.visualElement.getValue(n,(s.initial?s.initial[n]:void 0)||0)}snapToCursor(n){eachAxis(o=>{const{drag:s}=this.getProps();if(!shouldDrag(o,s,this.currentDirection))return;const{projection:c}=this.visualElement,d=this.getAxisMotionValue(o);if(c&&c.layout){const{min:h,max:p}=c.layout.layoutBox[o];d.set(n[o]-mixNumber$1(h,p,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:n,dragConstraints:o}=this.getProps(),{projection:s}=this.visualElement;if(!isRefObject(o)||!s||!this.constraints)return;this.stopAnimation();const c={x:0,y:0};eachAxis(h=>{const p=this.getAxisMotionValue(h);if(p){const y=p.get();c[h]=calcOrigin({min:y,max:y},this.constraints[h])}});const{transformTemplate:d}=this.visualElement.getProps();this.visualElement.current.style.transform=d?d({},""):"none",s.root&&s.root.updateScroll(),s.updateLayout(),this.resolveConstraints(),eachAxis(h=>{if(!shouldDrag(h,n,null))return;const p=this.getAxisMotionValue(h),{min:y,max:E}=this.constraints[h];p.set(mixNumber$1(y,E,c[h]))})}addListeners(){if(!this.visualElement.current)return;elementDragControls.set(this.visualElement,this);const n=this.visualElement.current,o=addPointerEvent(n,"pointerdown",y=>{const{drag:E,dragListener:L=!0}=this.getProps();E&&L&&this.start(y)}),s=()=>{const{dragConstraints:y}=this.getProps();isRefObject(y)&&(this.constraints=this.resolveRefConstraints())},{projection:c}=this.visualElement,d=c.addEventListener("measure",s);c&&!c.layout&&(c.root&&c.root.updateScroll(),c.updateLayout()),s();const h=addDomEvent(window,"resize",()=>this.scalePositionWithinConstraints()),p=c.addEventListener("didUpdate",({delta:y,hasLayoutChanged:E})=>{this.isDragging&&E&&(eachAxis(L=>{const F=this.getAxisMotionValue(L);F&&(this.originPoint[L]+=y[L].translate,F.set(F.get()+y[L].translate))}),this.visualElement.render())});return()=>{h(),o(),d(),p&&p()}}getProps(){const n=this.visualElement.getProps(),{drag:o=!1,dragDirectionLock:s=!1,dragPropagation:c=!1,dragConstraints:d=!1,dragElastic:h=defaultElastic,dragMomentum:p=!0}=n;return{...n,drag:o,dragDirectionLock:s,dragPropagation:c,dragConstraints:d,dragElastic:h,dragMomentum:p}}}function shouldDrag(t,n,o){return(n===!0||n===t)&&(o===null||o===t)}function getCurrentDirection(t,n=10){let o=null;return Math.abs(t.y)>n?o="y":Math.abs(t.x)>n&&(o="x"),o}class DragGesture extends Feature{constructor(n){super(n),this.removeGroupControls=noop$1,this.removeListeners=noop$1,this.controls=new VisualElementDragControls(n)}mount(){const{dragControls:n}=this.node.getProps();n&&(this.removeGroupControls=n.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||noop$1}unmount(){this.removeGroupControls(),this.removeListeners()}}const asyncHandler=t=>(n,o)=>{t&&t(n,o)};class PanGesture extends Feature{constructor(){super(...arguments),this.removePointerDownListener=noop$1}onPointerDown(n){this.session=new PanSession(n,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:getContextWindow(this.node)})}createPanHandlers(){const{onPanSessionStart:n,onPanStart:o,onPan:s,onPanEnd:c}=this.node.getProps();return{onSessionStart:asyncHandler(n),onStart:asyncHandler(o),onMove:s,onEnd:(d,h)=>{delete this.session,c&&c(d,h)}}}mount(){this.removePointerDownListener=addPointerEvent(this.node.current,"pointerdown",n=>this.onPointerDown(n))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}function usePresence(){const t=React.useContext(PresenceContext);if(t===null)return[!0,null];const{isPresent:n,onExitComplete:o,register:s}=t,c=React.useId();return React.useEffect(()=>s(c),[]),!n&&o?[!1,()=>o&&o(c)]:[!0]}const globalProjectionState={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function pixelsToPercent(t,n){return n.max===n.min?0:t/(n.max-n.min)*100}const correctBorderRadius={correct:(t,n)=>{if(!n.target)return t;if(typeof t=="string")if(px.test(t))t=parseFloat(t);else return t;const o=pixelsToPercent(t,n.target.x),s=pixelsToPercent(t,n.target.y);return`${o}% ${s}%`}},correctBoxShadow={correct:(t,{treeScale:n,projectionDelta:o})=>{const s=t,c=complex.parse(t);if(c.length>5)return s;const d=complex.createTransformer(t),h=typeof c[0]!="number"?1:0,p=o.x.scale*n.x,y=o.y.scale*n.y;c[0+h]/=p,c[1+h]/=y;const E=mixNumber$1(p,y,.5);return typeof c[2+h]=="number"&&(c[2+h]/=E),typeof c[3+h]=="number"&&(c[3+h]/=E),d(c)}};class MeasureLayoutWithContext extends React.Component{componentDidMount(){const{visualElement:n,layoutGroup:o,switchLayoutGroup:s,layoutId:c}=this.props,{projection:d}=n;addScaleCorrector(defaultScaleCorrectors),d&&(o.group&&o.group.add(d),s&&s.register&&c&&s.register(d),d.root.didUpdate(),d.addEventListener("animationComplete",()=>{this.safeToRemove()}),d.setOptions({...d.options,onExitComplete:()=>this.safeToRemove()})),globalProjectionState.hasEverUpdated=!0}getSnapshotBeforeUpdate(n){const{layoutDependency:o,visualElement:s,drag:c,isPresent:d}=this.props,h=s.projection;return h&&(h.isPresent=d,c||n.layoutDependency!==o||o===void 0?h.willUpdate():this.safeToRemove(),n.isPresent!==d&&(d?h.promote():h.relegate()||frame.postRender(()=>{const p=h.getStack();(!p||!p.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:n}=this.props.visualElement;n&&(n.root.didUpdate(),microtask.postRender(()=>{!n.currentAnimation&&n.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:n,layoutGroup:o,switchLayoutGroup:s}=this.props,{projection:c}=n;c&&(c.scheduleCheckAfterUnmount(),o&&o.group&&o.group.remove(c),s&&s.deregister&&s.deregister(c))}safeToRemove(){const{safeToRemove:n}=this.props;n&&n()}render(){return null}}function MeasureLayout(t){const[n,o]=usePresence(),s=React.useContext(LayoutGroupContext);return React.createElement(MeasureLayoutWithContext,{...t,layoutGroup:s,switchLayoutGroup:React.useContext(SwitchLayoutGroupContext),isPresent:n,safeToRemove:o})}const defaultScaleCorrectors={borderRadius:{...correctBorderRadius,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:correctBorderRadius,borderTopRightRadius:correctBorderRadius,borderBottomLeftRadius:correctBorderRadius,borderBottomRightRadius:correctBorderRadius,boxShadow:correctBoxShadow},borders=["TopLeft","TopRight","BottomLeft","BottomRight"],numBorders=borders.length,asNumber=t=>typeof t=="string"?parseFloat(t):t,isPx=t=>typeof t=="number"||px.test(t);function mixValues(t,n,o,s,c,d){c?(t.opacity=mixNumber$1(0,o.opacity!==void 0?o.opacity:1,easeCrossfadeIn(s)),t.opacityExit=mixNumber$1(n.opacity!==void 0?n.opacity:1,0,easeCrossfadeOut(s))):d&&(t.opacity=mixNumber$1(n.opacity!==void 0?n.opacity:1,o.opacity!==void 0?o.opacity:1,s));for(let h=0;h<numBorders;h++){const p=`border${borders[h]}Radius`;let y=getRadius(n,p),E=getRadius(o,p);if(y===void 0&&E===void 0)continue;y||(y=0),E||(E=0),y===0||E===0||isPx(y)===isPx(E)?(t[p]=Math.max(mixNumber$1(asNumber(y),asNumber(E),s),0),(percent.test(E)||percent.test(y))&&(t[p]+="%")):t[p]=E}(n.rotate||o.rotate)&&(t.rotate=mixNumber$1(n.rotate||0,o.rotate||0,s))}function getRadius(t,n){return t[n]!==void 0?t[n]:t.borderRadius}const easeCrossfadeIn=compress(0,.5,circOut),easeCrossfadeOut=compress(.5,.95,noop$1);function compress(t,n,o){return s=>s<t?0:s>n?1:o(progress(t,n,s))}function copyAxisInto(t,n){t.min=n.min,t.max=n.max}function copyBoxInto(t,n){copyAxisInto(t.x,n.x),copyAxisInto(t.y,n.y)}function removePointDelta(t,n,o,s,c){return t-=n,t=scalePoint(t,1/o,s),c!==void 0&&(t=scalePoint(t,1/c,s)),t}function removeAxisDelta(t,n=0,o=1,s=.5,c,d=t,h=t){if(percent.test(n)&&(n=parseFloat(n),n=mixNumber$1(h.min,h.max,n/100)-h.min),typeof n!="number")return;let p=mixNumber$1(d.min,d.max,s);t===d&&(p-=n),t.min=removePointDelta(t.min,n,o,p,c),t.max=removePointDelta(t.max,n,o,p,c)}function removeAxisTransforms(t,n,[o,s,c],d,h){removeAxisDelta(t,n[o],n[s],n[c],n.scale,d,h)}const xKeys=["x","scaleX","originX"],yKeys=["y","scaleY","originY"];function removeBoxTransforms(t,n,o,s){removeAxisTransforms(t.x,n,xKeys,o?o.x:void 0,s?s.x:void 0),removeAxisTransforms(t.y,n,yKeys,o?o.y:void 0,s?s.y:void 0)}function isAxisDeltaZero(t){return t.translate===0&&t.scale===1}function isDeltaZero(t){return isAxisDeltaZero(t.x)&&isAxisDeltaZero(t.y)}function boxEquals(t,n){return t.x.min===n.x.min&&t.x.max===n.x.max&&t.y.min===n.y.min&&t.y.max===n.y.max}function boxEqualsRounded(t,n){return Math.round(t.x.min)===Math.round(n.x.min)&&Math.round(t.x.max)===Math.round(n.x.max)&&Math.round(t.y.min)===Math.round(n.y.min)&&Math.round(t.y.max)===Math.round(n.y.max)}function aspectRatio(t){return calcLength(t.x)/calcLength(t.y)}class NodeStack{constructor(){this.members=[]}add(n){addUniqueItem(this.members,n),n.scheduleRender()}remove(n){if(removeItem(this.members,n),n===this.prevLead&&(this.prevLead=void 0),n===this.lead){const o=this.members[this.members.length-1];o&&this.promote(o)}}relegate(n){const o=this.members.findIndex(c=>n===c);if(o===0)return!1;let s;for(let c=o;c>=0;c--){const d=this.members[c];if(d.isPresent!==!1){s=d;break}}return s?(this.promote(s),!0):!1}promote(n,o){const s=this.lead;if(n!==s&&(this.prevLead=s,this.lead=n,n.show(),s)){s.instance&&s.scheduleRender(),n.scheduleRender(),n.resumeFrom=s,o&&(n.resumeFrom.preserveOpacity=!0),s.snapshot&&(n.snapshot=s.snapshot,n.snapshot.latestValues=s.animationValues||s.latestValues),n.root&&n.root.isUpdating&&(n.isLayoutDirty=!0);const{crossfade:c}=n.options;c===!1&&s.hide()}}exitAnimationComplete(){this.members.forEach(n=>{const{options:o,resumingFrom:s}=n;o.onExitComplete&&o.onExitComplete(),s&&s.options.onExitComplete&&s.options.onExitComplete()})}scheduleRender(){this.members.forEach(n=>{n.instance&&n.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}function buildProjectionTransform(t,n,o){let s="";const c=t.x.translate/n.x,d=t.y.translate/n.y,h=(o==null?void 0:o.z)||0;if((c||d||h)&&(s=`translate3d(${c}px, ${d}px, ${h}px) `),(n.x!==1||n.y!==1)&&(s+=`scale(${1/n.x}, ${1/n.y}) `),o){const{transformPerspective:E,rotate:L,rotateX:F,rotateY:N,skewX:z,skewY:oe}=o;E&&(s=`perspective(${E}px) ${s}`),L&&(s+=`rotate(${L}deg) `),F&&(s+=`rotateX(${F}deg) `),N&&(s+=`rotateY(${N}deg) `),z&&(s+=`skewX(${z}deg) `),oe&&(s+=`skewY(${oe}deg) `)}const p=t.x.scale*n.x,y=t.y.scale*n.y;return(p!==1||y!==1)&&(s+=`scale(${p}, ${y})`),s||"none"}const compareByDepth=(t,n)=>t.depth-n.depth;class FlatTree{constructor(){this.children=[],this.isDirty=!1}add(n){addUniqueItem(this.children,n),this.isDirty=!0}remove(n){removeItem(this.children,n),this.isDirty=!0}forEach(n){this.isDirty&&this.children.sort(compareByDepth),this.isDirty=!1,this.children.forEach(n)}}function delay(t,n){const o=time.now(),s=({timestamp:c})=>{const d=c-o;d>=n&&(cancelFrame(s),t(d-n))};return frame.read(s,!0),()=>cancelFrame(s)}function record(t){window.MotionDebug&&window.MotionDebug.record(t)}function isSVGElement(t){return t instanceof SVGElement&&t.tagName!=="svg"}function animateSingleValue(t,n,o){const s=isMotionValue(t)?t:motionValue(t);return s.start(animateMotionValue("",s,n,o)),s.animation}const transformAxes=["","X","Y","Z"],hiddenVisibility={visibility:"hidden"},animationTarget=1e3;let id=0;const projectionFrameData={type:"projectionFrame",totalNodes:0,resolvedTargetDeltas:0,recalculatedProjection:0};function resetDistortingTransform(t,n,o,s){const{latestValues:c}=n;c[t]&&(o[t]=c[t],n.setStaticValue(t,0),s&&(s[t]=0))}function createProjectionNode({attachResizeListener:t,defaultParent:n,measureScroll:o,checkIsScrollRoot:s,resetTransform:c}){return class{constructor(h={},p=n==null?void 0:n()){this.id=id++,this.animationId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,projectionFrameData.totalNodes=projectionFrameData.resolvedTargetDeltas=projectionFrameData.recalculatedProjection=0,this.nodes.forEach(propagateDirtyNodes),this.nodes.forEach(resolveTargetDelta),this.nodes.forEach(calcProjection),this.nodes.forEach(cleanDirtyNodes),record(projectionFrameData)},this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=h,this.root=p?p.root||p:this,this.path=p?[...p.path,p]:[],this.parent=p,this.depth=p?p.depth+1:0;for(let y=0;y<this.path.length;y++)this.path[y].shouldResetTransform=!0;this.root===this&&(this.nodes=new FlatTree)}addEventListener(h,p){return this.eventHandlers.has(h)||this.eventHandlers.set(h,new SubscriptionManager),this.eventHandlers.get(h).add(p)}notifyListeners(h,...p){const y=this.eventHandlers.get(h);y&&y.notify(...p)}hasListeners(h){return this.eventHandlers.has(h)}mount(h,p=this.root.hasTreeAnimated){if(this.instance)return;this.isSVG=isSVGElement(h),this.instance=h;const{layoutId:y,layout:E,visualElement:L}=this.options;if(L&&!L.current&&L.mount(h),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),p&&(E||y)&&(this.isLayoutDirty=!0),t){let F;const N=()=>this.root.updateBlockedByResize=!1;t(h,()=>{this.root.updateBlockedByResize=!0,F&&F(),F=delay(N,250),globalProjectionState.hasAnimatedSinceResize&&(globalProjectionState.hasAnimatedSinceResize=!1,this.nodes.forEach(finishAnimation))})}y&&this.root.registerSharedNode(y,this),this.options.animate!==!1&&L&&(y||E)&&this.addEventListener("didUpdate",({delta:F,hasLayoutChanged:N,hasRelativeTargetChanged:z,layout:oe})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const W=this.options.transition||L.getDefaultTransition()||defaultLayoutTransition,{onLayoutAnimationStart:lt,onLayoutAnimationComplete:nt}=L.getProps(),Ee=!this.targetLayout||!boxEqualsRounded(this.targetLayout,oe)||z,yt=!N&&z;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||yt||N&&(Ee||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(F,yt);const Ai={...getValueTransition(W,"layout"),onPlay:lt,onComplete:nt};(L.shouldReduceMotion||this.options.layoutRoot)&&(Ai.delay=0,Ai.type=!1),this.startAnimation(Ai)}else N||finishAnimation(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=oe})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const h=this.getStack();h&&h.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,cancelFrame(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(resetSkewAndRotation),this.animationId++)}getTransformTemplate(){const{visualElement:h}=this.options;return h&&h.getProps().transformTemplate}willUpdate(h=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let L=0;L<this.path.length;L++){const F=this.path[L];F.shouldResetTransform=!0,F.updateScroll("snapshot"),F.options.layoutRoot&&F.willUpdate(!1)}const{layoutId:p,layout:y}=this.options;if(p===void 0&&!y)return;const E=this.getTransformTemplate();this.prevTransformTemplateValue=E?E(this.latestValues,""):void 0,this.updateSnapshot(),h&&this.notifyListeners("willUpdate")}update(){if(this.updateScheduled=!1,this.isUpdateBlocked()){this.unblockUpdate(),this.clearAllSnapshots(),this.nodes.forEach(clearMeasurements);return}this.isUpdating||this.nodes.forEach(clearIsLayoutDirty),this.isUpdating=!1,window.HandoffCancelAllAnimations&&window.HandoffCancelAllAnimations(),this.nodes.forEach(resetTransformStyle),this.nodes.forEach(updateLayout),this.nodes.forEach(notifyLayoutUpdate),this.clearAllSnapshots();const p=time.now();frameData.delta=clamp(0,1e3/60,p-frameData.timestamp),frameData.timestamp=p,frameData.isProcessing=!0,steps.update.process(frameData),steps.preRender.process(frameData),steps.render.process(frameData),frameData.isProcessing=!1}didUpdate(){this.updateScheduled||(this.updateScheduled=!0,microtask.read(()=>this.update()))}clearAllSnapshots(){this.nodes.forEach(clearSnapshot),this.sharedNodes.forEach(removeLeadSnapshots)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,frame.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){frame.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure())}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let y=0;y<this.path.length;y++)this.path[y].updateScroll();const h=this.layout;this.layout=this.measure(!1),this.layoutCorrected=createBox(),this.isLayoutDirty=!1,this.projectionDelta=void 0,this.notifyListeners("measure",this.layout.layoutBox);const{visualElement:p}=this.options;p&&p.notify("LayoutMeasure",this.layout.layoutBox,h?h.layoutBox:void 0)}updateScroll(h="measure"){let p=!!(this.options.layoutScroll&&this.instance);this.scroll&&this.scroll.animationId===this.root.animationId&&this.scroll.phase===h&&(p=!1),p&&(this.scroll={animationId:this.root.animationId,phase:h,isRoot:s(this.instance),offset:o(this.instance)})}resetTransform(){if(!c)return;const h=this.isLayoutDirty||this.shouldResetTransform,p=this.projectionDelta&&!isDeltaZero(this.projectionDelta),y=this.getTransformTemplate(),E=y?y(this.latestValues,""):void 0,L=E!==this.prevTransformTemplateValue;h&&(p||hasTransform(this.latestValues)||L)&&(c(this.instance,E),this.shouldResetTransform=!1,this.scheduleRender())}measure(h=!0){const p=this.measurePageBox();let y=this.removeElementScroll(p);return h&&(y=this.removeTransform(y)),roundBox(y),{animationId:this.root.animationId,measuredBox:p,layoutBox:y,latestValues:{},source:this.id}}measurePageBox(){const{visualElement:h}=this.options;if(!h)return createBox();const p=h.measureViewportBox(),{scroll:y}=this.root;return y&&(translateAxis(p.x,y.offset.x),translateAxis(p.y,y.offset.y)),p}removeElementScroll(h){const p=createBox();copyBoxInto(p,h);for(let y=0;y<this.path.length;y++){const E=this.path[y],{scroll:L,options:F}=E;if(E!==this.root&&L&&F.layoutScroll){if(L.isRoot){copyBoxInto(p,h);const{scroll:N}=this.root;N&&(translateAxis(p.x,-N.offset.x),translateAxis(p.y,-N.offset.y))}translateAxis(p.x,L.offset.x),translateAxis(p.y,L.offset.y)}}return p}applyTransform(h,p=!1){const y=createBox();copyBoxInto(y,h);for(let E=0;E<this.path.length;E++){const L=this.path[E];!p&&L.options.layoutScroll&&L.scroll&&L!==L.root&&transformBox(y,{x:-L.scroll.offset.x,y:-L.scroll.offset.y}),hasTransform(L.latestValues)&&transformBox(y,L.latestValues)}return hasTransform(this.latestValues)&&transformBox(y,this.latestValues),y}removeTransform(h){const p=createBox();copyBoxInto(p,h);for(let y=0;y<this.path.length;y++){const E=this.path[y];if(!E.instance||!hasTransform(E.latestValues))continue;hasScale(E.latestValues)&&E.updateSnapshot();const L=createBox(),F=E.measurePageBox();copyBoxInto(L,F),removeBoxTransforms(p,E.latestValues,E.snapshot?E.snapshot.layoutBox:void 0,L)}return hasTransform(this.latestValues)&&removeBoxTransforms(p,this.latestValues),p}setTargetDelta(h){this.targetDelta=h,this.root.scheduleUpdateProjection(),this.isProjectionDirty=!0}setOptions(h){this.options={...this.options,...h,crossfade:h.crossfade!==void 0?h.crossfade:!0}}clearMeasurements(){this.scroll=void 0,this.layout=void 0,this.snapshot=void 0,this.prevTransformTemplateValue=void 0,this.targetDelta=void 0,this.target=void 0,this.isLayoutDirty=!1}forceRelativeParentToResolveTarget(){this.relativeParent&&this.relativeParent.resolvedRelativeTargetAt!==frameData.timestamp&&this.relativeParent.resolveTargetDelta(!0)}resolveTargetDelta(h=!1){var p;const y=this.getLead();this.isProjectionDirty||(this.isProjectionDirty=y.isProjectionDirty),this.isTransformDirty||(this.isTransformDirty=y.isTransformDirty),this.isSharedProjectionDirty||(this.isSharedProjectionDirty=y.isSharedProjectionDirty);const E=!!this.resumingFrom||this!==y;if(!(h||E&&this.isSharedProjectionDirty||this.isProjectionDirty||!((p=this.parent)===null||p===void 0)&&p.isProjectionDirty||this.attemptToResolveRelativeTarget))return;const{layout:F,layoutId:N}=this.options;if(!(!this.layout||!(F||N))){if(this.resolvedRelativeTargetAt=frameData.timestamp,!this.targetDelta&&!this.relativeTarget){const z=this.getClosestProjectingParent();z&&z.layout&&this.animationProgress!==1?(this.relativeParent=z,this.forceRelativeParentToResolveTarget(),this.relativeTarget=createBox(),this.relativeTargetOrigin=createBox(),calcRelativePosition(this.relativeTargetOrigin,this.layout.layoutBox,z.layout.layoutBox),copyBoxInto(this.relativeTarget,this.relativeTargetOrigin)):this.relativeParent=this.relativeTarget=void 0}if(!(!this.relativeTarget&&!this.targetDelta)){if(this.target||(this.target=createBox(),this.targetWithTransforms=createBox()),this.relativeTarget&&this.relativeTargetOrigin&&this.relativeParent&&this.relativeParent.target?(this.forceRelativeParentToResolveTarget(),calcRelativeBox(this.target,this.relativeTarget,this.relativeParent.target)):this.targetDelta?(this.resumingFrom?this.target=this.applyTransform(this.layout.layoutBox):copyBoxInto(this.target,this.layout.layoutBox),applyBoxDelta(this.target,this.targetDelta)):copyBoxInto(this.target,this.layout.layoutBox),this.attemptToResolveRelativeTarget){this.attemptToResolveRelativeTarget=!1;const z=this.getClosestProjectingParent();z&&!!z.resumingFrom==!!this.resumingFrom&&!z.options.layoutScroll&&z.target&&this.animationProgress!==1?(this.relativeParent=z,this.forceRelativeParentToResolveTarget(),this.relativeTarget=createBox(),this.relativeTargetOrigin=createBox(),calcRelativePosition(this.relativeTargetOrigin,this.target,z.target),copyBoxInto(this.relativeTarget,this.relativeTargetOrigin)):this.relativeParent=this.relativeTarget=void 0}projectionFrameData.resolvedTargetDeltas++}}}getClosestProjectingParent(){if(!(!this.parent||hasScale(this.parent.latestValues)||has2DTranslate(this.parent.latestValues)))return this.parent.isProjecting()?this.parent:this.parent.getClosestProjectingParent()}isProjecting(){return!!((this.relativeTarget||this.targetDelta||this.options.layoutRoot)&&this.layout)}calcProjection(){var h;const p=this.getLead(),y=!!this.resumingFrom||this!==p;let E=!0;if((this.isProjectionDirty||!((h=this.parent)===null||h===void 0)&&h.isProjectionDirty)&&(E=!1),y&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(E=!1),this.resolvedRelativeTargetAt===frameData.timestamp&&(E=!1),E)return;const{layout:L,layoutId:F}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(L||F))return;copyBoxInto(this.layoutCorrected,this.layout.layoutBox);const N=this.treeScale.x,z=this.treeScale.y;applyTreeDeltas(this.layoutCorrected,this.treeScale,this.path,y),p.layout&&!p.target&&(this.treeScale.x!==1||this.treeScale.y!==1)&&(p.target=p.layout.layoutBox,p.targetWithTransforms=createBox());const{target:oe}=p;if(!oe){this.projectionTransform&&(this.projectionDelta=createDelta(),this.projectionTransform="none",this.scheduleRender());return}this.projectionDelta||(this.projectionDelta=createDelta(),this.projectionDeltaWithTransform=createDelta());const W=this.projectionTransform;calcBoxDelta(this.projectionDelta,this.layoutCorrected,oe,this.latestValues),this.projectionTransform=buildProjectionTransform(this.projectionDelta,this.treeScale),(this.projectionTransform!==W||this.treeScale.x!==N||this.treeScale.y!==z)&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",oe)),projectionFrameData.recalculatedProjection++}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(h=!0){if(this.options.scheduleRender&&this.options.scheduleRender(),h){const p=this.getStack();p&&p.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}setAnimationOrigin(h,p=!1){const y=this.snapshot,E=y?y.latestValues:{},L={...this.latestValues},F=createDelta();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!p;const N=createBox(),z=y?y.source:void 0,oe=this.layout?this.layout.source:void 0,W=z!==oe,lt=this.getStack(),nt=!lt||lt.members.length<=1,Ee=!!(W&&!nt&&this.options.crossfade===!0&&!this.path.some(hasOpacityCrossfade));this.animationProgress=0;let yt;this.mixTargetDelta=Ai=>{const zi=Ai/1e3;mixAxisDelta(F.x,h.x,zi),mixAxisDelta(F.y,h.y,zi),this.setTargetDelta(F),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(calcRelativePosition(N,this.layout.layoutBox,this.relativeParent.layout.layoutBox),mixBox(this.relativeTarget,this.relativeTargetOrigin,N,zi),yt&&boxEquals(this.relativeTarget,yt)&&(this.isProjectionDirty=!1),yt||(yt=createBox()),copyBoxInto(yt,this.relativeTarget)),W&&(this.animationValues=L,mixValues(L,E,this.latestValues,zi,Ee,nt)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=zi},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(h){this.notifyListeners("animationStart"),this.currentAnimation&&this.currentAnimation.stop(),this.resumingFrom&&this.resumingFrom.currentAnimation&&this.resumingFrom.currentAnimation.stop(),this.pendingAnimation&&(cancelFrame(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=frame.update(()=>{globalProjectionState.hasAnimatedSinceResize=!0,this.currentAnimation=animateSingleValue(0,animationTarget,{...h,onUpdate:p=>{this.mixTargetDelta(p),h.onUpdate&&h.onUpdate(p)},onComplete:()=>{h.onComplete&&h.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const h=this.getStack();h&&h.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(animationTarget),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const h=this.getLead();let{targetWithTransforms:p,target:y,layout:E,latestValues:L}=h;if(!(!p||!y||!E)){if(this!==h&&this.layout&&E&&shouldAnimatePositionOnly(this.options.animationType,this.layout.layoutBox,E.layoutBox)){y=this.target||createBox();const F=calcLength(this.layout.layoutBox.x);y.x.min=h.target.x.min,y.x.max=y.x.min+F;const N=calcLength(this.layout.layoutBox.y);y.y.min=h.target.y.min,y.y.max=y.y.min+N}copyBoxInto(p,y),transformBox(p,L),calcBoxDelta(this.projectionDeltaWithTransform,this.layoutCorrected,p,L)}}registerSharedNode(h,p){this.sharedNodes.has(h)||this.sharedNodes.set(h,new NodeStack),this.sharedNodes.get(h).add(p);const E=p.options.initialPromotionConfig;p.promote({transition:E?E.transition:void 0,preserveFollowOpacity:E&&E.shouldPreserveFollowOpacity?E.shouldPreserveFollowOpacity(p):void 0})}isLead(){const h=this.getStack();return h?h.lead===this:!0}getLead(){var h;const{layoutId:p}=this.options;return p?((h=this.getStack())===null||h===void 0?void 0:h.lead)||this:this}getPrevLead(){var h;const{layoutId:p}=this.options;return p?(h=this.getStack())===null||h===void 0?void 0:h.prevLead:void 0}getStack(){const{layoutId:h}=this.options;if(h)return this.root.sharedNodes.get(h)}promote({needsReset:h,transition:p,preserveFollowOpacity:y}={}){const E=this.getStack();E&&E.promote(this,y),h&&(this.projectionDelta=void 0,this.needsReset=!0),p&&this.setOptions({transition:p})}relegate(){const h=this.getStack();return h?h.relegate(this):!1}resetSkewAndRotation(){const{visualElement:h}=this.options;if(!h)return;let p=!1;const{latestValues:y}=h;if((y.z||y.rotate||y.rotateX||y.rotateY||y.rotateZ||y.skewX||y.skewY)&&(p=!0),!p)return;const E={};y.z&&resetDistortingTransform("z",h,E,this.animationValues);for(let L=0;L<transformAxes.length;L++)resetDistortingTransform(`rotate${transformAxes[L]}`,h,E,this.animationValues),resetDistortingTransform(`skew${transformAxes[L]}`,h,E,this.animationValues);h.render();for(const L in E)h.setStaticValue(L,E[L]),this.animationValues&&(this.animationValues[L]=E[L]);h.scheduleRender()}getProjectionStyles(h){var p,y;if(!this.instance||this.isSVG)return;if(!this.isVisible)return hiddenVisibility;const E={visibility:""},L=this.getTransformTemplate();if(this.needsReset)return this.needsReset=!1,E.opacity="",E.pointerEvents=resolveMotionValue(h==null?void 0:h.pointerEvents)||"",E.transform=L?L(this.latestValues,""):"none",E;const F=this.getLead();if(!this.projectionDelta||!this.layout||!F.target){const W={};return this.options.layoutId&&(W.opacity=this.latestValues.opacity!==void 0?this.latestValues.opacity:1,W.pointerEvents=resolveMotionValue(h==null?void 0:h.pointerEvents)||""),this.hasProjected&&!hasTransform(this.latestValues)&&(W.transform=L?L({},""):"none",this.hasProjected=!1),W}const N=F.animationValues||F.latestValues;this.applyTransformsToTarget(),E.transform=buildProjectionTransform(this.projectionDeltaWithTransform,this.treeScale,N),L&&(E.transform=L(N,E.transform));const{x:z,y:oe}=this.projectionDelta;E.transformOrigin=`${z.origin*100}% ${oe.origin*100}% 0`,F.animationValues?E.opacity=F===this?(y=(p=N.opacity)!==null&&p!==void 0?p:this.latestValues.opacity)!==null&&y!==void 0?y:1:this.preserveOpacity?this.latestValues.opacity:N.opacityExit:E.opacity=F===this?N.opacity!==void 0?N.opacity:"":N.opacityExit!==void 0?N.opacityExit:0;for(const W in scaleCorrectors){if(N[W]===void 0)continue;const{correct:lt,applyTo:nt}=scaleCorrectors[W],Ee=E.transform==="none"?N[W]:lt(N[W],F);if(nt){const yt=nt.length;for(let Ai=0;Ai<yt;Ai++)E[nt[Ai]]=Ee}else E[W]=Ee}return this.options.layoutId&&(E.pointerEvents=F===this?resolveMotionValue(h==null?void 0:h.pointerEvents)||"":"none"),E}clearSnapshot(){this.resumeFrom=this.snapshot=void 0}resetTree(){this.root.nodes.forEach(h=>{var p;return(p=h.currentAnimation)===null||p===void 0?void 0:p.stop()}),this.root.nodes.forEach(clearMeasurements),this.root.sharedNodes.clear()}}}function updateLayout(t){t.updateLayout()}function notifyLayoutUpdate(t){var n;const o=((n=t.resumeFrom)===null||n===void 0?void 0:n.snapshot)||t.snapshot;if(t.isLead()&&t.layout&&o&&t.hasListeners("didUpdate")){const{layoutBox:s,measuredBox:c}=t.layout,{animationType:d}=t.options,h=o.source!==t.layout.source;d==="size"?eachAxis(F=>{const N=h?o.measuredBox[F]:o.layoutBox[F],z=calcLength(N);N.min=s[F].min,N.max=N.min+z}):shouldAnimatePositionOnly(d,o.layoutBox,s)&&eachAxis(F=>{const N=h?o.measuredBox[F]:o.layoutBox[F],z=calcLength(s[F]);N.max=N.min+z,t.relativeTarget&&!t.currentAnimation&&(t.isProjectionDirty=!0,t.relativeTarget[F].max=t.relativeTarget[F].min+z)});const p=createDelta();calcBoxDelta(p,s,o.layoutBox);const y=createDelta();h?calcBoxDelta(y,t.applyTransform(c,!0),o.measuredBox):calcBoxDelta(y,s,o.layoutBox);const E=!isDeltaZero(p);let L=!1;if(!t.resumeFrom){const F=t.getClosestProjectingParent();if(F&&!F.resumeFrom){const{snapshot:N,layout:z}=F;if(N&&z){const oe=createBox();calcRelativePosition(oe,o.layoutBox,N.layoutBox);const W=createBox();calcRelativePosition(W,s,z.layoutBox),boxEqualsRounded(oe,W)||(L=!0),F.options.layoutRoot&&(t.relativeTarget=W,t.relativeTargetOrigin=oe,t.relativeParent=F)}}}t.notifyListeners("didUpdate",{layout:s,snapshot:o,delta:y,layoutDelta:p,hasLayoutChanged:E,hasRelativeTargetChanged:L})}else if(t.isLead()){const{onExitComplete:s}=t.options;s&&s()}t.options.transition=void 0}function propagateDirtyNodes(t){projectionFrameData.totalNodes++,t.parent&&(t.isProjecting()||(t.isProjectionDirty=t.parent.isProjectionDirty),t.isSharedProjectionDirty||(t.isSharedProjectionDirty=!!(t.isProjectionDirty||t.parent.isProjectionDirty||t.parent.isSharedProjectionDirty)),t.isTransformDirty||(t.isTransformDirty=t.parent.isTransformDirty))}function cleanDirtyNodes(t){t.isProjectionDirty=t.isSharedProjectionDirty=t.isTransformDirty=!1}function clearSnapshot(t){t.clearSnapshot()}function clearMeasurements(t){t.clearMeasurements()}function clearIsLayoutDirty(t){t.isLayoutDirty=!1}function resetTransformStyle(t){const{visualElement:n}=t.options;n&&n.getProps().onBeforeLayoutMeasure&&n.notify("BeforeLayoutMeasure"),t.resetTransform()}function finishAnimation(t){t.finishAnimation(),t.targetDelta=t.relativeTarget=t.target=void 0,t.isProjectionDirty=!0}function resolveTargetDelta(t){t.resolveTargetDelta()}function calcProjection(t){t.calcProjection()}function resetSkewAndRotation(t){t.resetSkewAndRotation()}function removeLeadSnapshots(t){t.removeLeadSnapshot()}function mixAxisDelta(t,n,o){t.translate=mixNumber$1(n.translate,0,o),t.scale=mixNumber$1(n.scale,1,o),t.origin=n.origin,t.originPoint=n.originPoint}function mixAxis(t,n,o,s){t.min=mixNumber$1(n.min,o.min,s),t.max=mixNumber$1(n.max,o.max,s)}function mixBox(t,n,o,s){mixAxis(t.x,n.x,o.x,s),mixAxis(t.y,n.y,o.y,s)}function hasOpacityCrossfade(t){return t.animationValues&&t.animationValues.opacityExit!==void 0}const defaultLayoutTransition={duration:.45,ease:[.4,0,.1,1]},userAgentContains=t=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(t),roundPoint=userAgentContains("applewebkit/")&&!userAgentContains("chrome/")?Math.round:noop$1;function roundAxis(t){t.min=roundPoint(t.min),t.max=roundPoint(t.max)}function roundBox(t){roundAxis(t.x),roundAxis(t.y)}function shouldAnimatePositionOnly(t,n,o){return t==="position"||t==="preserve-aspect"&&!isNear(aspectRatio(n),aspectRatio(o),.2)}const DocumentProjectionNode=createProjectionNode({attachResizeListener:(t,n)=>addDomEvent(t,"resize",n),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),rootProjectionNode={current:void 0},HTMLProjectionNode=createProjectionNode({measureScroll:t=>({x:t.scrollLeft,y:t.scrollTop}),defaultParent:()=>{if(!rootProjectionNode.current){const t=new DocumentProjectionNode({});t.mount(window),t.setOptions({layoutScroll:!0}),rootProjectionNode.current=t}return rootProjectionNode.current},resetTransform:(t,n)=>{t.style.transform=n!==void 0?n:"none"},checkIsScrollRoot:t=>window.getComputedStyle(t).position==="fixed"}),drag={pan:{Feature:PanGesture},drag:{Feature:DragGesture,ProjectionNode:HTMLProjectionNode,MeasureLayout}},prefersReducedMotion={current:null},hasReducedMotionListener={current:!1};function initPrefersReducedMotion(){if(hasReducedMotionListener.current=!0,!!isBrowser)if(window.matchMedia){const t=window.matchMedia("(prefers-reduced-motion)"),n=()=>prefersReducedMotion.current=t.matches;t.addListener(n),n()}else prefersReducedMotion.current=!1}function updateMotionValuesFromProps(t,n,o){const{willChange:s}=n;for(const c in n){const d=n[c],h=o[c];if(isMotionValue(d))t.addValue(c,d),isWillChangeMotionValue(s)&&s.add(c),process.env.NODE_ENV==="development"&&warnOnce(d.version==="11.0.27",`Attempting to mix Framer Motion versions ${d.version} with 11.0.27 may not work as expected.`);else if(isMotionValue(h))t.addValue(c,motionValue(d,{owner:t})),isWillChangeMotionValue(s)&&s.remove(c);else if(h!==d)if(t.hasValue(c)){const p=t.getValue(c);p.liveStyle===!0?p.jump(d):p.hasAnimated||p.set(d)}else{const p=t.getStaticValue(c);t.addValue(c,motionValue(p!==void 0?p:d,{owner:t}))}}for(const c in o)n[c]===void 0&&t.removeValue(c);return n}const visualElementStore=new WeakMap,valueTypes=[...dimensionValueTypes,color,complex],findValueType=t=>valueTypes.find(testValueType(t)),featureNames=Object.keys(featureDefinitions),numFeatures=featureNames.length,propEventHandlers=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"],numVariantProps=variantProps.length;function getClosestProjectingNode(t){if(t)return t.options.allowProjection!==!1?t.projection:getClosestProjectingNode(t.parent)}class VisualElement{constructor({parent:n,props:o,presenceContext:s,reducedMotionConfig:c,blockInitialAnimation:d,visualState:h},p={}){this.resolveKeyframes=(N,z,oe,W)=>new this.KeyframeResolver(N,z,oe,W,this),this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=KeyframeResolver,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.scheduleRender=()=>frame.render(this.render,!1,!0);const{latestValues:y,renderState:E}=h;this.latestValues=y,this.baseTarget={...y},this.initialValues=o.initial?{...y}:{},this.renderState=E,this.parent=n,this.props=o,this.presenceContext=s,this.depth=n?n.depth+1:0,this.reducedMotionConfig=c,this.options=p,this.blockInitialAnimation=!!d,this.isControllingVariants=isControllingVariants(o),this.isVariantNode=isVariantNode(o),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(n&&n.current);const{willChange:L,...F}=this.scrapeMotionValuesFromProps(o,{},this);for(const N in F){const z=F[N];y[N]!==void 0&&isMotionValue(z)&&(z.set(y[N],!1),isWillChangeMotionValue(L)&&L.add(N))}}scrapeMotionValuesFromProps(n,o,s){return{}}mount(n){this.current=n,visualElementStore.set(n,this),this.projection&&!this.projection.instance&&this.projection.mount(n),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((o,s)=>this.bindToMotionValue(s,o)),hasReducedMotionListener.current||initPrefersReducedMotion(),this.shouldReduceMotion=this.reducedMotionConfig==="never"?!1:this.reducedMotionConfig==="always"?!0:prefersReducedMotion.current,process.env.NODE_ENV!=="production"&&warnOnce(this.shouldReduceMotion!==!0,"You have Reduced Motion enabled on your device. Animations may not appear as expected."),this.parent&&this.parent.children.add(this),this.update(this.props,this.presenceContext)}unmount(){visualElementStore.delete(this.current),this.projection&&this.projection.unmount(),cancelFrame(this.notifyUpdate),cancelFrame(this.render),this.valueSubscriptions.forEach(n=>n()),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent&&this.parent.children.delete(this);for(const n in this.events)this.events[n].clear();for(const n in this.features)this.features[n].unmount();this.current=null}bindToMotionValue(n,o){const s=transformProps.has(n),c=o.on("change",h=>{this.latestValues[n]=h,this.props.onUpdate&&frame.preRender(this.notifyUpdate),s&&this.projection&&(this.projection.isTransformDirty=!0)}),d=o.on("renderRequest",this.scheduleRender);this.valueSubscriptions.set(n,()=>{c(),d(),o.owner&&o.stop()})}sortNodePosition(n){return!this.current||!this.sortInstanceNodePosition||this.type!==n.type?0:this.sortInstanceNodePosition(this.current,n.current)}loadFeatures({children:n,...o},s,c,d){let h,p;if(process.env.NODE_ENV!=="production"&&c&&s){const y="You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.";o.ignoreStrict?warning(!1,y):invariant(!1,y)}for(let y=0;y<numFeatures;y++){const E=featureNames[y],{isEnabled:L,Feature:F,ProjectionNode:N,MeasureLayout:z}=featureDefinitions[E];N&&(h=N),L(o)&&(!this.features[E]&&F&&(this.features[E]=new F(this)),z&&(p=z))}if((this.type==="html"||this.type==="svg")&&!this.projection&&h){this.projection=new h(this.latestValues,getClosestProjectingNode(this.parent));const{layoutId:y,layout:E,drag:L,dragConstraints:F,layoutScroll:N,layoutRoot:z}=o;this.projection.setOptions({layoutId:y,layout:E,alwaysMeasureLayout:!!L||F&&isRefObject(F),visualElement:this,scheduleRender:()=>this.scheduleRender(),animationType:typeof E=="string"?E:"both",initialPromotionConfig:d,layoutScroll:N,layoutRoot:z})}return p}updateFeatures(){for(const n in this.features){const o=this.features[n];o.isMounted?o.update():(o.mount(),o.isMounted=!0)}}triggerBuild(){this.build(this.renderState,this.latestValues,this.options,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):createBox()}getStaticValue(n){return this.latestValues[n]}setStaticValue(n,o){this.latestValues[n]=o}update(n,o){(n.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=n,this.prevPresenceContext=this.presenceContext,this.presenceContext=o;for(let s=0;s<propEventHandlers.length;s++){const c=propEventHandlers[s];this.propEventSubscriptions[c]&&(this.propEventSubscriptions[c](),delete this.propEventSubscriptions[c]);const d=n["on"+c];d&&(this.propEventSubscriptions[c]=this.on(c,d))}this.prevMotionValues=updateMotionValuesFromProps(this,this.scrapeMotionValuesFromProps(n,this.prevProps,this),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(n){return this.props.variants?this.props.variants[n]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}getVariantContext(n=!1){if(n)return this.parent?this.parent.getVariantContext():void 0;if(!this.isControllingVariants){const s=this.parent?this.parent.getVariantContext()||{}:{};return this.props.initial!==void 0&&(s.initial=this.props.initial),s}const o={};for(let s=0;s<numVariantProps;s++){const c=variantProps[s],d=this.props[c];(isVariantLabel(d)||d===!1)&&(o[c]=d)}return o}addVariantChild(n){const o=this.getClosestVariantNode();if(o)return o.variantChildren&&o.variantChildren.add(n),()=>o.variantChildren.delete(n)}addValue(n,o){o!==this.values.get(n)&&(this.removeValue(n),this.bindToMotionValue(n,o)),this.values.set(n,o),this.latestValues[n]=o.get()}removeValue(n){this.values.delete(n);const o=this.valueSubscriptions.get(n);o&&(o(),this.valueSubscriptions.delete(n)),delete this.latestValues[n],this.removeValueFromRenderState(n,this.renderState)}hasValue(n){return this.values.has(n)}getValue(n,o){if(this.props.values&&this.props.values[n])return this.props.values[n];let s=this.values.get(n);return s===void 0&&o!==void 0&&(s=motionValue(o===null?void 0:o,{owner:this}),this.addValue(n,s)),s}readValue(n,o){var s;let c=this.latestValues[n]!==void 0||!this.current?this.latestValues[n]:(s=this.getBaseTargetFromProps(this.props,n))!==null&&s!==void 0?s:this.readValueFromInstance(this.current,n,this.options);return c!=null&&(typeof c=="string"&&(isNumericalString(c)||isZeroValueString(c))?c=parseFloat(c):!findValueType(c)&&complex.test(o)&&(c=getAnimatableNone(n,o)),this.setBaseTarget(n,isMotionValue(c)?c.get():c)),isMotionValue(c)?c.get():c}setBaseTarget(n,o){this.baseTarget[n]=o}getBaseTarget(n){var o,s;const{initial:c}=this.props,d=typeof c=="string"||typeof c=="object"?(s=resolveVariantFromProps(this.props,c,(o=this.presenceContext)===null||o===void 0?void 0:o.custom))===null||s===void 0?void 0:s[n]:void 0;if(c&&d!==void 0)return d;const h=this.getBaseTargetFromProps(this.props,n);return h!==void 0&&!isMotionValue(h)?h:this.initialValues[n]!==void 0&&d===void 0?void 0:this.baseTarget[n]}on(n,o){return this.events[n]||(this.events[n]=new SubscriptionManager),this.events[n].add(o)}notify(n,...o){this.events[n]&&this.events[n].notify(...o)}}class DOMVisualElement extends VisualElement{constructor(){super(...arguments),this.KeyframeResolver=DOMKeyframesResolver}sortInstanceNodePosition(n,o){return n.compareDocumentPosition(o)&2?1:-1}getBaseTargetFromProps(n,o){return n.style?n.style[o]:void 0}removeValueFromRenderState(n,{vars:o,style:s}){delete o[n],delete s[n]}}function getComputedStyle(t){return window.getComputedStyle(t)}class HTMLVisualElement extends DOMVisualElement{constructor(){super(...arguments),this.type="html"}readValueFromInstance(n,o){if(transformProps.has(o)){const s=getDefaultValueType(o);return s&&s.default||0}else{const s=getComputedStyle(n),c=(isCSSVariableName(o)?s.getPropertyValue(o):s[o])||0;return typeof c=="string"?c.trim():c}}measureInstanceViewportBox(n,{transformPagePoint:o}){return measureViewportBox(n,o)}build(n,o,s,c){buildHTMLStyles(n,o,s,c.transformTemplate)}scrapeMotionValuesFromProps(n,o,s){return scrapeMotionValuesFromProps$1(n,o,s)}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:n}=this.props;isMotionValue(n)&&(this.childSubscription=n.on("change",o=>{this.current&&(this.current.textContent=`${o}`)}))}renderInstance(n,o,s,c){renderHTML(n,o,s,c)}}class SVGVisualElement extends DOMVisualElement{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1}getBaseTargetFromProps(n,o){return n[o]}readValueFromInstance(n,o){if(transformProps.has(o)){const s=getDefaultValueType(o);return s&&s.default||0}return o=camelCaseAttributes.has(o)?o:camelToDash(o),n.getAttribute(o)}measureInstanceViewportBox(){return createBox()}scrapeMotionValuesFromProps(n,o){return scrapeMotionValuesFromProps(n,o,this)}build(n,o,s,c){buildSVGAttrs(n,o,s,this.isSVGTag,c.transformTemplate)}renderInstance(n,o,s,c){renderSVG(n,o,s,c)}mount(n){this.isSVGTag=isSVGTag(n.tagName),super.mount(n)}}const createDomVisualElement=(t,n)=>isSVGComponent(t)?new SVGVisualElement(n,{enableHardwareAcceleration:!1}):new HTMLVisualElement(n,{allowProjection:t!==React.Fragment,enableHardwareAcceleration:!0}),layout={layout:{ProjectionNode:HTMLProjectionNode,MeasureLayout}},preloadedFeatures={...animations,...gestureAnimations,...drag,...layout},motion=createMotionProxy((t,n)=>createDomMotionConfig(t,n,preloadedFeatures,createDomVisualElement));function useMotionValue(t){const n=useConstant(()=>motionValue(t)),{isStatic:o}=React.useContext(MotionConfigContext);if(o){const[,s]=React.useState(t);React.useEffect(()=>n.on("change",s),[])}return n}function assignRef(t,n){return typeof t=="function"?t(n):t&&(t.current=n),t}function useCallbackRef(t,n){var o=React.useState(function(){return{value:t,callback:n,facade:{get current(){return o.value},set current(s){var c=o.value;c!==s&&(o.value=s,o.callback(s,c))}}}})[0];return o.callback=n,o.facade}var useIsomorphicLayoutEffect=typeof window<"u"?React__namespace.useLayoutEffect:React__namespace.useEffect,currentValues=new WeakMap;function useMergeRefs(t,n){var o=useCallbackRef(null,function(s){return t.forEach(function(c){return assignRef(c,s)})});return useIsomorphicLayoutEffect(function(){var s=currentValues.get(o);if(s){var c=new Set(s),d=new Set(t),h=o.current;c.forEach(function(p){d.has(p)||assignRef(p,null)}),d.forEach(function(p){c.has(p)||assignRef(p,h)})}currentValues.set(o,t)},[t]),o}const occluder=new EllipsoidalOccluder(Ellipsoid$1.WGS84,Cartesian3.ZERO),ScreenSpaceElement=React.forwardRef(({position:t,children:n,...o},s)=>{const c=useConstant$2(()=>new Cartesian3);t==null||t.clone(c);const d=useMotionValue(""),h=useMotionValue("none"),{toWindowPosition:p,getCamera:y,toXYZ:E,isPositionVisible:L}=useContext(),F=React.useRef(null);usePreRender(()=>{if(F.current==null)return;let z;try{const Ee=p==null?void 0:p([c.x,c.y,c.z]);z=new Cartesian2(Ee==null?void 0:Ee[0],Ee==null?void 0:Ee[1])}catch{h.set("none");return}const oe=y==null?void 0:y();if(!oe)return;const W=E==null?void 0:E(oe==null?void 0:oe.lng,oe==null?void 0:oe.lat,oe==null?void 0:oe.height);if(!W)return;if(occluder.cameraPosition=new Cartesian3(W[0],W[1],W[2]),z==null||z.x<0||z.y<0||z.x>window.innerWidth||z.y>window.innerHeight||!(L!=null&&L([c.x,c.y,c.z]))){h.set("none");return}const lt=`calc(${z.x}px - 50%)`,nt=`calc(${z.y}px - 50%)`;d.set(`translate(${lt}, ${nt})`),h.set("block")});const N=useMergeRefs([F,s]);return jsxRuntimeExports.jsx(motion.div,{ref:N,...o,style:{...o.style,transform:d,display:h,position:"absolute",pointerEvents:"none",left:0,top:0},children:n})});ScreenSpaceElement.displayName="ScreenSpaceElement";const MeasurementLine$1=({a:t,b:n,color:o})=>{const s=React.useRef([t,n]);s.current=[t,n];const c=useConstant$2(()=>new CallbackProperty(()=>s.current,!1)),d=React.useMemo(()=>({polyline:{positions:c,width:1.5,material:new PolylineDashMaterialProperty({color:o,dashLength:8})}}),[o,c]);return jsxRuntimeExports.jsx(Entity,{...d})},ExtrudedMeasurement=({a:t,b:n,extrudedHeight:o,color:s,showLine:c})=>{const d=useConstant$2(()=>new Cartesian3);return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(ScreenSpaceElement,{position:Cartesian3.midpoint(t,n,d),children:jsxRuntimeExports.jsx(MeasurementText,{children:o<1e3?`${o.toFixed(1)} m`:`${(o/1e3).toFixed(1)} km`})}),c&&jsxRuntimeExports.jsx(MeasurementLine$1,{a:t,b:n,color:s})]})},ExtrudedControlPoints=React.memo(({geometryOptions:{controlPoints:t,type:n},extrudedHeight:o,color:s,isEditing:c,extrudedPoint:d,centroidBasePoint:h,centroidExtrudedPoint:p,catchedExtrudedPoint:y,handleControlPointMouseEvent:E})=>{const L=t[t.length-1],F=d?new Cartesian3(...d):void 0,N=h?new Cartesian3(...h):void 0,z=p?new Cartesian3(...p):void 0;return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[F&&jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:F,isEditing:c,isExtrudedControlPoint:!0,handleControlPointMouseEvent:E}),(!c||y)&&jsxRuntimeExports.jsx(ExtrudedMeasurement,{a:L,b:F,extrudedHeight:o,color:c?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):s,showLine:n!=="extrudedPolygon"})]}),N&&jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:N,isEditing:c,isExtrudedControlPoint:!0}),z&&jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:z,isEditing:c,isExtrudedControlPoint:!0})]})});ExtrudedControlPoints.displayName="ExtrudedControlPoints";const ExtrudedPolygonEntity=({id:t,hierarchy:n,extrudedHeight:o,color:s,disableShadow:c=!1,isEditing:d})=>{const h=React.useRef(n);h.current=n;const y=useConstant$2(()=>new CallbackProperty(()=>h.current,!1)),E=React.useRef(o);E.current=o;const F=useConstant$2(()=>new CallbackProperty(()=>E.current,!1)),N=React.useMemo(()=>({polygon:{hierarchy:y,heightReference:HeightReference$1.RELATIVE_TO_TERRAIN,extrudedHeight:F,extrudedHeightReference:HeightReference$1.RELATIVE_TO_TERRAIN,fill:!0,outline:!0,outlineWidth:1,outlineColor:d?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):s==null?void 0:s.withAlpha(1),material:new ColorMaterialProperty(d?s==null?void 0:s.withAlpha(.2):s),classificationType:ClassificationType$1.TERRAIN,shadows:c?ShadowMode$1.DISABLED:ShadowMode$1.ENABLED}}),[F,c,y,s,d]),{requestRender:z}=useContext();return z==null||z(),jsxRuntimeExports.jsx(Entity,{id:t,...N})},PolygonEntity=({dynamic:t=!1,hierarchy:n,color:o})=>{const s=React.useRef(n);s.current=n;const c=useConstant$2(()=>new CallbackProperty(()=>s.current,!1)),d=t?c:n,h=React.useMemo(()=>({polygon:{hierarchy:d,fill:!0,material:o==null?void 0:o.withAlpha(.5),classificationType:ClassificationType$1.TERRAIN}}),[o,d]),{requestRender:p}=useContext();return p==null||p(),jsxRuntimeExports.jsx(Entity,{...h})},PolylineEntity=({dynamic:t=!1,positions:n,color:o,isEditing:s})=>{const c=React.useRef(n);c.current=n;const d=useConstant$2(()=>new CallbackProperty(()=>c.current,!t)),h=t?d:n,p=React.useMemo(()=>({polyline:{positions:h,width:1.5,material:s?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):o,classificationType:ClassificationType$1.TERRAIN,clampToGround:!0}}),[o,h,s]),{requestRender:y}=useContext();return y==null||y(),jsxRuntimeExports.jsx(Entity,{...p})},cartesianScratch1$1=new Cartesian3,SurfaceAddingPoints=React.memo(({geometryOptions:{type:t,controlPoints:n},isEditing:o,handleAddControlPoint:s})=>{if(!["polyline","polygon","extrudedPolygon"].includes(t))return null;const c=[];for(let d=0;d<n.length-1;d++){const h=n[d+1],p=Cartesian3.midpoint(n[d],h,cartesianScratch1$1);c.push(p.clone())}if(t==="polygon"||t==="extrudedPolygon"){const d=Cartesian3.midpoint(n[n.length-1],n[0],cartesianScratch1$1);c.push(d.clone())}return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:c.map((d,h)=>jsxRuntimeExports.jsx(ControlPoint,{position:d,isAddingPoint:!0,index:h,clampToGround:!0,isEditing:o,handleControlPointMouseEvent:()=>s==null?void 0:s([d.x,d.y,d.z],h)},h))})});SurfaceAddingPoints.displayName="SurfaceAddingPoints";const MeasurementLine=({a:t,b:n,color:o})=>{const s=React.useRef([t,n]);s.current=[t,n];const c=useConstant$2(()=>new CallbackProperty(()=>s.current,!1)),d=React.useMemo(()=>({polyline:{positions:c,width:1.5,material:new PolylineDashMaterialProperty({color:o,dashLength:8}),classificationType:ClassificationType$1.TERRAIN,clampToGround:!0}}),[o,c]),{requestRender:h}=useContext();return h==null||h(),jsxRuntimeExports.jsx(Entity,{...d})},SurfaceMeasurement=({a:t,b:n,color:o,showLine:s=!1})=>{const c=useConstant$2(()=>new Cartesian3),{getSurfaceDistance:d}=useContext(),h=d==null?void 0:d(t,n);return h!==void 0?jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(ScreenSpaceElement,{position:Cartesian3.midpoint(t,n,c),children:jsxRuntimeExports.jsx(MeasurementText,{children:h<1e3?`${h.toFixed(1)} m`:`${(h/1e3).toFixed(1)} km`})}),s&&jsxRuntimeExports.jsx(MeasurementLine,{a:t,b:n,color:o})]}):null},cartesianScratch1=new Cartesian3,SurfaceControlPoints=React.memo(({geometryOptions:{type:t,controlPoints:n},color:o,isEditing:s,catchedControlPointIndex:c,selectedControlPointIndex:d,handleControlPointMouseEvent:h})=>{const p=[];if(n.length>=2)if(s){if(c!==void 0&&c!==-1)switch(t){case"polyline":c>0&&p.push({points:[n[c-1],n[c]],showLine:!1}),c<n.length-1&&p.push({points:[n[c],n[c+1]],showLine:!1});break;case"circle":case"extrudedCircle":c!==2&&p.push({points:[n[0],n[1]],showLine:!0});break;case"rectangle":case"extrudedRectangle":if(c<=1)p.push({points:[n[0],n[1]],showLine:!1});else if(c===2){const[y,E,L]=n,F=Cartesian3.midpoint(y,E,cartesianScratch1);p.push({points:[F,L],showLine:!0})}break;case"polygon":case"extrudedPolygon":p.push({points:[n[c],c===0?n[n.length-1]:n[c-1]],showLine:!1}),p.push({points:[n[c],c===n.length-1?n[0]:n[c+1]],showLine:!1});break}}else switch(t){case"rectangle":if(n.length===2)p.push({points:n,showLine:!0});else if(n.length===3){const[y,E,L]=n,F=Cartesian3.midpoint(y,E,cartesianScratch1);p.push({points:[F,L],showLine:!0})}break;default:p.push({points:n.slice(-2),showLine:t==="circle"});break}return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[n.map((y,E)=>jsxRuntimeExports.jsx(ControlPoint,{position:y,index:E,isSelected:d===E,clampToGround:!0,isEditing:s,handleControlPointMouseEvent:h},E)),p.map(({points:y,showLine:E},L)=>jsxRuntimeExports.jsx(SurfaceMeasurement,{a:y[0],b:y[1],color:s?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):o,showLine:E},L))]})});SurfaceControlPoints.displayName="SurfaceControlPoints";const SketchComponent=React.memo(({geometryOptions:t,extrudedHeight:n,disableShadow:o,color:s,isEditing:c,extrudedPoint:d,centroidBasePoint:h,centroidExtrudedPoint:p,catchedControlPointIndex:y,catchedExtrudedPoint:E,selectedControlPointIndex:L,handleControlPointMouseEvent:F,handleAddControlPoint:N})=>{const z=React.useMemo(()=>t?{...t,controlPoints:t==null?void 0:t.controlPoints.map(Ee=>new Cesium$1.Cartesian3(...Ee))}:null,[t]),oe=React.useMemo(()=>z?createGeometry(z):null,[z]),{positionsArray:W,hierarchyArray:lt}=React.useMemo(()=>(oe==null?void 0:oe.type)==="Point"?{}:(oe==null?void 0:oe.type)==="LineString"?{positionsArray:convertGeometryToPositionsArray(oe)}:oe!=null?{positionsArray:convertGeometryToPositionsArray(oe),hierarchyArray:convertPolygonToHierarchyArray(oe)}:{},[oe]),nt=React.useMemo(()=>Color$1.fromCssColorString(s??DEFAULT_SKETCH_COLOR),[s]);return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[W==null?void 0:W.map((Ee,yt)=>jsxRuntimeExports.jsx(PolylineEntity,{dynamic:!0,positions:Ee,color:nt,isEditing:c},yt)),lt==null?void 0:lt.map((Ee,yt)=>jsxRuntimeExports.jsx(PolygonEntity,{dynamic:!0,hierarchy:Ee,color:nt},yt)),z!=null&&(!n||c)&&jsxRuntimeExports.jsx(SurfaceControlPoints,{geometryOptions:z,color:nt,isEditing:c,catchedControlPointIndex:y,selectedControlPointIndex:L,handleControlPointMouseEvent:F}),z!=null&&c&&jsxRuntimeExports.jsx(SurfaceAddingPoints,{geometryOptions:z,isEditing:c,handleAddControlPoint:N}),z!=null&&n&&jsxRuntimeExports.jsx(ExtrudedControlPoints,{geometryOptions:z,extrudedHeight:n,extrudedPoint:d,centroidBasePoint:h,centroidExtrudedPoint:p,catchedExtrudedPoint:E,color:nt,isEditing:c,handleControlPointMouseEvent:F}),n&&(lt==null?void 0:lt.map((Ee,yt)=>jsxRuntimeExports.jsx(ExtrudedPolygonEntity,{hierarchy:Ee,extrudedHeight:n,disableShadow:o,color:nt,isEditing:c},yt)))]})});SketchComponent.displayName="SketchComponent";const Cesium=({className:t,style:n,property:o,time:s,camera:c,small:d,ready:h,children:p,selectedLayerId:y,isLayerDraggable:E,isLayerDragging:L,shouldRender:F,layerSelectionReason:N,meta:z,displayCredits:oe,layersRef:W,featureFlags:lt,requestingRenderMode:nt,timelineManagerRef:Ee,cameraForceHorizontalRoll:yt,onLayerSelect:Ai,onCameraChange:zi,onLayerDrag:ha,onLayerDrop:ba,onLayerEdit:Sa,onLayerSelectWithRectStart:ya,onLayerSelectWithRectMove:ms,onLayerSelectWithRectEnd:bs,onMount:Ra,onLayerVisibility:pi,onLayerLoad:mt,onCreditsUpdate:fa},Wa)=>{var ef,Zd,of,hf,df,cf,gf,Sf,bf,Pf,If,Nf,Jf,qf,Bf,zm,Tf,Cf,Df,Wf,$f,Em,Qf,Am,wm,_m,xf,zf,wf,yf,Of,Uf,Dm,Bm,$m,Qm,ap,dp,hp,fp,yu,sf;const{cesium:sl,mouseEventHandles:Vd,cesiumIonAccessToken:Xd,context:pu,layerSelectWithRectEventHandlers:gl,sceneLight:md,sceneBackgroundColor:Gd,sceneMsaaSamples:tf,sceneMode:nf,cameraViewBoundaries:lf,cameraViewOuterBoundaries:ff,cameraViewBoundariesMaterial:_f,handleCameraChange:pf,handleCameraMoveEnd:vf,handleUpdate:Mf,handleClick:Af,handleMount:Lf,handleUnmount:Wc,handleTilesChange:uf,handleTerrainProviderChange:rf}=useHooks$1({ref:Wa,property:o,time:s,selectedLayerId:y,selectionReason:N,meta:z,layersRef:W,featureFlags:lt,timelineManagerRef:Ee,isLayerDraggable:E,isLayerDragging:L,shouldRender:F,requestingRenderMode:nt,camera:c,cameraForceHorizontalRoll:yt,onLayerDrag:ha,onLayerDrop:ba,onLayerSelect:Ai,onLayerEdit:Sa,onLayerSelectWithRectStart:ya,onLayerSelectWithRectMove:ms,onLayerSelectWithRectEnd:bs,onLayerVisibility:pi,onLayerLoad:mt,onCameraChange:zi,onMount:Ra,onCreditsUpdate:fa});return jsxRuntimeExports.jsxs(Aa$1,{ref:sl,onUpdate:Mf,className:t,requestRenderMode:!0,animation:!1,timeline:!1,baseLayer:!1,fullscreenButton:!1,homeButton:!1,geocoder:!1,infoBox:!1,baseLayerPicker:!1,navigationHelpButton:!1,projectionPicker:!1,sceneModePicker:!1,creditContainer:oe?void 0:creditContainer,style:{width:d?"300px":"auto",height:d?"300px":"100%",display:h?void 0:"none",cursor:L?"grab":void 0,...n},shadows:!!((Zd=(ef=o==null?void 0:o.scene)==null?void 0:ef.shadow)!=null&&Zd.enabled),onClick:Af,onDoubleClick:Vd.doubleClick,onMouseDown:Vd.mouseDown,onMouseUp:Vd.mouseUp,onRightClick:Vd.rightClick,onRightDown:Vd.rightDown,onRightUp:Vd.rightUp,onMiddleClick:Vd.middleClick,onMiddleDown:Vd.middleDown,onMiddleUp:Vd.middleUp,onMouseMove:Vd.mouseMove,onMouseEnter:Vd.mouseEnter,onMouseLeave:Vd.mouseLeave,onWheel:Vd.wheel,children:[jsxRuntimeExports.jsx(Event,{onMount:Lf,onUnmount:Wc}),jsxRuntimeExports.jsx(ReearthClock,{timelineManagerRef:Ee}),jsxRuntimeExports.jsx(ImageryLayers,{tiles:o==null?void 0:o.tiles,cesiumIonAccessToken:Xd,onTilesChange:uf}),jsxRuntimeExports.jsx(LabelImageryLayers,{tileLabels:o==null?void 0:o.tileLabels}),jsxRuntimeExports.jsx(Indicator,{property:o,timelineManagerRef:Ee}),jsxRuntimeExports.jsxs(ka$1,{useDefault:!0,children:[jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_CLICK}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_DOUBLE_CLICK})]}),jsxRuntimeExports.jsxs(ka$1,{children:[jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_DOWN,action:gl.start.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_DOWN,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:gl.start.shift}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE,action:gl.move.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:gl.move.shift}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_UP,action:gl.end.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_UP,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:gl.end.shift})]}),jsxRuntimeExports.jsx(Ta$1,{maximumZoomDistance:(hf=(of=o==null?void 0:o.camera)==null?void 0:of.limiter)!=null&&hf.enabled?((gf=(cf=(df=o.camera)==null?void 0:df.limiter)==null?void 0:cf.targetArea)==null?void 0:gf.height)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,enableCollisionDetection:!((Sf=o==null?void 0:o.camera)!=null&&Sf.allowEnterGround)}),jsxRuntimeExports.jsx(Ps$1,{percentageChanged:.2,onChange:pf,onMoveEnd:vf}),lf&&((Pf=(bf=o==null?void 0:o.camera)==null?void 0:bf.limiter)==null?void 0:Pf.showHelper)&&jsxRuntimeExports.jsx(Is$1,{children:jsxRuntimeExports.jsx(ua$1,{positions:lf,width:1,material:Cesium$1.Color.RED,arcType:Cesium$1.ArcType.RHUMB})}),ff&&((Nf=(If=o==null?void 0:o.camera)==null?void 0:If.limiter)==null?void 0:Nf.showHelper)&&jsxRuntimeExports.jsx(Is$1,{children:jsxRuntimeExports.jsx(ua$1,{positions:ff,width:1,material:_f,arcType:Cesium$1.ArcType.RHUMB})}),jsxRuntimeExports.jsx($a$1,{backgroundColor:Gd,light:md,mode:nf,msaaSamples:tf,useDepthPicking:!1,useWebVR:!!((Jf=o==null?void 0:o.scene)!=null&&Jf.vr)||void 0,debugShowFramesPerSecond:!!((qf=o==null?void 0:o.debug)!=null&&qf.showFramesPerSecond),verticalExaggerationRelativeHeight:(Bf=o==null?void 0:o.scene)==null?void 0:Bf.verticalExaggerationRelativeHeight,verticalExaggeration:(zm=o==null?void 0:o.scene)==null?void 0:zm.verticalExaggeration}),jsxRuntimeExports.jsx(Oa$1,{show:((Cf=(Tf=o==null?void 0:o.sky)==null?void 0:Tf.skyBox)==null?void 0:Cf.show)??!0}),jsxRuntimeExports.jsx(Vs,{enabled:((Wf=(Df=o==null?void 0:o.sky)==null?void 0:Df.fog)==null?void 0:Wf.enabled)??!0,density:(Em=($f=o==null?void 0:o.sky)==null?void 0:$f.fog)==null?void 0:Em.density}),jsxRuntimeExports.jsx(Ga$1,{show:((Am=(Qf=o==null?void 0:o.sky)==null?void 0:Qf.sun)==null?void 0:Am.show)??!0}),jsxRuntimeExports.jsx(ea$1,{show:((_m=(wm=o==null?void 0:o.sky)==null?void 0:wm.moon)==null?void 0:_m.show)??!0}),jsxRuntimeExports.jsx(_a$2,{show:((zf=(xf=o==null?void 0:o.sky)==null?void 0:xf.skyAtmosphere)==null?void 0:zf.show)??!0,atmosphereLightIntensity:(yf=(wf=o==null?void 0:o.sky)==null?void 0:wf.skyAtmosphere)==null?void 0:yf.lightIntensity,saturationShift:(Uf=(Of=o==null?void 0:o.sky)==null?void 0:Of.skyAtmosphere)==null?void 0:Uf.saturationShift,brightnessShift:(Bm=(Dm=o==null?void 0:o.sky)==null?void 0:Dm.skyAtmosphere)==null?void 0:Bm.brightnessShift}),jsxRuntimeExports.jsx(Globe,{property:o,cesiumIonAccessToken:Xd,onTerrainProviderChange:rf}),jsxRuntimeExports.jsx(context.Provider,{value:pu,children:h?p:null}),jsxRuntimeExports.jsx(AmbientOcclusion,{...AMBIENT_OCCLUSION_QUALITY[((Qm=($m=o==null?void 0:o.render)==null?void 0:$m.ambientOcclusion)==null?void 0:Qm.quality)||"low"],enabled:!!((dp=(ap=o==null?void 0:o.render)==null?void 0:ap.ambientOcclusion)!=null&&dp.enabled),intensity:((fp=(hp=o==null?void 0:o.render)==null?void 0:hp.ambientOcclusion)==null?void 0:fp.intensity)??100,outputType:(sf=(yu=o==null?void 0:o.render)==null?void 0:yu.ambientOcclusion)!=null&&sf.ambientOcclusionOnly?AmbientOcclusionOutputType.Occlusion:null})]})},creditContainer=document.createElement("div"),Component=React.forwardRef(Cesium),engine={component:Component,featureComponent:Feature$1,clusterComponent:Cluster,sketchComponent:SketchComponent,delegatedDataTypes:["czml","wms","mvt","3dtiles","osm-buildings","kml"]},engines={cesium:engine};function Error$1({error:t,resetErrorBoundary:n}){return jsxRuntimeExports.jsxs("div",{children:[jsxRuntimeExports.jsx("h1",{children:"Oops! An Error Occurred"}),jsxRuntimeExports.jsx("p",{children:t.message}),jsxRuntimeExports.jsx("p",{children:jsxRuntimeExports.jsx("button",{style:{color:"#fff"},onClick:n,children:"Retry"})})]})}const version$1="0.0.7-alpha.23",useCoreAPI=({viewerProperty:t})=>{const n=React.useRef(t);n.current=t;const o=React.useMemo(()=>({get version(){return version$1},get viewerProperty(){return n.current}}),[]);React.useEffect(()=>{window.reearth_core=o},[o])},viewportMobileMaxWidth=768,useViewport=({wrapperRef:t})=>{const n=React.useMemo(()=>paramsToObject(new URLSearchParams(window.location.search)),[]),[o,s]=React.useState({width:void 0,height:void 0,isMobile:void 0,query:n});return React.useEffect(()=>{const c=new ResizeObserver(d=>{var E,L;const[h]=d;let p,y;if(h.contentBoxSize){const F=Array.isArray(h.contentBoxSize)?h.contentBoxSize[0]:h.contentBoxSize;p=F.inlineSize,y=F.blockSize}else h.contentRect?(p=h.contentRect.width,y=h.contentRect.height):(p=(E=t.current)==null?void 0:E.clientWidth,y=(L=t.current)==null?void 0:L.clientHeight);s(F=>({width:p,height:y,isMobile:p?p<=viewportMobileMaxWidth:void 0,query:F.query}))});return t.current&&c.observe(t.current),()=>{c.disconnect()}},[t]),o};function paramsToObject(t){const n={};for(const[o,s]of t)n[o]=s;return n}function useHooks({camera:t,interactionMode:n,zoomedLayerId:o,viewerProperty:s,onLayerSelect:c,onCameraChange:d,onInteractionModeChange:h,onZoomToLayer:p,onLayerDrop:y,onSketchTypeChangeProp:E},L){const F=React.useRef(null);React.useImperativeHandle(L,()=>F.current,[]);const N=React.useRef(null),z=useViewport({wrapperRef:N}),[oe,W]=React.useState({}),[lt,nt]=React.useState(),[Ee,yt]=React.useState(),Ai=React.useCallback(async(Tf,Cf,Df,Wf,$f)=>{var wm,_m,xf,zf,wf,yf,Of,Uf,Dm,Bm,$m;const Em=((wm=oe.layer)==null?void 0:wm.layer.type)==="simple"&&((zf=(xf=(_m=oe.layer)==null?void 0:_m.layer)==null?void 0:xf.data)==null?void 0:zf.isSketchLayer);if(oe.layerId===Tf&&oe.featureId===Cf&&!Em)return;const Qf=await(Df==null?void 0:Df()),Am=Tf&&Cf?(Em?(wf=Qf==null?void 0:Qf.features)==null?void 0:wf.find(Qm=>Qm.id===Cf):(Uf=(yf=F.current)==null?void 0:(Of=yf.engine).findComputedFeatureById)==null?void 0:Uf.call(Of,Tf,Cf))??($f==null?void 0:$f.feature):void 0;nt(Tf&&Cf?($m=(Dm=F.current)==null?void 0:(Bm=Dm.engine).findFeatureById)==null?void 0:$m.call(Bm,Tf,Cf):void 0),yt(Am),W(Qm=>Qm.layerId===Tf&&Qm.featureId===Cf?Qm:{layerId:Tf,featureId:Cf,layer:Qf,reason:Wf}),c==null||c(Tf,Df,Am,Wf)},[oe,c]),zi=React.useRef(),[ha,ba]=useValue(t,d),[Sa,ya]=React.useState(!1),ms=React.useCallback(Tf=>{ya(!!Tf)},[]),[bs,Ra]=useValue(n,h),pi=bs||"default",[mt,fa]=React.useState("auto");React.useEffect(()=>{fa(pi==="sketch"?"crosshair":pi==="move"?"grab":"auto")},[pi]);const Wa=INTERACTION_MODES[pi],sl=React.useRef(),Vd=React.useCallback(Tf=>{sl.current=Tf},[]),Xd=React.useCallback(Tf=>{var Cf;(Cf=sl.current)==null||Cf.call(sl,Tf)},[]),pu=React.useRef(),gl=React.useCallback(Tf=>{pu.current=Tf},[]),md=React.useCallback(Tf=>{var Cf;(Cf=pu.current)==null||Cf.call(pu,Tf)},[]),Gd=React.useRef(),tf=React.useCallback(Tf=>{Gd.current=Tf},[]),nf=React.useCallback(Tf=>{var Cf;(Cf=Gd.current)==null||Cf.call(Gd,Tf)},[]),lf=React.useRef(),ff=React.useCallback(Tf=>{lf.current=Tf},[]),_f=React.useCallback(Tf=>{var Cf;(Cf=lf.current)==null||Cf.call(lf,Tf)},[]),pf=React.useRef(),vf=React.useCallback(Tf=>{pf.current=Tf},[]),Mf=React.useCallback(Tf=>{var Cf;(Cf=pf.current)==null||Cf.call(pf,Tf)},[]),Af=React.useRef(),Lf=React.useCallback(Tf=>{Af.current=Tf},[]),Wc=React.useCallback(Tf=>{var Cf;(Cf=Af.current)==null||Cf.call(Af,Tf)},[]),uf=React.useRef([]),rf=React.useCallback(Tf=>{uf.current.push(Tf)},[]),ef=React.useCallback(Tf=>{uf.current.forEach(Cf=>Cf(Tf))},[]),Zd=React.useRef([]),of=React.useCallback(Tf=>{Zd.current.push(Tf)},[]),hf=React.useCallback(Tf=>{Zd.current.forEach(Cf=>Cf(Tf))},[]),df=React.useRef([]),cf=React.useCallback(Tf=>{df.current.push(Tf)},[]),gf=React.useCallback(Tf=>{df.current.forEach(Cf=>Cf(Tf))},[]),Sf=React.useRef([]),bf=React.useCallback(Tf=>{Sf.current.push(Tf)},[]),Pf=React.useCallback((Tf,Cf)=>{Sf.current.forEach(Df=>Df(Tf)),E==null||E(Tf,Cf)},[E]);React.useEffect(()=>{var Tf,Cf;o&&((Cf=(Tf=F.current)==null?void 0:Tf.engine)==null||Cf.lookAtLayer(o),p==null||p(void 0))},[o,p]);const[If,Nf]=React.useState(!1),Jf=React.useCallback(()=>{Nf(!0)},[]),qf=React.useCallback((Tf,Cf,Df)=>{var Em;Nf(!1);const Wf=(Em=F.current)==null?void 0:Em.layers.findById(Tf),$f=Wf!=null&&Wf.property.default.location?"default.location":Wf!=null&&Wf.property.default.position?"default.position":void 0;Df&&Wf&&Wf.propertyId&&$f&&(y==null||y(Wf.propertyId,$f,Df))},[y,F]),Bf=React.useMemo(()=>({interactionMode:pi,selectedLayer:oe,selectedComputedFeature:Ee,viewport:z,handleCameraForceHorizontalRollChange:ms,handleInteractionModeChange:Ra,onSketchPluginFeatureCreate:rf,onSketchPluginFeatureUpdate:of,onSketchPluginFeatureDelete:cf,onSketchTypeChange:bf,onLayerVisibility:gl,onLayerLoad:tf,onLayerEdit:Vd,onLayerSelectWithRectStart:ff,onLayerSelectWithRectMove:vf,onLayerSelectWithRectEnd:Lf}),[pi,oe,Ee,z,Ra,ms,Vd,rf,of,cf,bf,gl,tf,ff,vf,Lf]),zm=React.useMemo(()=>({position:"relative",width:"100%",height:"100%",overflow:"hidden"}),[]);return useCoreAPI({viewerProperty:s}),{mapRef:F,wrapperRef:N,selectedFeature:lt,camera:ha,featureFlags:Wa,isLayerDragging:If,timelineManagerRef:zi,cursor:mt,cameraForceHorizontalRoll:Sa,coreContextValue:Bf,containerStyle:zm,handleLayerSelect:Ai,handleLayerDrag:Jf,handleLayerDrop:qf,handleLayerEdit:Xd,handleCameraChange:ba,handleInteractionModeChange:Ra,handleSketchPluginFeatureCreate:ef,handleSketchPluginFeatureUpdate:hf,handleSketchPluginFeatureDelete:gf,handleSketchTypeChange:Pf,handleLayerVisibility:md,handleLayerLoad:nf,handleLayerSelectWithRectStart:_f,handleLayerSelectWithRectMove:Mf,handleLayerSelectWithRectEnd:Wc}}function useValue(t,n){const[o,s]=React.useState(t),c=React.useCallback(d=>{d&&(s(d),n==null||n(d))},[n]);return React.useEffect(()=>{s(t)},[t]),[o,c]}const CoreVisualizer=React.memo(React.forwardRef(({engine:t,isBuilt:n,isEditable:o,viewerProperty:s,layers:c,clusters:d,small:h,ready:p,hiddenLayers:y,camera:E,time:L,interactionMode:F,shouldRender:N,meta:z,displayCredits:oe=!0,style:W,zoomedLayerId:lt,children:nt,onLayerDrop:Ee,onLayerSelect:yt,onCameraChange:Ai,onZoomToLayer:zi,onInteractionModeChange:ha,onMount:ba,onSketchTypeChangeProp:Sa,onSketchFeatureCreate:ya,onSketchFeatureUpdate:ms,onSketchFeatureDelete:bs,onAPIReady:Ra,onCreditsUpdate:pi},mt)=>{const{mapRef:fa,wrapperRef:Wa,selectedFeature:sl,camera:Vd,featureFlags:Xd,isLayerDragging:pu,timelineManagerRef:gl,cursor:md,cameraForceHorizontalRoll:Gd,coreContextValue:tf,containerStyle:nf,handleLayerSelect:lf,handleLayerDrag:ff,handleLayerDrop:_f,handleLayerEdit:pf,handleCameraChange:vf,handleInteractionModeChange:Mf,handleSketchPluginFeatureCreate:Af,handleSketchPluginFeatureUpdate:Lf,handleSketchPluginFeatureDelete:Wc,handleSketchTypeChange:uf,handleLayerVisibility:rf,handleLayerLoad:ef,handleLayerSelectWithRectStart:Zd,handleLayerSelectWithRectMove:of,handleLayerSelectWithRectEnd:hf}=useHooks({camera:E,interactionMode:F,zoomedLayerId:lt,viewerProperty:s,onLayerSelect:yt,onCameraChange:Ai,onZoomToLayer:zi,onLayerDrop:Ee,onInteractionModeChange:ha,onSketchTypeChangeProp:Sa},mt);return jsxRuntimeExports.jsx(ErrorBoundary,{FallbackComponent:Error$1,children:jsxRuntimeExports.jsx(VisualizerProvider,{mapRef:fa,children:jsxRuntimeExports.jsxs("div",{ref:Wa,style:nf,children:[jsxRuntimeExports.jsx(Map$1,{ref:fa,isBuilt:n,isEditable:o,engine:t,layers:c,engines,camera:Vd,cameraForceHorizontalRoll:Gd,clusters:d,hiddenLayers:y,isLayerDragging:pu,isLayerDraggable:o,meta:z,displayCredits:oe,style:W,featureFlags:Xd,shouldRender:N,property:s,time:L,small:h,ready:p,timelineManagerRef:gl,interactionMode:F,selectedFeature:sl,cursor:md,onCameraChange:vf,onLayerDrag:ff,onLayerDrop:_f,onLayerSelect:lf,onLayerEdit:pf,overrideInteractionMode:Mf,onSketchFeatureCreate:ya,onSketchPluginFeatureCreate:Af,onSketchFeatureUpdate:ms,onSketchPluginFeatureUpdate:Lf,onSketchFeatureDelete:bs,onSketchPluginFeatureDelete:Wc,onSketchTypeChange:uf,onMount:ba,onLayerVisibility:rf,onLayerLoad:ef,onLayerSelectWithRectStart:Zd,onLayerSelectWithRectMove:of,onLayerSelectWithRectEnd:hf,onAPIReady:Ra,onCreditsUpdate:pi}),jsxRuntimeExports.jsx(coreContext.Provider,{value:tf,children:nt})]})})})}));var global$1=typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{},lookup=[],revLookup=[],Arr=typeof Uint8Array<"u"?Uint8Array:Array,inited=!1;function init(){inited=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=0,o=t.length;n<o;++n)lookup[n]=t[n],revLookup[t.charCodeAt(n)]=n;revLookup[45]=62,revLookup[95]=63}function toByteArray(t){inited||init();var n,o,s,c,d,h,p=t.length;if(p%4>0)throw new Error("Invalid string. Length must be a multiple of 4");d=t[p-2]==="="?2:t[p-1]==="="?1:0,h=new Arr(p*3/4-d),s=d>0?p-4:p;var y=0;for(n=0,o=0;n<s;n+=4,o+=3)c=revLookup[t.charCodeAt(n)]<<18|revLookup[t.charCodeAt(n+1)]<<12|revLookup[t.charCodeAt(n+2)]<<6|revLookup[t.charCodeAt(n+3)],h[y++]=c>>16&255,h[y++]=c>>8&255,h[y++]=c&255;return d===2?(c=revLookup[t.charCodeAt(n)]<<2|revLookup[t.charCodeAt(n+1)]>>4,h[y++]=c&255):d===1&&(c=revLookup[t.charCodeAt(n)]<<10|revLookup[t.charCodeAt(n+1)]<<4|revLookup[t.charCodeAt(n+2)]>>2,h[y++]=c>>8&255,h[y++]=c&255),h}function tripletToBase64(t){return lookup[t>>18&63]+lookup[t>>12&63]+lookup[t>>6&63]+lookup[t&63]}function encodeChunk(t,n,o){for(var s,c=[],d=n;d<o;d+=3)s=(t[d]<<16)+(t[d+1]<<8)+t[d+2],c.push(tripletToBase64(s));return c.join("")}function fromByteArray(t){inited||init();for(var n,o=t.length,s=o%3,c="",d=[],h=16383,p=0,y=o-s;p<y;p+=h)d.push(encodeChunk(t,p,p+h>y?y:p+h));return s===1?(n=t[o-1],c+=lookup[n>>2],c+=lookup[n<<4&63],c+="=="):s===2&&(n=(t[o-2]<<8)+t[o-1],c+=lookup[n>>10],c+=lookup[n>>4&63],c+=lookup[n<<2&63],c+="="),d.push(c),d.join("")}function read(t,n,o,s,c){var d,h,p=c*8-s-1,y=(1<<p)-1,E=y>>1,L=-7,F=o?c-1:0,N=o?-1:1,z=t[n+F];for(F+=N,d=z&(1<<-L)-1,z>>=-L,L+=p;L>0;d=d*256+t[n+F],F+=N,L-=8);for(h=d&(1<<-L)-1,d>>=-L,L+=s;L>0;h=h*256+t[n+F],F+=N,L-=8);if(d===0)d=1-E;else{if(d===y)return h?NaN:(z?-1:1)*(1/0);h=h+Math.pow(2,s),d=d-E}return(z?-1:1)*h*Math.pow(2,d-s)}function write(t,n,o,s,c,d){var h,p,y,E=d*8-c-1,L=(1<<E)-1,F=L>>1,N=c===23?Math.pow(2,-24)-Math.pow(2,-77):0,z=s?0:d-1,oe=s?1:-1,W=n<0||n===0&&1/n<0?1:0;for(n=Math.abs(n),isNaN(n)||n===1/0?(p=isNaN(n)?1:0,h=L):(h=Math.floor(Math.log(n)/Math.LN2),n*(y=Math.pow(2,-h))<1&&(h--,y*=2),h+F>=1?n+=N/y:n+=N*Math.pow(2,1-F),n*y>=2&&(h++,y/=2),h+F>=L?(p=0,h=L):h+F>=1?(p=(n*y-1)*Math.pow(2,c),h=h+F):(p=n*Math.pow(2,F-1)*Math.pow(2,c),h=0));c>=8;t[o+z]=p&255,z+=oe,p/=256,c-=8);for(h=h<<c|p,E+=c;E>0;t[o+z]=h&255,z+=oe,h/=256,E-=8);t[o+z-oe]|=W*128}var toString={}.toString,isArray$1=Array.isArray||function(t){return toString.call(t)=="[object Array]"},INSPECT_MAX_BYTES=50;Buffer$1.TYPED_ARRAY_SUPPORT=global$1.TYPED_ARRAY_SUPPORT!==void 0?global$1.TYPED_ARRAY_SUPPORT:!0,kMaxLength();function kMaxLength(){return Buffer$1.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function createBuffer(t,n){if(kMaxLength()<n)throw new RangeError("Invalid typed array length");return Buffer$1.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(n),t.__proto__=Buffer$1.prototype):(t===null&&(t=new Buffer$1(n)),t.length=n),t}function Buffer$1(t,n,o){if(!Buffer$1.TYPED_ARRAY_SUPPORT&&!(this instanceof Buffer$1))return new Buffer$1(t,n,o);if(typeof t=="number"){if(typeof n=="string")throw new Error("If encoding is specified then the first argument must be a string");return allocUnsafe(this,t)}return from(this,t,n,o)}Buffer$1.poolSize=8192,Buffer$1._augment=function(t){return t.__proto__=Buffer$1.prototype,t};function from(t,n,o,s){if(typeof n=="number")throw new TypeError('"value" argument must not be a number');return typeof ArrayBuffer<"u"&&n instanceof ArrayBuffer?fromArrayBuffer(t,n,o,s):typeof n=="string"?fromString(t,n,o):fromObject(t,n)}Buffer$1.from=function(t,n,o){return from(null,t,n,o)},Buffer$1.TYPED_ARRAY_SUPPORT&&(Buffer$1.prototype.__proto__=Uint8Array.prototype,Buffer$1.__proto__=Uint8Array,typeof Symbol<"u"&&Symbol.species&&Buffer$1[Symbol.species]);function assertSize(t){if(typeof t!="number")throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative')}function alloc(t,n,o,s){return assertSize(n),n<=0?createBuffer(t,n):o!==void 0?typeof s=="string"?createBuffer(t,n).fill(o,s):createBuffer(t,n).fill(o):createBuffer(t,n)}Buffer$1.alloc=function(t,n,o){return alloc(null,t,n,o)};function allocUnsafe(t,n){if(assertSize(n),t=createBuffer(t,n<0?0:checked(n)|0),!Buffer$1.TYPED_ARRAY_SUPPORT)for(var o=0;o<n;++o)t[o]=0;return t}Buffer$1.allocUnsafe=function(t){return allocUnsafe(null,t)},Buffer$1.allocUnsafeSlow=function(t){return allocUnsafe(null,t)};function fromString(t,n,o){if((typeof o!="string"||o==="")&&(o="utf8"),!Buffer$1.isEncoding(o))throw new TypeError('"encoding" must be a valid string encoding');var s=byteLength(n,o)|0;t=createBuffer(t,s);var c=t.write(n,o);return c!==s&&(t=t.slice(0,c)),t}function fromArrayLike(t,n){var o=n.length<0?0:checked(n.length)|0;t=createBuffer(t,o);for(var s=0;s<o;s+=1)t[s]=n[s]&255;return t}function fromArrayBuffer(t,n,o,s){if(n.byteLength,o<0||n.byteLength<o)throw new RangeError("'offset' is out of bounds");if(n.byteLength<o+(s||0))throw new RangeError("'length' is out of bounds");return o===void 0&&s===void 0?n=new Uint8Array(n):s===void 0?n=new Uint8Array(n,o):n=new Uint8Array(n,o,s),Buffer$1.TYPED_ARRAY_SUPPORT?(t=n,t.__proto__=Buffer$1.prototype):t=fromArrayLike(t,n),t}function fromObject(t,n){if(internalIsBuffer(n)){var o=checked(n.length)|0;return t=createBuffer(t,o),t.length===0||n.copy(t,0,0,o),t}if(n){if(typeof ArrayBuffer<"u"&&n.buffer instanceof ArrayBuffer||"length"in n)return typeof n.length!="number"||isnan(n.length)?createBuffer(t,0):fromArrayLike(t,n);if(n.type==="Buffer"&&isArray$1(n.data))return fromArrayLike(t,n.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function checked(t){if(t>=kMaxLength())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength().toString(16)+" bytes");return t|0}Buffer$1.isBuffer=isBuffer;function internalIsBuffer(t){return!!(t!=null&&t._isBuffer)}Buffer$1.compare=function t(n,o){if(!internalIsBuffer(n)||!internalIsBuffer(o))throw new TypeError("Arguments must be Buffers");if(n===o)return 0;for(var s=n.length,c=o.length,d=0,h=Math.min(s,c);d<h;++d)if(n[d]!==o[d]){s=n[d],c=o[d];break}return s<c?-1:c<s?1:0},Buffer$1.isEncoding=function t(n){switch(String(n).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},Buffer$1.concat=function t(n,o){if(!isArray$1(n))throw new TypeError('"list" argument must be an Array of Buffers');if(n.length===0)return Buffer$1.alloc(0);var s;if(o===void 0)for(o=0,s=0;s<n.length;++s)o+=n[s].length;var c=Buffer$1.allocUnsafe(o),d=0;for(s=0;s<n.length;++s){var h=n[s];if(!internalIsBuffer(h))throw new TypeError('"list" argument must be an Array of Buffers');h.copy(c,d),d+=h.length}return c};function byteLength(t,n){if(internalIsBuffer(t))return t.length;if(typeof ArrayBuffer<"u"&&typeof ArrayBuffer.isView=="function"&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;typeof t!="string"&&(t=""+t);var o=t.length;if(o===0)return 0;for(var s=!1;;)switch(n){case"ascii":case"latin1":case"binary":return o;case"utf8":case"utf-8":case void 0:return utf8ToBytes(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return o*2;case"hex":return o>>>1;case"base64":return base64ToBytes(t).length;default:if(s)return utf8ToBytes(t).length;n=(""+n).toLowerCase(),s=!0}}Buffer$1.byteLength=byteLength;function slowToString(t,n,o){var s=!1;if((n===void 0||n<0)&&(n=0),n>this.length||((o===void 0||o>this.length)&&(o=this.length),o<=0)||(o>>>=0,n>>>=0,o<=n))return"";for(t||(t="utf8");;)switch(t){case"hex":return hexSlice(this,n,o);case"utf8":case"utf-8":return utf8Slice(this,n,o);case"ascii":return asciiSlice(this,n,o);case"latin1":case"binary":return latin1Slice(this,n,o);case"base64":return base64Slice(this,n,o);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,n,o);default:if(s)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),s=!0}}Buffer$1.prototype._isBuffer=!0;function swap(t,n,o){var s=t[n];t[n]=t[o],t[o]=s}Buffer$1.prototype.swap16=function t(){var n=this.length;if(n%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var o=0;o<n;o+=2)swap(this,o,o+1);return this},Buffer$1.prototype.swap32=function t(){var n=this.length;if(n%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var o=0;o<n;o+=4)swap(this,o,o+3),swap(this,o+1,o+2);return this},Buffer$1.prototype.swap64=function t(){var n=this.length;if(n%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var o=0;o<n;o+=8)swap(this,o,o+7),swap(this,o+1,o+6),swap(this,o+2,o+5),swap(this,o+3,o+4);return this},Buffer$1.prototype.toString=function t(){var n=this.length|0;return n===0?"":arguments.length===0?utf8Slice(this,0,n):slowToString.apply(this,arguments)},Buffer$1.prototype.equals=function t(n){if(!internalIsBuffer(n))throw new TypeError("Argument must be a Buffer");return this===n?!0:Buffer$1.compare(this,n)===0},Buffer$1.prototype.inspect=function t(){var n="",o=INSPECT_MAX_BYTES;return this.length>0&&(n=this.toString("hex",0,o).match(/.{2}/g).join(" "),this.length>o&&(n+=" ... ")),"<Buffer "+n+">"},Buffer$1.prototype.compare=function t(n,o,s,c,d){if(!internalIsBuffer(n))throw new TypeError("Argument must be a Buffer");if(o===void 0&&(o=0),s===void 0&&(s=n?n.length:0),c===void 0&&(c=0),d===void 0&&(d=this.length),o<0||s>n.length||c<0||d>this.length)throw new RangeError("out of range index");if(c>=d&&o>=s)return 0;if(c>=d)return-1;if(o>=s)return 1;if(o>>>=0,s>>>=0,c>>>=0,d>>>=0,this===n)return 0;for(var h=d-c,p=s-o,y=Math.min(h,p),E=this.slice(c,d),L=n.slice(o,s),F=0;F<y;++F)if(E[F]!==L[F]){h=E[F],p=L[F];break}return h<p?-1:p<h?1:0};function bidirectionalIndexOf(t,n,o,s,c){if(t.length===0)return-1;if(typeof o=="string"?(s=o,o=0):o>2147483647?o=2147483647:o<-2147483648&&(o=-2147483648),o=+o,isNaN(o)&&(o=c?0:t.length-1),o<0&&(o=t.length+o),o>=t.length){if(c)return-1;o=t.length-1}else if(o<0)if(c)o=0;else return-1;if(typeof n=="string"&&(n=Buffer$1.from(n,s)),internalIsBuffer(n))return n.length===0?-1:arrayIndexOf(t,n,o,s,c);if(typeof n=="number")return n=n&255,Buffer$1.TYPED_ARRAY_SUPPORT&&typeof Uint8Array.prototype.indexOf=="function"?c?Uint8Array.prototype.indexOf.call(t,n,o):Uint8Array.prototype.lastIndexOf.call(t,n,o):arrayIndexOf(t,[n],o,s,c);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(t,n,o,s,c){var d=1,h=t.length,p=n.length;if(s!==void 0&&(s=String(s).toLowerCase(),s==="ucs2"||s==="ucs-2"||s==="utf16le"||s==="utf-16le")){if(t.length<2||n.length<2)return-1;d=2,h/=2,p/=2,o/=2}function y(z,oe){return d===1?z[oe]:z.readUInt16BE(oe*d)}var E;if(c){var L=-1;for(E=o;E<h;E++)if(y(t,E)===y(n,L===-1?0:E-L)){if(L===-1&&(L=E),E-L+1===p)return L*d}else L!==-1&&(E-=E-L),L=-1}else for(o+p>h&&(o=h-p),E=o;E>=0;E--){for(var F=!0,N=0;N<p;N++)if(y(t,E+N)!==y(n,N)){F=!1;break}if(F)return E}return-1}Buffer$1.prototype.includes=function t(n,o,s){return this.indexOf(n,o,s)!==-1},Buffer$1.prototype.indexOf=function t(n,o,s){return bidirectionalIndexOf(this,n,o,s,!0)},Buffer$1.prototype.lastIndexOf=function t(n,o,s){return bidirectionalIndexOf(this,n,o,s,!1)};function hexWrite(t,n,o,s){o=Number(o)||0;var c=t.length-o;s?(s=Number(s),s>c&&(s=c)):s=c;var d=n.length;if(d%2!==0)throw new TypeError("Invalid hex string");s>d/2&&(s=d/2);for(var h=0;h<s;++h){var p=parseInt(n.substr(h*2,2),16);if(isNaN(p))return h;t[o+h]=p}return h}function utf8Write(t,n,o,s){return blitBuffer(utf8ToBytes(n,t.length-o),t,o,s)}function asciiWrite(t,n,o,s){return blitBuffer(asciiToBytes(n),t,o,s)}function latin1Write(t,n,o,s){return asciiWrite(t,n,o,s)}function base64Write(t,n,o,s){return blitBuffer(base64ToBytes(n),t,o,s)}function ucs2Write(t,n,o,s){return blitBuffer(utf16leToBytes(n,t.length-o),t,o,s)}Buffer$1.prototype.write=function t(n,o,s,c){if(o===void 0)c="utf8",s=this.length,o=0;else if(s===void 0&&typeof o=="string")c=o,s=this.length,o=0;else if(isFinite(o))o=o|0,isFinite(s)?(s=s|0,c===void 0&&(c="utf8")):(c=s,s=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");var d=this.length-o;if((s===void 0||s>d)&&(s=d),n.length>0&&(s<0||o<0)||o>this.length)throw new RangeError("Attempt to write outside buffer bounds");c||(c="utf8");for(var h=!1;;)switch(c){case"hex":return hexWrite(this,n,o,s);case"utf8":case"utf-8":return utf8Write(this,n,o,s);case"ascii":return asciiWrite(this,n,o,s);case"latin1":case"binary":return latin1Write(this,n,o,s);case"base64":return base64Write(this,n,o,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,n,o,s);default:if(h)throw new TypeError("Unknown encoding: "+c);c=(""+c).toLowerCase(),h=!0}},Buffer$1.prototype.toJSON=function t(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function base64Slice(t,n,o){return n===0&&o===t.length?fromByteArray(t):fromByteArray(t.slice(n,o))}function utf8Slice(t,n,o){o=Math.min(t.length,o);for(var s=[],c=n;c<o;){var d=t[c],h=null,p=d>239?4:d>223?3:d>191?2:1;if(c+p<=o){var y,E,L,F;switch(p){case 1:d<128&&(h=d);break;case 2:y=t[c+1],(y&192)===128&&(F=(d&31)<<6|y&63,F>127&&(h=F));break;case 3:y=t[c+1],E=t[c+2],(y&192)===128&&(E&192)===128&&(F=(d&15)<<12|(y&63)<<6|E&63,F>2047&&(F<55296||F>57343)&&(h=F));break;case 4:y=t[c+1],E=t[c+2],L=t[c+3],(y&192)===128&&(E&192)===128&&(L&192)===128&&(F=(d&15)<<18|(y&63)<<12|(E&63)<<6|L&63,F>65535&&F<1114112&&(h=F))}}h===null?(h=65533,p=1):h>65535&&(h-=65536,s.push(h>>>10&1023|55296),h=56320|h&1023),s.push(h),c+=p}return decodeCodePointsArray(s)}var MAX_ARGUMENTS_LENGTH=4096;function decodeCodePointsArray(t){var n=t.length;if(n<=MAX_ARGUMENTS_LENGTH)return String.fromCharCode.apply(String,t);for(var o="",s=0;s<n;)o+=String.fromCharCode.apply(String,t.slice(s,s+=MAX_ARGUMENTS_LENGTH));return o}function asciiSlice(t,n,o){var s="";o=Math.min(t.length,o);for(var c=n;c<o;++c)s+=String.fromCharCode(t[c]&127);return s}function latin1Slice(t,n,o){var s="";o=Math.min(t.length,o);for(var c=n;c<o;++c)s+=String.fromCharCode(t[c]);return s}function hexSlice(t,n,o){var s=t.length;(!n||n<0)&&(n=0),(!o||o<0||o>s)&&(o=s);for(var c="",d=n;d<o;++d)c+=toHex(t[d]);return c}function utf16leSlice(t,n,o){for(var s=t.slice(n,o),c="",d=0;d<s.length;d+=2)c+=String.fromCharCode(s[d]+s[d+1]*256);return c}Buffer$1.prototype.slice=function t(n,o){var s=this.length;n=~~n,o=o===void 0?s:~~o,n<0?(n+=s,n<0&&(n=0)):n>s&&(n=s),o<0?(o+=s,o<0&&(o=0)):o>s&&(o=s),o<n&&(o=n);var c;if(Buffer$1.TYPED_ARRAY_SUPPORT)c=this.subarray(n,o),c.__proto__=Buffer$1.prototype;else{var d=o-n;c=new Buffer$1(d,void 0);for(var h=0;h<d;++h)c[h]=this[h+n]}return c};function checkOffset(t,n,o){if(t%1!==0||t<0)throw new RangeError("offset is not uint");if(t+n>o)throw new RangeError("Trying to access beyond buffer length")}Buffer$1.prototype.readUIntLE=function t(n,o,s){n=n|0,o=o|0,s||checkOffset(n,o,this.length);for(var c=this[n],d=1,h=0;++h<o&&(d*=256);)c+=this[n+h]*d;return c},Buffer$1.prototype.readUIntBE=function t(n,o,s){n=n|0,o=o|0,s||checkOffset(n,o,this.length);for(var c=this[n+--o],d=1;o>0&&(d*=256);)c+=this[n+--o]*d;return c},Buffer$1.prototype.readUInt8=function t(n,o){return o||checkOffset(n,1,this.length),this[n]},Buffer$1.prototype.readUInt16LE=function t(n,o){return o||checkOffset(n,2,this.length),this[n]|this[n+1]<<8},Buffer$1.prototype.readUInt16BE=function t(n,o){return o||checkOffset(n,2,this.length),this[n]<<8|this[n+1]},Buffer$1.prototype.readUInt32LE=function t(n,o){return o||checkOffset(n,4,this.length),(this[n]|this[n+1]<<8|this[n+2]<<16)+this[n+3]*16777216},Buffer$1.prototype.readUInt32BE=function t(n,o){return o||checkOffset(n,4,this.length),this[n]*16777216+(this[n+1]<<16|this[n+2]<<8|this[n+3])},Buffer$1.prototype.readIntLE=function t(n,o,s){n=n|0,o=o|0,s||checkOffset(n,o,this.length);for(var c=this[n],d=1,h=0;++h<o&&(d*=256);)c+=this[n+h]*d;return d*=128,c>=d&&(c-=Math.pow(2,8*o)),c},Buffer$1.prototype.readIntBE=function t(n,o,s){n=n|0,o=o|0,s||checkOffset(n,o,this.length);for(var c=o,d=1,h=this[n+--c];c>0&&(d*=256);)h+=this[n+--c]*d;return d*=128,h>=d&&(h-=Math.pow(2,8*o)),h},Buffer$1.prototype.readInt8=function t(n,o){return o||checkOffset(n,1,this.length),this[n]&128?(255-this[n]+1)*-1:this[n]},Buffer$1.prototype.readInt16LE=function t(n,o){o||checkOffset(n,2,this.length);var s=this[n]|this[n+1]<<8;return s&32768?s|4294901760:s},Buffer$1.prototype.readInt16BE=function t(n,o){o||checkOffset(n,2,this.length);var s=this[n+1]|this[n]<<8;return s&32768?s|4294901760:s},Buffer$1.prototype.readInt32LE=function t(n,o){return o||checkOffset(n,4,this.length),this[n]|this[n+1]<<8|this[n+2]<<16|this[n+3]<<24},Buffer$1.prototype.readInt32BE=function t(n,o){return o||checkOffset(n,4,this.length),this[n]<<24|this[n+1]<<16|this[n+2]<<8|this[n+3]},Buffer$1.prototype.readFloatLE=function t(n,o){return o||checkOffset(n,4,this.length),read(this,n,!0,23,4)},Buffer$1.prototype.readFloatBE=function t(n,o){return o||checkOffset(n,4,this.length),read(this,n,!1,23,4)},Buffer$1.prototype.readDoubleLE=function t(n,o){return o||checkOffset(n,8,this.length),read(this,n,!0,52,8)},Buffer$1.prototype.readDoubleBE=function t(n,o){return o||checkOffset(n,8,this.length),read(this,n,!1,52,8)};function checkInt(t,n,o,s,c,d){if(!internalIsBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(n>c||n<d)throw new RangeError('"value" argument is out of bounds');if(o+s>t.length)throw new RangeError("Index out of range")}Buffer$1.prototype.writeUIntLE=function t(n,o,s,c){if(n=+n,o=o|0,s=s|0,!c){var d=Math.pow(2,8*s)-1;checkInt(this,n,o,s,d,0)}var h=1,p=0;for(this[o]=n&255;++p<s&&(h*=256);)this[o+p]=n/h&255;return o+s},Buffer$1.prototype.writeUIntBE=function t(n,o,s,c){if(n=+n,o=o|0,s=s|0,!c){var d=Math.pow(2,8*s)-1;checkInt(this,n,o,s,d,0)}var h=s-1,p=1;for(this[o+h]=n&255;--h>=0&&(p*=256);)this[o+h]=n/p&255;return o+s},Buffer$1.prototype.writeUInt8=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,1,255,0),Buffer$1.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),this[o]=n&255,o+1};function objectWriteUInt16(t,n,o,s){n<0&&(n=65535+n+1);for(var c=0,d=Math.min(t.length-o,2);c<d;++c)t[o+c]=(n&255<<8*(s?c:1-c))>>>(s?c:1-c)*8}Buffer$1.prototype.writeUInt16LE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,2,65535,0),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n&255,this[o+1]=n>>>8):objectWriteUInt16(this,n,o,!0),o+2},Buffer$1.prototype.writeUInt16BE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,2,65535,0),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n>>>8,this[o+1]=n&255):objectWriteUInt16(this,n,o,!1),o+2};function objectWriteUInt32(t,n,o,s){n<0&&(n=4294967295+n+1);for(var c=0,d=Math.min(t.length-o,4);c<d;++c)t[o+c]=n>>>(s?c:3-c)*8&255}Buffer$1.prototype.writeUInt32LE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,4,4294967295,0),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o+3]=n>>>24,this[o+2]=n>>>16,this[o+1]=n>>>8,this[o]=n&255):objectWriteUInt32(this,n,o,!0),o+4},Buffer$1.prototype.writeUInt32BE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,4,4294967295,0),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n>>>24,this[o+1]=n>>>16,this[o+2]=n>>>8,this[o+3]=n&255):objectWriteUInt32(this,n,o,!1),o+4},Buffer$1.prototype.writeIntLE=function t(n,o,s,c){if(n=+n,o=o|0,!c){var d=Math.pow(2,8*s-1);checkInt(this,n,o,s,d-1,-d)}var h=0,p=1,y=0;for(this[o]=n&255;++h<s&&(p*=256);)n<0&&y===0&&this[o+h-1]!==0&&(y=1),this[o+h]=(n/p>>0)-y&255;return o+s},Buffer$1.prototype.writeIntBE=function t(n,o,s,c){if(n=+n,o=o|0,!c){var d=Math.pow(2,8*s-1);checkInt(this,n,o,s,d-1,-d)}var h=s-1,p=1,y=0;for(this[o+h]=n&255;--h>=0&&(p*=256);)n<0&&y===0&&this[o+h+1]!==0&&(y=1),this[o+h]=(n/p>>0)-y&255;return o+s},Buffer$1.prototype.writeInt8=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,1,127,-128),Buffer$1.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),n<0&&(n=255+n+1),this[o]=n&255,o+1},Buffer$1.prototype.writeInt16LE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,2,32767,-32768),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n&255,this[o+1]=n>>>8):objectWriteUInt16(this,n,o,!0),o+2},Buffer$1.prototype.writeInt16BE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,2,32767,-32768),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n>>>8,this[o+1]=n&255):objectWriteUInt16(this,n,o,!1),o+2},Buffer$1.prototype.writeInt32LE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,4,2147483647,-2147483648),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n&255,this[o+1]=n>>>8,this[o+2]=n>>>16,this[o+3]=n>>>24):objectWriteUInt32(this,n,o,!0),o+4},Buffer$1.prototype.writeInt32BE=function t(n,o,s){return n=+n,o=o|0,s||checkInt(this,n,o,4,2147483647,-2147483648),n<0&&(n=4294967295+n+1),Buffer$1.TYPED_ARRAY_SUPPORT?(this[o]=n>>>24,this[o+1]=n>>>16,this[o+2]=n>>>8,this[o+3]=n&255):objectWriteUInt32(this,n,o,!1),o+4};function checkIEEE754(t,n,o,s,c,d){if(o+s>t.length)throw new RangeError("Index out of range");if(o<0)throw new RangeError("Index out of range")}function writeFloat(t,n,o,s,c){return c||checkIEEE754(t,n,o,4),write(t,n,o,s,23,4),o+4}Buffer$1.prototype.writeFloatLE=function t(n,o,s){return writeFloat(this,n,o,!0,s)},Buffer$1.prototype.writeFloatBE=function t(n,o,s){return writeFloat(this,n,o,!1,s)};function writeDouble(t,n,o,s,c){return c||checkIEEE754(t,n,o,8),write(t,n,o,s,52,8),o+8}Buffer$1.prototype.writeDoubleLE=function t(n,o,s){return writeDouble(this,n,o,!0,s)},Buffer$1.prototype.writeDoubleBE=function t(n,o,s){return writeDouble(this,n,o,!1,s)},Buffer$1.prototype.copy=function t(n,o,s,c){if(s||(s=0),!c&&c!==0&&(c=this.length),o>=n.length&&(o=n.length),o||(o=0),c>0&&c<s&&(c=s),c===s||n.length===0||this.length===0)return 0;if(o<0)throw new RangeError("targetStart out of bounds");if(s<0||s>=this.length)throw new RangeError("sourceStart out of bounds");if(c<0)throw new RangeError("sourceEnd out of bounds");c>this.length&&(c=this.length),n.length-o<c-s&&(c=n.length-o+s);var d=c-s,h;if(this===n&&s<o&&o<c)for(h=d-1;h>=0;--h)n[h+o]=this[h+s];else if(d<1e3||!Buffer$1.TYPED_ARRAY_SUPPORT)for(h=0;h<d;++h)n[h+o]=this[h+s];else Uint8Array.prototype.set.call(n,this.subarray(s,s+d),o);return d},Buffer$1.prototype.fill=function t(n,o,s,c){if(typeof n=="string"){if(typeof o=="string"?(c=o,o=0,s=this.length):typeof s=="string"&&(c=s,s=this.length),n.length===1){var d=n.charCodeAt(0);d<256&&(n=d)}if(c!==void 0&&typeof c!="string")throw new TypeError("encoding must be a string");if(typeof c=="string"&&!Buffer$1.isEncoding(c))throw new TypeError("Unknown encoding: "+c)}else typeof n=="number"&&(n=n&255);if(o<0||this.length<o||this.length<s)throw new RangeError("Out of range index");if(s<=o)return this;o=o>>>0,s=s===void 0?this.length:s>>>0,n||(n=0);var h;if(typeof n=="number")for(h=o;h<s;++h)this[h]=n;else{var p=internalIsBuffer(n)?n:utf8ToBytes(new Buffer$1(n,c).toString()),y=p.length;for(h=0;h<s-o;++h)this[h+o]=p[h%y]}return this};var INVALID_BASE64_RE=/[^+\/0-9A-Za-z-_]/g;function base64clean(t){if(t=stringtrim(t).replace(INVALID_BASE64_RE,""),t.length<2)return"";for(;t.length%4!==0;)t=t+"=";return t}function stringtrim(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function toHex(t){return t<16?"0"+t.toString(16):t.toString(16)}function utf8ToBytes(t,n){n=n||1/0;for(var o,s=t.length,c=null,d=[],h=0;h<s;++h){if(o=t.charCodeAt(h),o>55295&&o<57344){if(!c){if(o>56319){(n-=3)>-1&&d.push(239,191,189);continue}else if(h+1===s){(n-=3)>-1&&d.push(239,191,189);continue}c=o;continue}if(o<56320){(n-=3)>-1&&d.push(239,191,189),c=o;continue}o=(c-55296<<10|o-56320)+65536}else c&&(n-=3)>-1&&d.push(239,191,189);if(c=null,o<128){if((n-=1)<0)break;d.push(o)}else if(o<2048){if((n-=2)<0)break;d.push(o>>6|192,o&63|128)}else if(o<65536){if((n-=3)<0)break;d.push(o>>12|224,o>>6&63|128,o&63|128)}else if(o<1114112){if((n-=4)<0)break;d.push(o>>18|240,o>>12&63|128,o>>6&63|128,o&63|128)}else throw new Error("Invalid code point")}return d}function asciiToBytes(t){for(var n=[],o=0;o<t.length;++o)n.push(t.charCodeAt(o)&255);return n}function utf16leToBytes(t,n){for(var o,s,c,d=[],h=0;h<t.length&&!((n-=2)<0);++h)o=t.charCodeAt(h),s=o>>8,c=o%256,d.push(c),d.push(s);return d}function base64ToBytes(t){return toByteArray(base64clean(t))}function blitBuffer(t,n,o,s){for(var c=0;c<s&&!(c+o>=n.length||c>=t.length);++c)n[c+o]=t[c];return c}function isnan(t){return t!==t}function isBuffer(t){return t!=null&&(!!t._isBuffer||isFastBuffer(t)||isSlowBuffer(t))}function isFastBuffer(t){return!!t.constructor&&typeof t.constructor.isBuffer=="function"&&t.constructor.isBuffer(t)}function isSlowBuffer(t){return typeof t.readFloatLE=="function"&&typeof t.slice=="function"&&isFastBuffer(t.slice(0,0))}var domain;function EventHandlers(){}EventHandlers.prototype=Object.create(null);function EventEmitter(){EventEmitter.init.call(this)}EventEmitter.EventEmitter=EventEmitter,EventEmitter.usingDomains=!1,EventEmitter.prototype.domain=void 0,EventEmitter.prototype._events=void 0,EventEmitter.prototype._maxListeners=void 0,EventEmitter.defaultMaxListeners=10,EventEmitter.init=function(){this.domain=null,EventEmitter.usingDomains&&domain.active,(!this._events||this._events===Object.getPrototypeOf(this)._events)&&(this._events=new EventHandlers,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},EventEmitter.prototype.setMaxListeners=function t(n){if(typeof n!="number"||n<0||isNaN(n))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=n,this};function $getMaxListeners(t){return t._maxListeners===void 0?EventEmitter.defaultMaxListeners:t._maxListeners}EventEmitter.prototype.getMaxListeners=function t(){return $getMaxListeners(this)};function emitNone(t,n,o){if(n)t.call(o);else for(var s=t.length,c=arrayClone(t,s),d=0;d<s;++d)c[d].call(o)}function emitOne(t,n,o,s){if(n)t.call(o,s);else for(var c=t.length,d=arrayClone(t,c),h=0;h<c;++h)d[h].call(o,s)}function emitTwo(t,n,o,s,c){if(n)t.call(o,s,c);else for(var d=t.length,h=arrayClone(t,d),p=0;p<d;++p)h[p].call(o,s,c)}function emitThree(t,n,o,s,c,d){if(n)t.call(o,s,c,d);else for(var h=t.length,p=arrayClone(t,h),y=0;y<h;++y)p[y].call(o,s,c,d)}function emitMany(t,n,o,s){if(n)t.apply(o,s);else for(var c=t.length,d=arrayClone(t,c),h=0;h<c;++h)d[h].apply(o,s)}EventEmitter.prototype.emit=function t(n){var o,s,c,d,h,p,y,E=n==="error";if(p=this._events,p)E=E&&p.error==null;else if(!E)return!1;if(y=this.domain,E){if(o=arguments[1],y)o||(o=new Error('Uncaught, unspecified "error" event')),o.domainEmitter=this,o.domain=y,o.domainThrown=!1,y.emit("error",o);else{if(o instanceof Error)throw o;var L=new Error('Uncaught, unspecified "error" event. ('+o+")");throw L.context=o,L}return!1}if(s=p[n],!s)return!1;var F=typeof s=="function";switch(c=arguments.length,c){case 1:emitNone(s,F,this);break;case 2:emitOne(s,F,this,arguments[1]);break;case 3:emitTwo(s,F,this,arguments[1],arguments[2]);break;case 4:emitThree(s,F,this,arguments[1],arguments[2],arguments[3]);break;default:for(d=new Array(c-1),h=1;h<c;h++)d[h-1]=arguments[h];emitMany(s,F,this,d)}return!0};function _addListener(t,n,o,s){var c,d,h;if(typeof o!="function")throw new TypeError('"listener" argument must be a function');if(d=t._events,d?(d.newListener&&(t.emit("newListener",n,o.listener?o.listener:o),d=t._events),h=d[n]):(d=t._events=new EventHandlers,t._eventsCount=0),!h)h=d[n]=o,++t._eventsCount;else if(typeof h=="function"?h=d[n]=s?[o,h]:[h,o]:s?h.unshift(o):h.push(o),!h.warned&&(c=$getMaxListeners(t),c&&c>0&&h.length>c)){h.warned=!0;var p=new Error("Possible EventEmitter memory leak detected. "+h.length+" "+n+" listeners added. Use emitter.setMaxListeners() to increase limit");p.name="MaxListenersExceededWarning",p.emitter=t,p.type=n,p.count=h.length,emitWarning(p)}return t}function emitWarning(t){typeof console.warn=="function"?console.warn(t):console.log(t)}EventEmitter.prototype.addListener=function t(n,o){return _addListener(this,n,o,!1)},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.prependListener=function t(n,o){return _addListener(this,n,o,!0)};function _onceWrap(t,n,o){var s=!1;function c(){t.removeListener(n,c),s||(s=!0,o.apply(t,arguments))}return c.listener=o,c}EventEmitter.prototype.once=function t(n,o){if(typeof o!="function")throw new TypeError('"listener" argument must be a function');return this.on(n,_onceWrap(this,n,o)),this},EventEmitter.prototype.prependOnceListener=function t(n,o){if(typeof o!="function")throw new TypeError('"listener" argument must be a function');return this.prependListener(n,_onceWrap(this,n,o)),this},EventEmitter.prototype.removeListener=function t(n,o){var s,c,d,h,p;if(typeof o!="function")throw new TypeError('"listener" argument must be a function');if(c=this._events,!c)return this;if(s=c[n],!s)return this;if(s===o||s.listener&&s.listener===o)--this._eventsCount===0?this._events=new EventHandlers:(delete c[n],c.removeListener&&this.emit("removeListener",n,s.listener||o));else if(typeof s!="function"){for(d=-1,h=s.length;h-- >0;)if(s[h]===o||s[h].listener&&s[h].listener===o){p=s[h].listener,d=h;break}if(d<0)return this;if(s.length===1){if(s[0]=void 0,--this._eventsCount===0)return this._events=new EventHandlers,this;delete c[n]}else spliceOne(s,d);c.removeListener&&this.emit("removeListener",n,p||o)}return this},EventEmitter.prototype.removeAllListeners=function t(n){var o,s;if(s=this._events,!s)return this;if(!s.removeListener)return arguments.length===0?(this._events=new EventHandlers,this._eventsCount=0):s[n]&&(--this._eventsCount===0?this._events=new EventHandlers:delete s[n]),this;if(arguments.length===0){for(var c=Object.keys(s),d=0,h;d<c.length;++d)h=c[d],h!=="removeListener"&&this.removeAllListeners(h);return this.removeAllListeners("removeListener"),this._events=new EventHandlers,this._eventsCount=0,this}if(o=s[n],typeof o=="function")this.removeListener(n,o);else if(o)do this.removeListener(n,o[o.length-1]);while(o[0]);return this},EventEmitter.prototype.listeners=function t(n){var o,s,c=this._events;return c?(o=c[n],o?typeof o=="function"?s=[o.listener||o]:s=unwrapListeners(o):s=[]):s=[],s},EventEmitter.listenerCount=function(t,n){return typeof t.listenerCount=="function"?t.listenerCount(n):listenerCount$1.call(t,n)},EventEmitter.prototype.listenerCount=listenerCount$1;function listenerCount$1(t){var n=this._events;if(n){var o=n[t];if(typeof o=="function")return 1;if(o)return o.length}return 0}EventEmitter.prototype.eventNames=function t(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};function spliceOne(t,n){for(var o=n,s=o+1,c=t.length;s<c;o+=1,s+=1)t[o]=t[s];t.pop()}function arrayClone(t,n){for(var o=new Array(n);n--;)o[n]=t[n];return o}function unwrapListeners(t){for(var n=new Array(t.length),o=0;o<n.length;++o)n[o]=t[o].listener||t[o];return n}function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}var cachedSetTimeout=defaultSetTimout,cachedClearTimeout=defaultClearTimeout;typeof global$1.setTimeout=="function"&&(cachedSetTimeout=setTimeout),typeof global$1.clearTimeout=="function"&&(cachedClearTimeout=clearTimeout);function runTimeout(t){if(cachedSetTimeout===setTimeout)return setTimeout(t,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(t,0);try{return cachedSetTimeout(t,0)}catch{try{return cachedSetTimeout.call(null,t,0)}catch{return cachedSetTimeout.call(this,t,0)}}}function runClearTimeout(t){if(cachedClearTimeout===clearTimeout)return clearTimeout(t);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(t);try{return cachedClearTimeout(t)}catch{try{return cachedClearTimeout.call(null,t)}catch{return cachedClearTimeout.call(this,t)}}}var queue=[],draining=!1,currentQueue,queueIndex=-1;function cleanUpNextTick(){!draining||!currentQueue||(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var t=runTimeout(cleanUpNextTick);draining=!0;for(var n=queue.length;n;){for(currentQueue=queue,queue=[];++queueIndex<n;)currentQueue&¤tQueue[queueIndex].run();queueIndex=-1,n=queue.length}currentQueue=null,draining=!1,runClearTimeout(t)}}function nextTick(t){var n=new Array(arguments.length-1);if(arguments.length>1)for(var o=1;o<arguments.length;o++)n[o-1]=arguments[o];queue.push(new Item(t,n)),queue.length===1&&!draining&&runTimeout(drainQueue)}function Item(t,n){this.fun=t,this.array=n}Item.prototype.run=function(){this.fun.apply(null,this.array)};var title="browser",platform="browser",browser=!0,env={},argv=[],version="",versions={},release={},config={};function noop(){}var on=noop,addListener=noop,once=noop,off=noop,removeListener=noop,removeAllListeners=noop,emit=noop;function binding(t){throw new Error("process.binding is not supported")}function cwd(){return"/"}function chdir(t){throw new Error("process.chdir is not supported")}function umask(){return 0}var performance$1=global$1.performance||{},performanceNow=performance$1.now||performance$1.mozNow||performance$1.msNow||performance$1.oNow||performance$1.webkitNow||function(){return new Date().getTime()};function hrtime(t){var n=performanceNow.call(performance$1)*.001,o=Math.floor(n),s=Math.floor(n%1*1e9);return t&&(o=o-t[0],s=s-t[1],s<0&&(o--,s+=1e9)),[o,s]}var startTime=new Date;function uptime(){var t=new Date,n=t-startTime;return n/1e3}var process$1={nextTick,title,browser,env,argv,version,versions,on,addListener,once,off,removeListener,removeAllListeners,emit,binding,cwd,chdir,umask,hrtime,platform,release,config,uptime},inherits;typeof Object.create=="function"?inherits=function(n,o){n.super_=o,n.prototype=Object.create(o.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}})}:inherits=function(n,o){n.super_=o;var s=function(){};s.prototype=o.prototype,n.prototype=new s,n.prototype.constructor=n};var inherits$1=inherits,formatRegExp=/%[sdj%]/g;function format(t){if(!isString(t)){for(var n=[],o=0;o<arguments.length;o++)n.push(inspect(arguments[o]));return n.join(" ")}for(var o=1,s=arguments,c=s.length,d=String(t).replace(formatRegExp,function(p){if(p==="%%")return"%";if(o>=c)return p;switch(p){case"%s":return String(s[o++]);case"%d":return Number(s[o++]);case"%j":try{return JSON.stringify(s[o++])}catch{return"[Circular]"}default:return p}}),h=s[o];o<c;h=s[++o])isNull(h)||!isObject(h)?d+=" "+h:d+=" "+inspect(h);return d}function deprecate(t,n){if(isUndefined(global$1.process))return function(){return deprecate(t,n).apply(this,arguments)};if(process$1.noDeprecation===!0)return t;var o=!1;function s(){if(!o){if(process$1.throwDeprecation)throw new Error(n);process$1.traceDeprecation?console.trace(n):console.error(n),o=!0}return t.apply(this,arguments)}return s}var debugs={},debugEnviron;function debuglog(t){if(isUndefined(debugEnviron)&&(debugEnviron=process$1.env.NODE_DEBUG||""),t=t.toUpperCase(),!debugs[t])if(new RegExp("\\b"+t+"\\b","i").test(debugEnviron)){var n=0;debugs[t]=function(){var o=format.apply(null,arguments);console.error("%s %d: %s",t,n,o)}}else debugs[t]=function(){};return debugs[t]}function inspect(t,n){var o={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(o.depth=arguments[2]),arguments.length>=4&&(o.colors=arguments[3]),isBoolean(n)?o.showHidden=n:n&&_extend(o,n),isUndefined(o.showHidden)&&(o.showHidden=!1),isUndefined(o.depth)&&(o.depth=2),isUndefined(o.colors)&&(o.colors=!1),isUndefined(o.customInspect)&&(o.customInspect=!0),o.colors&&(o.stylize=stylizeWithColor),formatValue(o,t,o.depth)}inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},inspect.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};function stylizeWithColor(t,n){var o=inspect.styles[n];return o?"\x1B["+inspect.colors[o][0]+"m"+t+"\x1B["+inspect.colors[o][1]+"m":t}function stylizeNoColor(t,n){return t}function arrayToHash(t){var n={};return t.forEach(function(o,s){n[o]=!0}),n}function formatValue(t,n,o){if(t.customInspect&&n&&isFunction(n.inspect)&&n.inspect!==inspect&&!(n.constructor&&n.constructor.prototype===n)){var s=n.inspect(o,t);return isString(s)||(s=formatValue(t,s,o)),s}var c=formatPrimitive(t,n);if(c)return c;var d=Object.keys(n),h=arrayToHash(d);if(t.showHidden&&(d=Object.getOwnPropertyNames(n)),isError(n)&&(d.indexOf("message")>=0||d.indexOf("description")>=0))return formatError(n);if(d.length===0){if(isFunction(n)){var p=n.name?": "+n.name:"";return t.stylize("[Function"+p+"]","special")}if(isRegExp(n))return t.stylize(RegExp.prototype.toString.call(n),"regexp");if(isDate(n))return t.stylize(Date.prototype.toString.call(n),"date");if(isError(n))return formatError(n)}var y="",E=!1,L=["{","}"];if(isArray(n)&&(E=!0,L=["[","]"]),isFunction(n)){var F=n.name?": "+n.name:"";y=" [Function"+F+"]"}if(isRegExp(n)&&(y=" "+RegExp.prototype.toString.call(n)),isDate(n)&&(y=" "+Date.prototype.toUTCString.call(n)),isError(n)&&(y=" "+formatError(n)),d.length===0&&(!E||n.length==0))return L[0]+y+L[1];if(o<0)return isRegExp(n)?t.stylize(RegExp.prototype.toString.call(n),"regexp"):t.stylize("[Object]","special");t.seen.push(n);var N;return E?N=formatArray(t,n,o,h,d):N=d.map(function(z){return formatProperty(t,n,o,h,z,E)}),t.seen.pop(),reduceToSingleString(N,y,L)}function formatPrimitive(t,n){if(isUndefined(n))return t.stylize("undefined","undefined");if(isString(n)){var o="'"+JSON.stringify(n).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(o,"string")}if(isNumber(n))return t.stylize(""+n,"number");if(isBoolean(n))return t.stylize(""+n,"boolean");if(isNull(n))return t.stylize("null","null")}function formatError(t){return"["+Error.prototype.toString.call(t)+"]"}function formatArray(t,n,o,s,c){for(var d=[],h=0,p=n.length;h<p;++h)hasOwnProperty(n,String(h))?d.push(formatProperty(t,n,o,s,String(h),!0)):d.push("");return c.forEach(function(y){y.match(/^\d+$/)||d.push(formatProperty(t,n,o,s,y,!0))}),d}function formatProperty(t,n,o,s,c,d){var h,p,y;if(y=Object.getOwnPropertyDescriptor(n,c)||{value:n[c]},y.get?y.set?p=t.stylize("[Getter/Setter]","special"):p=t.stylize("[Getter]","special"):y.set&&(p=t.stylize("[Setter]","special")),hasOwnProperty(s,c)||(h="["+c+"]"),p||(t.seen.indexOf(y.value)<0?(isNull(o)?p=formatValue(t,y.value,null):p=formatValue(t,y.value,o-1),p.indexOf(`
|
|
6746
6746
|
`)>-1&&(d?p=p.split(`
|
|
6747
6747
|
`).map(function(E){return" "+E}).join(`
|
|
6748
6748
|
`).substr(2):p=`
|