@reearth/core 0.0.7-alpha.39 → 0.0.7-alpha.40

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.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 $t(t,n){return t=t.slice(),t.push(n),t}function Gl(t,n){return n=n.slice(),n.unshift(t),n}var Wh=function(t){bh(n,t);function n(o){var s;return Hc(this,n),s=uh(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 zc(n)}(Vl(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 Wh(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 S=t;n=S.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 P=D.toPathArray(t);P[0]==="$"&&P.length>1&&P.shift(),this._hasParentSelector=null;var L=this._trace(P,n,["$"],d,h,o).filter(function(F){return F&&!F.isParentSelector});return L.length?!y&&L.length===1&&!L[0].hasArrExpr?this._getPreferredOutput(L[0]):L.reduce(function(F,N){var z=c._getPreferredOutput(N);return p&&Array.isArray(z)?F=F.concat(z):F.push(z),F},[]):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,S;if(!t.length)return S={path:o,value:n,parent:s,parentProperty:c,hasArrExpr:h},this._handleCallback(S,d,"value"),S;var P=t[0],L=t.slice(1),F=[];function N(ma){Array.isArray(ma)?ma.forEach(function(yt){F.push(yt)}):F.push(ma)}if((typeof P!="string"||p)&&n&&Xt.call(n,P))N(this._trace(L,n[P],$t(o,P),n,P,d,h));else if(P==="*")this._walk(n,function(ma){N(y._trace(L,n[ma],$t(o,ma),n,ma,d,!0,!0))});else if(P==="..")N(this._trace(L,n,o,s,c,d,h)),this._walk(n,function(ma){Qt(n[ma])==="object"&&N(y._trace(t.slice(),n[ma],$t(o,ma),n,ma,d,!0))});else{if(P==="^")return this._hasParentSelector=!0,{path:o.slice(0,-1),expr:L,isParentSelector:!0};if(P==="~")return S={path:$t(o,P),value:c,parent:s,parentProperty:null},this._handleCallback(S,d,"property"),S;if(P==="$")N(this._trace(L,n,o,null,null,d,h));else if(/^(\x2D?[0-9]*):(\x2D?[0-9]*):?([0-9]*)$/.test(P))N(this._slice(P,L,n,o,s,c,d));else if(P.indexOf("?(")===0){if(this.currPreventEval)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");var z=P.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(z);W?this._walk(n,function(ma){var yt=[W[2]],lt=W[1]?n[ma][W[1]]:n[ma],pi=y._trace(yt,lt,o,s,c,d,!0);pi.length>0&&N(y._trace(L,n[ma],$t(o,ma),n,ma,d,!0))}):this._walk(n,function(ma){y._eval(z,n[ma],ma,o,s,c)&&N(y._trace(L,n[ma],$t(o,ma),n,ma,d,!0))})}else if(P[0]==="("){if(this.currPreventEval)throw new Error("Eval [(expr)] prevented in JSONPath expression.");N(this._trace(Gl(this._eval(P,n,o[o.length-1],o.slice(0,-1),s,c),L),n,o,s,c,d,h))}else if(P[0]==="@"){var nt=!1,Pe=P.slice(1,-2);switch(Pe){case"scalar":(!n||!["object","function"].includes(Qt(n)))&&(nt=!0);break;case"boolean":case"string":case"undefined":case"function":Qt(n)===Pe&&(nt=!0);break;case"integer":Number.isFinite(n)&&!(n%1)&&(nt=!0);break;case"number":Number.isFinite(n)&&(nt=!0);break;case"nonFinite":typeof n=="number"&&!Number.isFinite(n)&&(nt=!0);break;case"object":n&&Qt(n)===Pe&&(nt=!0);break;case"array":Array.isArray(n)&&(nt=!0);break;case"other":nt=this.currOtherTypeCallback(n,o,s,c);break;case"null":n===null&&(nt=!0);break;default:throw new TypeError("Unknown value type "+Pe)}if(nt)return S={path:o,value:n,parent:s,parentProperty:c},this._handleCallback(S,d,"value"),S}else if(P[0]==="`"&&n&&Xt.call(n,P.slice(1))){var se=P.slice(1);N(this._trace(L,n[se],$t(o,se),n,se,d,h,!0))}else if(P.includes(",")){var mt=P.split(","),kt=Rh(mt),mn;try{for(kt.s();!(mn=kt.n()).done;){var _i=mn.value;N(this._trace(Gl(_i,L),n,o,s,c,d,!0))}}catch(ma){kt.e(ma)}finally{kt.f()}}else!p&&n&&Xt.call(n,P)&&N(this._trace(L,n[P],$t(o,P),n,P,d,h,!0))}if(this._hasParentSelector)for(var zi=0;zi<F.length;zi++){var Sa=F[zi];if(Sa&&Sa.isParentSelector){var fa=this._trace(Sa.expr,n,Sa.path,s,c,d,h);if(Array.isArray(fa)){F[zi]=fa[0];for(var La=fa.length,Ra=1;Ra<La;Ra++)zi++,F.splice(zi,0,fa[Ra])}else F[zi]=fa}}return F},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(":"),S=y[2]&&Number.parseInt(y[2])||1,P=y[0]&&Number.parseInt(y[0])||0,L=y[1]&&Number.parseInt(y[1])||p;P=P<0?Math.max(0,P+p):Math.min(p,P),L=L<0?Math.max(0,L+p):Math.min(p,L);for(var F=[],N=P;N<L;N+=S){var z=this._trace(Gl(N,n),o,s,c,d,h,!0);z.forEach(function(W){F.push(W)})}return F}},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(S){throw new Error("jsonPath: "+S.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 fh=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])}},Sh=function(){function t(n){Hc(this,t),this.code=n}return zc(t,[{key:"runInNewContext",value:function(n){var o=this.code,s=Object.keys(n),c=[];fh(s,c,function(S){return typeof n[S]=="function"});var d=s.map(function(S){return n[S]}),h=c.reduce(function(S,P){var L=n[P].toString();return/function/.test(L)||(L="function "+L),"var "+P+"="+L+";"+S},"");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 kc(Function,s.concat([y])).apply(void 0,Xh(d))}}]),t}();D.prototype.vm={Script:Sh};const Lh="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",Fh=t=>Array.from(window.crypto.getRandomValues(new Uint8Array(t))).map(n=>Lh[n%t]).join("").toLowerCase(),Pc=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]=Pc(t[n]));return t},Bl="czm_";function Ih(t,n){let o=t,s="";const c=[];let d=o.indexOf("${");const h=typeof n<"u",p={},y=/^\$./;for(;d>=0;)if(xh(o,d)){const S=Th(o,d);s+=o.slice(0,S+1),o=o.slice(S+1),d=o.indexOf("${")}else{s+=o.slice(0,d);const S=Uh(o,d),P=o.slice(d+2,S);if(y.test(P)){if(!h)return[s,[]];let L=p[P];if(!L)try{L=D({json:n,path:P}),p[P]=L}catch{return[s,[]]}if(L.length!==0){const F=Fh(10);c.push({literalName:F,literalValue:L[0]}),s+=F}else return["false",[]]}else{const L=Yh(P);s+=`${Bl}${L}`}o=o.slice(S+1),d=o.indexOf("${")}return s+=o,[s,c]}function xh(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 Th(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 Uh(t,n){const o=t.indexOf("}",n);if(o<0)throw new Error("replaceVariable: Unmatched {.");return o}const ae=t=>`$reearth_${t}_$`,pl={"[":ae("opened_square_bracket"),"]":ae("closed_square_bracket"),"{":ae("opened_curly_bracket"),"}":ae("closed_curly_bracket"),"(":ae("opened_parentheses"),")":ae("closed_parentheses"),"-":ae("hyphen")},Yh=t=>{const n=t.replace(/-/g,pl["-"]);return/(\]|\)|\})[^[.]+$/.test(n)?Object.entries(pl).reduce((o,[s,c])=>o.replaceAll(s,c),n):n},Jh=t=>Object.entries(pl).reduce((n,[o,s])=>n.replaceAll(s,o),t),Ch=new Set(jr),zn=new Set(Or);function O(t,n){let o=new Error("failed to parse");const s=n.type;if(s==="Literal")o=Kh(n);else if(s==="CallExpression")o=Nh(t,n);else if(s==="Identifier")o=Mh(n);else if(s==="UnaryExpression"){const c=n.operator,d=O(t,n.argument);if(Ch.has(c))o=new w(k.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(zn.has(c))o=new w(k.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);zn.has(c)&&(o=new w(k.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(k.CONDITIONAL,"?",d,h,c)}else if(s==="MemberExpression")o=zh(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(k.ARRAY,c)}else throw s==="Compound"?new Error("Provide exactly one expression."):new Error("Cannot parse expression.");return o}function Kh(t){const n=typeof t.value;if(t.value===null)return new w(k.LITERAL_NULL,null);if(n==="boolean")return new w(k.LITERAL_BOOLEAN,t.value);if(n==="number")return new w(k.LITERAL_NUMBER,t.value);if(n==="string")return t.value.indexOf("${")>=0?new w(k.VARIABLE_IN_STRING,t.value):new w(k.LITERAL_STRING,gh(t.value));throw new Error(`${t} is not a function.`)}function gh(t){return t.replace(_r,"\\")}function Nh(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(k.LITERAL_BOOLEAN,!1):new w(k.LITERAL_NULL,null);const p=O(t,h),y=O(t,o[0]);return new w(k.FUNCTION_CALL,d,p,y)}else if(d==="toString"){const p=O(t,h);return new w(k.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(k.LITERAL_COLOR,c);const d=O(t,o[0]);if(typeof o[1]<"u"){const h=O(t,o[1]);return new w(k.LITERAL_COLOR,c,[d,h])}return new w(k.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(k.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(k.LITERAL_COLOR,c,d)}else if(c==="isNaN"||c==="isFinite"){if(s===0)return c==="isNaN"?new w(k.LITERAL_BOOLEAN,!0):new w(k.LITERAL_BOOLEAN,!1);const d=O(t,o[0]);return new w(k.UNARY,c,d)}else if(typeof wl[c]<"u"){if(s!==1)throw new Error(`${c} requires exactly one argument.`);const d=O(t,o[0]);return new w(k.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(k.BINARY,c,d,h)}else if(c==="Boolean"){if(s===0)return new w(k.LITERAL_BOOLEAN,!1);const d=O(t,o[0]);return new w(k.UNARY,c,d)}else if(c==="Number"){if(s===0)return new w(k.LITERAL_NUMBER,0);const d=O(t,o[0]);return new w(k.UNARY,c,d)}else if(c==="String"){if(s===0)return new w(k.LITERAL_STRING,"");const d=O(t,o[0]);return new w(k.UNARY,c,d)}throw new Error(`Unexpected function call "${c}".`)}function Mh(t){const n=t.name;if(Qh(n)){const o=Ph(n);return o.substring(0,8)==="tiles3d_"?new w(k.BUILTIN_VARIABLE,o):new w(k.VARIABLE,o)}else{if(n==="NaN")return new w(k.LITERAL_NUMBER,NaN);if(n==="Infinity")return new w(k.LITERAL_NUMBER,1/0);if(n==="undefined")return new w(k.LITERAL_UNDEFINED,void 0)}throw new Error(`${n} is not defined.`)}function kh(t){const n=t.property.name;if(n==="PI")return new w(k.LITERAL_NUMBER,Math.PI);if(n==="E")return new w(k.LITERAL_NUMBER,Math.E);throw new Error(`${n} Math Constant is not supported at the moment`)}function Hh(t){const n=t.property.name;if(n==="POSITIVE_INFINITY")return new w(k.LITERAL_NUMBER,Number.POSITIVE_INFINITY);throw new Error(`${n} Number Constant is not supported at the moment`)}function zh(t,n){if(n.object.name==="Math")return kh(n);if(n.object.name==="Number")return Hh(n);let o;const s=O(t,n.object);return n.computed?(o=O(t,n.property),new w(k.MEMBER,"brackets",s,o)):(o=new w(k.LITERAL_STRING,n.property.name),new w(k.MEMBER,"dot",s,o))}function Qh(t){return t.substring(0,4)===Bl}function Ph(t){return Jh(t).substring(4)}const Qn=new Map,Pn=new Map,En=new Map,wn=new Map;class Ki{constructor(n,o,s){U(this,"_runtimeAst"),U(this,"_feature");var c;this._feature=o;let d=[];n=Eh(n,s);const h=Pn.get(n);if(h)[n,d]=h;else{const y=n;[n,d]=Ih(wh(n),(c=this._feature)==null?void 0:c.properties),n.includes(Bl)&&Pn.set(y,[n,d])}const p=Qn.get(n);if(p)this._runtimeAst=p;else{if(d.length!==0)for(const S of d)ne.addLiteral(S.literalName,S.literalValue);ne.addBinaryOp("=~",0),ne.addBinaryOp("!~",0);let y;try{y=ne(n)}catch(S){throw new Error(`failed to generate ast: ${S}`)}this._runtimeAst=O(this,y),Qn.set(n,this._runtimeAst)}}evaluate(){return this._runtimeAst.evaluate(this._feature)}}function Eh(t,n){if(typeof n>"u")return t;const o=JSON.stringify(Object.entries(n).sort()),s=t+o,c=wn.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 wn.set(s,h),h}function wh(t){return t.replace(Dr,Ar)}let vh$1=class{constructor(n,o,s){U(this,"_conditions"),U(this,"_runtimeConditions"),U(this,"_feature"),U(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 Bh(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 Bh{constructor(n,o){U(this,"condition"),U(this,"expression"),this.condition=n,this.expression=o}}const jh=(t,n,o)=>{const s=J0(t,Br),c=qh(t,n);return{...c,...Oh(s,t,c),type:"computedFeature",interval:o}};function Oh(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])=>Ah(c)?[s,Ec(c,n,o)]:[s,_h(c,n,o)]))}function Dh(t){return typeof t=="object"&&t&&"expression"in t}function Ah(t){return typeof t=="object"&&t&&!("expression"in t)&&!Array.isArray(t)}function _h(t,n,o){try{if(Dh(t)){const s=t.expression,c=Pc(ju(o));return typeof s>"u"?void 0:typeof s=="object"&&s.conditions?new vh$1(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 qh(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 jh(t,n)}const $h=(t,n,o)=>{if(!o)return;const s=(()=>{switch(vt.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):tb(t.loadGeometry(),n),d=Ri(o,eb(c,t,n,s)),h=new Cesium$1.ImageryLayerFeatureInfo;return h.data={layerId:o==null?void 0:o.id,featureId:c,feature:d,appearanceType:vt.types[t.type].toLowerCase()},h},tb=(t,n)=>{const o=[n.x,n.y,n.level,...t.flatMap(s=>s.map(c=>[c.x,c.y]))].join(":");return wr(o)},eb=(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,wc=new Set,yl=typeof process=="object"&&process?process:{},vc=(t,n,o,s)=>{typeof yl.emitWarning=="function"?yl.emitWarning(t,n,o,s):console.error(`[${o}] ${n}: ${t}`)};let gi=globalThis.AbortController,vn=globalThis.AbortSignal;var oc;if(typeof gi>"u"){vn=class{constructor(){U(this,"onabort"),U(this,"_onabort",[]),U(this,"reason"),U(this,"aborted",!1)}addEventListener(o,s){this._onabort.push(s)}},gi=class{constructor(){U(this,"signal",new vn),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=((oc=yl.env)==null?void 0:oc.LRU_CACHE_IGNORE_AC_WARNING)!=="1";const n=()=>{t&&(t=!1,vc("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 ib=t=>!wc.has(t),te=t=>t&&t===Math.floor(t)&&t>0&&isFinite(t),Bc=t=>te(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(U(this,"heap"),U(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=Bc(t);if(!n)return[];H(Fe,Te,!0);const o=new Fe(t,n);return H(Fe,Te,!1),o}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}};let fi=Fe;Te=new WeakMap,E(fi,Te,!1);var Ut,Rt,Yt,Jt,Ue,ot,Ct,ct,tt,Q,Zt,Wt,bt,at,Kt,ut,gt,Nt,ft,Mt,le,Vt,ei,Wl,he,Bt,ii,St,ki,jc,be,Ye,li,Ht,ee,zt,ie,ni,fl,Bm,Je,Si,Ce,Li,_,$,ci,Sl,me,je;const $l=class{constructor(t){E(this,ei),E(this,ki),E(this,Ht),E(this,zt),E(this,ni),E(this,Je),E(this,Ce),E(this,_),E(this,ci),E(this,me),E(this,Ut,void 0),E(this,Rt,void 0),E(this,Yt,void 0),E(this,Jt,void 0),E(this,Ue,void 0),U(this,"ttl"),U(this,"ttlResolution"),U(this,"ttlAutopurge"),U(this,"updateAgeOnGet"),U(this,"updateAgeOnHas"),U(this,"allowStale"),U(this,"noDisposeOnSet"),U(this,"noUpdateTTL"),U(this,"maxEntrySize"),U(this,"sizeCalculation"),U(this,"noDeleteOnFetchRejection"),U(this,"noDeleteOnStaleGet"),U(this,"allowStaleOnFetchAbort"),U(this,"allowStaleOnFetchRejection"),U(this,"ignoreFetchAbort"),E(this,ot,void 0),E(this,Ct,void 0),E(this,ct,void 0),E(this,tt,void 0),E(this,Q,void 0),E(this,Zt,void 0),E(this,Wt,void 0),E(this,bt,void 0),E(this,at,void 0),E(this,Kt,void 0),E(this,ut,void 0),E(this,gt,void 0),E(this,Nt,void 0),E(this,ft,void 0),E(this,Mt,void 0),E(this,le,void 0),E(this,Vt,void 0),E(this,he,()=>{}),E(this,Bt,()=>{}),E(this,ii,()=>{}),E(this,St,()=>!1),E(this,be,_i=>{}),E(this,Ye,(_i,zi,Sa)=>{}),E(this,li,(_i,zi,Sa,fa)=>{if(Sa||fa)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0}),U(this,Bm,"LRUCache");const{max:n=0,ttl:o,ttlResolution:s=1,ttlAutopurge:c,updateAgeOnGet:d,updateAgeOnHas:h,allowStale:p,dispose:y,disposeAfter:S,noDisposeOnSet:P,noUpdateTTL:L,maxSize:F=0,maxEntrySize:N=0,sizeCalculation:z,fetchMethod:W,noDeleteOnFetchRejection:nt,noDeleteOnStaleGet:Pe,allowStaleOnFetchRejection:se,allowStaleOnFetchAbort:mt,ignoreFetchAbort:kt}=t;if(n!==0&&!te(n))throw new TypeError("max option must be a nonnegative integer");const mn=n?Bc(n):Array;if(!mn)throw new Error("invalid max value: "+n);if(H(this,Ut,n),H(this,Rt,F),this.maxEntrySize=N||r(this,Rt),this.sizeCalculation=z,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(H(this,Ue,W),H(this,le,!!W),H(this,ct,new Map),H(this,tt,new Array(n).fill(void 0)),H(this,Q,new Array(n).fill(void 0)),H(this,Zt,new mn(n)),H(this,Wt,new mn(n)),H(this,bt,0),H(this,at,0),H(this,Kt,fi.create(n)),H(this,ot,0),H(this,Ct,0),typeof y=="function"&&H(this,Yt,y),typeof S=="function"?(H(this,Jt,S),H(this,ut,[])):(H(this,Jt,void 0),H(this,ut,void 0)),H(this,Mt,!!r(this,Yt)),H(this,Vt,!!r(this,Jt)),this.noDisposeOnSet=!!P,this.noUpdateTTL=!!L,this.noDeleteOnFetchRejection=!!nt,this.allowStaleOnFetchRejection=!!se,this.allowStaleOnFetchAbort=!!mt,this.ignoreFetchAbort=!!kt,this.maxEntrySize!==0){if(r(this,Rt)!==0&&!te(r(this,Rt)))throw new TypeError("maxSize must be a positive integer if specified");if(!te(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");K(this,ki,jc).call(this)}if(this.allowStale=!!p,this.noDeleteOnStaleGet=!!Pe,this.updateAgeOnGet=!!d,this.updateAgeOnHas=!!h,this.ttlResolution=te(s)||s===0?s:1,this.ttlAutopurge=!!c,this.ttl=o||0,this.ttl){if(!te(this.ttl))throw new TypeError("ttl must be a positive integer if specified");K(this,ei,Wl).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 _i="LRU_CACHE_UNBOUNDED";ib(_i)&&(wc.add(_i),vc("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",_i,$l))}}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,Ht,ee).call(o,n)},rindexes:n=>{var o;return K(o=t,zt,ie).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,Ht,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]])}*rentries(){for(const t of K(this,zt,ie).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,Ht,ee).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,ie).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,Ht,ee).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,ie).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,Ht,ee).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,Ht,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)}}rforEach(t,n=this){for(const o of K(this,zt,ie).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,ie).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,Ht,ee).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:S,noDisposeOnSet:P=this.noDisposeOnSet,sizeCalculation:L=this.sizeCalculation,status:F}=o;let{noUpdateTTL:N=this.noUpdateTTL}=o;const z=r(this,li).call(this,t,n,o.size||0,L);if(this.maxEntrySize&&z>this.maxEntrySize)return F&&(F.set="miss",F.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),H(this,at,W),ri(this,ot)._++,r(this,Ye).call(this,W,z,F),F&&(F.set="add"),N=!1;else{K(this,me,je).call(this,W);const nt=r(this,Q)[W];if(n!==nt){if(r(this,le)&&K(this,_,$).call(this,nt)){nt.__abortController.abort(new Error("replaced"));const{__staleWhileFetching:Pe}=nt;Pe!==void 0&&!P&&(r(this,Mt)&&((s=r(this,Yt))==null||s.call(this,Pe,t,"set")),r(this,Vt)&&((c=r(this,ut))==null||c.push([Pe,t,"set"])))}else P||(r(this,Mt)&&((d=r(this,Yt))==null||d.call(this,nt,t,"set")),r(this,Vt)&&((h=r(this,ut))==null||h.push([nt,t,"set"])));if(r(this,be).call(this,W),r(this,Ye).call(this,W,z,F),r(this,Q)[W]=n,F){F.set="replace";const Pe=nt&&K(this,_,$).call(this,nt)?nt.__staleWhileFetching:nt;Pe!==void 0&&(F.oldValue=Pe)}}else F&&(F.set="update")}if(y!==0&&!r(this,ft)&&K(this,ei,Wl).call(this),r(this,ft)&&(N||r(this,ii).call(this,W,y,S),F&&r(this,Bt).call(this,F,W)),!P&&r(this,Vt)&&r(this,ut)){const nt=r(this,ut);let Pe;for(;Pe=nt==null?void 0:nt.shift();)(p=r(this,Jt))==null||p.call(this,...Pe)}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,Bt).call(this,s,c));else return o&&r(this,he).call(this,c),s&&(s.has="hit",r(this,Bt).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:S=this.noUpdateTTL,noDeleteOnFetchRejection:P=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:L=this.allowStaleOnFetchRejection,ignoreFetchAbort:F=this.ignoreFetchAbort,allowStaleOnFetchAbort:N=this.allowStaleOnFetchAbort,context:z,forceRefresh:W=!1,status:nt,signal:Pe}=n;if(!r(this,le))return nt&&(nt.fetch="get"),this.get(t,{allowStale:o,updateAgeOnGet:s,noDeleteOnStaleGet:c,status:nt});const se={allowStale:o,updateAgeOnGet:s,noDeleteOnStaleGet:c,ttl:d,noDisposeOnSet:h,size:p,sizeCalculation:y,noUpdateTTL:S,noDeleteOnFetchRejection:P,allowStaleOnFetchRejection:L,allowStaleOnFetchAbort:N,ignoreFetchAbort:F,status:nt,signal:Pe};let mt=r(this,ct).get(t);if(mt===void 0){nt&&(nt.fetch="miss");const kt=K(this,Ce,Li).call(this,t,mt,se,z);return kt.__returned=kt}else{const kt=r(this,Q)[mt];if(K(this,_,$).call(this,kt)){const Sa=o&&kt.__staleWhileFetching!==void 0;return nt&&(nt.fetch="inflight",Sa&&(nt.returnedStale=!0)),Sa?kt.__staleWhileFetching:kt.__returned=kt}const mn=r(this,St).call(this,mt);if(!W&&!mn)return nt&&(nt.fetch="hit"),K(this,me,je).call(this,mt),s&&r(this,he).call(this,mt),nt&&r(this,Bt).call(this,nt,mt),kt;const _i=K(this,Ce,Li).call(this,t,mt,se,z),zi=_i.__staleWhileFetching!==void 0&&o;return nt&&(nt.fetch=mn?"stale":"refresh",zi&&mn&&(nt.returnedStale=!0)),zi?_i.__staleWhileFetching:_i.__returned=_i}}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,Bt).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))H(this,at,r(this,Wt)[h]);else if(h===r(this,bt))H(this,bt,r(this,Zt)[h]);else{const y=r(this,Wt)[h];r(this,Zt)[y]=r(this,Zt)[h];const S=r(this,Zt)[h];r(this,Wt)[S]=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,ie).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),H(this,bt,0),H(this,at,0),r(this,Kt).length=0,H(this,Ct,0),H(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 Rl=$l;Bm=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,le=new WeakMap,Vt=new WeakMap,ei=new WeakSet,Wl=function(){const t=new Wi(r(this,Ut)),n=new Wi(r(this,Ut));H(this,ft,t),H(this,Nt,n),H(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()}}),H(this,he,c=>{n[c]=t[c]!==0?Le.now():0}),H(this,Bt,(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},H(this,St,c=>{const d=n[c],h=t[c];return!!h&&!!d&&(o||s())-d>h})},he=new WeakMap,Bt=new WeakMap,ii=new WeakMap,St=new WeakMap,ki=new WeakSet,jc=function(){const t=new Wi(r(this,Ut));H(this,Ct,0),H(this,gt,t),H(this,be,n=>{H(this,Ct,r(this,Ct)-t[n]),t[n]=0}),H(this,li,(n,o,s,c)=>{if(K(this,_,$).call(this,o))return 0;if(!te(s))if(c){if(typeof c!="function")throw new TypeError("sizeCalculation must be a function");if(s=c(o,n),!te(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}),H(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)}H(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,Ht=new WeakSet,ee=function*({allowStale:t=this.allowStale}={}){if(r(this,ot))for(let n=r(this,at);!(!K(this,ni,fl).call(this,n)||((t||!r(this,St).call(this,n))&&(yield n),n===r(this,bt)));)n=r(this,Wt)[n]},zt=new WeakSet,ie=function*({allowStale:t=this.allowStale}={}){if(r(this,ot))for(let n=r(this,bt);!(!K(this,ni,fl).call(this,n)||((t||!r(this,St).call(this,n))&&(yield n),n===r(this,at)));)n=r(this,Zt)[n]},ni=new WeakSet,fl=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,le)&&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?(H(this,bt,H(this,at,0)),r(this,Kt).length=0):H(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=(z,W=!1)=>{const{aborted:nt}=d.signal,Pe=o.ignoreFetchAbort&&z!==void 0;if(o.status&&(nt&&!W?(o.status.fetchAborted=!0,o.status.fetchError=d.signal.reason,Pe&&(o.status.fetchAbortIgnored=!0)):o.status.fetchResolved=!0),nt&&!Pe&&!W)return P(d.signal.reason);const se=F;return r(this,Q)[n]===F&&(z===void 0?se.__staleWhileFetching?r(this,Q)[n]=se.__staleWhileFetching:this.delete(t):(o.status&&(o.status.fetchUpdated=!0),this.set(t,z,p.options))),z},S=z=>(o.status&&(o.status.fetchRejected=!0,o.status.fetchError=z),P(z)),P=z=>{const{aborted:W}=d.signal,nt=W&&o.allowStaleOnFetchAbort,Pe=nt||o.allowStaleOnFetchRejection,se=Pe||o.noDeleteOnFetchRejection,mt=F;if(r(this,Q)[n]===F&&(!se||mt.__staleWhileFetching===void 0?this.delete(t):nt||(r(this,Q)[n]=mt.__staleWhileFetching)),Pe)return o.status&&mt.__staleWhileFetching!==void 0&&(o.status.returnedStale=!0),mt.__staleWhileFetching;if(mt.__returned===mt)throw z},L=(z,W)=>{var nt;const Pe=(nt=r(this,Ue))==null?void 0:nt.call(this,t,c,p);Pe&&Pe instanceof Promise&&Pe.then(se=>z(se===void 0?void 0:se),W),d.signal.addEventListener("abort",()=>{(!o.ignoreFetchAbort||o.allowStaleOnFetchAbort)&&(z(void 0),o.allowStaleOnFetchAbort&&(z=se=>y(se,!0)))})};o.status&&(o.status.fetchDispatched=!0);const F=new Promise(L).then(y,S),N=Object.assign(F,{__abortController:d,__staleWhileFetching:c,__returned:void 0});return n===void 0?(this.set(t,N,{...p.options,status:void 0}),n=r(this,ct).get(t)):r(this,Q)[n]=N,N},_=new WeakSet,$=function(t){if(!r(this,le))return!1;const n=t;return!!n&&n instanceof Promise&&n.hasOwnProperty("__staleWhileFetching")&&n.__abortController instanceof gi},ci=new WeakSet,Sl=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)?H(this,bt,r(this,Zt)[t]):K(this,ci,Sl).call(this,r(this,Wt)[t],r(this,Zt)[t]),K(this,ci,Sl).call(this,r(this,at),t),H(this,at,t))};const Bn=new Rl({max:1e3}),lb=(t,n,o)=>{const s=JSON.stringify(t.properties),c=Bn.get(s);if(c)return c;const d=(()=>{switch(vt.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=nb("",t,n,d);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 Bn.set(s,p),p},nb=(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 cb(t){return ob(t)===Cesium$1.WindingOrder.COUNTER_CLOCKWISE}function jn(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,S=n[h].x,P=n[h].y;y>s!=P>s&&o<(S-p)*(s-y)/(P-y)+p&&(c=!c)}return c}function db(t,n){for(let o=0;o<t.length;o++)if(jn(n,t[o])){let s=!1;for(;o+1<t.length&&!cb(t[o+1]);)o++,!s&&jn(n,t[o])&&(s=!0);if(!s)return!0}return!1}function ob(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 re=256;class sb{constructor(n){U(this,"_urlTemplate"),U(this,"_parseTile"),U(this,"_tilingScheme"),U(this,"_layerNames"),U(this,"_tileWidth"),U(this,"_tileHeight"),U(this,"_pickPointRadius"),U(this,"_pickLineWidth"),U(this,"_tileCaches"),this._parseTile=ab,this._urlTemplate=n.urlTemplate,this._tileWidth=re,this._tileHeight=re,this._layerNames=n.layerNames,this._tilingScheme=new de,this._pickPointRadius=n.pickPointRadius??ub,this._pickLineWidth=n.pickLineWidth??rb}async render(n,o,s,c){const d=On(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(S=>p==null?void 0:p.layers[S]);y&&(o.strokeStyle="black",o.fillStyle="black",o.lineWidth=1,o.miterLimit=2,o.setTransform(this._tileWidth*d/re,0,0,this._tileHeight*d/re,0,0),y.forEach(S=>{if(!S)return;const P=re/S.extent;for(let L=0;L<S.length;L++){const F=S.feature(L),N=lb(F,s,h);if(!N)continue;o.fillStyle=N.fillStyle??o.fillStyle,o.strokeStyle=N.strokeStyle??o.strokeStyle,o.lineWidth=N.lineWidth??o.lineWidth,o.lineJoin=N.lineJoin??o.lineJoin;const z=F.loadGeometry();vt.types[F.type]==="Polygon"?this._renderPolygon(o,z,P,(N.lineWidth??1)>0):vt.types[F.type]==="Point"?this._renderPoint(o,z,P):vt.types[F.type]==="LineString"?this._renderLineString(o,z,P):console.error(`Unexpected geometry type: ${F.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 S=y[0];n.moveTo(S.x*s,S.y*s);for(let P=1;P<y.length;P++)S=y[P],n.lineTo(S.x*s,S.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=On(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],S=function(W,nt,Pe,se,mt){const kt=new Cesium$1.Cartesian2;Cesium$1.Cartesian2.subtract(W,new Cesium$1.Cartesian2(nt[0],Pe[0]),kt);const mn=new Cesium$1.Cartesian2((se[1]-se[0])/(nt[1]-nt[0]),(mt[1]-mt[0])/(Pe[1]-Pe[0]));return Cesium$1.Cartesian2.add(Cesium$1.Cartesian2.multiplyComponents(kt,mn,new Cesium$1.Cartesian2),new Cesium$1.Cartesian2(se[0],mt[0]),new Cesium$1.Cartesian2)},P=[],L=[0,c.extent-1],F=(L[1]-L[0])/this._tileWidth,N=S(Cesium$1.Cartesian2.fromCartesian3(this._tilingScheme.projection.project(new Cesium$1.Cartographic(o,s))),p,y,L,L),z=new wi(N.x,N.y);for(let W=0;W<c.length;W++){const nt=c.feature(W);if(vt.types[nt.type]==="Polygon"&&db(nt.loadGeometry(),z)||vt.types[nt.type]==="LineString"&&Pr(nt.loadGeometry(),z,Dn(this._pickLineWidth,nt,n)*F)||vt.types[nt.type]==="Point"&&Qr(nt.loadGeometry(),z,Dn(this._pickPointRadius,nt,n)*F)){const Pe=$h(nt,n,d);Pe&&P.push(Pe)}}return P}async _cachedTile(n){var o,s;if(n){if((o=this._tileCaches)!=null&&o.has(n))return this._tileCaches.get(n);try{const c=mb(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 ab=async t=>{try{const n=await bb(t);return n?hb(n):void 0}catch{return}},ub=5,rb=5,hb=t=>new yr(new Rr(t)),bb=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}},mb=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 S;const P=(n=y.bbox)==null?void 0:n.call(y),L={...y,id:y.id,loadGeometry:()=>(S||(S=y.loadGeometry()),S),bbox:P?()=>P:void 0,toGeoJSON:y.toGeoJSON};d.push(L)}o[s]={...h,feature:p=>d[p]}}return{layers:o}},On=(t,n)=>decodeURIComponent(t).replace("{z}",String(n.level)).replace("{x}",String(n.x)).replace("{y}",String(n.y));function Dn(t,n,o){return typeof t=="number"?t:t(n,o)}var Oc={},xt={},Xe={};Object.defineProperty(Xe,"__esModule",{value:!0}),Xe.DefaultSerializer=Xe.extendSerializer=void 0;function Zb(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=Zb;const An={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}}},Vb=t=>t&&typeof t=="object"&&"__error_marker"in t&&t.__error_marker==="$$error";Xe.DefaultSerializer={deserialize(t){return Vb(t)?An.deserialize(t):t},serialize(t){return t instanceof Error?An.serialize(t):t}},Object.defineProperty(xt,"__esModule",{value:!0}),xt.serialize=xt.deserialize=xt.registerSerializer=void 0;const Dc=Xe;let Ni=Dc.DefaultSerializer;function Xb(t){Ni=Dc.extendSerializer(Ni,t)}xt.registerSerializer=Xb;function Gb(t){return Ni.deserialize(t)}xt.deserialize=Gb;function pb(t){return Ni.serialize(t)}xt.serialize=pb;var Ac={},Ot={},Ne={};Object.defineProperty(Ne,"__esModule",{value:!0}),Ne.getBundleURL=Ne.getBaseURL=void 0;let nl$2;function yb(){return nl$2||(nl$2=Rb()),nl$2}Ne.getBundleURL=yb;function Rb(){try{throw new Error}catch(t){const n=(""+t.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\/\/[^)\n]+/g);if(n)return _c(n[0])}return"/"}function _c(t){return(""+t).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\/\/.+)?\/[^/]+(?:\?.*)?$/,"$1")+"/"}Ne.getBaseURL=_c,Object.defineProperty(Ot,"__esModule",{value:!0}),Ot.isWorkerRuntime=Ot.getWorkerImplementation=Ot.defaultPoolSize=void 0;const _n=Ne;Ot.defaultPoolSize=typeof navigator<"u"&&navigator.hardwareConcurrency?navigator.hardwareConcurrency:4;const qn=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 Wb(){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"&&!qn(s)&&_n.getBundleURL().match(/^file:\/\//i)&&(s=new URL(s,_n.getBundleURL().replace(/\/[^\/]+$/,"/")),(!((d=c==null?void 0:c.CORSWorkaround)!==null&&d!==void 0)||d)&&(s=$n(`importScripts(${JSON.stringify(s)});`))),typeof s=="string"&&qn(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 cl;function fb(){return cl||(cl=Wb()),cl}Ot.getWorkerImplementation=fb;function Sb(){const t=typeof self<"u"&&typeof Window<"u"&&self instanceof Window;return!!(typeof self<"u"&&self.postMessage&&!t)}Ot.isWorkerRuntime=Sb;var qc={},Me={},Lb={get exports(){return Me},set exports(t){Me=t}},dl,tc;function Fb(){if(tc)return dl;tc=1;var t=1e3,n=t*60,o=n*60,s=o*24,c=s*7,d=s*365.25;dl=function(P,L){L=L||{};var F=typeof P;if(F==="string"&&P.length>0)return h(P);if(F==="number"&&isFinite(P))return L.long?y(P):p(P);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(P))};function h(P){if(P=String(P),!(P.length>100)){var L=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(P);if(L){var F=parseFloat(L[1]),N=(L[2]||"ms").toLowerCase();switch(N){case"years":case"year":case"yrs":case"yr":case"y":return F*d;case"weeks":case"week":case"w":return F*c;case"days":case"day":case"d":return F*s;case"hours":case"hour":case"hrs":case"hr":case"h":return F*o;case"minutes":case"minute":case"mins":case"min":case"m":return F*n;case"seconds":case"second":case"secs":case"sec":case"s":return F*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return F;default:return}}}}function p(P){var L=Math.abs(P);return L>=s?Math.round(P/s)+"d":L>=o?Math.round(P/o)+"h":L>=n?Math.round(P/n)+"m":L>=t?Math.round(P/t)+"s":P+"ms"}function y(P){var L=Math.abs(P);return L>=s?S(P,L,s,"day"):L>=o?S(P,L,o,"hour"):L>=n?S(P,L,n,"minute"):L>=t?S(P,L,t,"second"):P+" ms"}function S(P,L,F,N){var z=L>=F*1.5;return Math.round(P/F)+" "+N+(z?"s":"")}return dl}function Ib(t){o.debug=o,o.default=o,o.coerce=y,o.disable=d,o.enable=c,o.enabled=h,o.humanize=Fb(),o.destroy=S,Object.keys(t).forEach(P=>{o[P]=t[P]}),o.names=[],o.skips=[],o.formatters={};function n(P){let L=0;for(let F=0;F<P.length;F++)L=(L<<5)-L+P.charCodeAt(F),L|=0;return o.colors[Math.abs(L)%o.colors.length]}o.selectColor=n;function o(P){let L,F=null,N,z;function W(...nt){if(!W.enabled)return;const Pe=W,se=Number(new Date),mt=se-(L||se);Pe.diff=mt,Pe.prev=L,Pe.curr=se,L=se,nt[0]=o.coerce(nt[0]),typeof nt[0]!="string"&&nt.unshift("%O");let kt=0;nt[0]=nt[0].replace(/%([a-zA-Z%])/g,(mn,_i)=>{if(mn==="%%")return"%";kt++;const zi=o.formatters[_i];if(typeof zi=="function"){const Sa=nt[kt];mn=zi.call(Pe,Sa),nt.splice(kt,1),kt--}return mn}),o.formatArgs.call(Pe,nt),(Pe.log||o.log).apply(Pe,nt)}return W.namespace=P,W.useColors=o.useColors(),W.color=o.selectColor(P),W.extend=s,W.destroy=o.destroy,Object.defineProperty(W,"enabled",{enumerable:!0,configurable:!1,get:()=>F!==null?F:(N!==o.namespaces&&(N=o.namespaces,z=o.enabled(P)),z),set:nt=>{F=nt}}),typeof o.init=="function"&&o.init(W),W}function s(P,L){const F=o(this.namespace+(typeof L>"u"?":":L)+P);return F.log=this.log,F}function c(P){o.save(P),o.namespaces=P,o.names=[],o.skips=[];let L;const F=(typeof P=="string"?P:"").split(/[\s,]+/),N=F.length;for(L=0;L<N;L++)F[L]&&(P=F[L].replace(/\*/g,".*?"),P[0]==="-"?o.skips.push(new RegExp("^"+P.slice(1)+"$")):o.names.push(new RegExp("^"+P+"$")))}function d(){const P=[...o.names.map(p),...o.skips.map(p).map(L=>"-"+L)].join(",");return o.enable(""),P}function h(P){if(P[P.length-1]==="*")return!0;let L,F;for(L=0,F=o.skips.length;L<F;L++)if(o.skips[L].test(P))return!1;for(L=0,F=o.names.length;L<F;L++)if(o.names[L].test(P))return!0;return!1}function p(P){return P.toString().substring(2,P.toString().length-2).replace(/\.\*\?$/,"*")}function y(P){return P instanceof Error?P.stack||P.message:P}function S(){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 xb=Ib;(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 S="color: "+this.color;y.splice(1,0,S,"color: inherit");let P=0,L=0;y[0].replace(/%[a-zA-Z%]/g,F=>{F!=="%%"&&(P++,F==="%c"&&(L=P))}),y.splice(L,0,S)}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=xb(n);const{formatters:p}=t.exports;p.j=function(y){try{return JSON.stringify(y)}catch(S){return"[UnexpectedJSONParseError]: "+S.message}}})(Lb,Me);var Tb=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(P){try{S(s.next(P))}catch(L){h(L)}}function y(P){try{S(s.throw(P))}catch(L){h(L)}}function S(P){P.done?d(P.value):c(P.value).then(p,y)}S((s=s.apply(t,n||[])).next())})};class vi{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(()=>Tb(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 $c=()=>typeof Symbol=="function",di=t=>$c()&&!!Symbol[t],jl=t=>di(t)?Symbol[t]:"@@"+t;di("asyncIterator")||(Symbol.asyncIterator=Symbol.asyncIterator||Symbol.for("Symbol.asyncIterator"));const Ub=jl("iterator"),Ll=jl("observable"),td=jl("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[td],n===null&&(n=void 0)),n!==void 0?n:It}function Yb(t){return t instanceof It}function ke(t){ke.log?ke.log(t):setTimeout(()=>{throw t},0)}function Fi(t){Promise.resolve().then(()=>{try{t()}catch(n){ke(n)}})}function ed(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){ke(o)}}function Fl(t){t._observer=void 0,t._queue=void 0,t._state="closed"}function Jb(t){const n=t._queue;if(n){t._queue=void 0,t._state="ready";for(const o of n)if(id$2(t,o.type,o.value),t._state==="closed")break}}function id$2(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(Fl(t),c)c.call(s,o);else throw o;break;case"complete":Fl(t),c&&c.call(s);break}}catch(c){ke(c)}t._state==="closed"?ed(t):t._state==="running"&&(t._state="ready")}function ol(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(()=>Jb(t));return}id$2(t,n,o)}}class Cb{constructor(n,o){this._cleanup=void 0,this._observer=n,this._queue=void 0,this._state="initializing";const s=new Kb(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"&&(Fl(this),ed(this))}}class Kb{constructor(n){this._subscription=n}get closed(){return this._subscription._state==="closed"}next(n){ol(this._subscription,"next",n)}error(n){ol(this._subscription,"error",n)}complete(){ol(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 Cb(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 S=!d;if(d=!0,!S||c)try{h=n(h,y)}catch(P){return p.error(P)}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(P){return s.error(P)}else y=p;const S=o.from(y).subscribe({next(P){s.next(P)},error(P){s.error(P)},complete(){const P=c.indexOf(S);P>=0&&c.splice(P,1),h()}});c.push(S)},error(p){s.error(p)},complete(){h()}});function h(){d.closed&&c.length===0&&s.complete()}return()=>{c.forEach(p=>p.unsubscribe()),d.unsubscribe()}})}[Ll](){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,Ll);if(s){const c=s.call(n);if(Object(c)!==c)throw new TypeError(c+" is not an object");return Yb(c)&&c.constructor===o?c:new o(d=>c.subscribe(d))}if(di("iterator")){const c=Mi(n,Ub);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[td](){return this}}$c()&&Object.defineProperty(It,Symbol("extensions"),{value:{symbol:Ll,hostReportError:ke},configurable:!0});const ye=It;function Re(t){typeof t=="function"?t():t&&typeof t.unsubscribe=="function"&&t.unsubscribe()}var gb=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(P){try{S(s.next(P))}catch(L){h(L)}}function y(P){try{S(s.throw(P))}catch(L){h(L)}}function S(P){P.done?d(P.value):c(P.value).then(p,y)}S((s=s.apply(t,n||[])).next())})};function Nb(t){return n=>new ye(o=>{const s=new vi(o),c=n.subscribe({complete(){s.complete()},error(d){s.error(d)},next(d){s.schedule(h=>gb(this,void 0,void 0,function*(){(yield t(d))&&h(d)}))}});return()=>Re(c)})}function Mb(t){return t&&di("asyncIterator")&&t[Symbol.asyncIterator]}function kb(t){return t&&di("iterator")&&t[Symbol.iterator]}var Hb=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(P){try{S(s.next(P))}catch(L){h(L)}}function y(P){try{S(s.throw(P))}catch(L){h(L)}}function S(P){P.done?d(P.value):c(P.value).then(p,y)}S((s=s.apply(t,n||[])).next())})},zb=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(S){d({value:S,done:p})},h)}};function Qb(t){return n=>new ye(o=>{const s=new vi(o),c=n.subscribe({complete(){s.complete()},error(d){s.error(d)},next(d){s.schedule(h=>Hb(this,void 0,void 0,function*(){var p,y;const S=yield t(d);if(kb(S)||Mb(S))try{for(var P=zb(S),L;L=yield P.next(),!L.done;){const F=L.value;h(F)}}catch(F){p={error:F}}finally{try{L&&!L.done&&(y=P.return)&&(yield y.call(P))}finally{if(p)throw p.error}}else S.map(F=>h(F))}))}});return()=>Re(c)})}function Pb(t){return new It(n=>{let o=0;const s=setInterval(()=>{n.next(o++)},t);return()=>clearInterval(s)})}var Eb=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(P){try{S(s.next(P))}catch(L){h(L)}}function y(P){try{S(s.throw(P))}catch(L){h(L)}}function S(P){P.done?d(P.value):c(P.value).then(p,y)}S((s=s.apply(t,n||[])).next())})};function wb(t){return n=>new ye(o=>{const s=new vi(o),c=n.subscribe({complete(){s.complete()},error(d){s.error(d)},next(d){s.schedule(h=>Eb(this,void 0,void 0,function*(){const p=yield t(d);h(p)}))}});return()=>Re(c)})}function vb(...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 Bb 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 ld=Bb;function jb(t){const n=new ld;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 Ob=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(P){try{S(s.next(P))}catch(L){h(L)}}function y(P){try{S(s.throw(P))}catch(L){h(L)}}function S(P){P.done?d(P.value):c(P.value).then(p,y)}S((s=s.apply(t,n||[])).next())})};function Db(t,n){return o=>new ye(s=>{let c,d=0;const h=new vi(s),p=o.subscribe({complete(){h.complete()},error(y){h.error(y)},next(y){h.schedule(S=>Ob(this,void 0,void 0,function*(){c=yield t(d===0?typeof n>"u"?y:n:c,y,d++),S(c)}))}});return()=>Re(p)})}const Ab=Object.freeze(Object.defineProperty({__proto__:null,Observable:ye,Subject:ld,filter:Nb,flatMap:Qb,interval:Pb,map:wb,merge:vb,multicast:jb,scan:Db,unsubscribe:Re},Symbol.toStringTag,{value:"Module"})),Bi=g0(Ab);var ji={};Object.defineProperty(ji,"__esModule",{value:!0}),ji.allSettled=void 0;function _b(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)}}))}ji.allSettled=_b;var nd={};(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={}))})(nd);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 sl=pt;function ec(t){throw Error(t)}oi.Thread={errors(t){return t[sl.$errors]||ec("Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.")},events(t){return t[sl.$events]||ec("Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.")},terminate(t){return t[sl.$terminate]()}},function(t){var n=rt&&rt.__awaiter||function(Pe,se,mt,kt){function mn(_i){return _i instanceof mt?_i:new mt(function(zi){zi(_i)})}return new(mt||(mt=Promise))(function(_i,zi){function Sa(Ra){try{La(kt.next(Ra))}catch(ma){zi(ma)}}function fa(Ra){try{La(kt.throw(Ra))}catch(ma){zi(ma)}}function La(Ra){Ra.done?_i(Ra.value):mn(Ra.value).then(Sa,fa)}La((kt=kt.apply(Pe,se||[])).next())})},o=rt&&rt.__importDefault||function(Pe){return Pe&&Pe.__esModule?Pe:{default:Pe}};Object.defineProperty(t,"__esModule",{value:!0}),t.Pool=t.Thread=t.PoolEventType=void 0;const s=o(Me),c=Bi,d=ji,h=Ot,p=nd;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 S=1;function P(Pe){const se=[];for(let mt=0;mt<Pe;mt++)se.push(mt);return se}function L(Pe){return new Promise(se=>setTimeout(se,Pe))}function F(Pe,se){return Pe.reduce((mt,kt)=>[...mt,...se(kt)],[])}function N(Pe){return Pe.replace(/\W/g," ").trim().replace(/\s+/g,"-")}function z(Pe,se){return P(se).map(()=>({init:Pe(),runningTasks:[]}))}class W{constructor(se,mt){this.eventSubject=new c.Subject,this.initErrors=[],this.isClosing=!1,this.nextTaskID=1,this.taskQueue=[];const kt=typeof mt=="number"?{size:mt}:mt||{},{size:mn=h.defaultPoolSize}=kt;this.debug=s.default(`threads:pool:${N(kt.name||String(S++))}`),this.options=kt,this.workers=z(se,mn),this.eventObservable=c.multicast(c.Observable.from(this.eventSubject)),Promise.all(this.workers.map(_i=>_i.init)).then(()=>this.eventSubject.next({type:p.PoolEventType.initialized,size:this.workers.length}),_i=>{this.debug("Error while initializing pool worker:",_i),this.eventSubject.error(_i),this.initErrors.push(_i)})}findIdlingWorker(){const{concurrency:se=1}=this.options;return this.workers.find(mt=>mt.runningTasks.length<se)}runPoolTask(se,mt){return n(this,void 0,void 0,function*(){const kt=this.workers.indexOf(se)+1;this.debug(`Running task #${mt.id} on worker #${kt}...`),this.eventSubject.next({type:p.PoolEventType.taskStart,taskID:mt.id,workerID:kt});try{const mn=yield mt.run(yield se.init);this.debug(`Task #${mt.id} completed successfully`),this.eventSubject.next({type:p.PoolEventType.taskCompleted,returnValue:mn,taskID:mt.id,workerID:kt})}catch(mn){this.debug(`Task #${mt.id} failed`),this.eventSubject.next({type:p.PoolEventType.taskFailed,taskID:mt.id,error:mn,workerID:kt})}})}run(se,mt){return n(this,void 0,void 0,function*(){const kt=n(this,void 0,void 0,function*(){const mn=()=>{se.runningTasks=se.runningTasks.filter(_i=>_i!==kt)};yield L(0);try{yield this.runPoolTask(se,mt)}finally{mn(),this.isClosing||this.scheduleWork()}});se.runningTasks.push(kt)})}scheduleWork(){this.debug("Attempt de-queueing a task in order to run it...");const se=this.findIdlingWorker();if(!se)return;const mt=this.taskQueue.shift();if(!mt){this.debug("Task queue is empty"),this.eventSubject.next({type:p.PoolEventType.taskQueueDrained});return}this.run(se,mt)}taskCompletion(se){return new Promise((mt,kt)=>{const mn=this.events().subscribe(_i=>{_i.type===p.PoolEventType.taskCompleted&&_i.taskID===se?(mn.unsubscribe(),mt(_i.returnValue)):_i.type===p.PoolEventType.taskFailed&&_i.taskID===se?(mn.unsubscribe(),kt(_i.error)):_i.type===p.PoolEventType.terminated&&(mn.unsubscribe(),kt(Error("Pool has been terminated before task was run.")))})})}settled(se=!1){return n(this,void 0,void 0,function*(){const mt=()=>F(this.workers,_i=>_i.runningTasks),kt=[],mn=this.eventObservable.subscribe(_i=>{_i.type===p.PoolEventType.taskFailed&&kt.push(_i.error)});return this.initErrors.length>0?Promise.reject(this.initErrors[0]):se&&this.taskQueue.length===0?(yield d.allSettled(mt()),kt):(yield new Promise((_i,zi)=>{const Sa=this.eventObservable.subscribe({next(fa){fa.type===p.PoolEventType.taskQueueDrained&&(Sa.unsubscribe(),_i(void 0))},error:zi})}),yield d.allSettled(mt()),mn.unsubscribe(),kt)})}completed(se=!1){return n(this,void 0,void 0,function*(){const mt=this.settled(se),kt=new Promise((_i,zi)=>{const Sa=this.eventObservable.subscribe({next(fa){fa.type===p.PoolEventType.taskQueueDrained?(Sa.unsubscribe(),_i(mt)):fa.type===p.PoolEventType.taskFailed&&(Sa.unsubscribe(),zi(fa.error))},error:zi})}),mn=yield Promise.race([mt,kt]);if(mn.length>0)throw mn[0]})}events(){return this.eventObservable}queue(se){const{maxQueuedJobs:mt=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 kt=this.nextTaskID++,mn=this.taskCompletion(kt);mn.catch(zi=>{this.debug(`Task #${kt} errored:`,zi)});const _i={id:kt,run:se,cancel:()=>{this.taskQueue.indexOf(_i)!==-1&&(this.taskQueue=this.taskQueue.filter(zi=>zi!==_i),this.eventSubject.next({type:p.PoolEventType.taskCanceled,taskID:_i.id}))},then:mn.then.bind(mn)};if(this.taskQueue.length>=mt)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 #${_i.id}...`),this.taskQueue.push(_i),this.eventSubject.next({type:p.PoolEventType.taskQueued,taskID:_i.id}),this.scheduleWork(),_i}terminate(se){return n(this,void 0,void 0,function*(){this.isClosing=!0,se||(yield this.completed(!0)),this.eventSubject.next({type:p.PoolEventType.terminated,remainingQueue:[...this.taskQueue]}),this.eventSubject.complete(),yield Promise.all(this.workers.map(mt=>n(this,void 0,void 0,function*(){return y.Thread.terminate(yield mt.init)})))})}}W.EventType=p.PoolEventType;function nt(Pe,se){return new W(Pe,se)}nt.EventType=p.PoolEventType,t.Pool=nt}(qc);var Oi={},Di={};Object.defineProperty(Di,"__esModule",{value:!0}),Di.createPromiseWithResolver=void 0;const qb=()=>{};function $b(){let t=!1,n,o=qb;return[new Promise(s=>{t?s(n):o=s}),s=>{t=!0,n=s,o(n)}]}Di.createPromiseWithResolver=$b;var cd={};(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={}))})(cd);var He={},Ai={};Object.defineProperty(Ai,"__esModule",{value:!0}),Ai.ObservablePromise=void 0;const tm=Bi,em=()=>{},im=t=>t,ic=t=>Promise.resolve().then(t);function lm(t){throw t}function nm(t){return t&&typeof t.then=="function"}class Ol extends tm.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)ic(()=>o(n))}onCompletion(){this.state="fulfilled";for(const n of this.fulfillmentCallbacks)ic(()=>n(this.firstValue))}then(n,o){const s=n||im,c=o||lm;let d=!1;return new Promise((h,p)=>{const y=P=>{if(!d){d=!0;try{h(c(P))}catch(L){p(L)}}},S=P=>{try{h(s(P))}catch(L){y(L)}};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(S),this.rejectionCallbacks.push(y)})}catch(n){return this.then(void 0,n)}finally(n){const o=n||em;return this.then(s=>(o(),s),()=>o())}static from(n){return nm(n)?new Ol(o=>{const s=d=>{o.next(d),o.complete()},c=d=>{o.error(d)};n.then(s,c)}):super.from(n)}}Ai.ObservablePromise=Ol;var Dt={};Object.defineProperty(Dt,"__esModule",{value:!0}),Dt.Transfer=Dt.isTransferDescriptor=void 0;const dd=pt;function cm(t){return!(!t||typeof t!="object")}function dm(t){return t&&typeof t=="object"&&t[dd.$transferable]}Dt.isTransferDescriptor=dm;function om(t,n){if(!n){if(!cm(t))throw Error();n=[t]}return{[dd.$transferable]:!0,send:t,transferables:n}}Dt.Transfer=om;var Dl={};(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={}))})(Dl);var sm=rt&&rt.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(He,"__esModule",{value:!0}),He.createProxyModule=He.createProxyFunction=void 0;const am=sm(Me),od=Bi,De=xt,lc=Ai,um=Dt,si=Dl,sd=am.default("threads:master:messages");let rm=1;const hm=t=>Array.from(new Set(t)),bm=t=>t&&t.type===si.WorkerMessageType.error,mm=t=>t&&t.type===si.WorkerMessageType.result,Zm=t=>t&&t.type===si.WorkerMessageType.running;function Vm(t,n){return new od.Observable(o=>{let s;const c=d=>{if(sd("Message from worker:",d.data),!(!d.data||d.data.uid!==n)){if(Zm(d.data))s=d.data.resultType;else if(mm(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(bm(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 Xm(t){if(t.length===0)return{args:[],transferables:[]};const n=[],o=[];for(const s of t)um.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:hm(o)}}function ad(t,n){return(...o)=>{const s=rm++,{args:c,transferables:d}=Xm(o),h={type:si.MasterMessageType.run,uid:s,method:n,args:c};sd("Sending command to run function to worker:",h);try{t.postMessage(h,d)}catch(p){return lc.ObservablePromise.from(Promise.reject(p))}return lc.ObservablePromise.from(od.multicast(Vm(t,s)))}}He.createProxyFunction=ad;function Gm(t,n){const o={};for(const s of n)o[s]=ad(t,s);return o}He.createProxyModule=Gm;var Al=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(P){try{S(s.next(P))}catch(L){h(L)}}function y(P){try{S(s.throw(P))}catch(L){h(L)}}function S(P){P.done?d(P.value):c(P.value).then(p,y)}S((s=s.apply(t,n||[])).next())})},pm=rt&&rt.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Oi,"__esModule",{value:!0}),Oi.spawn=void 0;const _l=pm(Me),ym=Bi,Rm=xt,Wm=Di,Xi=pt,Ii=cd,nc=He,fm=_l.default("threads:master:messages"),Sm=_l.default("threads:master:spawn"),ud=_l.default("threads:master:thread-utils"),Lm=t=>t&&t.type==="init",Fm=t=>t&&t.type==="uncaughtError",Im=typeof process<"u"&&process.env.THREADS_WORKER_INIT_TIMEOUT?Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT,10):1e4;function xm(t,n,o){return Al(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 Tm(t){return new Promise((n,o)=>{const s=c=>{fm("Message from worker before finishing initialization:",c.data),Lm(c.data)?(t.removeEventListener("message",s),n(c.data)):Fm(c.data)&&(t.removeEventListener("message",s),o(Rm.deserialize(c.data.error)))};t.addEventListener("message",s)})}function Um(t,n){return new ym.Observable(o=>{const s=d=>{const h={type:Ii.WorkerEventType.message,data:d.data};o.next(h)},c=d=>{ud("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 Ym(t){const[n,o]=Wm.createPromiseWithResolver();return{terminate:()=>Al(this,void 0,void 0,function*(){ud("Terminating worker"),yield t.terminate(),o()}),termination:n}}function cc(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 Jm(t,n){return Al(this,void 0,void 0,function*(){Sm("Initializing new thread");const o=n&&n.timeout?n.timeout:Im,s=(yield xm(Tm(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}=Ym(t),h=Um(t,c);if(s.type==="function"){const p=nc.createProxyFunction(t);return cc(p,t,h,d)}else if(s.type==="module"){const p=nc.createProxyModule(t,s.methods);return cc(p,t,h,d)}else{const p=s.type;throw Error(`Worker init message states unexpected type of expose(): ${p}`)}})}Oi.spawn=Jm,function(t){Object.defineProperty(t,"__esModule",{value:!0}),t.Worker=t.BlobWorker=t.isWorkerRuntime=t.Thread=t.spawn=t.Pool=void 0;const n=Ot;Object.defineProperty(t,"isWorkerRuntime",{enumerable:!0,get:function(){return n.isWorkerRuntime}});var o=qc;Object.defineProperty(t,"Pool",{enumerable:!0,get:function(){return o.Pool}});var s=Oi;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}(Ac);var rd={},Cm=t=>t?typeof Symbol.observable=="symbol"&&typeof t[Symbol.observable]=="function"?t===t[Symbol.observable]():typeof t["@@observable"]=="function"?t===t["@@observable"]():!1:!1,ql={};Object.defineProperty(ql,"__esModule",{value:!0});const Km=function(){const t=typeof self<"u"&&typeof Window<"u"&&self instanceof Window;return!!(typeof self<"u"&&self.postMessage&&!t)},gm=function(t,n){self.postMessage(t,n)},Nm=function(t){const n=s=>{t(s.data)},o=()=>{self.removeEventListener("message",n)};return self.addEventListener("message",n),o};ql.default={isWorkerRuntime:Km,postMessageToMaster:gm,subscribeToMasterMessages:Nm},function(t){var n=rt&&rt.__awaiter||function(fa,La,Ra,ma){function yt(lt){return lt instanceof Ra?lt:new Ra(function(pi){pi(lt)})}return new(Ra||(Ra=Promise))(function(lt,pi){function ba(Xs){try{ms(ma.next(Xs))}catch(Nl){pi(Nl)}}function Sc(Xs){try{ms(ma.throw(Xs))}catch(Nl){pi(Nl)}}function ms(Xs){Xs.done?lt(Xs.value):yt(Xs.value).then(ba,Sc)}ms((ma=ma.apply(fa,La||[])).next())})},o=rt&&rt.__importDefault||function(fa){return fa&&fa.__esModule?fa:{default:fa}};Object.defineProperty(t,"__esModule",{value:!0}),t.expose=t.isWorkerRuntime=t.Transfer=t.registerSerializer=void 0;const s=o(Cm),c=xt,d=Dt,h=Dl,p=o(ql);var y=xt;Object.defineProperty(t,"registerSerializer",{enumerable:!0,get:function(){return y.registerSerializer}});var S=Dt;Object.defineProperty(t,"Transfer",{enumerable:!0,get:function(){return S.Transfer}}),t.isWorkerRuntime=p.default.isWorkerRuntime;let P=!1;const L=new Map,F=fa=>fa&&fa.type===h.MasterMessageType.cancel,N=fa=>fa&&fa.type===h.MasterMessageType.run,z=fa=>s.default(fa)||W(fa);function W(fa){return fa&&typeof fa=="object"&&typeof fa.subscribe=="function"}function nt(fa){return d.isTransferDescriptor(fa)?{payload:fa.send,transferables:fa.transferables}:{payload:fa,transferables:void 0}}function Pe(){const fa={type:h.WorkerMessageType.init,exposed:{type:"function"}};p.default.postMessageToMaster(fa)}function se(fa){const La={type:h.WorkerMessageType.init,exposed:{type:"module",methods:fa}};p.default.postMessageToMaster(La)}function mt(fa,La){const{payload:Ra,transferables:ma}=nt(La),yt={type:h.WorkerMessageType.error,uid:fa,error:c.serialize(Ra)};p.default.postMessageToMaster(yt,ma)}function kt(fa,La,Ra){const{payload:ma,transferables:yt}=nt(Ra),lt={type:h.WorkerMessageType.result,uid:fa,complete:La?!0:void 0,payload:ma};p.default.postMessageToMaster(lt,yt)}function mn(fa,La){const Ra={type:h.WorkerMessageType.running,uid:fa,resultType:La};p.default.postMessageToMaster(Ra)}function _i(fa){try{const La={type:h.WorkerMessageType.uncaughtError,error:c.serialize(fa)};p.default.postMessageToMaster(La)}catch(La){console.error(`Not reporting uncaught error back to master thread as it occured while reporting an uncaught error already.
6101
6101
  Latest error:`,La,`
6102
- Original error:`,fa)}}function zi(fa,La,Ra){return n(this,void 0,void 0,function*(){let ma;try{ma=La(...Ra)}catch(lt){return mt(fa,lt)}const yt=z(ma)?"observable":"promise";if(mn(fa,yt),z(ma)){const lt=ma.subscribe(pi=>kt(fa,!1,c.serialize(pi)),pi=>{mt(fa,c.serialize(pi)),L.delete(fa)},()=>{kt(fa,!0),L.delete(fa)});L.set(fa,lt)}else try{const lt=yield ma;kt(fa,!0,c.serialize(lt))}catch(lt){mt(fa,c.serialize(lt))}})}function Sa(fa){if(!p.default.isWorkerRuntime())throw Error("expose() called in the master thread.");if(P)throw Error("expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.");if(P=!0,typeof fa=="function")p.default.subscribeToMasterMessages(La=>{N(La)&&!La.method&&zi(La.uid,fa,La.args.map(c.deserialize))}),Pe();else if(typeof fa=="object"&&fa){p.default.subscribeToMasterMessages(Ra=>{N(Ra)&&Ra.method&&zi(Ra.uid,fa[Ra.method],Ra.args.map(c.deserialize))});const La=Object.keys(fa).filter(Ra=>typeof fa[Ra]=="function");se(La)}else throw Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${fa}`);p.default.subscribeToMasterMessages(La=>{if(F(La)){const Ra=La.uid,ma=L.get(Ra);ma&&(ma.unsubscribe(),L.delete(Ra))}})}t.expose=Sa,typeof self<"u"&&typeof self.addEventListener=="function"&&p.default.isWorkerRuntime()&&(self.addEventListener("error",fa=>{setTimeout(()=>_i(fa.error||fa),250)}),self.addEventListener("unhandledrejection",fa=>{const La=fa.reason;La&&typeof La.message=="string"&&setTimeout(()=>_i(La),250)})),typeof process<"u"&&typeof process.on=="function"&&p.default.isWorkerRuntime()&&(process.on("uncaughtException",fa=>{setTimeout(()=>_i(fa),250)}),process.on("unhandledRejection",fa=>{fa&&typeof fa.message=="string"&&setTimeout(()=>_i(fa),250)}))}(rd),function(t){var n=rt&&rt.__createBinding||(Object.create?function(p,y,S,P){P===void 0&&(P=S),Object.defineProperty(p,P,{enumerable:!0,get:function(){return y[S]}})}:function(p,y,S,P){P===void 0&&(P=S),p[P]=y[S]}),o=rt&&rt.__exportStar||function(p,y){for(var S in p)S!=="default"&&!Object.prototype.hasOwnProperty.call(y,S)&&n(y,p,S)};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(Ac,t);var c=rd;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=Dt;Object.defineProperty(t,"Transfer",{enumerable:!0,get:function(){return h.Transfer}})}(Oc);const oe=K0(Oc);oe.registerSerializer;const Mm=oe.spawn;oe.BlobWorker,oe.DefaultSerializer;const km=oe.Pool;oe.Thread;const Hm=oe.Transfer;oe.Worker;const hd="dmFyIHcwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgSTA9KFgsWSxydCk9PlkgaW4gWD93MChYLFkse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnJ0fSk6WFtZXT1ydDt2YXIgQz0oWCxZLHJ0KT0+KEkwKFgsdHlwZW9mIFkhPSJzeW1ib2wiP1krIiI6WSxydCkscnQpLHVyPShYLFkscnQpPT57aWYoIVkuaGFzKFgpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrcnQpfTt2YXIgYz0oWCxZLHJ0KT0+KHVyKFgsWSwicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxydD9ydC5jYWxsKFgpOlkuZ2V0KFgpKSxVPShYLFkscnQpPT57aWYoWS5oYXMoWCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7WSBpbnN0YW5jZW9mIFdlYWtTZXQ/WS5hZGQoWCk6WS5zZXQoWCxydCl9LHY9KFgsWSxydCxFZSk9Pih1cihYLFksIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxFZT9FZS5jYWxsKFgscnQpOlkuc2V0KFgscnQpLHJ0KSxBbj0oWCxZLHJ0LEVlKT0+KHtzZXQgXyh3dCl7dihYLFksd3QscnQpfSxnZXQgXygpe3JldHVybiBjKFgsWSxFZSl9fSksdz0oWCxZLHJ0KT0+KHVyKFgsWSwiYWNjZXNzIHByaXZhdGUgbWV0aG9kIikscnQpOyhmdW5jdGlvbigpe3ZhciBraSxGZSxJdCxSdCxOdCxNdCxJZSx1dCxDdCxhdCx0dCxMLF90LHh0LEV0LGh0LHZ0LGZ0LER0LEx0LE90LFB0LHRlLHB0LCRlLGNyLGhlLGt0LFZlLGJ0LF9uLHFpLGZlLE5lLFdlLCR0LGVlLFZ0LG5lLHplLGhyLEYwLE1lLFRuLENlLFJuLEssZXQsWGUsZnIsbGUsa2U7InVzZSBzdHJpY3QiO3ZhciBYPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6e307ZnVuY3Rpb24gWSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBydD17fSxFZT10PT50P3R5cGVvZiBTeW1ib2wub2JzZXJ2YWJsZT09InN5bWJvbCImJnR5cGVvZiB0W1N5bWJvbC5vYnNlcnZhYmxlXT09ImZ1bmN0aW9uIj90PT09dFtTeW1ib2wub2JzZXJ2YWJsZV0oKTp0eXBlb2YgdFsiQEBvYnNlcnZhYmxlIl09PSJmdW5jdGlvbiI/dD09PXRbIkBAb2JzZXJ2YWJsZSJdKCk6ITE6ITEsd3Q9e30sX2U9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KF9lLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxfZS5EZWZhdWx0U2VyaWFsaXplcj1fZS5leHRlbmRTZXJpYWxpemVyPXZvaWQgMDtmdW5jdGlvbiBZaSh0LGUpe2NvbnN0IG49dC5kZXNlcmlhbGl6ZS5iaW5kKHQpLHI9dC5zZXJpYWxpemUuYmluZCh0KTtyZXR1cm57ZGVzZXJpYWxpemUoaSl7cmV0dXJuIGUuZGVzZXJpYWxpemUoaSxuKX0sc2VyaWFsaXplKGkpe3JldHVybiBlLnNlcmlhbGl6ZShpLHIpfX19X2UuZXh0ZW5kU2VyaWFsaXplcj1ZaTtjb25zdCBscj17ZGVzZXJpYWxpemUodCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IodC5tZXNzYWdlKSx7bmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFja30pfSxzZXJpYWxpemUodCl7cmV0dXJue19fZXJyb3JfbWFya2VyOiIkJGVycm9yIixtZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrfX19LEtpPXQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIl9fZXJyb3JfbWFya2VyImluIHQmJnQuX19lcnJvcl9tYXJrZXI9PT0iJCRlcnJvciI7X2UuRGVmYXVsdFNlcmlhbGl6ZXI9e2Rlc2VyaWFsaXplKHQpe3JldHVybiBLaSh0KT9sci5kZXNlcmlhbGl6ZSh0KTp0fSxzZXJpYWxpemUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcj9sci5zZXJpYWxpemUodCk6dH19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksd3Quc2VyaWFsaXplPXd0LmRlc2VyaWFsaXplPXd0LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3QgZHI9X2U7bGV0IHFlPWRyLkRlZmF1bHRTZXJpYWxpemVyO2Z1bmN0aW9uIFppKHQpe3FlPWRyLmV4dGVuZFNlcmlhbGl6ZXIocWUsdCl9d3QucmVnaXN0ZXJTZXJpYWxpemVyPVppO2Z1bmN0aW9uIFFpKHQpe3JldHVybiBxZS5kZXNlcmlhbGl6ZSh0KX13dC5kZXNlcmlhbGl6ZT1RaTtmdW5jdGlvbiBKaSh0KXtyZXR1cm4gcWUuc2VyaWFsaXplKHQpfXd0LnNlcmlhbGl6ZT1KaTt2YXIgcmU9e30sU3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxTdC4kd29ya2VyPVN0LiR0cmFuc2ZlcmFibGU9U3QuJHRlcm1pbmF0ZT1TdC4kZXZlbnRzPVN0LiRlcnJvcnM9dm9pZCAwLFN0LiRlcnJvcnM9U3ltYm9sKCJ0aHJlYWQuZXJyb3JzIiksU3QuJGV2ZW50cz1TeW1ib2woInRocmVhZC5ldmVudHMiKSxTdC4kdGVybWluYXRlPVN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpLFN0LiR0cmFuc2ZlcmFibGU9U3ltYm9sKCJ0aHJlYWQudHJhbnNmZXJhYmxlIiksU3QuJHdvcmtlcj1TeW1ib2woInRocmVhZC53b3JrZXIiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHJlLlRyYW5zZmVyPXJlLmlzVHJhbnNmZXJEZXNjcmlwdG9yPXZvaWQgMDtjb25zdCBFcj1TdDtmdW5jdGlvbiB0byh0KXtyZXR1cm4hKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpfWZ1bmN0aW9uIGVvKHQpe3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCImJnRbRXIuJHRyYW5zZmVyYWJsZV19cmUuaXNUcmFuc2ZlckRlc2NyaXB0b3I9ZW87ZnVuY3Rpb24gbm8odCxlKXtpZighZSl7aWYoIXRvKHQpKXRocm93IEVycm9yKCk7ZT1bdF19cmV0dXJue1tFci4kdHJhbnNmZXJhYmxlXTohMCxzZW5kOnQsdHJhbnNmZXJhYmxlczplfX1yZS5UcmFuc2Zlcj1ubzt2YXIgX3I9e307KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lldvcmtlck1lc3NhZ2VUeXBlPXQuTWFzdGVyTWVzc2FnZVR5cGU9dm9pZCAwLGZ1bmN0aW9uKGUpe2UuY2FuY2VsPSJjYW5jZWwiLGUucnVuPSJydW4ifSh0Lk1hc3Rlck1lc3NhZ2VUeXBlfHwodC5NYXN0ZXJNZXNzYWdlVHlwZT17fSkpLGZ1bmN0aW9uKGUpe2UuZXJyb3I9ImVycm9yIixlLmluaXQ9ImluaXQiLGUucmVzdWx0PSJyZXN1bHQiLGUucnVubmluZz0icnVubmluZyIsZS51bmNhdWdodEVycm9yPSJ1bmNhdWdodEVycm9yIn0odC5Xb3JrZXJNZXNzYWdlVHlwZXx8KHQuV29ya2VyTWVzc2FnZVR5cGU9e30pKX0pKF9yKTt2YXIgeG49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHhuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBybz1mdW5jdGlvbigpe2NvbnN0IGU9dHlwZW9mIHNlbGY8InUiJiZ0eXBlb2YgV2luZG93PCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdpbmRvdztyZXR1cm4hISh0eXBlb2Ygc2VsZjwidSImJnNlbGYucG9zdE1lc3NhZ2UmJiFlKX0saW89ZnVuY3Rpb24oZSxuKXtzZWxmLnBvc3RNZXNzYWdlKGUsbil9LG9vPWZ1bmN0aW9uKGUpe2NvbnN0IG49aT0+e2UoaS5kYXRhKX0scj0oKT0+e3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHJ9O3huLmRlZmF1bHQ9e2lzV29ya2VyUnVudGltZTpybyxwb3N0TWVzc2FnZVRvTWFzdGVyOmlvLHN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXM6b299LGZ1bmN0aW9uKHQpe3ZhciBlPVgmJlguX19hd2FpdGVyfHxmdW5jdGlvbihULEIsVixEKXtmdW5jdGlvbiB5dChvdCl7cmV0dXJuIG90IGluc3RhbmNlb2YgVj9vdDpuZXcgVihmdW5jdGlvbihndCl7Z3Qob3QpfSl9cmV0dXJuIG5ldyhWfHwoVj1Qcm9taXNlKSkoZnVuY3Rpb24ob3QsZ3Qpe2Z1bmN0aW9uIHBuKGRlKXt0cnl7SGUoRC5uZXh0KGRlKSl9Y2F0Y2goYXIpe2d0KGFyKX19ZnVuY3Rpb24geW4oZGUpe3RyeXtIZShELnRocm93KGRlKSl9Y2F0Y2goYXIpe2d0KGFyKX19ZnVuY3Rpb24gSGUoZGUpe2RlLmRvbmU/b3QoZGUudmFsdWUpOnl0KGRlLnZhbHVlKS50aGVuKHBuLHluKX1IZSgoRD1ELmFwcGx5KFQsQnx8W10pKS5uZXh0KCkpfSl9LG49WCYmWC5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKFQpe3JldHVybiBUJiZULl9fZXNNb2R1bGU/VDp7ZGVmYXVsdDpUfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZXhwb3NlPXQuaXNXb3JrZXJSdW50aW1lPXQuVHJhbnNmZXI9dC5yZWdpc3RlclNlcmlhbGl6ZXI9dm9pZCAwO2NvbnN0IHI9bihFZSksaT13dCxvPXJlLHM9X3IsdT1uKHhuKTt2YXIgYT13dDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJTZXJpYWxpemVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5yZWdpc3RlclNlcmlhbGl6ZXJ9fSk7dmFyIGw9cmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlRyYW5zZmVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5UcmFuc2Zlcn19KSx0LmlzV29ya2VyUnVudGltZT11LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lO2xldCBkPSExO2NvbnN0IF89bmV3IE1hcCxPPVQ9PlQmJlQudHlwZT09PXMuTWFzdGVyTWVzc2FnZVR5cGUuY2FuY2VsLGI9VD0+VCYmVC50eXBlPT09cy5NYXN0ZXJNZXNzYWdlVHlwZS5ydW4sST1UPT5yLmRlZmF1bHQoVCl8fFMoVCk7ZnVuY3Rpb24gUyhUKXtyZXR1cm4gVCYmdHlwZW9mIFQ9PSJvYmplY3QiJiZ0eXBlb2YgVC5zdWJzY3JpYmU9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gbShUKXtyZXR1cm4gby5pc1RyYW5zZmVyRGVzY3JpcHRvcihUKT97cGF5bG9hZDpULnNlbmQsdHJhbnNmZXJhYmxlczpULnRyYW5zZmVyYWJsZXN9OntwYXlsb2FkOlQsdHJhbnNmZXJhYmxlczp2b2lkIDB9fWZ1bmN0aW9uIGcoKXtjb25zdCBUPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUuaW5pdCxleHBvc2VkOnt0eXBlOiJmdW5jdGlvbiJ9fTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihUKX1mdW5jdGlvbiBHKFQpe2NvbnN0IEI9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LGV4cG9zZWQ6e3R5cGU6Im1vZHVsZSIsbWV0aG9kczpUfX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9ZnVuY3Rpb24gcShULEIpe2NvbnN0e3BheWxvYWQ6Vix0cmFuc2ZlcmFibGVzOkR9PW0oQikseXQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5lcnJvcix1aWQ6VCxlcnJvcjppLnNlcmlhbGl6ZShWKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoeXQsRCl9ZnVuY3Rpb24gJChULEIsVil7Y29uc3R7cGF5bG9hZDpELHRyYW5zZmVyYWJsZXM6eXR9PW0oViksb3Q9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5yZXN1bHQsdWlkOlQsY29tcGxldGU6Qj8hMDp2b2lkIDAscGF5bG9hZDpEfTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihvdCx5dCl9ZnVuY3Rpb24gbnQoVCxCKXtjb25zdCBWPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUucnVubmluZyx1aWQ6VCxyZXN1bHRUeXBlOkJ9O3UuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKFYpfWZ1bmN0aW9uIGx0KFQpe3RyeXtjb25zdCBCPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvcixlcnJvcjppLnNlcmlhbGl6ZShUKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9Y2F0Y2goQil7Y29uc29sZS5lcnJvcihgTm90IHJlcG9ydGluZyB1bmNhdWdodCBlcnJvciBiYWNrIHRvIG1hc3RlciB0aHJlYWQgYXMgaXQgb2NjdXJlZCB3aGlsZSByZXBvcnRpbmcgYW4gdW5jYXVnaHQgZXJyb3IgYWxyZWFkeS4KTGF0ZXN0IGVycm9yOmAsQixgCk9yaWdpbmFsIGVycm9yOmAsVCl9fWZ1bmN0aW9uIGl0KFQsQixWKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IEQ7dHJ5e0Q9QiguLi5WKX1jYXRjaChvdCl7cmV0dXJuIHEoVCxvdCl9Y29uc3QgeXQ9SShEKT8ib2JzZXJ2YWJsZSI6InByb21pc2UiO2lmKG50KFQseXQpLEkoRCkpe2NvbnN0IG90PUQuc3Vic2NyaWJlKGd0PT4kKFQsITEsaS5zZXJpYWxpemUoZ3QpKSxndD0+e3EoVCxpLnNlcmlhbGl6ZShndCkpLF8uZGVsZXRlKFQpfSwoKT0+eyQoVCwhMCksXy5kZWxldGUoVCl9KTtfLnNldChULG90KX1lbHNlIHRyeXtjb25zdCBvdD15aWVsZCBEOyQoVCwhMCxpLnNlcmlhbGl6ZShvdCkpfWNhdGNoKG90KXtxKFQsaS5zZXJpYWxpemUob3QpKX19KX1mdW5jdGlvbiBCdChUKXtpZighdS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKXRocm93IEVycm9yKCJleHBvc2UoKSBjYWxsZWQgaW4gdGhlIG1hc3RlciB0aHJlYWQuIik7aWYoZCl0aHJvdyBFcnJvcigiZXhwb3NlKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiBUaGlzIGlzIG5vdCBwb3NzaWJsZS4gUGFzcyBhbiBvYmplY3QgdG8gZXhwb3NlKCkgaWYgeW91IHdhbnQgdG8gZXhwb3NlIG11bHRpcGxlIGZ1bmN0aW9ucy4iKTtpZihkPSEwLHR5cGVvZiBUPT0iZnVuY3Rpb24iKXUuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntiKEIpJiYhQi5tZXRob2QmJml0KEIudWlkLFQsQi5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KSxnKCk7ZWxzZSBpZih0eXBlb2YgVD09Im9iamVjdCImJlQpe3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKFY9PntiKFYpJiZWLm1ldGhvZCYmaXQoVi51aWQsVFtWLm1ldGhvZF0sVi5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KTtjb25zdCBCPU9iamVjdC5rZXlzKFQpLmZpbHRlcihWPT50eXBlb2YgVFtWXT09ImZ1bmN0aW9uIik7RyhCKX1lbHNlIHRocm93IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBleHBvc2UoKS4gRXhwZWN0ZWQgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QsIGdvdDogJHtUfWApO3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntpZihPKEIpKXtjb25zdCBWPUIudWlkLEQ9Xy5nZXQoVik7RCYmKEQudW5zdWJzY3JpYmUoKSxfLmRlbGV0ZShWKSl9fSl9dC5leHBvc2U9QnQsdHlwZW9mIHNlbGY8InUiJiZ0eXBlb2Ygc2VsZi5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixUPT57c2V0VGltZW91dCgoKT0+bHQoVC5lcnJvcnx8VCksMjUwKX0pLHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigidW5oYW5kbGVkcmVqZWN0aW9uIixUPT57Y29uc3QgQj1ULnJlYXNvbjtCJiZ0eXBlb2YgQi5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoQiksMjUwKX0pKSx0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZiBwcm9jZXNzLm9uPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsVD0+e3NldFRpbWVvdXQoKCk9Pmx0KFQpLDI1MCl9KSxwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLFQ9PntUJiZ0eXBlb2YgVC5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoVCksMjUwKX0pKX0ocnQpO3ZhciBPbj1ZKHJ0KTtjb25zdCBzbz1Pbi5leHBvc2U7T24ucmVnaXN0ZXJTZXJpYWxpemVyLE9uLlRyYW5zZmVyO2Z1bmN0aW9uIEYodCxlKXtyZXR1cm4gdD8/ZX1GLkVNUFRZX09CSkVDVD1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBwKHQpe3JldHVybiB0IT1udWxsfWZ1bmN0aW9uIHgodCl7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXAoT2JqZWN0LmNyZWF0ZSkmJih4LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSkseC5wcm90b3R5cGUuY29uc3RydWN0b3I9eCkseC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBwKHRoaXMuc3RhY2spJiYodCs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSx0fSx4LnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IHgoIlRoaXMgZnVuY3Rpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiIpfTtjb25zdCBzdD17fTtzdC50eXBlT2Y9e307ZnVuY3Rpb24gYW8odCl7cmV0dXJuYCR7dH0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiBwZSh0LGUsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7ZX0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7dH1gfXN0LmRlZmluZWQ9ZnVuY3Rpb24odCxlKXtpZighcChlKSl0aHJvdyBuZXcgeChhbyh0KSl9LHN0LnR5cGVPZi5mdW5jPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImZ1bmN0aW9uIix0KSl9LHN0LnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsInN0cmluZyIsdCkpfSxzdC50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyB4KHBlKHR5cGVvZiBlLCJudW1iZXIiLHQpKX0sc3QudHlwZU9mLm51bWJlci5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU+PW4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKHN0LnR5cGVPZi5udW1iZXIodCxlKSxlPm4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZihzdC50eXBlT2YubnVtYmVyKHQsZSksZTw9bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU8bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsIm9iamVjdCIsdCkpfSxzdC50eXBlT2YuYm9vbD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImJvb2xlYW4iLHQpKX0sc3QudHlwZU9mLmJpZ2ludD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYmlnaW50Iil0aHJvdyBuZXcgeChwZSh0eXBlb2YgZSwiYmlnaW50Iix0KSl9LHN0LnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHN0LnR5cGVPZi5udW1iZXIodCxuKSxzdC50eXBlT2YubnVtYmVyKGUsciksbiE9PXIpdGhyb3cgbmV3IHgoYCR7dH0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHtufSBhbmQgJHtyfWApfTt2YXIgaD1zdCxXdD1mdW5jdGlvbih0KXt0PT1udWxsJiYodD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHQuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheSh0LHQubGVuZ3RoKTp0aGlzLmluaXRfc2VlZCh0KX07V3QucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbih0KXtmb3IodGhpcy5tdFswXT10Pj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgdD10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKCh0JjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsodCY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0sV3QucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEscj0wLGk9dGhpcy5OPmU/dGhpcy5OOmU7aTtpLS0pe3ZhciBvPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKG8mNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhvJjY1NTM1KSoxNjY0NTI1KSt0W3JdK3IsdGhpcy5tdFtuXT4+Pj0wLG4rKyxyKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLHI+PWUmJihyPTApfWZvcihpPXRoaXMuTi0xO2k7aS0tKXt2YXIgbz10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChvJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsobyY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LFd0LnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIHQsZT1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV50Pj4+MV5lW3QmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV50Pj4+MV5lW3QmMV07dD10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1edD4+PjFeZVt0JjFdLHRoaXMubXRpPTB9cmV0dXJuIHQ9dGhpcy5tdFt0aGlzLm10aSsrXSx0Xj10Pj4+MTEsdF49dDw8NyYyNjM2OTI4NjQwLHRePXQ8PDE1JjQwMjI3MzA3NTIsdF49dD4+PjE4LHQ+Pj4wfSxXdC5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX0sV3QucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfSxXdC5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfSxXdC5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfSxXdC5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmRvbV9pbnQoKT4+PjUsZT10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKHQqNjcxMDg4NjQrZSkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3ZhciBwcj1XdDtjb25zdCB5PXt9O3kuRVBTSUxPTjE9LjEseS5FUFNJTE9OMj0uMDEseS5FUFNJTE9OMz0uMDAxLHkuRVBTSUxPTjQ9MWUtNCx5LkVQU0lMT041PTFlLTUseS5FUFNJTE9ONj0xZS02LHkuRVBTSUxPTjc9MWUtNyx5LkVQU0lMT044PTFlLTgseS5FUFNJTE9OOT0xZS05LHkuRVBTSUxPTjEwPTFlLTEwLHkuRVBTSUxPTjExPTFlLTExLHkuRVBTSUxPTjEyPTFlLTEyLHkuRVBTSUxPTjEzPTFlLTEzLHkuRVBTSUxPTjE0PTFlLTE0LHkuRVBTSUxPTjE1PTFlLTE1LHkuRVBTSUxPTjE2PTFlLTE2LHkuRVBTSUxPTjE3PTFlLTE3LHkuRVBTSUxPTjE4PTFlLTE4LHkuRVBTSUxPTjE5PTFlLTE5LHkuRVBTSUxPTjIwPTFlLTIwLHkuRVBTSUxPTjIxPTFlLTIxLHkuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTUseS5TT0xBUl9SQURJVVM9Njk1NWU1LHkuTFVOQVJfUkFESVVTPTE3Mzc0MDAseS5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0LHkuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNCx5LnNpZ249RihNYXRoLnNpZ24sZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PTB8fGUhPT1lP2U6ZT4wPzE6LTF9KSx5LnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX0seS50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9RihlLDI1NSksTWF0aC5yb3VuZCgoeS5jbGFtcCh0LC0xLDEpKi41Ky41KSplKX0seS5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1GKGUsMjU1KSx5LmNsYW1wKHQsMCxlKS9lKjItMX0seS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPU1hdGgubWF4KG4tZSwwKSxuPT09MD8wOnkuY2xhbXAoKHQtZSkvbiwwLDEpfSx5LnNpbmg9RihNYXRoLnNpbmgsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpLU1hdGguZXhwKC1lKSkvMn0pLHkuY29zaD1GKE1hdGguY29zaCxmdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfSkseS5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX0seS5QST1NYXRoLlBJLHkuT05FX09WRVJfUEk9MS9NYXRoLlBJLHkuUElfT1ZFUl9UV089TWF0aC5QSS8yLHkuUElfT1ZFUl9USFJFRT1NYXRoLlBJLzMseS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80LHkuUElfT1ZFUl9TSVg9TWF0aC5QSS82LHkuVEhSRUVfUElfT1ZFUl9UV089MypNYXRoLlBJLzIseS5UV09fUEk9MipNYXRoLlBJLHkuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSkseS5SQURJQU5TX1BFUl9ERUdSRUU9TWF0aC5QSS8xODAseS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEkseS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9eS5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMCx5LnRvUmFkaWFucz1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZGVncmVlcyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdCp5LlJBRElBTlNfUEVSX0RFR1JFRX0seS50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqeS5ERUdSRUVTX1BFUl9SQURJQU59LHkuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtjb25zdCBlPXkuVFdPX1BJLG49dC1NYXRoLmZsb29yKHQvZSkqZTtyZXR1cm4gbjwtTWF0aC5QST9uK2U6bj49TWF0aC5QST9uLWU6bn0seS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHkuY2xhbXAodCwtMSp5LlBJX09WRVJfVFdPLHkuUElfT1ZFUl9UV08pfSx5Lm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49LXkuUEkmJnQ8PXkuUEk/dDp5Lnplcm9Ub1R3b1BpKHQreS5QSSkteS5QSX0seS56ZXJvVG9Ud29QaT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYodD49MCYmdDw9eS5UV09fUEkpcmV0dXJuIHQ7Y29uc3QgZT15Lm1vZCh0LHkuVFdPX1BJKTtyZXR1cm4gTWF0aC5hYnMoZSk8eS5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPnkuRVBTSUxPTjE0P3kuVFdPX1BJOmV9LHkubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoIm0gaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IHgoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIHkuc2lnbih0KT09PXkuc2lnbihlKSYmTWF0aC5hYnModCk8TWF0aC5hYnMoZSk/dDoodCVlK2UpJWV9LHkuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixyKXtpZighcCh0KSl0aHJvdyBuZXcgeCgibGVmdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmlnaHQgaXMgcmVxdWlyZWQuIik7bj1GKG4sMCkscj1GKHIsbik7Y29uc3QgaT1NYXRoLmFicyh0LWUpO3JldHVybiBpPD1yfHxpPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX0seS5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIXAodCkpdGhyb3cgbmV3IHgoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFwKGUpKXRocm93IG5ldyB4KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIXAobikpdGhyb3cgbmV3IHgoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPC1ufSx5Lmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFwKHQpKXRocm93IG5ldyB4KCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufSx5LmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn0seS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+LW59O2NvbnN0IFllPVsxXTt5LmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgeCgiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7Y29uc3QgZT1ZZS5sZW5ndGg7aWYodD49ZSl7bGV0IG49WWVbZS0xXTtmb3IobGV0IHI9ZTtyPD10O3IrKyl7Y29uc3QgaT1uKnI7WWUucHVzaChpKSxuPWl9fXJldHVybiBZZVt0XX0seS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPUYobiwwKSwhcCh0KSl0aHJvdyBuZXcgeCgibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyB4KCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9LHkuaXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQhPT0wJiYodCZ0LTEpPT09MH0seS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD4yMTQ3NDgzNjQ4KXRocm93IG5ldyB4KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuIik7cmV0dXJuLS10LHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsKyt0LHR9LHkucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH0seS5jbGFtcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLGgudHlwZU9mLm51bWJlcigibWluIixlKSxoLnR5cGVPZi5udW1iZXIoIm1heCIsbiksdDxlP2U6dD5uP246dH07bGV0IHlyPW5ldyBwcjt5LnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInNlZWQgaXMgcmVxdWlyZWQuIik7eXI9bmV3IHByKHQpfSx5Lm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4geXIucmFuZG9tKCl9LHkucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB5Lm5leHRSYW5kb21OdW1iZXIoKSooZS10KSt0fSx5LmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKHkuY2xhbXAodCwtMSwxKSl9LHkuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmFzaW4oeS5jbGFtcCh0LC0xLDEpKX0seS5jaG9yZExlbmd0aD1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmFkaXVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiAyKmUqTWF0aC5zaW4odCouNSl9LHkubG9nQmFzZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJudW1iZXIgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoImJhc2UgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGgubG9nKHQpL01hdGgubG9nKGUpfSx5LmNicnQ9RihNYXRoLmNicnQsZnVuY3Rpb24oZSl7Y29uc3Qgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufSkseS5sb2cyPUYoTWF0aC5sb2cyLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfSkseS5mb2c9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigieCIsdCksdCooLS4xNzg0Kk1hdGguYWJzKHQpLS4wNjYzKnQqdCsxLjAzMDEpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2YubnVtYmVyKCJ4Iix0KSxoLnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLHI9TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtjb25zdCBpPU1hdGgubWF4KHIsbik7bj1NYXRoLm1pbihyLG4pO2NvbnN0IG89bi9pO2lmKGlzTmFOKG8pKXRocm93IG5ldyB4KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpO3JldHVybiByPXkuZmFzdEFwcHJveGltYXRlQXRhbihvKSxyPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP3kuUElfT1ZFUl9UV08tcjpyLHI9dDwwP3kuUEktcjpyLHI9ZTwwPy1yOnIscn07dmFyIFI9eTtmdW5jdGlvbiBBKHQsZSl7dGhpcy54PUYodCwwKSx0aGlzLnk9RihlLDApfUEuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcChuKT8obi54PXQsbi55PWUsbik6bmV3IEEodCxlKX0sQS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcgQSh0LngsdC55KX0sQS5mcm9tQ2FydGVzaWFuMz1BLmNsb25lLEEuZnJvbUNhcnRlc2lhbjQ9QS5jbG9uZSxBLnBhY2tlZExlbmd0aD0yLEEucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGguZGVmaW5lZCgiYXJyYXkiLGUpLG49RihuLDApLGVbbisrXT10LngsZVtuXT10LnksZX0sQS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLmRlZmluZWQoImFycmF5Iix0KSxlPUYoZSwwKSxwKG4pfHwobj1uZXcgQSksbi54PXRbZSsrXSxuLnk9dFtlXSxufSxBLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjI7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMiBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpQS5wYWNrKHRbaV0sZSxpKjIpO3JldHVybiBlfSxBLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMiksdC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8yOmU9bmV3IEFycmF5KG4vMik7Zm9yKGxldCByPTA7cjxuO3IrPTIpe2NvbnN0IGk9ci8yO2VbaV09QS51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxBLmZyb21BcnJheT1BLnVucGFjayxBLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55KX0sQS5taW5pbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5taW4odC54LHQueSl9LEEubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59LEEubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG59LEEuY2xhbXA9ZnVuY3Rpb24odCxlLG4scil7aC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLGgudHlwZU9mLm9iamVjdCgibWF4IixuKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIscik7Y29uc3QgaT1SLmNsYW1wKHQueCxlLngsbi54KSxvPVIuY2xhbXAodC55LGUueSxuLnkpO3JldHVybiByLng9aSxyLnk9byxyfSxBLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0Lnl9LEEubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoQS5tYWduaXR1ZGVTcXVhcmVkKHQpKX07Y29uc3QgS2U9bmV3IEE7QS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLEEuc3VidHJhY3QodCxlLEtlKSxBLm1hZ25pdHVkZShLZSl9LEEuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5zdWJ0cmFjdCh0LGUsS2UpLEEubWFnbml0dWRlU3F1YXJlZChLZSl9LEEubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtjb25zdCBuPUEubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24saXNOYU4oZS54KXx8aXNOYU4oZS55KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LEEuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55fSxBLmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fSxBLm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG59LEEuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG59LEEuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn0sQS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG59LEEubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbn0sQS5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn0sQS5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlfSxBLmFicz1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGV9O2NvbnN0IEFyPW5ldyBBO0EubGVycD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCksaC50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLGgudHlwZU9mLm51bWJlcigidCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLEEubXVsdGlwbHlCeVNjYWxhcihlLG4sQXIpLHI9QS5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLHIpLEEuYWRkKEFyLHIscil9O2NvbnN0IFRyPW5ldyBBLFJyPW5ldyBBO0EuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5ub3JtYWxpemUodCxUciksQS5ub3JtYWxpemUoZSxSciksUi5hY29zQ2xhbXBlZChBLmRvdChUcixScikpfTtjb25zdCB1bz1uZXcgQTtBLm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7Y29uc3Qgbj1BLm5vcm1hbGl6ZSh0LHVvKTtyZXR1cm4gQS5hYnMobixuKSxuLng8PW4ueT9lPUEuY2xvbmUoQS5VTklUX1gsZSk6ZT1BLmNsb25lKEEuVU5JVF9ZLGUpLGV9LEEuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxwKHQpJiZwKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueX0sQS5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX0sQS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKX0sQS5aRVJPPU9iamVjdC5mcmVlemUobmV3IEEoMCwwKSksQS5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgQSgxLDEpKSxBLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBBKDEsMCkpLEEuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IEEoMCwxKSksQS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEEuY2xvbmUodGhpcyx0KX0sQS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBBLmVxdWFscyh0aGlzLHQpfSxBLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQS5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfSxBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0pYH07ZnVuY3Rpb24gZih0LGUsbil7dGhpcy54PUYodCwwKSx0aGlzLnk9RihlLDApLHRoaXMuej1GKG4sMCl9Zi5mcm9tU3BoZXJpY2FsPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQuY2xvY2sscj10LmNvbmUsaT1GKHQubWFnbml0dWRlLDEpLG89aSpNYXRoLnNpbihyKTtyZXR1cm4gZS54PW8qTWF0aC5jb3MobiksZS55PW8qTWF0aC5zaW4obiksZS56PWkqTWF0aC5jb3MociksZX0sZi5mcm9tRWxlbWVudHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHAocik/KHIueD10LHIueT1lLHIuej1uLHIpOm5ldyBmKHQsZSxuKX0sZi5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBmKHQueCx0LnksdC56KX0sZi5mcm9tQ2FydGVzaWFuND1mLmNsb25lLGYucGFja2VkTGVuZ3RoPTMsZi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1GKG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbl09dC56LGV9LGYudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJhcnJheSIsdCksZT1GKGUsMCkscChuKXx8KG49bmV3IGYpLG4ueD10W2UrK10sbi55PXRbZSsrXSxuLno9dFtlXSxufSxmLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjM7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpZi5wYWNrKHRbaV0sZSxpKjMpO3JldHVybiBlfSxmLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMyksdC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCByPTA7cjxuO3IrPTMpe2NvbnN0IGk9ci8zO2VbaV09Zi51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxmLmZyb21BcnJheT1mLnVucGFjayxmLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55LHQueil9LGYubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX0sZi5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSxoLnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG59LGYubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG4uej1NYXRoLm1heCh0LnosZS56KSxufSxmLmNsYW1wPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGgudHlwZU9mLm9iamVjdCgibWluIixlKSxoLnR5cGVPZi5vYmplY3QoIm1heCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpO2NvbnN0IGk9Ui5jbGFtcCh0LngsZS54LG4ueCksbz1SLmNsYW1wKHQueSxlLnksbi55KSxzPVIuY2xhbXAodC56LGUueixuLnopO3JldHVybiByLng9aSxyLnk9byxyLno9cyxyfSxmLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0LnkrdC56KnQuen0sZi5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChmLm1hZ25pdHVkZVNxdWFyZWQodCkpfTtjb25zdCBaZT1uZXcgZjtmLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5zdWJ0cmFjdCh0LGUsWmUpLGYubWFnbml0dWRlKFplKX0sZi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxmLnN1YnRyYWN0KHQsZSxaZSksZi5tYWduaXR1ZGVTcXVhcmVkKFplKX0sZi5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5tYWduaXR1ZGUodCk7aWYoZS54PXQueC9uLGUueT10LnkvbixlLno9dC56L24saXNOYU4oZS54KXx8aXNOYU4oZS55KXx8aXNOYU4oZS56KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LGYuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9LGYubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbn0sZi5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbi56PXQuei9lLnosbn0sZi5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufSxmLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbn0sZi5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxuLno9dC56KmUsbn0sZi5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59LGYubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZX0sZi5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlfTtjb25zdCB4cj1uZXcgZjtmLmxlcnA9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLGgudHlwZU9mLm9iamVjdCgiZW5kIixlKSxoLnR5cGVPZi5udW1iZXIoInQiLG4pLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKSxmLm11bHRpcGx5QnlTY2FsYXIoZSxuLHhyKSxyPWYubXVsdGlwbHlCeVNjYWxhcih0LDEtbixyKSxmLmFkZCh4cixyLHIpfTtjb25zdCBRZT1uZXcgZixibj1uZXcgZjtmLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5ub3JtYWxpemUodCxRZSksZi5ub3JtYWxpemUoZSxibik7Y29uc3Qgbj1mLmRvdChRZSxibikscj1mLm1hZ25pdHVkZShmLmNyb3NzKFFlLGJuLFFlKSk7cmV0dXJuIE1hdGguYXRhbjIocixuKX07Y29uc3QgY289bmV3IGY7Zi5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5ub3JtYWxpemUodCxjbyk7cmV0dXJuIGYuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1mLmNsb25lKGYuVU5JVF9YLGUpOmU9Zi5jbG9uZShmLlVOSVRfWixlKTpuLnk8PW4uej9lPWYuY2xvbmUoZi5VTklUX1ksZSk6ZT1mLmNsb25lKGYuVU5JVF9aLGUpLGV9LGYucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhIix0KSxoLmRlZmluZWQoImIiLGUpLGguZGVmaW5lZCgicmVzdWx0IixuKTtjb25zdCByPWYuZG90KHQsZSkvZi5kb3QoZSxlKTtyZXR1cm4gZi5tdWx0aXBseUJ5U2NhbGFyKGUscixuKX0sZi5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQueD09PWUueCYmdC55PT09ZS55JiZ0Lno9PT1lLnp9LGYuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX0sZi5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueixlLnosbixyKX0sZi5jcm9zcz1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7Y29uc3Qgcj10LngsaT10Lnksbz10Lnoscz1lLngsdT1lLnksYT1lLnosbD1pKmEtbyp1LGQ9bypzLXIqYSxfPXIqdS1pKnM7cmV0dXJuIG4ueD1sLG4ueT1kLG4uej1fLG59LGYubWlkcG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9KHQueCtlLngpKi41LG4ueT0odC55K2UueSkqLjUsbi56PSh0LnorZS56KSouNSxufSxmLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksZi5mcm9tUmFkaWFucyh0LGUsbixyLGkpfTtsZXQgbXQ9bmV3IGYseWU9bmV3IGY7Y29uc3QgaG89bmV3IGYoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO2YuZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXtoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1GKG4sMCk7Y29uc3Qgbz1wKHIpP3IucmFkaWlTcXVhcmVkOmhvLHM9TWF0aC5jb3MoZSk7bXQueD1zKk1hdGguY29zKHQpLG10Lnk9cypNYXRoLnNpbih0KSxtdC56PU1hdGguc2luKGUpLG10PWYubm9ybWFsaXplKG10LG10KSxmLm11bHRpcGx5Q29tcG9uZW50cyhvLG10LHllKTtjb25zdCB1PU1hdGguc3FydChmLmRvdChtdCx5ZSkpO3JldHVybiB5ZT1mLmRpdmlkZUJ5U2NhbGFyKHllLHUseWUpLG10PWYubXVsdGlwbHlCeVNjYWxhcihtdCxuLG10KSxwKGkpfHwoaT1uZXcgZiksZi5hZGQoeWUsbXQsaSl9LGYuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoaC5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtjb25zdCByPXQubGVuZ3RoO3Aobik/bi5sZW5ndGg9ci8yOm49bmV3IEFycmF5KHIvMik7Zm9yKGxldCBpPTA7aTxyO2krPTIpe2NvbnN0IG89dFtpXSxzPXRbaSsxXSx1PWkvMjtuW3VdPWYuZnJvbURlZ3JlZXMobyxzLDAsZSxuW3VdKX1yZXR1cm4gbn0sZi5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzI6bj1uZXcgQXJyYXkoci8yKTtmb3IobGV0IGk9MDtpPHI7aSs9Mil7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9aS8yO25bdV09Zi5mcm9tUmFkaWFucyhvLHMsMCxlLG5bdV0pfXJldHVybiBufSxmLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tRGVncmVlcyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tUmFkaWFucyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgZigwLDAsMCkpLGYuT05FPU9iamVjdC5mcmVlemUobmV3IGYoMSwxLDEpKSxmLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBmKDEsMCwwKSksZi5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgZigwLDEsMCkpLGYuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IGYoMCwwLDEpKSxmLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gZi5jbG9uZSh0aGlzLHQpfSxmLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGYuZXF1YWxzKHRoaXMsdCl9LGYucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9LGYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9KWB9O2NvbnN0IGZvPW5ldyBmLGxvPW5ldyBmO2Z1bmN0aW9uIE9yKHQsZSxuLHIsaSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFwKHIpKXRocm93IG5ldyB4KCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2NvbnN0IG89dC54LHM9dC55LHU9dC56LGE9ZS54LGw9ZS55LGQ9ZS56LF89bypvKmEqYSxPPXMqcypsKmwsYj11KnUqZCpkLEk9XytPK2IsUz1NYXRoLnNxcnQoMS9JKSxtPWYubXVsdGlwbHlCeVNjYWxhcih0LFMsZm8pO2lmKEk8cilyZXR1cm4gaXNGaW5pdGUoUyk/Zi5jbG9uZShtLGkpOnZvaWQgMDtjb25zdCBnPW4ueCxHPW4ueSxxPW4ueiwkPWxvOyQueD1tLngqZyoyLCQueT1tLnkqRyoyLCQuej1tLnoqcSoyO2xldCBudD0oMS1TKSpmLm1hZ25pdHVkZSh0KS8oLjUqZi5tYWduaXR1ZGUoJCkpLGx0PTAsaXQsQnQsVCxCLFYsRCx5dCxvdCxndCxwbix5bjtkb3tudC09bHQsVD0xLygxK250KmcpLEI9MS8oMStudCpHKSxWPTEvKDErbnQqcSksRD1UKlQseXQ9QipCLG90PVYqVixndD1EKlQscG49eXQqQix5bj1vdCpWLGl0PV8qRCtPKnl0K2Iqb3QtMSxCdD1fKmd0KmcrTypwbipHK2IqeW4qcTtjb25zdCBIZT0tMipCdDtsdD1pdC9IZX13aGlsZShNYXRoLmFicyhpdCk+Ui5FUFNJTE9OMTIpO3JldHVybiBwKGkpPyhpLng9bypULGkueT1zKkIsaS56PXUqVixpKTpuZXcgZihvKlQscypCLHUqVil9ZnVuY3Rpb24gSCh0LGUsbil7dGhpcy5sb25naXR1ZGU9Rih0LDApLHRoaXMubGF0aXR1ZGU9RihlLDApLHRoaXMuaGVpZ2h0PUYobiwwKX1ILmZyb21SYWRpYW5zPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1GKG4sMCkscChyKT8oci5sb25naXR1ZGU9dCxyLmxhdGl0dWRlPWUsci5oZWlnaHQ9bixyKTpuZXcgSCh0LGUsbil9LEguZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksSC5mcm9tUmFkaWFucyh0LGUsbixyKX07Y29uc3QgRW89bmV3IGYsX289bmV3IGYscG89bmV3IGYseW89bmV3IGYoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpLEFvPW5ldyBmKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKSxUbz1SLkVQU0lMT04xO0guZnJvbUNhcnRlc2lhbj1mdW5jdGlvbih0LGUsbil7Y29uc3Qgcj1wKGUpP2Uub25lT3ZlclJhZGlpOnlvLGk9cChlKT9lLm9uZU92ZXJSYWRpaVNxdWFyZWQ6QW8sbz1wKGUpP2UuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ6VG8scz1Pcih0LHIsaSxvLF9vKTtpZighcChzKSlyZXR1cm47bGV0IHU9Zi5tdWx0aXBseUNvbXBvbmVudHMocyxpLEVvKTt1PWYubm9ybWFsaXplKHUsdSk7Y29uc3QgYT1mLnN1YnRyYWN0KHQscyxwbyksbD1NYXRoLmF0YW4yKHUueSx1LngpLGQ9TWF0aC5hc2luKHUueiksXz1SLnNpZ24oZi5kb3QoYSx0KSkqZi5tYWduaXR1ZGUoYSk7cmV0dXJuIHAobik/KG4ubG9uZ2l0dWRlPWwsbi5sYXRpdHVkZT1kLG4uaGVpZ2h0PV8sbik6bmV3IEgobCxkLF8pfSxILnRvQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWMiLHQpLGYuZnJvbVJhZGlhbnModC5sb25naXR1ZGUsdC5sYXRpdHVkZSx0LmhlaWdodCxlLG4pfSxILmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYocCh0KSlyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBIKHQubG9uZ2l0dWRlLHQubGF0aXR1ZGUsdC5oZWlnaHQpfSxILmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC5sb25naXR1ZGU9PT1lLmxvbmdpdHVkZSYmdC5sYXRpdHVkZT09PWUubGF0aXR1ZGUmJnQuaGVpZ2h0PT09ZS5oZWlnaHR9LEguZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49RihuLDApLHQ9PT1lfHxwKHQpJiZwKGUpJiZNYXRoLmFicyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSk8PW4mJk1hdGguYWJzKHQubGF0aXR1ZGUtZS5sYXRpdHVkZSk8PW4mJk1hdGguYWJzKHQuaGVpZ2h0LWUuaGVpZ2h0KTw9bn0sSC5aRVJPPU9iamVjdC5mcmVlemUobmV3IEgoMCwwLDApKSxILnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gSC5jbG9uZSh0aGlzLHQpfSxILnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEguZXF1YWxzKHRoaXMsdCl9LEgucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gSC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX0sSC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5sb25naXR1ZGV9LCAke3RoaXMubGF0aXR1ZGV9LCAke3RoaXMuaGVpZ2h0fSlgfTtmdW5jdGlvbiBicih0LGUsbixyKXtlPUYoZSwwKSxuPUYobiwwKSxyPUYociwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieCIsZSwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieSIsbiwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieiIsciwwKSx0Ll9yYWRpaT1uZXcgZihlLG4sciksdC5fcmFkaWlTcXVhcmVkPW5ldyBmKGUqZSxuKm4scipyKSx0Ll9yYWRpaVRvVGhlRm91cnRoPW5ldyBmKGUqZSplKmUsbipuKm4qbixyKnIqcipyKSx0Ll9vbmVPdmVyUmFkaWk9bmV3IGYoZT09PTA/MDoxL2Usbj09PTA/MDoxL24scj09PTA/MDoxL3IpLHQuX29uZU92ZXJSYWRpaVNxdWFyZWQ9bmV3IGYoZT09PTA/MDoxLyhlKmUpLG49PT0wPzA6MS8obipuKSxyPT09MD8wOjEvKHIqcikpLHQuX21pbmltdW1SYWRpdXM9TWF0aC5taW4oZSxuLHIpLHQuX21heGltdW1SYWRpdXM9TWF0aC5tYXgoZSxuLHIpLHQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9Ui5FUFNJTE9OMSx0Ll9yYWRpaVNxdWFyZWQueiE9PTAmJih0Ll9zcXVhcmVkWE92ZXJTcXVhcmVkWj10Ll9yYWRpaVNxdWFyZWQueC90Ll9yYWRpaVNxdWFyZWQueil9ZnVuY3Rpb24gaih0LGUsbil7dGhpcy5fcmFkaWk9dm9pZCAwLHRoaXMuX3JhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aD12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9taW5pbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9tYXhpbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXZvaWQgMCx0aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWj12b2lkIDAsYnIodGhpcyx0LGUsbil9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoai5wcm90b3R5cGUse3JhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWl9fSxyYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVNxdWFyZWR9fSxyYWRpaVRvVGhlRm91cnRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aH19LG9uZU92ZXJSYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaX19LG9uZU92ZXJSYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkfX0sbWluaW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbmltdW1SYWRpdXN9fSxtYXhpbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4aW11bVJhZGl1c319fSksai5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXJldHVybjtjb25zdCBuPXQuX3JhZGlpO3JldHVybiBwKGUpPyhmLmNsb25lKG4sZS5fcmFkaWkpLGYuY2xvbmUodC5fcmFkaWlTcXVhcmVkLGUuX3JhZGlpU3F1YXJlZCksZi5jbG9uZSh0Ll9yYWRpaVRvVGhlRm91cnRoLGUuX3JhZGlpVG9UaGVGb3VydGgpLGYuY2xvbmUodC5fb25lT3ZlclJhZGlpLGUuX29uZU92ZXJSYWRpaSksZi5jbG9uZSh0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkLGUuX29uZU92ZXJSYWRpaVNxdWFyZWQpLGUuX21pbmltdW1SYWRpdXM9dC5fbWluaW11bVJhZGl1cyxlLl9tYXhpbXVtUmFkaXVzPXQuX21heGltdW1SYWRpdXMsZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD10Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGUpOm5ldyBqKG4ueCxuLnksbi56KX0sai5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgaikscCh0KSYmYnIoZSx0LngsdC55LHQueiksZX0sai5XR1M4ND1PYmplY3QuZnJlZXplKG5ldyBqKDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSksai5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyBqKDEsMSwxKSksai5NT09OPU9iamVjdC5mcmVlemUobmV3IGooUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMpKSxqLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gai5jbG9uZSh0aGlzLHQpfSxqLnBhY2tlZExlbmd0aD1mLnBhY2tlZExlbmd0aCxqLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSxoLmRlZmluZWQoImFycmF5IixlKSxuPUYobiwwKSxmLnBhY2sodC5fcmFkaWksZSxuKSxlfSxqLnVucGFjaz1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhcnJheSIsdCksZT1GKGUsMCk7Y29uc3Qgcj1mLnVucGFjayh0LGUpO3JldHVybiBqLmZyb21DYXJ0ZXNpYW4zKHIsbil9LGoucHJvdG90eXBlLmdlb2NlbnRyaWNTdXJmYWNlTm9ybWFsPWYubm9ybWFsaXplLGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIix0KTtjb25zdCBuPXQubG9uZ2l0dWRlLHI9dC5sYXRpdHVkZSxpPU1hdGguY29zKHIpLG89aSpNYXRoLmNvcyhuKSxzPWkqTWF0aC5zaW4obiksdT1NYXRoLnNpbihyKTtyZXR1cm4gcChlKXx8KGU9bmV3IGYpLGUueD1vLGUueT1zLGUuej11LGYubm9ybWFsaXplKGUsZSl9LGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbD1mdW5jdGlvbih0LGUpe2lmKCFmLmVxdWFsc0Vwc2lsb24odCxmLlpFUk8sUi5FUFNJTE9OMTQpKXJldHVybiBwKGUpfHwoZT1uZXcgZiksZT1mLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsZSksZi5ub3JtYWxpemUoZSxlKX07Y29uc3QgUm89bmV3IGYseG89bmV3IGY7ai5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlKXtjb25zdCBuPVJvLHI9eG87dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWModCxuKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0aGlzLl9yYWRpaVNxdWFyZWQsbixyKTtjb25zdCBpPU1hdGguc3FydChmLmRvdChuLHIpKTtyZXR1cm4gZi5kaXZpZGVCeVNjYWxhcihyLGksciksZi5tdWx0aXBseUJ5U2NhbGFyKG4sdC5oZWlnaHQsbikscChlKXx8KGU9bmV3IGYpLGYuYWRkKHIsbixlKX0sai5wcm90b3R5cGUuY2FydG9ncmFwaGljQXJyYXlUb0NhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47cisrKWVbcl09dGhpcy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbih0W3JdLGVbcl0pO3JldHVybiBlfTtjb25zdCBPbz1uZXcgZixibz1uZXcgZixnbz1uZXcgZjtqLnByb3RvdHlwZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQsYm8pO2lmKCFwKG4pKXJldHVybjtjb25zdCByPXRoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4sT28pLGk9Zi5zdWJ0cmFjdCh0LG4sZ28pLG89TWF0aC5hdGFuMihyLnksci54KSxzPU1hdGguYXNpbihyLnopLHU9Ui5zaWduKGYuZG90KGksdCkpKmYubWFnbml0dWRlKGkpO3JldHVybiBwKGUpPyhlLmxvbmdpdHVkZT1vLGUubGF0aXR1ZGU9cyxlLmhlaWdodD11LGUpOm5ldyBIKG8scyx1KX0sai5wcm90b3R5cGUuY2FydGVzaWFuQXJyYXlUb0NhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47KytyKWVbcl09dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W3JdLGVbcl0pO3JldHVybiBlfSxqLnByb3RvdHlwZS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9yKHQsdGhpcy5fb25lT3ZlclJhZGlpLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKX0sai5wcm90b3R5cGUuc2NhbGVUb0dlb2NlbnRyaWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQueCxyPXQueSxpPXQueixvPXRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQscz0xL01hdGguc3FydChuKm4qby54K3IqcipvLnkraSppKm8ueik7cmV0dXJuIGYubXVsdGlwbHlCeVNjYWxhcih0LHMsZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgZiksZi5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWksZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uRnJvbVNjYWxlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAoZSl8fChlPW5ldyBmKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX3JhZGlpLGUpfSxqLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHxwKHQpJiZmLmVxdWFscyh0aGlzLl9yYWRpaSx0Ll9yYWRpaSl9LGoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpLnRvU3RyaW5nKCl9LGoucHJvdG90eXBlLmdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXM9ZnVuY3Rpb24odCxlLG4pe2lmKGgudHlwZU9mLm9iamVjdCgicG9zaXRpb24iLHQpLCFSLmVxdWFsc0Vwc2lsb24odGhpcy5fcmFkaWkueCx0aGlzLl9yYWRpaS55LFIuRVBTSUxPTjE1KSl0aHJvdyBuZXcgeCgiRWxsaXBzb2lkIG11c3QgYmUgYW4gZWxsaXBzb2lkIG9mIHJldm9sdXRpb24gKHJhZGlpLnggPT0gcmFkaWkueSkiKTtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW4oIkVsbGlwc29pZC5yYWRpaS56Iix0aGlzLl9yYWRpaS56LDApLGU9RihlLDApO2NvbnN0IHI9dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYocChuKXx8KG49bmV3IGYpLG4ueD0wLG4ueT0wLG4uej10LnoqKDEtciksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LWUpKXJldHVybiBufTtjb25zdCBTbz1bLjE0ODg3NDMzODk4MTYzLC40MzMzOTUzOTQxMjkyNSwuNjc5NDA5NTY4Mjk5MDIsLjg2NTA2MzM2NjY4ODk4LC45NzM5MDY1Mjg1MTcxNywwXSxtbz1bLjI5NTUyNDIyNDcxNDc1LC4yNjkyNjY3MTkzMDk5OSwuMjE5MDg2MzYyNTE1OTgsLjE0OTQ1MTM0OTE1MDU4LC4wNjY2NzEzNDQzMDg2ODQsMF07ZnVuY3Rpb24gZ3IodCxlLG4pe2gudHlwZU9mLm51bWJlcigiYSIsdCksaC50eXBlT2YubnVtYmVyKCJiIixlKSxoLnR5cGVPZi5mdW5jKCJmdW5jIixuKTtjb25zdCByPS41KihlK3QpLGk9LjUqKGUtdCk7bGV0IG89MDtmb3IobGV0IHM9MDtzPDU7cysrKXtjb25zdCB1PWkqU29bc107bys9bW9bc10qKG4ocit1KStuKHItdSkpfXJldHVybiBvKj1pLG99ai5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24odCl7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2NvbnN0IGU9dC53ZXN0O2xldCBuPXQuZWFzdDtjb25zdCByPXQuc291dGgsaT10Lm5vcnRoO2Zvcig7bjxlOyluKz1SLlRXT19QSTtjb25zdCBvPXRoaXMuX3JhZGlpU3F1YXJlZCxzPW8ueCx1PW8ueSxhPW8ueixsPXMqdTtyZXR1cm4gZ3IocixpLGZ1bmN0aW9uKGQpe2NvbnN0IF89TWF0aC5jb3MoZCksTz1NYXRoLnNpbihkKTtyZXR1cm4gTWF0aC5jb3MoZCkqZ3IoZSxuLGZ1bmN0aW9uKGIpe2NvbnN0IEk9TWF0aC5jb3MoYiksUz1NYXRoLnNpbihiKTtyZXR1cm4gTWF0aC5zcXJ0KGwqTypPK2EqKHUqSSpJK3MqUypTKSpfKl8pfSl9KX07ZnVuY3Rpb24gTih0LGUsbixyKXt0aGlzLndlc3Q9Rih0LDApLHRoaXMuc291dGg9RihlLDApLHRoaXMuZWFzdD1GKG4sMCksdGhpcy5ub3J0aD1GKHIsMCl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTi5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTi5jb21wdXRlV2lkdGgodGhpcyl9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBOLmNvbXB1dGVIZWlnaHQodGhpcyl9fX0pLE4ucGFja2VkTGVuZ3RoPTQsTi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1GKG4sMCksZVtuKytdPXQud2VzdCxlW24rK109dC5zb3V0aCxlW24rK109dC5lYXN0LGVbbl09dC5ub3J0aCxlfSxOLnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguZGVmaW5lZCgiYXJyYXkiLHQpLGU9RihlLDApLHAobil8fChuPW5ldyBOKSxuLndlc3Q9dFtlKytdLG4uc291dGg9dFtlKytdLG4uZWFzdD10W2UrK10sbi5ub3J0aD10W2VdLG59LE4uY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgZT10LmVhc3Q7Y29uc3Qgbj10Lndlc3Q7cmV0dXJuIGU8biYmKGUrPVIuVFdPX1BJKSxlLW59LE4uY29tcHV0ZUhlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHQubm9ydGgtdC5zb3V0aH0sTi5mcm9tRGVncmVlcz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0PVIudG9SYWRpYW5zKEYodCwwKSksZT1SLnRvUmFkaWFucyhGKGUsMCkpLG49Ui50b1JhZGlhbnMoRihuLDApKSxyPVIudG9SYWRpYW5zKEYociwwKSkscChpKT8oaS53ZXN0PXQsaS5zb3V0aD1lLGkuZWFzdD1uLGkubm9ydGg9cixpKTpuZXcgTih0LGUsbixyKX0sTi5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBwKGkpPyhpLndlc3Q9Rih0LDApLGkuc291dGg9RihlLDApLGkuZWFzdD1GKG4sMCksaS5ub3J0aD1GKHIsMCksaSk6bmV3IE4odCxlLG4scil9LE4uZnJvbUNhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtsZXQgbj1OdW1iZXIuTUFYX1ZBTFVFLHI9LU51bWJlci5NQVhfVkFMVUUsaT1OdW1iZXIuTUFYX1ZBTFVFLG89LU51bWJlci5NQVhfVkFMVUUscz1OdW1iZXIuTUFYX1ZBTFVFLHU9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBhPTAsbD10Lmxlbmd0aDthPGw7YSsrKXtjb25zdCBkPXRbYV07bj1NYXRoLm1pbihuLGQubG9uZ2l0dWRlKSxyPU1hdGgubWF4KHIsZC5sb25naXR1ZGUpLHM9TWF0aC5taW4ocyxkLmxhdGl0dWRlKSx1PU1hdGgubWF4KHUsZC5sYXRpdHVkZSk7Y29uc3QgXz1kLmxvbmdpdHVkZT49MD9kLmxvbmdpdHVkZTpkLmxvbmdpdHVkZStSLlRXT19QSTtpPU1hdGgubWluKGksXyksbz1NYXRoLm1heChvLF8pfXJldHVybiByLW4+by1pJiYobj1pLHI9byxyPlIuUEkmJihyPXItUi5UV09fUEkpLG4+Ui5QSSYmKG49bi1SLlRXT19QSSkpLHAoZSk/KGUud2VzdD1uLGUuc291dGg9cyxlLmVhc3Q9cixlLm5vcnRoPXUsZSk6bmV3IE4obixzLHIsdSl9LE4uZnJvbUNhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSxuKXtoLmRlZmluZWQoImNhcnRlc2lhbnMiLHQpLGU9RihlLGouV0dTODQpO2xldCByPU51bWJlci5NQVhfVkFMVUUsaT0tTnVtYmVyLk1BWF9WQUxVRSxvPU51bWJlci5NQVhfVkFMVUUscz0tTnVtYmVyLk1BWF9WQUxVRSx1PU51bWJlci5NQVhfVkFMVUUsYT0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IGw9MCxkPXQubGVuZ3RoO2w8ZDtsKyspe2NvbnN0IF89ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W2xdKTtyPU1hdGgubWluKHIsXy5sb25naXR1ZGUpLGk9TWF0aC5tYXgoaSxfLmxvbmdpdHVkZSksdT1NYXRoLm1pbih1LF8ubGF0aXR1ZGUpLGE9TWF0aC5tYXgoYSxfLmxhdGl0dWRlKTtjb25zdCBPPV8ubG9uZ2l0dWRlPj0wP18ubG9uZ2l0dWRlOl8ubG9uZ2l0dWRlK1IuVFdPX1BJO289TWF0aC5taW4obyxPKSxzPU1hdGgubWF4KHMsTyl9cmV0dXJuIGktcj5zLW8mJihyPW8saT1zLGk+Ui5QSSYmKGk9aS1SLlRXT19QSSkscj5SLlBJJiYocj1yLVIuVFdPX1BJKSkscChuKT8obi53ZXN0PXIsbi5zb3V0aD11LG4uZWFzdD1pLG4ubm9ydGg9YSxuKTpuZXcgTihyLHUsaSxhKX0sTi5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUud2VzdD10Lndlc3QsZS5zb3V0aD10LnNvdXRoLGUuZWFzdD10LmVhc3QsZS5ub3J0aD10Lm5vcnRoLGUpOm5ldyBOKHQud2VzdCx0LnNvdXRoLHQuZWFzdCx0Lm5vcnRoKX0sTi5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj1GKG4sMCksdD09PWV8fHAodCkmJnAoZSkmJk1hdGguYWJzKHQud2VzdC1lLndlc3QpPD1uJiZNYXRoLmFicyh0LnNvdXRoLWUuc291dGgpPD1uJiZNYXRoLmFicyh0LmVhc3QtZS5lYXN0KTw9biYmTWF0aC5hYnModC5ub3J0aC1lLm5vcnRoKTw9bn0sTi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIE4uY2xvbmUodGhpcyx0KX0sTi5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBOLmVxdWFscyh0aGlzLHQpfSxOLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC53ZXN0PT09ZS53ZXN0JiZ0LnNvdXRoPT09ZS5zb3V0aCYmdC5lYXN0PT09ZS5lYXN0JiZ0Lm5vcnRoPT09ZS5ub3J0aH0sTi5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBOLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfSxOLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtjb25zdCBlPXQubm9ydGg7aC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoIixlLC1SLlBJX09WRVJfVFdPKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGgiLGUsUi5QSV9PVkVSX1RXTyk7Y29uc3Qgbj10LnNvdXRoO2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJzb3V0aCIsbiwtUi5QSV9PVkVSX1RXTyksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoIixuLFIuUElfT1ZFUl9UV08pO2NvbnN0IHI9dC53ZXN0O2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ3ZXN0IixyLC1NYXRoLlBJKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygid2VzdCIscixNYXRoLlBJKTtjb25zdCBpPXQuZWFzdDtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdCIsaSwtTWF0aC5QSSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3QiLGksTWF0aC5QSSl9LE4uc291dGh3ZXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10Lndlc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC53ZXN0LHQuc291dGgpfSxOLm5vcnRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBIKHQud2VzdCx0Lm5vcnRoKX0sTi5ub3J0aGVhc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHAoZSk/KGUubG9uZ2l0dWRlPXQuZWFzdCxlLmxhdGl0dWRlPXQubm9ydGgsZS5oZWlnaHQ9MCxlKTpuZXcgSCh0LmVhc3QsdC5ub3J0aCl9LE4uc291dGhlYXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10LmVhc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC5lYXN0LHQuc291dGgpfSxOLmNlbnRlcj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgbj10LmVhc3Q7Y29uc3Qgcj10Lndlc3Q7bjxyJiYobis9Ui5UV09fUEkpO2NvbnN0IGk9Ui5uZWdhdGl2ZVBpVG9QaSgocituKSouNSksbz0odC5zb3V0aCt0Lm5vcnRoKSouNTtyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9aSxlLmxhdGl0dWRlPW8sZS5oZWlnaHQ9MCxlKTpuZXcgSChpLG8pfSxOLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2xldCByPXQuZWFzdCxpPXQud2VzdCxvPWUuZWFzdCxzPWUud2VzdDtyPGkmJm8+MD9yKz1SLlRXT19QSTpvPHMmJnI+MCYmKG8rPVIuVFdPX1BJKSxyPGkmJnM8MD9zKz1SLlRXT19QSTpvPHMmJmk8MCYmKGkrPVIuVFdPX1BJKTtjb25zdCB1PVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgoaSxzKSksYT1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWluKHIsbykpO2lmKCh0Lndlc3Q8dC5lYXN0fHxlLndlc3Q8ZS5lYXN0KSYmYTw9dSlyZXR1cm47Y29uc3QgbD1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLGQ9TWF0aC5taW4odC5ub3J0aCxlLm5vcnRoKTtpZighKGw+PWQpKXJldHVybiBwKG4pPyhuLndlc3Q9dSxuLnNvdXRoPWwsbi5lYXN0PWEsbi5ub3J0aD1kLG4pOm5ldyBOKHUsbCxhLGQpfSxOLnNpbXBsZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2NvbnN0IHI9TWF0aC5tYXgodC53ZXN0LGUud2VzdCksaT1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLG89TWF0aC5taW4odC5lYXN0LGUuZWFzdCkscz1NYXRoLm1pbih0Lm5vcnRoLGUubm9ydGgpO2lmKCEoaT49c3x8cj49bykpcmV0dXJuIHAobik/KG4ud2VzdD1yLG4uc291dGg9aSxuLmVhc3Q9byxuLm5vcnRoPXMsbik6bmV3IE4ocixpLG8scyl9LE4udW5pb249ZnVuY3Rpb24odCxlLG4pe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxoLnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKSxwKG4pfHwobj1uZXcgTik7bGV0IHI9dC5lYXN0LGk9dC53ZXN0LG89ZS5lYXN0LHM9ZS53ZXN0O3I8aSYmbz4wP3IrPVIuVFdPX1BJOm88cyYmcj4wJiYobys9Ui5UV09fUEkpLHI8aSYmczwwP3MrPVIuVFdPX1BJOm88cyYmaTwwJiYoaSs9Ui5UV09fUEkpO2NvbnN0IHU9Ui5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihpLHMpKSxhPVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgocixvKSk7cmV0dXJuIG4ud2VzdD11LG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLnNvdXRoKSxuLmVhc3Q9YSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5ub3J0aCksbn0sTi5leHBhbmQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpLHAobil8fChuPW5ldyBOKSxuLndlc3Q9TWF0aC5taW4odC53ZXN0LGUubG9uZ2l0dWRlKSxuLnNvdXRoPU1hdGgubWluKHQuc291dGgsZS5sYXRpdHVkZSksbi5lYXN0PU1hdGgubWF4KHQuZWFzdCxlLmxvbmdpdHVkZSksbi5ub3J0aD1NYXRoLm1heCh0Lm5vcnRoLGUubGF0aXR1ZGUpLG59LE4uY29udGFpbnM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpO2xldCBuPWUubG9uZ2l0dWRlO2NvbnN0IHI9ZS5sYXRpdHVkZSxpPXQud2VzdDtsZXQgbz10LmVhc3Q7cmV0dXJuIG88aSYmKG8rPVIuVFdPX1BJLG48MCYmKG4rPVIuVFdPX1BJKSksKG4+aXx8Ui5lcXVhbHNFcHNpbG9uKG4saSxSLkVQU0lMT04xNCkpJiYobjxvfHxSLmVxdWFsc0Vwc2lsb24obixvLFIuRVBTSUxPTjE0KSkmJnI+PXQuc291dGgmJnI8PXQubm9ydGh9O2NvbnN0IEZvPW5ldyBIO04uc3Vic2FtcGxlPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxlPUYoZSxqLldHUzg0KSxuPUYobiwwKSxwKHIpfHwocj1bXSk7bGV0IGk9MDtjb25zdCBvPXQubm9ydGgscz10LnNvdXRoLHU9dC5lYXN0LGE9dC53ZXN0LGw9Rm87bC5oZWlnaHQ9bixsLmxvbmdpdHVkZT1hLGwubGF0aXR1ZGU9byxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sYXRpdHVkZT1zLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxsLmxvbmdpdHVkZT1hLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxvPDA/bC5sYXRpdHVkZT1vOnM+MD9sLmxhdGl0dWRlPXM6bC5sYXRpdHVkZT0wO2ZvcihsZXQgZD0xO2Q8ODsrK2QpbC5sb25naXR1ZGU9LU1hdGguUEkrZCpSLlBJX09WRVJfVFdPLE4uY29udGFpbnModCxsKSYmKHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyk7cmV0dXJuIGwubGF0aXR1ZGU9PT0wJiYobC5sb25naXR1ZGU9YSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyspLHIubGVuZ3RoPWkscn0sTi5zdWJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtpZihoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGhMZXJwIixuLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4sMSksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImVhc3RMZXJwIixyLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0TGVycCIsciwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibm9ydGhMZXJwIixpLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLGksMSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLHIpLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4saSkscChvKXx8KG89bmV3IE4pLHQud2VzdDw9dC5lYXN0KXtjb25zdCB1PXQuZWFzdC10Lndlc3Q7by53ZXN0PXQud2VzdCtlKnUsby5lYXN0PXQud2VzdCtyKnV9ZWxzZXtjb25zdCB1PVIuVFdPX1BJK3QuZWFzdC10Lndlc3Q7by53ZXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K2UqdSksby5lYXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K3IqdSl9Y29uc3Qgcz10Lm5vcnRoLXQuc291dGg7cmV0dXJuIG8uc291dGg9dC5zb3V0aCtuKnMsby5ub3J0aD10LnNvdXRoK2kqcyxlPT09MSYmKG8ud2VzdD10LmVhc3QpLHI9PT0xJiYoby5lYXN0PXQuZWFzdCksbj09PTEmJihvLnNvdXRoPXQubm9ydGgpLGk9PT0xJiYoby5ub3J0aD10Lm5vcnRoKSxvfSxOLk1BWF9WQUxVRT1PYmplY3QuZnJlZXplKG5ldyBOKC1NYXRoLlBJLC1SLlBJX09WRVJfVFdPLE1hdGguUEksUi5QSV9PVkVSX1RXTykpO3ZhciBTcj1PYmplY3QuZnJlZXplKHtERVBUSF9CVUZGRVJfQklUOjI1NixTVEVOQ0lMX0JVRkZFUl9CSVQ6MTAyNCxDT0xPUl9CVUZGRVJfQklUOjE2Mzg0LFBPSU5UUzowLExJTkVTOjEsTElORV9MT09QOjIsTElORV9TVFJJUDozLFRSSUFOR0xFUzo0LFRSSUFOR0xFX1NUUklQOjUsVFJJQU5HTEVfRkFOOjYsWkVSTzowLE9ORToxLFNSQ19DT0xPUjo3NjgsT05FX01JTlVTX1NSQ19DT0xPUjo3NjksU1JDX0FMUEhBOjc3MCxPTkVfTUlOVVNfU1JDX0FMUEhBOjc3MSxEU1RfQUxQSEE6NzcyLE9ORV9NSU5VU19EU1RfQUxQSEE6NzczLERTVF9DT0xPUjo3NzQsT05FX01JTlVTX0RTVF9DT0xPUjo3NzUsU1JDX0FMUEhBX1NBVFVSQVRFOjc3NixGVU5DX0FERDozMjc3NCxCTEVORF9FUVVBVElPTjozMjc3NyxCTEVORF9FUVVBVElPTl9SR0I6MzI3NzcsQkxFTkRfRVFVQVRJT05fQUxQSEE6MzQ4NzcsRlVOQ19TVUJUUkFDVDozMjc3OCxGVU5DX1JFVkVSU0VfU1VCVFJBQ1Q6MzI3NzksQkxFTkRfRFNUX1JHQjozMjk2OCxCTEVORF9TUkNfUkdCOjMyOTY5LEJMRU5EX0RTVF9BTFBIQTozMjk3MCxCTEVORF9TUkNfQUxQSEE6MzI5NzEsQ09OU1RBTlRfQ09MT1I6MzI3NjksT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOjMyNzcwLENPTlNUQU5UX0FMUEhBOjMyNzcxLE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQTozMjc3MixCTEVORF9DT0xPUjozMjc3MyxBUlJBWV9CVUZGRVI6MzQ5NjIsRUxFTUVOVF9BUlJBWV9CVUZGRVI6MzQ5NjMsQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjQsRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORzozNDk2NSxTVFJFQU1fRFJBVzozNTA0MCxTVEFUSUNfRFJBVzozNTA0NCxEWU5BTUlDX0RSQVc6MzUwNDgsQlVGRkVSX1NJWkU6MzQ2NjAsQlVGRkVSX1VTQUdFOjM0NjYxLENVUlJFTlRfVkVSVEVYX0FUVFJJQjozNDM0MixGUk9OVDoxMDI4LEJBQ0s6MTAyOSxGUk9OVF9BTkRfQkFDSzoxMDMyLENVTExfRkFDRToyODg0LEJMRU5EOjMwNDIsRElUSEVSOjMwMjQsU1RFTkNJTF9URVNUOjI5NjAsREVQVEhfVEVTVDoyOTI5LFNDSVNTT1JfVEVTVDozMDg5LFBPTFlHT05fT0ZGU0VUX0ZJTEw6MzI4MjMsU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOjMyOTI2LFNBTVBMRV9DT1ZFUkFHRTozMjkyOCxOT19FUlJPUjowLElOVkFMSURfRU5VTToxMjgwLElOVkFMSURfVkFMVUU6MTI4MSxJTlZBTElEX09QRVJBVElPTjoxMjgyLE9VVF9PRl9NRU1PUlk6MTI4NSxDVzoyMzA0LENDVzoyMzA1LExJTkVfV0lEVEg6Mjg0OSxBTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6MzM5MDEsQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOjMzOTAyLENVTExfRkFDRV9NT0RFOjI4ODUsRlJPTlRfRkFDRToyODg2LERFUFRIX1JBTkdFOjI5MjgsREVQVEhfV1JJVEVNQVNLOjI5MzAsREVQVEhfQ0xFQVJfVkFMVUU6MjkzMSxERVBUSF9GVU5DOjI5MzIsU1RFTkNJTF9DTEVBUl9WQUxVRToyOTYxLFNURU5DSUxfRlVOQzoyOTYyLFNURU5DSUxfRkFJTDoyOTY0LFNURU5DSUxfUEFTU19ERVBUSF9GQUlMOjI5NjUsU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1M6Mjk2NixTVEVOQ0lMX1JFRjoyOTY3LFNURU5DSUxfVkFMVUVfTUFTSzoyOTYzLFNURU5DSUxfV1JJVEVNQVNLOjI5NjgsU1RFTkNJTF9CQUNLX0ZVTkM6MzQ4MTYsU1RFTkNJTF9CQUNLX0ZBSUw6MzQ4MTcsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTDozNDgxOCxTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTOjM0ODE5LFNURU5DSUxfQkFDS19SRUY6MzYwMDMsU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0s6MzYwMDQsU1RFTkNJTF9CQUNLX1dSSVRFTUFTSzozNjAwNSxWSUVXUE9SVDoyOTc4LFNDSVNTT1JfQk9YOjMwODgsQ09MT1JfQ0xFQVJfVkFMVUU6MzEwNixDT0xPUl9XUklURU1BU0s6MzEwNyxVTlBBQ0tfQUxJR05NRU5UOjMzMTcsUEFDS19BTElHTk1FTlQ6MzMzMyxNQVhfVEVYVFVSRV9TSVpFOjMzNzksTUFYX1ZJRVdQT1JUX0RJTVM6MzM4NixTVUJQSVhFTF9CSVRTOjM0MDgsUkVEX0JJVFM6MzQxMCxHUkVFTl9CSVRTOjM0MTEsQkxVRV9CSVRTOjM0MTIsQUxQSEFfQklUUzozNDEzLERFUFRIX0JJVFM6MzQxNCxTVEVOQ0lMX0JJVFM6MzQxNSxQT0xZR09OX09GRlNFVF9VTklUUzoxMDc1MixQT0xZR09OX09GRlNFVF9GQUNUT1I6MzI4MjQsVEVYVFVSRV9CSU5ESU5HXzJEOjMyODczLFNBTVBMRV9CVUZGRVJTOjMyOTM2LFNBTVBMRVM6MzI5MzcsU0FNUExFX0NPVkVSQUdFX1ZBTFVFOjMyOTM4LFNBTVBMRV9DT1ZFUkFHRV9JTlZFUlQ6MzI5MzksQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6MzQ0NjcsRE9OVF9DQVJFOjQzNTIsRkFTVEVTVDo0MzUzLE5JQ0VTVDo0MzU0LEdFTkVSQVRFX01JUE1BUF9ISU5UOjMzMTcwLEJZVEU6NTEyMCxVTlNJR05FRF9CWVRFOjUxMjEsU0hPUlQ6NTEyMixVTlNJR05FRF9TSE9SVDo1MTIzLElOVDo1MTI0LFVOU0lHTkVEX0lOVDo1MTI1LEZMT0FUOjUxMjYsREVQVEhfQ09NUE9ORU5UOjY0MDIsQUxQSEE6NjQwNixSR0I6NjQwNyxSR0JBOjY0MDgsTFVNSU5BTkNFOjY0MDksTFVNSU5BTkNFX0FMUEhBOjY0MTAsVU5TSUdORURfU0hPUlRfNF80XzRfNDozMjgxOSxVTlNJR05FRF9TSE9SVF81XzVfNV8xOjMyODIwLFVOU0lHTkVEX1NIT1JUXzVfNl81OjMzNjM1LEZSQUdNRU5UX1NIQURFUjozNTYzMixWRVJURVhfU0hBREVSOjM1NjMzLE1BWF9WRVJURVhfQVRUUklCUzozNDkyMSxNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzozNjM0NyxNQVhfVkFSWUlOR19WRUNUT1JTOjM2MzQ4LE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOjM1NjYxLE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MCxNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNDkzMCxNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTOjM2MzQ5LFNIQURFUl9UWVBFOjM1NjYzLERFTEVURV9TVEFUVVM6MzU3MTIsTElOS19TVEFUVVM6MzU3MTQsVkFMSURBVEVfU1RBVFVTOjM1NzE1LEFUVEFDSEVEX1NIQURFUlM6MzU3MTcsQUNUSVZFX1VOSUZPUk1TOjM1NzE4LEFDVElWRV9BVFRSSUJVVEVTOjM1NzIxLFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjozNTcyNCxDVVJSRU5UX1BST0dSQU06MzU3MjUsTkVWRVI6NTEyLExFU1M6NTEzLEVRVUFMOjUxNCxMRVFVQUw6NTE1LEdSRUFURVI6NTE2LE5PVEVRVUFMOjUxNyxHRVFVQUw6NTE4LEFMV0FZUzo1MTksS0VFUDo3NjgwLFJFUExBQ0U6NzY4MSxJTkNSOjc2ODIsREVDUjo3NjgzLElOVkVSVDo1Mzg2LElOQ1JfV1JBUDozNDA1NSxERUNSX1dSQVA6MzQwNTYsVkVORE9SOjc5MzYsUkVOREVSRVI6NzkzNyxWRVJTSU9OOjc5MzgsTkVBUkVTVDo5NzI4LExJTkVBUjo5NzI5LE5FQVJFU1RfTUlQTUFQX05FQVJFU1Q6OTk4NCxMSU5FQVJfTUlQTUFQX05FQVJFU1Q6OTk4NSxORUFSRVNUX01JUE1BUF9MSU5FQVI6OTk4NixMSU5FQVJfTUlQTUFQX0xJTkVBUjo5OTg3LFRFWFRVUkVfTUFHX0ZJTFRFUjoxMDI0MCxURVhUVVJFX01JTl9GSUxURVI6MTAyNDEsVEVYVFVSRV9XUkFQX1M6MTAyNDIsVEVYVFVSRV9XUkFQX1Q6MTAyNDMsVEVYVFVSRV8yRDozNTUzLFRFWFRVUkU6NTg5MCxURVhUVVJFX0NVQkVfTUFQOjM0MDY3LFRFWFRVUkVfQklORElOR19DVUJFX01BUDozNDA2OCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6MzQwNjksVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOjM0MDcwLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWTozNDA3MSxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6MzQwNzIsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOjM0MDczLFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjozNDA3NCxNQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOjM0MDc2LFRFWFRVUkUwOjMzOTg0LFRFWFRVUkUxOjMzOTg1LFRFWFRVUkUyOjMzOTg2LFRFWFRVUkUzOjMzOTg3LFRFWFRVUkU0OjMzOTg4LFRFWFRVUkU1OjMzOTg5LFRFWFRVUkU2OjMzOTkwLFRFWFRVUkU3OjMzOTkxLFRFWFRVUkU4OjMzOTkyLFRFWFRVUkU5OjMzOTkzLFRFWFRVUkUxMDozMzk5NCxURVhUVVJFMTE6MzM5OTUsVEVYVFVSRTEyOjMzOTk2LFRFWFRVUkUxMzozMzk5NyxURVhUVVJFMTQ6MzM5OTgsVEVYVFVSRTE1OjMzOTk5LFRFWFRVUkUxNjozNGUzLFRFWFRVUkUxNzozNDAwMSxURVhUVVJFMTg6MzQwMDIsVEVYVFVSRTE5OjM0MDAzLFRFWFRVUkUyMDozNDAwNCxURVhUVVJFMjE6MzQwMDUsVEVYVFVSRTIyOjM0MDA2LFRFWFRVUkUyMzozNDAwNyxURVhUVVJFMjQ6MzQwMDgsVEVYVFVSRTI1OjM0MDA5LFRFWFRVUkUyNjozNDAxMCxURVhUVVJFMjc6MzQwMTEsVEVYVFVSRTI4OjM0MDEyLFRFWFRVUkUyOTozNDAxMyxURVhUVVJFMzA6MzQwMTQsVEVYVFVSRTMxOjM0MDE1LEFDVElWRV9URVhUVVJFOjM0MDE2LFJFUEVBVDoxMDQ5NyxDTEFNUF9UT19FREdFOjMzMDcxLE1JUlJPUkVEX1JFUEVBVDozMzY0OCxGTE9BVF9WRUMyOjM1NjY0LEZMT0FUX1ZFQzM6MzU2NjUsRkxPQVRfVkVDNDozNTY2NixJTlRfVkVDMjozNTY2NyxJTlRfVkVDMzozNTY2OCxJTlRfVkVDNDozNTY2OSxCT09MOjM1NjcwLEJPT0xfVkVDMjozNTY3MSxCT09MX1ZFQzM6MzU2NzIsQk9PTF9WRUM0OjM1NjczLEZMT0FUX01BVDI6MzU2NzQsRkxPQVRfTUFUMzozNTY3NSxGTE9BVF9NQVQ0OjM1Njc2LFNBTVBMRVJfMkQ6MzU2NzgsU0FNUExFUl9DVUJFOjM1NjgwLFZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDozNDMzOCxWRVJURVhfQVRUUklCX0FSUkFZX1NJWkU6MzQzMzksVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREU6MzQzNDAsVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFOjM0MzQxLFZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDozNDkyMixWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVI6MzQzNzMsVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORzozNDk3NSxJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6MzU3MzgsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6MzU3MzksQ09NUElMRV9TVEFUVVM6MzU3MTMsTE9XX0ZMT0FUOjM2MzM2LE1FRElVTV9GTE9BVDozNjMzNyxISUdIX0ZMT0FUOjM2MzM4LExPV19JTlQ6MzYzMzksTUVESVVNX0lOVDozNjM0MCxISUdIX0lOVDozNjM0MSxGUkFNRUJVRkZFUjozNjE2MCxSRU5ERVJCVUZGRVI6MzYxNjEsUkdCQTQ6MzI4NTQsUkdCNV9BMTozMjg1NSxSR0I1NjU6MzYxOTQsREVQVEhfQ09NUE9ORU5UMTY6MzMxODksU1RFTkNJTF9JTkRFWDo2NDAxLFNURU5DSUxfSU5ERVg4OjM2MTY4LERFUFRIX1NURU5DSUw6MzQwNDEsUkVOREVSQlVGRkVSX1dJRFRIOjM2MTYyLFJFTkRFUkJVRkZFUl9IRUlHSFQ6MzYxNjMsUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVDozNjE2NCxSRU5ERVJCVUZGRVJfUkVEX1NJWkU6MzYxNzYsUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU6MzYxNzcsUkVOREVSQlVGRkVSX0JMVUVfU0laRTozNjE3OCxSRU5ERVJCVUZGRVJfQUxQSEFfU0laRTozNjE3OSxSRU5ERVJCVUZGRVJfREVQVEhfU0laRTozNjE4MCxSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFOjM2MTgxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6MzYwNDgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRTozNjA0OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUw6MzYwNTAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6MzYwNTEsQ09MT1JfQVRUQUNITUVOVDA6MzYwNjQsREVQVEhfQVRUQUNITUVOVDozNjA5NixTVEVOQ0lMX0FUVEFDSE1FTlQ6MzYxMjgsREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOjMzMzA2LE5PTkU6MCxGUkFNRUJVRkZFUl9DT01QTEVURTozNjA1MyxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6MzYwNTQsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6MzYwNTUsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOjM2MDU3LEZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOjM2MDYxLEZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVOREVSQlVGRkVSX0JJTkRJTkc6MzYwMDcsTUFYX1JFTkRFUkJVRkZFUl9TSVpFOjM0MDI0LElOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOjEyODYsVU5QQUNLX0ZMSVBfWV9XRUJHTDozNzQ0MCxVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6Mzc0NDEsQ09OVEVYVF9MT1NUX1dFQkdMOjM3NDQyLFVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0w6Mzc0NDMsQlJPV1NFUl9ERUZBVUxUX1dFQkdMOjM3NDQ0LENPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6MzM3NzYsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6MzM3NzcsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6MzM3NzgsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6MzM3NzksQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRzozNTg0MCxDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOjM1ODQxLENPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HOjM1ODQyLENPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOjM1ODQzLENPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9XRUJHTDozNzgwOCxDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOjM2MTk2LENPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNOjM2NDkyLEhBTEZfRkxPQVRfT0VTOjM2MTkzLERPVUJMRTo1MTMwLFJFQURfQlVGRkVSOjMwNzQsVU5QQUNLX1JPV19MRU5HVEg6MzMxNCxVTlBBQ0tfU0tJUF9ST1dTOjMzMTUsVU5QQUNLX1NLSVBfUElYRUxTOjMzMTYsUEFDS19ST1dfTEVOR1RIOjMzMzAsUEFDS19TS0lQX1JPV1M6MzMzMSxQQUNLX1NLSVBfUElYRUxTOjMzMzIsQ09MT1I6NjE0NCxERVBUSDo2MTQ1LFNURU5DSUw6NjE0NixSRUQ6NjQwMyxSR0I4OjMyODQ5LFJHQkE4OjMyODU2LFJHQjEwX0EyOjMyODU3LFRFWFRVUkVfQklORElOR18zRDozMjg3NCxVTlBBQ0tfU0tJUF9JTUFHRVM6MzI4NzcsVU5QQUNLX0lNQUdFX0hFSUdIVDozMjg3OCxURVhUVVJFXzNEOjMyODc5LFRFWFRVUkVfV1JBUF9SOjMyODgyLE1BWF8zRF9URVhUVVJFX1NJWkU6MzI4ODMsVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWOjMzNjQwLE1BWF9FTEVNRU5UU19WRVJUSUNFUzozM2UzLE1BWF9FTEVNRU5UU19JTkRJQ0VTOjMzMDAxLFRFWFRVUkVfTUlOX0xPRDozMzA4MixURVhUVVJFX01BWF9MT0Q6MzMwODMsVEVYVFVSRV9CQVNFX0xFVkVMOjMzMDg0LFRFWFRVUkVfTUFYX0xFVkVMOjMzMDg1LE1JTjozMjc3NSxNQVg6MzI3NzYsREVQVEhfQ09NUE9ORU5UMjQ6MzMxOTAsTUFYX1RFWFRVUkVfTE9EX0JJQVM6MzQwNDUsVEVYVFVSRV9DT01QQVJFX01PREU6MzQ4OTIsVEVYVFVSRV9DT01QQVJFX0ZVTkM6MzQ4OTMsQ1VSUkVOVF9RVUVSWTozNDkxNyxRVUVSWV9SRVNVTFQ6MzQ5MTgsUVVFUllfUkVTVUxUX0FWQUlMQUJMRTozNDkxOSxTVFJFQU1fUkVBRDozNTA0MSxTVFJFQU1fQ09QWTozNTA0MixTVEFUSUNfUkVBRDozNTA0NSxTVEFUSUNfQ09QWTozNTA0NixEWU5BTUlDX1JFQUQ6MzUwNDksRFlOQU1JQ19DT1BZOjM1MDUwLE1BWF9EUkFXX0JVRkZFUlM6MzQ4NTIsRFJBV19CVUZGRVIwOjM0ODUzLERSQVdfQlVGRkVSMTozNDg1NCxEUkFXX0JVRkZFUjI6MzQ4NTUsRFJBV19CVUZGRVIzOjM0ODU2LERSQVdfQlVGRkVSNDozNDg1NyxEUkFXX0JVRkZFUjU6MzQ4NTgsRFJBV19CVUZGRVI2OjM0ODU5LERSQVdfQlVGRkVSNzozNDg2MCxEUkFXX0JVRkZFUjg6MzQ4NjEsRFJBV19CVUZGRVI5OjM0ODYyLERSQVdfQlVGRkVSMTA6MzQ4NjMsRFJBV19CVUZGRVIxMTozNDg2NCxEUkFXX0JVRkZFUjEyOjM0ODY1LERSQVdfQlVGRkVSMTM6MzQ4NjYsRFJBV19CVUZGRVIxNDozNDg2NyxEUkFXX0JVRkZFUjE1OjM0ODY4LE1BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTcsTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTgsU0FNUExFUl8zRDozNTY3OSxTQU1QTEVSXzJEX1NIQURPVzozNTY4MixGUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UOjM1NzIzLFBJWEVMX1BBQ0tfQlVGRkVSOjM1MDUxLFBJWEVMX1VOUEFDS19CVUZGRVI6MzUwNTIsUElYRUxfUEFDS19CVUZGRVJfQklORElORzozNTA1MyxQSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTUsRkxPQVRfTUFUMngzOjM1Njg1LEZMT0FUX01BVDJ4NDozNTY4NixGTE9BVF9NQVQzeDI6MzU2ODcsRkxPQVRfTUFUM3g0OjM1Njg4LEZMT0FUX01BVDR4MjozNTY4OSxGTE9BVF9NQVQ0eDM6MzU2OTAsU1JHQjozNTkwNCxTUkdCODozNTkwNSxTUkdCOF9BTFBIQTg6MzU5MDcsQ09NUEFSRV9SRUZfVE9fVEVYVFVSRTozNDg5NCxSR0JBMzJGOjM0ODM2LFJHQjMyRjozNDgzNyxSR0JBMTZGOjM0ODQyLFJHQjE2RjozNDg0MyxWRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVI6MzUwNjksTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTOjM1MDcxLE1JTl9QUk9HUkFNX1RFWEVMX09GRlNFVDozNTA3NixNQVhfUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzcsTUFYX1ZBUllJTkdfQ09NUE9ORU5UUzozNTY1OSxURVhUVVJFXzJEX0FSUkFZOjM1ODY2LFRFWFRVUkVfQklORElOR18yRF9BUlJBWTozNTg2OSxSMTFGX0cxMUZfQjEwRjozNTg5OCxVTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWOjM1ODk5LFJHQjlfRTU6MzU5MDEsVU5TSUdORURfSU5UXzVfOV85XzlfUkVWOjM1OTAyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERTozNTk2NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0NPTVBPTkVOVFM6MzU5NjgsVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTOjM1OTcxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQ6MzU5NzIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFOjM1OTczLFRSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU46MzU5NzYsUkFTVEVSSVpFUl9ESVNDQVJEOjM1OTc3LE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UUzozNTk3OCxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlM6MzU5NzksSU5URVJMRUFWRURfQVRUUklCUzozNTk4MCxTRVBBUkFURV9BVFRSSUJTOjM1OTgxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVI6MzU5ODIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HOjM1OTgzLFJHQkEzMlVJOjM2MjA4LFJHQjMyVUk6MzYyMDksUkdCQTE2VUk6MzYyMTQsUkdCMTZVSTozNjIxNSxSR0JBOFVJOjM2MjIwLFJHQjhVSTozNjIyMSxSR0JBMzJJOjM2MjI2LFJHQjMySTozNjIyNyxSR0JBMTZJOjM2MjMyLFJHQjE2STozNjIzMyxSR0JBOEk6MzYyMzgsUkdCOEk6MzYyMzksUkVEX0lOVEVHRVI6MzYyNDQsUkdCX0lOVEVHRVI6MzYyNDgsUkdCQV9JTlRFR0VSOjM2MjQ5LFNBTVBMRVJfMkRfQVJSQVk6MzYyODksU0FNUExFUl8yRF9BUlJBWV9TSEFET1c6MzYyOTIsU0FNUExFUl9DVUJFX1NIQURPVzozNjI5MyxVTlNJR05FRF9JTlRfVkVDMjozNjI5NCxVTlNJR05FRF9JTlRfVkVDMzozNjI5NSxVTlNJR05FRF9JTlRfVkVDNDozNjI5NixJTlRfU0FNUExFUl8yRDozNjI5OCxJTlRfU0FNUExFUl8zRDozNjI5OSxJTlRfU0FNUExFUl9DVUJFOjM2MzAwLElOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzAzLFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEOjM2MzA2LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzNEOjM2MzA3LFVOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkU6MzYzMDgsVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVk6MzYzMTEsREVQVEhfQ09NUE9ORU5UMzJGOjM2MDEyLERFUFRIMzJGX1NURU5DSUw4OjM2MDEzLEZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFVjozNjI2OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HOjMzMjk2LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEU6MzMyOTcsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRTozMzI5OCxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkU6MzMyOTksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkU6MzMzMDAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFOjMzMzAxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRTozMzMwMixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRTozMzMwMyxGUkFNRUJVRkZFUl9ERUZBVUxUOjMzMzA0LFVOU0lHTkVEX0lOVF8yNF84OjM0MDQyLERFUFRIMjRfU1RFTkNJTDg6MzUwNTYsVU5TSUdORURfTk9STUFMSVpFRDozNTg2MyxEUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVBRF9GUkFNRUJVRkZFUjozNjAwOCxEUkFXX0ZSQU1FQlVGRkVSOjM2MDA5LFJFQURfRlJBTUVCVUZGRVJfQklORElORzozNjAxMCxSRU5ERVJCVUZGRVJfU0FNUExFUzozNjAxMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVI6MzYwNTIsTUFYX0NPTE9SX0FUVEFDSE1FTlRTOjM2MDYzLENPTE9SX0FUVEFDSE1FTlQxOjM2MDY1LENPTE9SX0FUVEFDSE1FTlQyOjM2MDY2LENPTE9SX0FUVEFDSE1FTlQzOjM2MDY3LENPTE9SX0FUVEFDSE1FTlQ0OjM2MDY4LENPTE9SX0FUVEFDSE1FTlQ1OjM2MDY5LENPTE9SX0FUVEFDSE1FTlQ2OjM2MDcwLENPTE9SX0FUVEFDSE1FTlQ3OjM2MDcxLENPTE9SX0FUVEFDSE1FTlQ4OjM2MDcyLENPTE9SX0FUVEFDSE1FTlQ5OjM2MDczLENPTE9SX0FUVEFDSE1FTlQxMDozNjA3NCxDT0xPUl9BVFRBQ0hNRU5UMTE6MzYwNzUsQ09MT1JfQVRUQUNITUVOVDEyOjM2MDc2LENPTE9SX0FUVEFDSE1FTlQxMzozNjA3NyxDT0xPUl9BVFRBQ0hNRU5UMTQ6MzYwNzgsQ09MT1JfQVRUQUNITUVOVDE1OjM2MDc5LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEU6MzYxODIsTUFYX1NBTVBMRVM6MzYxODMsSEFMRl9GTE9BVDo1MTMxLFJHOjMzMzE5LFJHX0lOVEVHRVI6MzMzMjAsUjg6MzMzMjEsUkc4OjMzMzIzLFIxNkY6MzMzMjUsUjMyRjozMzMyNixSRzE2RjozMzMyNyxSRzMyRjozMzMyOCxSOEk6MzMzMjksUjhVSTozMzMzMCxSMTZJOjMzMzMxLFIxNlVJOjMzMzMyLFIzMkk6MzMzMzMsUjMyVUk6MzMzMzQsUkc4STozMzMzNSxSRzhVSTozMzMzNixSRzE2STozMzMzNyxSRzE2VUk6MzMzMzgsUkczMkk6MzMzMzksUkczMlVJOjMzMzQwLFZFUlRFWF9BUlJBWV9CSU5ESU5HOjM0MjI5LFI4X1NOT1JNOjM2NzU2LFJHOF9TTk9STTozNjc1NyxSR0I4X1NOT1JNOjM2NzU4LFJHQkE4X1NOT1JNOjM2NzU5LFNJR05FRF9OT1JNQUxJWkVEOjM2NzY0LENPUFlfUkVBRF9CVUZGRVI6MzY2NjIsQ09QWV9XUklURV9CVUZGRVI6MzY2NjMsQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSX0JJTkRJTkc6MzY2NjMsVU5JRk9STV9CVUZGRVI6MzUzNDUsVU5JRk9STV9CVUZGRVJfQklORElORzozNTM2OCxVTklGT1JNX0JVRkZFUl9TVEFSVDozNTM2OSxVTklGT1JNX0JVRkZFUl9TSVpFOjM1MzcwLE1BWF9WRVJURVhfVU5JRk9STV9CTE9DS1M6MzUzNzEsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTOjM1MzczLE1BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUzozNTM3NCxNQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1M6MzUzNzUsTUFYX1VOSUZPUk1fQkxPQ0tfU0laRTozNTM3NixNQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3NyxNQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1Mzc5LFVOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQ6MzUzODAsQUNUSVZFX1VOSUZPUk1fQkxPQ0tTOjM1MzgyLFVOSUZPUk1fVFlQRTozNTM4MyxVTklGT1JNX1NJWkU6MzUzODQsVU5JRk9STV9CTE9DS19JTkRFWDozNTM4NixVTklGT1JNX09GRlNFVDozNTM4NyxVTklGT1JNX0FSUkFZX1NUUklERTozNTM4OCxVTklGT1JNX01BVFJJWF9TVFJJREU6MzUzODksVU5JRk9STV9JU19ST1dfTUFKT1I6MzUzOTAsVU5JRk9STV9CTE9DS19CSU5ESU5HOjM1MzkxLFVOSUZPUk1fQkxPQ0tfREFUQV9TSVpFOjM1MzkyLFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TOjM1Mzk0LFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1fSU5ESUNFUzozNTM5NSxVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUjozNTM5NixVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSOjM1Mzk4LElOVkFMSURfSU5ERVg6NDI5NDk2NzI5NSxNQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTOjM3MTU0LE1BWF9GUkFHTUVOVF9JTlBVVF9DT01QT05FTlRTOjM3MTU3LE1BWF9TRVJWRVJfV0FJVF9USU1FT1VUOjM3MTM3LE9CSkVDVF9UWVBFOjM3MTM4LFNZTkNfQ09ORElUSU9OOjM3MTM5LFNZTkNfU1RBVFVTOjM3MTQwLFNZTkNfRkxBR1M6MzcxNDEsU1lOQ19GRU5DRTozNzE0MixTWU5DX0dQVV9DT01NQU5EU19DT01QTEVURTozNzE0MyxVTlNJR05BTEVEOjM3MTQ0LFNJR05BTEVEOjM3MTQ1LEFMUkVBRFlfU0lHTkFMRUQ6MzcxNDYsVElNRU9VVF9FWFBJUkVEOjM3MTQ3LENPTkRJVElPTl9TQVRJU0ZJRUQ6MzcxNDgsV0FJVF9GQUlMRUQ6MzcxNDksU1lOQ19GTFVTSF9DT01NQU5EU19CSVQ6MSxWRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1I6MzUwNzAsQU5ZX1NBTVBMRVNfUEFTU0VEOjM1ODg3LEFOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkU6MzYyMDIsU0FNUExFUl9CSU5ESU5HOjM1MDk3LFJHQjEwX0EyVUk6MzY5NzUsSU5UXzJfMTBfMTBfMTBfUkVWOjM2MjU1LFRSQU5TRk9STV9GRUVEQkFDSzozNjM4NixUUkFOU0ZPUk1fRkVFREJBQ0tfUEFVU0VEOjM2Mzg3LFRSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkU6MzYzODgsVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkc6MzYzODksQ09NUFJFU1NFRF9SMTFfRUFDOjM3NDg4LENPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUM6Mzc0ODksQ09NUFJFU1NFRF9SRzExX0VBQzozNzQ5MCxDT01QUkVTU0VEX1NJR05FRF9SRzExX0VBQzozNzQ5MSxDT01QUkVTU0VEX1JHQjhfRVRDMjozNzQ5MixDT01QUkVTU0VEX1NSR0I4X0VUQzI6Mzc0OTMsQ09NUFJFU1NFRF9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NCxDT01QUkVTU0VEX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NSxDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDOjM3NDk2LENPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDOjM3NDk3LFRFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVDozNzE2NyxNQVhfRUxFTUVOVF9JTkRFWDozNjIwMyxURVhUVVJFX0lNTVVUQUJMRV9MRVZFTFM6MzM1MDMsTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUOjM0MDQ3fSk7Y29uc3QgSmU9e0NMT0NLV0lTRTpTci5DVyxDT1VOVEVSX0NMT0NLV0lTRTpTci5DQ1d9O0plLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09SmUuQ0xPQ0tXSVNFfHx0PT09SmUuQ09VTlRFUl9DTE9DS1dJU0V9O3ZhciBnbj1PYmplY3QuZnJlZXplKEplKTtmdW5jdGlvbiBBdCh0KXt0aGlzLl9lbGxpcHNvaWQ9Rih0LGouV0dTODQpLHRoaXMuX3NlbWltYWpvckF4aXM9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsdGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXM9MS90aGlzLl9zZW1pbWFqb3JBeGlzfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KSxBdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBSLlBJX09WRVJfVFdPLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10KSl9LEF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGU9ZnVuY3Rpb24odCl7dD5BdC5NYXhpbXVtTGF0aXR1ZGU/dD1BdC5NYXhpbXVtTGF0aXR1ZGU6dDwtQXQuTWF4aW11bUxhdGl0dWRlJiYodD0tQXQuTWF4aW11bUxhdGl0dWRlKTtjb25zdCBlPU1hdGguc2luKHQpO3JldHVybiAuNSpNYXRoLmxvZygoMStlKS8oMS1lKSl9LEF0Lk1heGltdW1MYXRpdHVkZT1BdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlKE1hdGguUEkpLEF0LnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9zZW1pbWFqb3JBeGlzLHI9dC5sb25naXR1ZGUqbixpPUF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUodC5sYXRpdHVkZSkqbixvPXQuaGVpZ2h0O3JldHVybiBwKGUpPyhlLng9cixlLnk9aSxlLno9byxlKTpuZXcgZihyLGksbyl9LEF0LnByb3RvdHlwZS51bnByb2plY3Q9ZnVuY3Rpb24odCxlKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiY2FydGVzaWFuIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxyPXQueCpuLGk9QXQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZSh0Lnkqbiksbz10Lno7cmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPXIsZS5sYXRpdHVkZT1pLGUuaGVpZ2h0PW8sZSk6bmV3IEgocixpLG8pfTtjbGFzcyB3b3thZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19Y2xhc3MgSW97Y29uc3RydWN0b3IoZSl7dGhpcy5qc2VwPWUsdGhpcy5yZWdpc3RlcmVkPXt9fXJlZ2lzdGVyKC4uLmUpe2UuZm9yRWFjaChuPT57aWYodHlwZW9mIG4hPSJvYmplY3QifHwhbi5uYW1lfHwhbi5pbml0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBKU0VQIHBsdWdpbiBmb3JtYXQiKTt0aGlzLnJlZ2lzdGVyZWRbbi5uYW1lXXx8KG4uaW5pdCh0aGlzLmpzZXApLHRoaXMucmVnaXN0ZXJlZFtuLm5hbWVdPW4pfSl9fWNsYXNzIEV7c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjEuMy44In1zdGF0aWMgdG9TdHJpbmcoKXtyZXR1cm4iSmF2YVNjcmlwdCBFeHByZXNzaW9uIFBhcnNlciAoSlNFUCkgdiIrRS52ZXJzaW9ufXN0YXRpYyBhZGRVbmFyeU9wKGUpe3JldHVybiBFLm1heF91bm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF91bm9wX2xlbiksRS51bmFyeV9vcHNbZV09MSxFfXN0YXRpYyBhZGRCaW5hcnlPcChlLG4scil7cmV0dXJuIEUubWF4X2Jpbm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF9iaW5vcF9sZW4pLEUuYmluYXJ5X29wc1tlXT1uLHI/RS5yaWdodF9hc3NvY2lhdGl2ZS5hZGQoZSk6RS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSksRX1zdGF0aWMgYWRkSWRlbnRpZmllckNoYXIoZSl7cmV0dXJuIEUuYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzLmFkZChlKSxFfXN0YXRpYyBhZGRMaXRlcmFsKGUsbil7cmV0dXJuIEUubGl0ZXJhbHNbZV09bixFfXN0YXRpYyByZW1vdmVVbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS51bmFyeV9vcHNbZV0sZS5sZW5ndGg9PT1FLm1heF91bm9wX2xlbiYmKEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSksRX1zdGF0aWMgcmVtb3ZlQWxsVW5hcnlPcHMoKXtyZXR1cm4gRS51bmFyeV9vcHM9e30sRS5tYXhfdW5vcF9sZW49MCxFfXN0YXRpYyByZW1vdmVJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4gRS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUJpbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS5iaW5hcnlfb3BzW2VdLGUubGVuZ3RoPT09RS5tYXhfYmlub3BfbGVuJiYoRS5tYXhfYmlub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUuYmluYXJ5X29wcykpLEUucmlnaHRfYXNzb2NpYXRpdmUuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUFsbEJpbmFyeU9wcygpe3JldHVybiBFLmJpbmFyeV9vcHM9e30sRS5tYXhfYmlub3BfbGVuPTAsRX1zdGF0aWMgcmVtb3ZlTGl0ZXJhbChlKXtyZXR1cm4gZGVsZXRlIEUubGl0ZXJhbHNbZV0sRX1zdGF0aWMgcmVtb3ZlQWxsTGl0ZXJhbHMoKXtyZXR1cm4gRS5saXRlcmFscz17fSxFfWdldCBjaGFyKCl7cmV0dXJuIHRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCl9Z2V0IGNvZGUoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCl9Y29uc3RydWN0b3IoZSl7dGhpcy5leHByPWUsdGhpcy5pbmRleD0wfXN0YXRpYyBwYXJzZShlKXtyZXR1cm4gbmV3IEUoZSkucGFyc2UoKX1zdGF0aWMgZ2V0TWF4S2V5TGVuKGUpe3JldHVybiBNYXRoLm1heCgwLC4uLk9iamVjdC5rZXlzKGUpLm1hcChuPT5uLmxlbmd0aCkpfXN0YXRpYyBpc0RlY2ltYWxEaWdpdChlKXtyZXR1cm4gZT49NDgmJmU8PTU3fXN0YXRpYyBiaW5hcnlQcmVjZWRlbmNlKGUpe3JldHVybiBFLmJpbmFyeV9vcHNbZV18fDB9c3RhdGljIGlzSWRlbnRpZmllclN0YXJ0KGUpe3JldHVybiBlPj02NSYmZTw9OTB8fGU+PTk3JiZlPD0xMjJ8fGU+PTEyOCYmIUUuYmluYXJ5X29wc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGUpXXx8RS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuaGFzKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfXN0YXRpYyBpc0lkZW50aWZpZXJQYXJ0KGUpe3JldHVybiBFLmlzSWRlbnRpZmllclN0YXJ0KGUpfHxFLmlzRGVjaW1hbERpZ2l0KGUpfXRocm93RXJyb3IoZSl7Y29uc3Qgbj1uZXcgRXJyb3IoZSsiIGF0IGNoYXJhY3RlciAiK3RoaXMuaW5kZXgpO3Rocm93IG4uaW5kZXg9dGhpcy5pbmRleCxuLmRlc2NyaXB0aW9uPWUsbn1ydW5Ib29rKGUsbil7aWYoRS5ob29rc1tlXSl7Y29uc3Qgcj17Y29udGV4dDp0aGlzLG5vZGU6bn07cmV0dXJuIEUuaG9va3MucnVuKGUsciksci5ub2RlfXJldHVybiBufXNlYXJjaEhvb2soZSl7aWYoRS5ob29rc1tlXSl7Y29uc3Qgbj17Y29udGV4dDp0aGlzfTtyZXR1cm4gRS5ob29rc1tlXS5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNhbGwobi5jb250ZXh0LG4pLG4ubm9kZX0pLG4ubm9kZX19Z29iYmxlU3BhY2VzKCl7bGV0IGU9dGhpcy5jb2RlO2Zvcig7ZT09PUUuU1BBQ0VfQ09ERXx8ZT09PUUuVEFCX0NPREV8fGU9PT1FLkxGX0NPREV8fGU9PT1FLkNSX0NPREU7KWU9dGhpcy5leHByLmNoYXJDb2RlQXQoKyt0aGlzLmluZGV4KTt0aGlzLnJ1bkhvb2soImdvYmJsZS1zcGFjZXMiKX1wYXJzZSgpe3RoaXMucnVuSG9vaygiYmVmb3JlLWFsbCIpO2NvbnN0IGU9dGhpcy5nb2JibGVFeHByZXNzaW9ucygpLG49ZS5sZW5ndGg9PT0xP2VbMF06e3R5cGU6RS5DT01QT1VORCxib2R5OmV9O3JldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLWFsbCIsbil9Z29iYmxlRXhwcmVzc2lvbnMoZSl7bGV0IG49W10scixpO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOylpZihyPXRoaXMuY29kZSxyPT09RS5TRU1DT0xfQ09ERXx8cj09PUUuQ09NTUFfQ09ERSl0aGlzLmluZGV4Kys7ZWxzZSBpZihpPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpKW4ucHVzaChpKTtlbHNlIGlmKHRoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCl7aWYocj09PWUpYnJlYWs7dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpfXJldHVybiBufWdvYmJsZUV4cHJlc3Npb24oKXtjb25zdCBlPXRoaXMuc2VhcmNoSG9vaygiZ29iYmxlLWV4cHJlc3Npb24iKXx8dGhpcy5nb2JibGVCaW5hcnlFeHByZXNzaW9uKCk7cmV0dXJuIHRoaXMuZ29iYmxlU3BhY2VzKCksdGhpcy5ydW5Ib29rKCJhZnRlci1leHByZXNzaW9uIixlKX1nb2JibGVCaW5hcnlPcCgpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IGU9dGhpcy5leHByLnN1YnN0cih0aGlzLmluZGV4LEUubWF4X2Jpbm9wX2xlbiksbj1lLmxlbmd0aDtmb3IoO24+MDspe2lmKEUuYmluYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShlKSYmKCFFLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrZS5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIUUuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K2UubGVuZ3RoKSkpKXJldHVybiB0aGlzLmluZGV4Kz1uLGU7ZT1lLnN1YnN0cigwLC0tbil9cmV0dXJuITF9Z29iYmxlQmluYXJ5RXhwcmVzc2lvbigpe2xldCBlLG4scixpLG8scyx1LGEsbDtpZihzPXRoaXMuZ29iYmxlVG9rZW4oKSwhc3x8KG49dGhpcy5nb2JibGVCaW5hcnlPcCgpLCFuKSlyZXR1cm4gcztmb3Iobz17dmFsdWU6bixwcmVjOkUuYmluYXJ5UHJlY2VkZW5jZShuKSxyaWdodF9hOkUucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSx1PXRoaXMuZ29iYmxlVG9rZW4oKSx1fHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24gYWZ0ZXIgIituKSxpPVtzLG8sdV07bj10aGlzLmdvYmJsZUJpbmFyeU9wKCk7KXtpZihyPUUuYmluYXJ5UHJlY2VkZW5jZShuKSxyPT09MCl7dGhpcy5pbmRleC09bi5sZW5ndGg7YnJlYWt9bz17dmFsdWU6bixwcmVjOnIscmlnaHRfYTpFLnJpZ2h0X2Fzc29jaWF0aXZlLmhhcyhuKX0sbD1uO2NvbnN0IGQ9Xz0+by5yaWdodF9hJiZfLnJpZ2h0X2E/cj5fLnByZWM6cjw9Xy5wcmVjO2Zvcig7aS5sZW5ndGg+MiYmZChpW2kubGVuZ3RoLTJdKTspdT1pLnBvcCgpLG49aS5wb3AoKS52YWx1ZSxzPWkucG9wKCksZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6bixsZWZ0OnMscmlnaHQ6dX0saS5wdXNoKGUpO2U9dGhpcy5nb2JibGVUb2tlbigpLGV8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK2wpLGkucHVzaChvLGUpfWZvcihhPWkubGVuZ3RoLTEsZT1pW2FdO2E+MTspZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6aVthLTFdLnZhbHVlLGxlZnQ6aVthLTJdLHJpZ2h0OmV9LGEtPTI7cmV0dXJuIGV9Z29iYmxlVG9rZW4oKXtsZXQgZSxuLHIsaTtpZih0aGlzLmdvYmJsZVNwYWNlcygpLGk9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtdG9rZW4iKSxpKXJldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIixpKTtpZihlPXRoaXMuY29kZSxFLmlzRGVjaW1hbERpZ2l0KGUpfHxlPT09RS5QRVJJT0RfQ09ERSlyZXR1cm4gdGhpcy5nb2JibGVOdW1lcmljTGl0ZXJhbCgpO2lmKGU9PT1FLlNRVU9URV9DT0RFfHxlPT09RS5EUVVPVEVfQ09ERSlpPXRoaXMuZ29iYmxlU3RyaW5nTGl0ZXJhbCgpO2Vsc2UgaWYoZT09PUUuT0JSQUNLX0NPREUpaT10aGlzLmdvYmJsZUFycmF5KCk7ZWxzZXtmb3Iobj10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgsRS5tYXhfdW5vcF9sZW4pLHI9bi5sZW5ndGg7cj4wOyl7aWYoRS51bmFyeV9vcHMuaGFzT3duUHJvcGVydHkobikmJighRS5pc0lkZW50aWZpZXJTdGFydCh0aGlzLmNvZGUpfHx0aGlzLmluZGV4K24ubGVuZ3RoPHRoaXMuZXhwci5sZW5ndGgmJiFFLmlzSWRlbnRpZmllclBhcnQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCtuLmxlbmd0aCkpKSl7dGhpcy5pbmRleCs9cjtjb25zdCBvPXRoaXMuZ29iYmxlVG9rZW4oKTtyZXR1cm4gb3x8dGhpcy50aHJvd0Vycm9yKCJtaXNzaW5nIHVuYXJ5T3AgYXJndW1lbnQiKSx0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIix7dHlwZTpFLlVOQVJZX0VYUCxvcGVyYXRvcjpuLGFyZ3VtZW50Om8scHJlZml4OiEwfSl9bj1uLnN1YnN0cigwLC0tcil9RS5pc0lkZW50aWZpZXJTdGFydChlKT8oaT10aGlzLmdvYmJsZUlkZW50aWZpZXIoKSxFLmxpdGVyYWxzLmhhc093blByb3BlcnR5KGkubmFtZSk/aT17dHlwZTpFLkxJVEVSQUwsdmFsdWU6RS5saXRlcmFsc1tpLm5hbWVdLHJhdzppLm5hbWV9OmkubmFtZT09PUUudGhpc19zdHImJihpPXt0eXBlOkUuVEhJU19FWFB9KSk6ZT09PUUuT1BBUkVOX0NPREUmJihpPXRoaXMuZ29iYmxlR3JvdXAoKSl9cmV0dXJuIGk/KGk9dGhpcy5nb2JibGVUb2tlblByb3BlcnR5KGkpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpKTp0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIiwhMSl9Z29iYmxlVG9rZW5Qcm9wZXJ0eShlKXt0aGlzLmdvYmJsZVNwYWNlcygpO2xldCBuPXRoaXMuY29kZTtmb3IoO249PT1FLlBFUklPRF9DT0RFfHxuPT09RS5PQlJBQ0tfQ09ERXx8bj09PUUuT1BBUkVOX0NPREV8fG49PT1FLlFVTUFSS19DT0RFOyl7bGV0IHI7aWYobj09PUUuUVVNQVJLX0NPREUpe2lmKHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrMSkhPT1FLlBFUklPRF9DT0RFKWJyZWFrO3I9ITAsdGhpcy5pbmRleCs9Mix0aGlzLmdvYmJsZVNwYWNlcygpLG49dGhpcy5jb2RlfXRoaXMuaW5kZXgrKyxuPT09RS5PQlJBQ0tfQ09ERT8oZT17dHlwZTpFLk1FTUJFUl9FWFAsY29tcHV0ZWQ6ITAsb2JqZWN0OmUscHJvcGVydHk6dGhpcy5nb2JibGVFeHByZXNzaW9uKCl9LHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PUUuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PUUuT1BBUkVOX0NPREU/ZT17dHlwZTpFLkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT1FLlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6RS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDtFLmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT1FLlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7RS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUsRS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT1FLlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PUUuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6RS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOkUuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2ZvcihFLmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLEUuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTpFLklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT1FLkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09RS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PUUuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT1FLkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT1FLkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoRS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09RS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOkUuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTpFLkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNCUkFDS19DT0RFKX19fWNvbnN0IE5vPW5ldyB3bztPYmplY3QuYXNzaWduKEUse2hvb2tzOk5vLHBsdWdpbnM6bmV3IElvKEUpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiJiYiOjIsInwiOjMsIl4iOjQsIiYiOjUsIj09Ijo2LCIhPSI6NiwiPT09Ijo2LCIhPT0iOjYsIjwiOjcsIj4iOjcsIjw9Ijo3LCI+PSI6NywiPDwiOjgsIj4+Ijo4LCI+Pj4iOjgsIisiOjksIi0iOjksIioiOjEwLCIvIjoxMCwiJSI6MTB9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQsYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzOm5ldyBTZXQoWyIkIiwiXyJdKSxsaXRlcmFsczp7dHJ1ZTohMCxmYWxzZTohMSxudWxsOm51bGx9LHRoaXNfc3RyOiJ0aGlzIn0pLEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSxFLm1heF9iaW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS5iaW5hcnlfb3BzKTtjb25zdCBxdD10PT5uZXcgRSh0KS5wYXJzZSgpO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEUpLmZvckVhY2godD0+e3F0W3RdPT09dm9pZCAwJiZ0IT09InByb3RvdHlwZSImJihxdFt0XT1FW3RdKX0pLHF0LkpzZXA9RTtjb25zdCBNbz0iQ29uZGl0aW9uYWxFeHByZXNzaW9uIjt2YXIgQ289e25hbWU6InRlcm5hcnkiLGluaXQodCl7dC5ob29rcy5hZGQoImFmdGVyLWV4cHJlc3Npb24iLGZ1bmN0aW9uKG4pe2lmKG4ubm9kZSYmdGhpcy5jb2RlPT09dC5RVU1BUktfQ09ERSl7dGhpcy5pbmRleCsrO2NvbnN0IHI9bi5ub2RlLGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7aWYoaXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIiksdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLmNvZGU9PT10LkNPTE9OX0NPREUpe3RoaXMuaW5kZXgrKztjb25zdCBvPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpO2lmKG98fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiIpLG4ubm9kZT17dHlwZTpNbyx0ZXN0OnIsY29uc2VxdWVudDppLGFsdGVybmF0ZTpvfSxyLm9wZXJhdG9yJiZ0LmJpbmFyeV9vcHNbci5vcGVyYXRvcl08PS45KXtsZXQgcz1yO2Zvcig7cy5yaWdodC5vcGVyYXRvciYmdC5iaW5hcnlfb3BzW3MucmlnaHQub3BlcmF0b3JdPD0uOTspcz1zLnJpZ2h0O24ubm9kZS50ZXN0PXMucmlnaHQscy5yaWdodD1uLm5vZGUsbi5ub2RlPXJ9fWVsc2UgdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCA6Iil9fSl9fTtxdC5wbHVnaW5zLnJlZ2lzdGVyKENvKTtmdW5jdGlvbiBZdCh0KXtpZih0PUYodCxGLkVNUFRZX09CSkVDVCksdGhpcy5fZWxsaXBzb2lkPUYodC5lbGxpcHNvaWQsai5XR1M4NCksdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1g9Rih0Lm51bWJlck9mTGV2ZWxaZXJvVGlsZXNYLDEpLHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNZPUYodC5udW1iZXJPZkxldmVsWmVyb1RpbGVzWSwxKSx0aGlzLl9wcm9qZWN0aW9uPW5ldyBBdCh0aGlzLl9lbGxpcHNvaWQpLHAodC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycykmJnAodC5yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycykpdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnM9dC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycyx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz10LnJlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzO2Vsc2V7Y29uc3Qgcj10aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cypNYXRoLlBJO3RoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzPW5ldyBBKC1yLC1yKSx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz1uZXcgQShyLHIpfWNvbnN0IGU9dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMpLG49dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMpO3RoaXMuX3JlY3RhbmdsZT1uZXcgTihlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLG4ubG9uZ2l0dWRlLG4ubGF0aXR1ZGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFl0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX0scmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdGFuZ2xlfX0scHJvamVjdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2plY3Rpb259fX0pLFl0LnByb3RvdHlwZS5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNYPDx0fSxZdC5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWTw8dH0sWXQucHJvdG90eXBlLnJlY3RhbmdsZVRvTmF0aXZlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9wcm9qZWN0aW9uLHI9bi5wcm9qZWN0KE4uc291dGh3ZXN0KHQpKSxpPW4ucHJvamVjdChOLm5vcnRoZWFzdCh0KSk7cmV0dXJuIHAoZSk/KGUud2VzdD1yLngsZS5zb3V0aD1yLnksZS5lYXN0PWkueCxlLm5vcnRoPWkueSxlKTpuZXcgTihyLngsci55LGkueCxpLnkpfSxZdC5wcm90b3R5cGUudGlsZVhZVG9OYXRpdmVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChuKSxvPXRoaXMuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsKG4pLHM9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLngtdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCkvaSx1PXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngrdCpzLGE9dGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCsodCsxKSpzLGw9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueSkvbyxkPXRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktZSpsLF89dGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS0oZSsxKSpsO3JldHVybiBwKHIpPyhyLndlc3Q9dSxyLnNvdXRoPV8sci5lYXN0PWEsci5ub3J0aD1kLHIpOm5ldyBOKHUsXyxhLGQpfSxZdC5wcm90b3R5cGUudGlsZVhZVG9SZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKHQsZSxuLHIpLG89dGhpcy5fcHJvamVjdGlvbixzPW8udW5wcm9qZWN0KG5ldyBBKGkud2VzdCxpLnNvdXRoKSksdT1vLnVucHJvamVjdChuZXcgQShpLmVhc3QsaS5ub3J0aCkpO3JldHVybiBpLndlc3Q9cy5sb25naXR1ZGUsaS5zb3V0aD1zLmxhdGl0dWRlLGkuZWFzdD11LmxvbmdpdHVkZSxpLm5vcnRoPXUubGF0aXR1ZGUsaX0sWXQucHJvdG90eXBlLnBvc2l0aW9uVG9UaWxlWFk9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9dGhpcy5fcmVjdGFuZ2xlO2lmKCFOLmNvbnRhaW5zKHIsdCkpcmV0dXJuO2NvbnN0IGk9dGhpcy5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWwoZSksbz10aGlzLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbChlKSx1PSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngpL2ksbD0odGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy55KS9vLF89dGhpcy5fcHJvamVjdGlvbi5wcm9qZWN0KHQpLE89Xy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngsYj10aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LV8ueTtsZXQgST1PL3V8MDtJPj1pJiYoST1pLTEpO2xldCBTPWIvbHwwO3JldHVybiBTPj1vJiYoUz1vLTEpLHAobik/KG4ueD1JLG4ueT1TLG4pOm5ldyBBKEksUyl9O2Z1bmN0aW9uIFNuKCl7dGhpcy5uYW1lPXZvaWQgMCx0aGlzLmRlc2NyaXB0aW9uPXZvaWQgMCx0aGlzLnBvc2l0aW9uPXZvaWQgMCx0aGlzLmRhdGE9dm9pZCAwLHRoaXMuaW1hZ2VyeUxheWVyPXZvaWQgMH1Tbi5wcm90b3R5cGUuY29uZmlndXJlTmFtZUZyb21Qcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe2xldCBlPTEwLG47Zm9yKGNvbnN0IHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpJiZ0W3JdKXtjb25zdCBpPXIudG9Mb3dlckNhc2UoKTtlPjEmJmk9PT0ibmFtZSI/KGU9MSxuPXIpOmU+MiYmaT09PSJ0aXRsZSI/KGU9MixuPXIpOmU+MyYmL25hbWUvaS50ZXN0KHIpPyhlPTMsbj1yKTplPjQmJi90aXRsZS9pLnRlc3QocikmJihlPTQsbj1yKX1wKG4pJiYodGhpcy5uYW1lPXRbbl0pfSxTbi5wcm90b3R5cGUuY29uZmlndXJlRGVzY3JpcHRpb25Gcm9tUHJvcGVydGllcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe2xldCByPSc8dGFibGUgY2xhc3M9ImNlc2l1bS1pbmZvQm94LWRlZmF1bHRUYWJsZSI+Jztmb3IoY29uc3QgaSBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkoaSkpe2NvbnN0IG89bltpXTtwKG8pJiYodHlwZW9mIG89PSJvYmplY3QiP3IrPWA8dHI+PHRkPiR7aX08L3RkPjx0ZD4ke2Uobyl9PC90ZD48L3RyPmA6cis9YDx0cj48dGQ+JHtpfTwvdGQ+PHRkPiR7b308L3RkPjwvdHI+YCl9cmV0dXJuIHIrPSI8L3RhYmxlPiIscn10aGlzLmRlc2NyaXB0aW9uPWUodCl9O3ZhciB0bj1BZTtmdW5jdGlvbiBBZSh0LGUpe3RoaXMueD10LHRoaXMueT1lfUFlLnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFlKHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpfSxzdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpfSxtdWx0QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludCh0KX0sZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHQpfSxtdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQodCl9LGRpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYodCl9LHJvdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUodCl9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZUFyb3VuZCh0LGUpfSxtYXRNdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQodCl9LHVuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCl9LHBlcnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sbWFnOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55fSxkaXN0OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHQpKX0sZGlzdFNxcjpmdW5jdGlvbih0KXt2YXIgZT10LngtdGhpcy54LG49dC55LXRoaXMueTtyZXR1cm4gZSplK24qbn0sYW5nbGU6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksdGhpcy54KX0sYW5nbGVUbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnktdC55LHRoaXMueC10LngpfSxhbmdsZVdpdGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKHQueCx0LnkpfSxhbmdsZVdpdGhTZXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLngqZS10aGlzLnkqdCx0aGlzLngqdCt0aGlzLnkqZSl9LF9tYXRNdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0qdGhpcy54K3RbMV0qdGhpcy55LG49dFsyXSp0aGlzLngrdFszXSp0aGlzLnk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXN9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LF9zdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LF9tdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9LF9kaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sX211bHRCeVBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfSxfZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc30sX3VuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGl2KHRoaXMubWFnKCkpLHRoaXN9LF9wZXJwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55O3JldHVybiB0aGlzLnk9dGhpcy54LHRoaXMueD0tdCx0aGlzfSxfcm90YXRlOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCkscj1lKnRoaXMueC1uKnRoaXMueSxpPW4qdGhpcy54K2UqdGhpcy55O3JldHVybiB0aGlzLng9cix0aGlzLnk9aSx0aGlzfSxfcm90YXRlQXJvdW5kOmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5jb3ModCkscj1NYXRoLnNpbih0KSxpPWUueCtuKih0aGlzLngtZS54KS1yKih0aGlzLnktZS55KSxvPWUueStyKih0aGlzLngtZS54KStuKih0aGlzLnktZS55KTtyZXR1cm4gdGhpcy54PWksdGhpcy55PW8sdGhpc30sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfX0sQWUuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFlP3Q6QXJyYXkuaXNBcnJheSh0KT9uZXcgQWUodFswXSx0WzFdKTp0fTt2YXIgdm89dG4sbXI9VGU7ZnVuY3Rpb24gVGUodCxlLG4scixpKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9bix0aGlzLnR5cGU9MCx0aGlzLl9wYmY9dCx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPXIsdGhpcy5fdmFsdWVzPWksdC5yZWFkRmllbGRzKERvLHRoaXMsZSl9ZnVuY3Rpb24gRG8odCxlLG4pe3Q9PTE/ZS5pZD1uLnJlYWRWYXJpbnQoKTp0PT0yP0xvKG4sZSk6dD09Mz9lLnR5cGU9bi5yZWFkVmFyaW50KCk6dD09NCYmKGUuX2dlb21ldHJ5PW4ucG9zKX1mdW5jdGlvbiBMbyh0LGUpe2Zvcih2YXIgbj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxuOyl7dmFyIHI9ZS5fa2V5c1t0LnJlYWRWYXJpbnQoKV0saT1lLl92YWx1ZXNbdC5yZWFkVmFyaW50KCldO2UucHJvcGVydGllc1tyXT1pfX1UZS50eXBlcz1bIlVua25vd24iLCJQb2ludCIsIkxpbmVTdHJpbmciLCJQb2x5Z29uIl0sVGUucHJvdG90eXBlLmxvYWRHZW9tZXRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BiZjt0LnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIGU9dC5yZWFkVmFyaW50KCkrdC5wb3Msbj0xLHI9MCxpPTAsbz0wLHM9W10sdTt0LnBvczxlOyl7aWYocjw9MCl7dmFyIGE9dC5yZWFkVmFyaW50KCk7bj1hJjcscj1hPj4zfWlmKHItLSxuPT09MXx8bj09PTIpaSs9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxuPT09MSYmKHUmJnMucHVzaCh1KSx1PVtdKSx1LnB1c2gobmV3IHZvKGksbykpO2Vsc2UgaWYobj09PTcpdSYmdS5wdXNoKHVbMF0uY2xvbmUoKSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybiB1JiZzLnB1c2godSksc30sVGUucHJvdG90eXBlLmJib3g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYmY7dC5wb3M9dGhpcy5fZ2VvbWV0cnk7Zm9yKHZhciBlPXQucmVhZFZhcmludCgpK3QucG9zLG49MSxyPTAsaT0wLG89MCxzPTEvMCx1PS0xLzAsYT0xLzAsbD0tMS8wO3QucG9zPGU7KXtpZihyPD0wKXt2YXIgZD10LnJlYWRWYXJpbnQoKTtuPWQmNyxyPWQ+PjN9aWYoci0tLG49PT0xfHxuPT09MilpKz10LnJlYWRTVmFyaW50KCksbys9dC5yZWFkU1ZhcmludCgpLGk8cyYmKHM9aSksaT51JiYodT1pKSxvPGEmJihhPW8pLG8+bCYmKGw9byk7ZWxzZSBpZihuIT09Nyl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybltzLGEsdSxsXX0sVGUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5leHRlbnQqTWF0aC5wb3coMixuKSxpPXRoaXMuZXh0ZW50KnQsbz10aGlzLmV4dGVudCplLHM9dGhpcy5sb2FkR2VvbWV0cnkoKSx1PVRlLnR5cGVzW3RoaXMudHlwZV0sYSxsO2Z1bmN0aW9uIGQoYil7Zm9yKHZhciBJPTA7STxiLmxlbmd0aDtJKyspe3ZhciBTPWJbSV0sbT0xODAtKFMueStvKSozNjAvcjtiW0ldPVsoUy54K2kpKjM2MC9yLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAobSpNYXRoLlBJLzE4MCkpLTkwXX19c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSAxOnZhciBfPVtdO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspX1thXT1zW2FdWzBdO3M9XyxkKHMpO2JyZWFrO2Nhc2UgMjpmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKWQoc1thXSk7YnJlYWs7Y2FzZSAzOmZvcihzPVBvKHMpLGE9MDthPHMubGVuZ3RoO2ErKylmb3IobD0wO2w8c1thXS5sZW5ndGg7bCsrKWQoc1thXVtsXSk7YnJlYWt9cy5sZW5ndGg9PT0xP3M9c1swXTp1PSJNdWx0aSIrdTt2YXIgTz17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6dSxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOnRoaXMucHJvcGVydGllc307cmV0dXJuImlkImluIHRoaXMmJihPLmlkPXRoaXMuaWQpLE99O2Z1bmN0aW9uIFBvKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTEpcmV0dXJuW3RdO2Zvcih2YXIgbj1bXSxyLGksbz0wO288ZTtvKyspe3ZhciBzPUJvKHRbb10pO3MhPT0wJiYoaT09PXZvaWQgMCYmKGk9czwwKSxpPT09czwwPyhyJiZuLnB1c2gocikscj1bdFtvXV0pOnIucHVzaCh0W29dKSl9cmV0dXJuIHImJm4ucHVzaChyKSxufWZ1bmN0aW9uIEJvKHQpe2Zvcih2YXIgZT0wLG49MCxyPXQubGVuZ3RoLGk9ci0xLG8scztuPHI7aT1uKyspbz10W25dLHM9dFtpXSxlKz0ocy54LW8ueCkqKG8ueStzLnkpO3JldHVybiBlfXZhciBVbz1tcixqbz1GcjtmdW5jdGlvbiBGcih0LGUpe3RoaXMudmVyc2lvbj0xLHRoaXMubmFtZT1udWxsLHRoaXMuZXh0ZW50PTQwOTYsdGhpcy5sZW5ndGg9MCx0aGlzLl9wYmY9dCx0aGlzLl9rZXlzPVtdLHRoaXMuX3ZhbHVlcz1bXSx0aGlzLl9mZWF0dXJlcz1bXSx0LnJlYWRGaWVsZHMoR28sdGhpcyxlKSx0aGlzLmxlbmd0aD10aGlzLl9mZWF0dXJlcy5sZW5ndGh9ZnVuY3Rpb24gR28odCxlLG4pe3Q9PT0xNT9lLnZlcnNpb249bi5yZWFkVmFyaW50KCk6dD09PTE/ZS5uYW1lPW4ucmVhZFN0cmluZygpOnQ9PT01P2UuZXh0ZW50PW4ucmVhZFZhcmludCgpOnQ9PT0yP2UuX2ZlYXR1cmVzLnB1c2gobi5wb3MpOnQ9PT0zP2UuX2tleXMucHVzaChuLnJlYWRTdHJpbmcoKSk6dD09PTQmJmUuX3ZhbHVlcy5wdXNoKCRvKG4pKX1mdW5jdGlvbiAkbyh0KXtmb3IodmFyIGU9bnVsbCxuPXQucmVhZFZhcmludCgpK3QucG9zO3QucG9zPG47KXt2YXIgcj10LnJlYWRWYXJpbnQoKT4+MztlPXI9PT0xP3QucmVhZFN0cmluZygpOnI9PT0yP3QucmVhZEZsb2F0KCk6cj09PTM/dC5yZWFkRG91YmxlKCk6cj09PTQ/dC5yZWFkVmFyaW50NjQoKTpyPT09NT90LnJlYWRWYXJpbnQoKTpyPT09Nj90LnJlYWRTVmFyaW50KCk6cj09PTc/dC5yZWFkQm9vbGVhbigpOm51bGx9cmV0dXJuIGV9RnIucHJvdG90eXBlLmZlYXR1cmU9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLl9mZWF0dXJlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW3RdO3ZhciBlPXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IFVvKHRoaXMuX3BiZixlLHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX07dmFyIFZvPWpvLFdvPXpvO2Z1bmN0aW9uIHpvKHQsZSl7dGhpcy5sYXllcnM9dC5yZWFkRmllbGRzKFhvLHt9LGUpfWZ1bmN0aW9uIFhvKHQsZSxuKXtpZih0PT09Myl7dmFyIHI9bmV3IFZvKG4sbi5yZWFkVmFyaW50KCkrbi5wb3MpO3IubGVuZ3RoJiYoZVtyLm5hbWVdPXIpfX12YXIgSG89V28senQ9bXIsbW49e307LyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9tbi5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8scyx1PWkqOC1yLTEsYT0oMTw8dSktMSxsPWE+PjEsZD0tNyxfPW4/aS0xOjAsTz1uPy0xOjEsYj10W2UrX107Zm9yKF8rPU8sbz1iJigxPDwtZCktMSxiPj49LWQsZCs9dTtkPjA7bz1vKjI1Nit0W2UrX10sXys9TyxkLT04KTtmb3Iocz1vJigxPDwtZCktMSxvPj49LWQsZCs9cjtkPjA7cz1zKjI1Nit0W2UrX10sXys9TyxkLT04KTtpZihvPT09MClvPTEtbDtlbHNle2lmKG89PT1hKXJldHVybiBzP05hTjooYj8tMToxKSooMS8wKTtzPXMrTWF0aC5wb3coMixyKSxvPW8tbH1yZXR1cm4oYj8tMToxKSpzKk1hdGgucG93KDIsby1yKX0sbW4ud3JpdGU9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBzLHUsYSxsPW8qOC1pLTEsZD0oMTw8bCktMSxfPWQ+PjEsTz1pPT09MjM/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGI9cj8wOm8tMSxJPXI/MTotMSxTPWU8MHx8ZT09PTAmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8odT1pc05hTihlKT8xOjAscz1kKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKihhPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGEqPTIpLHMrXz49MT9lKz1PL2E6ZSs9TypNYXRoLnBvdygyLDEtXyksZSphPj0yJiYocysrLGEvPTIpLHMrXz49ZD8odT0wLHM9ZCk6cytfPj0xPyh1PShlKmEtMSkqTWF0aC5wb3coMixpKSxzPXMrXyk6KHU9ZSpNYXRoLnBvdygyLF8tMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O3RbbitiXT11JjI1NSxiKz1JLHUvPTI1NixpLT04KTtmb3Iocz1zPDxpfHUsbCs9aTtsPjA7dFtuK2JdPXMmMjU1LGIrPUkscy89MjU2LGwtPTgpO3RbbitiLUldfD1TKjEyOH07dmFyIGtvPVcsZW49bW47ZnVuY3Rpb24gVyh0KXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcmJkFycmF5QnVmZmVyLmlzVmlldyh0KT90Om5ldyBVaW50OEFycmF5KHR8fDApLHRoaXMucG9zPTAsdGhpcy50eXBlPTAsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofVcuVmFyaW50PTAsVy5GaXhlZDY0PTEsVy5CeXRlcz0yLFcuRml4ZWQzMj01O3ZhciBGbj0oMTw8MTYpKigxPDwxNiksd3I9MS9Gbixxbz0xMixJcj10eXBlb2YgVGV4dERlY29kZXI+InUiP251bGw6bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik7Vy5wcm90b3R5cGU9e2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmJ1Zj1udWxsfSxyZWFkRmllbGRzOmZ1bmN0aW9uKHQsZSxuKXtmb3Iobj1ufHx0aGlzLmxlbmd0aDt0aGlzLnBvczxuOyl7dmFyIHI9dGhpcy5yZWFkVmFyaW50KCksaT1yPj4zLG89dGhpcy5wb3M7dGhpcy50eXBlPXImNyx0KGksZSx0aGlzKSx0aGlzLnBvcz09PW8mJnRoaXMuc2tpcChyKX1yZXR1cm4gZX0scmVhZE1lc3NhZ2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWFkRmllbGRzKHQsZSx0aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyl9LHJlYWRGaXhlZDMyOmZ1bmN0aW9uKCl7dmFyIHQ9bm4odGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD1Ncih0aGlzLmJ1Zix0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9bm4odGhpcy5idWYsdGhpcy5wb3MpK25uKHRoaXMuYnVmLHRoaXMucG9zKzQpKkZuO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkU0ZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD1ubih0aGlzLmJ1Zix0aGlzLnBvcykrTXIodGhpcy5idWYsdGhpcy5wb3MrNCkqRm47cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRGbG9hdDpmdW5jdGlvbigpe3ZhciB0PWVuLnJlYWQodGhpcy5idWYsdGhpcy5wb3MsITAsMjMsNCk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD1lbi5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDUyLDgpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYnVmLG4scjtyZXR1cm4gcj1lW3RoaXMucG9zKytdLG49ciYxMjcscjwxMjh8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8NyxyPDEyOCl8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8MTQscjwxMjgpfHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDIxLHI8MTI4KT9uOihyPWVbdGhpcy5wb3NdLG58PShyJjE1KTw8MjgsWW8obix0LHRoaXMpKX0scmVhZFZhcmludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFZhcmludCghMCl9LHJlYWRTVmFyaW50OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVmFyaW50KCk7cmV0dXJuIHQlMj09PTE/KHQrMSkvLTI6dC8yfSxyZWFkQm9vbGVhbjpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKX0scmVhZFN0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5wb3M7cmV0dXJuIHRoaXMucG9zPXQsdC1lPj1xbyYmSXI/Y3ModGhpcy5idWYsZSx0KTp1cyh0aGlzLmJ1ZixlLHQpfSxyZWFkQnl0ZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxlPXRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGV9LHJlYWRQYWNrZWRWYXJpbnQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnR5cGUhPT1XLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTt2YXIgbj1YdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxuOyl0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTtyZXR1cm4gdH0scmVhZFBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09Vy5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7dmFyIGU9WHQodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PVcuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09Vy5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gdH0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1XLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PVcuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3JldHVybiB0fSxyZWFkUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09Vy5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09Vy5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7dmFyIGU9WHQodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1XLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7dmFyIGU9WHQodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiB0fSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBlPXQmNztpZihlPT09Vy5WYXJpbnQpZm9yKDt0aGlzLmJ1Zlt0aGlzLnBvcysrXT4xMjc7KTtlbHNlIGlmKGU9PT1XLkJ5dGVzKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYoZT09PVcuRml4ZWQzMil0aGlzLnBvcys9NDtlbHNlIGlmKGU9PT1XLkZpeGVkNjQpdGhpcy5wb3MrPTg7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuaW1wbGVtZW50ZWQgdHlwZTogIitlKX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8ZSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGVuZ3RofHwxNjtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXt2YXIgbj1uZXcgVWludDhBcnJheShlKTtuLnNldCh0aGlzLmJ1ZiksdGhpcy5idWY9bix0aGlzLmxlbmd0aD1lfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc3ViYXJyYXkoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCkseGUodGhpcy5idWYsdCx0aGlzLnBvcyksdGhpcy5wb3MrPTR9LHdyaXRlU0ZpeGVkMzI6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLHhlKHRoaXMuYnVmLHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlVmFyaW50OmZ1bmN0aW9uKHQpe2lmKHQ9K3R8fDAsdD4yNjg0MzU0NTV8fHQ8MCl7S28odCx0aGlzKTtyZXR1cm59dGhpcy5yZWFsbG9jKDQpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjcmMTI3KSkpfSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCh0PDA/LXQqMi0xOnQqMil9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KSx0aGlzLnJlYWxsb2ModC5sZW5ndGgqNCksdGhpcy5wb3MrKzt2YXIgZT10aGlzLnBvczt0aGlzLnBvcz1ocyh0aGlzLmJ1Zix0LHRoaXMucG9zKTt2YXIgbj10aGlzLnBvcy1lO24+PTEyOCYmTnIoZSxuLHRoaXMpLHRoaXMucG9zPWUtMSx0aGlzLndyaXRlVmFyaW50KG4pLHRoaXMucG9zKz1ufSx3cml0ZUZsb2F0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg0KSxlbi53cml0ZSh0aGlzLmJ1Zix0LHRoaXMucG9zLCEwLDIzLDQpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksZW4ud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCw1Miw4KSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGUpLHRoaXMucmVhbGxvYyhlKTtmb3IodmFyIG49MDtuPGU7bisrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbbl19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGUpe3RoaXMucG9zKys7dmFyIG49dGhpcy5wb3M7dChlLHRoaXMpO3ZhciByPXRoaXMucG9zLW47cj49MTI4JiZOcihuLHIsdGhpcyksdGhpcy5wb3M9bi0xLHRoaXMud3JpdGVWYXJpbnQociksdGhpcy5wb3MrPXJ9LHdyaXRlTWVzc2FnZTpmdW5jdGlvbih0LGUsbil7dGhpcy53cml0ZVRhZyh0LFcuQnl0ZXMpLHRoaXMud3JpdGVSYXdNZXNzYWdlKGUsbil9LHdyaXRlUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsSm8sZSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHRzLGUpfSx3cml0ZVBhY2tlZEJvb2xlYW46ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxycyxlKX0sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGVzLGUpfSx3cml0ZVBhY2tlZERvdWJsZTpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LG5zLGUpfSx3cml0ZVBhY2tlZEZpeGVkMzI6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxpcyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LG9zLGUpfSx3cml0ZVBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxzcyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGFzLGUpfSx3cml0ZUJ5dGVzRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsVy5CeXRlcyksdGhpcy53cml0ZUJ5dGVzKGUpfSx3cml0ZUZpeGVkMzJGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGUpfSx3cml0ZVNGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsVy5GaXhlZDMyKSx0aGlzLndyaXRlU0ZpeGVkMzIoZSl9LHdyaXRlRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LFcuRml4ZWQ2NCksdGhpcy53cml0ZUZpeGVkNjQoZSl9LHdyaXRlU0ZpeGVkNjRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChlKX0sd3JpdGVWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLlZhcmludCksdGhpcy53cml0ZVZhcmludChlKX0sd3JpdGVTVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsVy5WYXJpbnQpLHRoaXMud3JpdGVTVmFyaW50KGUpfSx3cml0ZVN0cmluZ0ZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LFcuQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoZSl9LHdyaXRlRmxvYXRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLkZpeGVkMzIpLHRoaXMud3JpdGVGbG9hdChlKX0sd3JpdGVEb3VibGVGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLkZpeGVkNjQpLHRoaXMud3JpdGVEb3VibGUoZSl9LHdyaXRlQm9vbGVhbkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVZhcmludEZpZWxkKHQsQm9vbGVhbihlKSl9fTtmdW5jdGlvbiBZbyh0LGUsbil7dmFyIHI9bi5idWYsaSxvO2lmKG89cltuLnBvcysrXSxpPShvJjExMik+PjQsbzwxMjh8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MyxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MTAsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDE3LG88MTI4KXx8KG89cltuLnBvcysrXSxpfD0obyYxMjcpPDwyNCxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMSk8PDMxLG88MTI4KSlyZXR1cm4gUmUodCxpLGUpO3Rocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMiKX1mdW5jdGlvbiBYdCh0KXtyZXR1cm4gdC50eXBlPT09Vy5CeXRlcz90LnJlYWRWYXJpbnQoKSt0LnBvczp0LnBvcysxfWZ1bmN0aW9uIFJlKHQsZSxuKXtyZXR1cm4gbj9lKjQyOTQ5NjcyOTYrKHQ+Pj4wKTooZT4+PjApKjQyOTQ5NjcyOTYrKHQ+Pj4wKX1mdW5jdGlvbiBLbyh0LGUpe3ZhciBuLHI7aWYodD49MD8obj10JTQyOTQ5NjcyOTZ8MCxyPXQvNDI5NDk2NzI5NnwwKToobj1+KC10JTQyOTQ5NjcyOTYpLHI9figtdC80Mjk0OTY3Mjk2KSxuXjQyOTQ5NjcyOTU/bj1uKzF8MDoobj0wLHI9cisxfDApKSx0Pj0xODQ0Njc0NDA3MzcwOTU1MmUzfHx0PC0xODQ0Njc0NDA3MzcwOTU1MmUzKXRocm93IG5ldyBFcnJvcigiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXMiKTtlLnJlYWxsb2MoMTApLFpvKG4scixlKSxRbyhyLGUpfWZ1bmN0aW9uIFpvKHQsZSxuKXtuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zKytdPXQmMTI3fDEyOCx0Pj4+PTcsbi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zXT10JjEyN31mdW5jdGlvbiBRbyh0LGUpe3ZhciBuPSh0JjcpPDw0O2UuYnVmW2UucG9zKytdfD1ufCgodD4+Pj0zKT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3KSkpKSl9ZnVuY3Rpb24gTnIodCxlLG4pe3ZhciByPWU8PTE2MzgzPzE6ZTw9MjA5NzE1MT8yOmU8PTI2ODQzNTQ1NT8zOk1hdGguZmxvb3IoTWF0aC5sb2coZSkvKE1hdGguTE4yKjcpKTtuLnJlYWxsb2Mocik7Zm9yKHZhciBpPW4ucG9zLTE7aT49dDtpLS0pbi5idWZbaStyXT1uLmJ1ZltpXX1mdW5jdGlvbiBKbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVWYXJpbnQodFtuXSl9ZnVuY3Rpb24gdHModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU1ZhcmludCh0W25dKX1mdW5jdGlvbiBlcyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGbG9hdCh0W25dKX1mdW5jdGlvbiBucyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVEb3VibGUodFtuXSl9ZnVuY3Rpb24gcnModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlQm9vbGVhbih0W25dKX1mdW5jdGlvbiBpcyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIG9zKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIHNzKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZUZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gYXModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU0ZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gbm4odCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrdFtlKzNdKjE2Nzc3MjE2fWZ1bmN0aW9uIHhlKHQsZSxuKXt0W25dPWUsdFtuKzFdPWU+Pj44LHRbbisyXT1lPj4+MTYsdFtuKzNdPWU+Pj4yNH1mdW5jdGlvbiBNcih0LGUpe3JldHVybih0W2VdfHRbZSsxXTw8OHx0W2UrMl08PDE2KSsodFtlKzNdPDwyNCl9ZnVuY3Rpb24gdXModCxlLG4pe2Zvcih2YXIgcj0iIixpPWU7aTxuOyl7dmFyIG89dFtpXSxzPW51bGwsdT1vPjIzOT80Om8+MjIzPzM6bz4xOTE/MjoxO2lmKGkrdT5uKWJyZWFrO3ZhciBhLGwsZDt1PT09MT9vPDEyOCYmKHM9byk6dT09PTI/KGE9dFtpKzFdLChhJjE5Mik9PT0xMjgmJihzPShvJjMxKTw8NnxhJjYzLHM8PTEyNyYmKHM9bnVsbCkpKTp1PT09Mz8oYT10W2krMV0sbD10W2krMl0sKGEmMTkyKT09PTEyOCYmKGwmMTkyKT09PTEyOCYmKHM9KG8mMTUpPDwxMnwoYSY2Myk8PDZ8bCY2Mywoczw9MjA0N3x8cz49NTUyOTYmJnM8PTU3MzQzKSYmKHM9bnVsbCkpKTp1PT09NCYmKGE9dFtpKzFdLGw9dFtpKzJdLGQ9dFtpKzNdLChhJjE5Mik9PT0xMjgmJihsJjE5Mik9PT0xMjgmJihkJjE5Mik9PT0xMjgmJihzPShvJjE1KTw8MTh8KGEmNjMpPDwxMnwobCY2Myk8PDZ8ZCY2Mywoczw9NjU1MzV8fHM+PTExMTQxMTIpJiYocz1udWxsKSkpLHM9PT1udWxsPyhzPTY1NTMzLHU9MSk6cz42NTUzNSYmKHMtPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUocz4+PjEwJjEwMjN8NTUyOTYpLHM9NTYzMjB8cyYxMDIzKSxyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpLGkrPXV9cmV0dXJuIHJ9ZnVuY3Rpb24gY3ModCxlLG4pe3JldHVybiBJci5kZWNvZGUodC5zdWJhcnJheShlLG4pKX1mdW5jdGlvbiBocyh0LGUsbil7Zm9yKHZhciByPTAsaSxvO3I8ZS5sZW5ndGg7cisrKXtpZihpPWUuY2hhckNvZGVBdChyKSxpPjU1Mjk1JiZpPDU3MzQ0KWlmKG8paWYoaTw1NjMyMCl7dFtuKytdPTIzOSx0W24rK109MTkxLHRbbisrXT0xODksbz1pO2NvbnRpbnVlfWVsc2UgaT1vLTU1Mjk2PDwxMHxpLTU2MzIwfDY1NTM2LG89bnVsbDtlbHNle2k+NTYzMTl8fHIrMT09PWUubGVuZ3RoPyh0W24rK109MjM5LHRbbisrXT0xOTEsdFtuKytdPTE4OSk6bz1pO2NvbnRpbnVlfWVsc2UgbyYmKHRbbisrXT0yMzksdFtuKytdPTE5MSx0W24rK109MTg5LG89bnVsbCk7aTwxMjg/dFtuKytdPWk6KGk8MjA0OD90W24rK109aT4+NnwxOTI6KGk8NjU1MzY/dFtuKytdPWk+PjEyfDIyNDoodFtuKytdPWk+PjE4fDI0MCx0W24rK109aT4+MTImNjN8MTI4KSx0W24rK109aT4+NiY2M3wxMjgpLHRbbisrXT1pJjYzfDEyOCl9cmV0dXJuIG59dmFyIGZzPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxDcj1mcyxscz10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGRzPUNyfHxsc3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxVdD1kcyxFcz1VdC5TeW1ib2wsanQ9RXMsdnI9T2JqZWN0LnByb3RvdHlwZSxfcz12ci5oYXNPd25Qcm9wZXJ0eSxwcz12ci50b1N0cmluZyx2ZT1qdD9qdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24geXModCl7dmFyIGU9X3MuY2FsbCh0LHZlKSxuPXRbdmVdO3RyeXt0W3ZlXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBpPXBzLmNhbGwodCk7cmV0dXJuIHImJihlP3RbdmVdPW46ZGVsZXRlIHRbdmVdKSxpfXZhciBBcz1PYmplY3QucHJvdG90eXBlLFRzPUFzLnRvU3RyaW5nO2Z1bmN0aW9uIFJzKHQpe3JldHVybiBUcy5jYWxsKHQpfXZhciB4cz0iW29iamVjdCBOdWxsXSIsT3M9IltvYmplY3QgVW5kZWZpbmVkXSIsRHI9anQ/anQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIE9lKHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/T3M6eHM6RHImJkRyIGluIE9iamVjdCh0KT95cyh0KTpScyh0KX1mdW5jdGlvbiBiZSh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBicz0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiB3bih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxiZSh0KSYmT2UodCk9PWJzfWZ1bmN0aW9uIGdzKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9QXJyYXkocik7KytuPHI7KWlbbl09ZSh0W25dLG4sdCk7cmV0dXJuIGl9dmFyIFNzPUFycmF5LmlzQXJyYXksS3Q9U3MsbXM9MS8wLExyPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsUHI9THI/THIudG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIEJyKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdDtpZihLdCh0KSlyZXR1cm4gZ3ModCxCcikrIiI7aWYod24odCkpcmV0dXJuIFByP1ByLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4gZT09IjAiJiYxL3Q9PS1tcz8iLTAiOmV9ZnVuY3Rpb24gaWUodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihlPT0ib2JqZWN0Inx8ZT09ImZ1bmN0aW9uIil9ZnVuY3Rpb24gRnModCl7cmV0dXJuIHR9dmFyIHdzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixJcz0iW29iamVjdCBGdW5jdGlvbl0iLE5zPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsTXM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBVcih0KXtpZighaWUodCkpcmV0dXJuITE7dmFyIGU9T2UodCk7cmV0dXJuIGU9PUlzfHxlPT1Oc3x8ZT09d3N8fGU9PU1zfXZhciBDcz1VdFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sSW49Q3MsanI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKEluJiZJbi5rZXlzJiZJbi5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIHZzKHQpe3JldHVybiEhanImJmpyIGluIHR9dmFyIERzPUZ1bmN0aW9uLnByb3RvdHlwZSxMcz1Ecy50b1N0cmluZztmdW5jdGlvbiBvZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIExzLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBQcz0vW1xcXiQuKis/KClbXF17fXxdL2csQnM9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sVXM9RnVuY3Rpb24ucHJvdG90eXBlLGpzPU9iamVjdC5wcm90b3R5cGUsR3M9VXMudG9TdHJpbmcsJHM9anMuaGFzT3duUHJvcGVydHksVnM9UmVnRXhwKCJeIitHcy5jYWxsKCRzKS5yZXBsYWNlKFBzLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIFdzKHQpe2lmKCFpZSh0KXx8dnModCkpcmV0dXJuITE7dmFyIGU9VXIodCk/VnM6QnM7cmV0dXJuIGUudGVzdChvZSh0KSl9ZnVuY3Rpb24genModCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBzZSh0LGUpe3ZhciBuPXpzKHQsZSk7cmV0dXJuIFdzKG4pP246dm9pZCAwfXZhciBYcz1zZShVdCwiV2Vha01hcCIpLE5uPVhzLEdyPU9iamVjdC5jcmVhdGUsSHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighaWUoZSkpcmV0dXJue307aWYoR3IpcmV0dXJuIEdyKGUpO3QucHJvdG90eXBlPWU7dmFyIG49bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxufX0oKSxrcz1IcztmdW5jdGlvbiBxcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIFlzKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9QXJyYXkocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9dmFyIEtzPTgwMCxacz0xNixRcz1EYXRlLm5vdztmdW5jdGlvbiBKcyh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1RcygpLGk9WnMtKHItbik7aWYobj1yLGk+MCl7aWYoKytlPj1LcylyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiB0YSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIGVhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXNlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpLHJuPWVhLG5hPXJuP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHJuKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6dGEoZSksd3JpdGFibGU6ITB9KX06RnMscmE9bmEsaWE9SnMocmEpLG9hPWlhO2Z1bmN0aW9uIHNhKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoOysrbjxyJiZlKHRbbl0sbix0KSE9PSExOyk7cmV0dXJuIHR9dmFyIGFhPTkwMDcxOTkyNTQ3NDA5OTEsdWE9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIE1uKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuIGU9ZT8/YWEsISFlJiYobj09Im51bWJlciJ8fG4hPSJzeW1ib2wiJiZ1YS50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9ZnVuY3Rpb24gJHIodCxlLG4pe2U9PSJfX3Byb3RvX18iJiZybj9ybih0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gVnIodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgY2E9T2JqZWN0LnByb3RvdHlwZSxoYT1jYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBDbih0LGUsbil7dmFyIHI9dFtlXTsoIShoYS5jYWxsKHQsZSkmJlZyKHIsbikpfHxuPT09dm9pZCAwJiYhKGUgaW4gdCkpJiYkcih0LGUsbil9ZnVuY3Rpb24gb24odCxlLG4scil7dmFyIGk9IW47bnx8KG49e30pO2Zvcih2YXIgbz0tMSxzPWUubGVuZ3RoOysrbzxzOyl7dmFyIHU9ZVtvXSxhPXI/cihuW3VdLHRbdV0sdSxuLHQpOnZvaWQgMDthPT09dm9pZCAwJiYoYT10W3VdKSxpPyRyKG4sdSxhKTpDbihuLHUsYSl9cmV0dXJuIG59dmFyIFdyPU1hdGgubWF4O2Z1bmN0aW9uIGZhKHQsZSxuKXtyZXR1cm4gZT1XcihlPT09dm9pZCAwP3QubGVuZ3RoLTE6ZSwwKSxmdW5jdGlvbigpe2Zvcih2YXIgcj1hcmd1bWVudHMsaT0tMSxvPVdyKHIubGVuZ3RoLWUsMCkscz1BcnJheShvKTsrK2k8bzspc1tpXT1yW2UraV07aT0tMTtmb3IodmFyIHU9QXJyYXkoZSsxKTsrK2k8ZTspdVtpXT1yW2ldO3JldHVybiB1W2VdPW4ocykscXModCx0aGlzLHUpfX12YXIgbGE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiB2bih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PWxhfWZ1bmN0aW9uIHpyKHQpe3JldHVybiB0IT1udWxsJiZ2bih0Lmxlbmd0aCkmJiFVcih0KX12YXIgZGE9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiBEbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yLG49dHlwZW9mIGU9PSJmdW5jdGlvbiImJmUucHJvdG90eXBlfHxkYTtyZXR1cm4gdD09PW59ZnVuY3Rpb24gRWEodCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfXZhciBfYT0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBYcih0KXtyZXR1cm4gYmUodCkmJk9lKHQpPT1fYX12YXIgSHI9T2JqZWN0LnByb3RvdHlwZSxwYT1Ici5oYXNPd25Qcm9wZXJ0eSx5YT1Ici5wcm9wZXJ0eUlzRW51bWVyYWJsZSxBYT1YcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1hyOmZ1bmN0aW9uKHQpe3JldHVybiBiZSh0KSYmcGEuY2FsbCh0LCJjYWxsZWUiKSYmIXlhLmNhbGwodCwiY2FsbGVlIil9LExuPUFhO2Z1bmN0aW9uIFRhKCl7cmV0dXJuITF9dmFyIGtyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMscXI9a3ImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxSYT1xciYmcXIuZXhwb3J0cz09PWtyLFlyPVJhP1V0LkJ1ZmZlcjp2b2lkIDAseGE9WXI/WXIuaXNCdWZmZXI6dm9pZCAwLE9hPXhhfHxUYSxLcj1PYSxiYT0iW29iamVjdCBBcmd1bWVudHNdIixnYT0iW29iamVjdCBBcnJheV0iLFNhPSJbb2JqZWN0IEJvb2xlYW5dIixtYT0iW29iamVjdCBEYXRlXSIsRmE9IltvYmplY3QgRXJyb3JdIix3YT0iW29iamVjdCBGdW5jdGlvbl0iLElhPSJbb2JqZWN0IE1hcF0iLE5hPSJbb2JqZWN0IE51bWJlcl0iLE1hPSJbb2JqZWN0IE9iamVjdF0iLENhPSJbb2JqZWN0IFJlZ0V4cF0iLHZhPSJbb2JqZWN0IFNldF0iLERhPSJbb2JqZWN0IFN0cmluZ10iLExhPSJbb2JqZWN0IFdlYWtNYXBdIixQYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEJhPSJbb2JqZWN0IERhdGFWaWV3XSIsVWE9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsamE9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsR2E9IltvYmplY3QgSW50OEFycmF5XSIsJGE9IltvYmplY3QgSW50MTZBcnJheV0iLFZhPSJbb2JqZWN0IEludDMyQXJyYXldIixXYT0iW29iamVjdCBVaW50OEFycmF5XSIsemE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixYYT0iW29iamVjdCBVaW50MTZBcnJheV0iLEhhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsUT17fTtRW1VhXT1RW2phXT1RW0dhXT1RWyRhXT1RW1ZhXT1RW1dhXT1RW3phXT1RW1hhXT1RW0hhXT0hMCxRW2JhXT1RW2dhXT1RW1BhXT1RW1NhXT1RW0JhXT1RW21hXT1RW0ZhXT1RW3dhXT1RW0lhXT1RW05hXT1RW01hXT1RW0NhXT1RW3ZhXT1RW0RhXT1RW0xhXT0hMTtmdW5jdGlvbiBrYSh0KXtyZXR1cm4gYmUodCkmJnZuKHQubGVuZ3RoKSYmISFRW09lKHQpXX1mdW5jdGlvbiBQbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBacj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVpyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUscWE9RGUmJkRlLmV4cG9ydHM9PT1acixCbj1xYSYmQ3IucHJvY2VzcyxZYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxCbiYmQm4uYmluZGluZyYmQm4uYmluZGluZygidXRpbCIpfWNhdGNoe319KCksZ2U9WWEsUXI9Z2UmJmdlLmlzVHlwZWRBcnJheSxLYT1Rcj9QbihRcik6a2EsWmE9S2EsUWE9T2JqZWN0LnByb3RvdHlwZSxKYT1RYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBKcih0LGUpe3ZhciBuPUt0KHQpLHI9IW4mJkxuKHQpLGk9IW4mJiFyJiZLcih0KSxvPSFuJiYhciYmIWkmJlphKHQpLHM9bnx8cnx8aXx8byx1PXM/RWEodC5sZW5ndGgsU3RyaW5nKTpbXSxhPXUubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShlfHxKYS5jYWxsKHQsbCkpJiYhKHMmJihsPT0ibGVuZ3RoInx8aSYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fG8mJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxNbihsLGEpKSkmJnUucHVzaChsKTtyZXR1cm4gdX1mdW5jdGlvbiB0aSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19dmFyIHR1PXRpKE9iamVjdC5rZXlzLE9iamVjdCksZXU9dHUsbnU9T2JqZWN0LnByb3RvdHlwZSxydT1udS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBpdSh0KXtpZighRG4odCkpcmV0dXJuIGV1KHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpcnUuY2FsbCh0LG4pJiZuIT0iY29uc3RydWN0b3IiJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24gVW4odCl7cmV0dXJuIHpyKHQpP0pyKHQpOml1KHQpfWZ1bmN0aW9uIG91KHQpe3ZhciBlPVtdO2lmKHQhPW51bGwpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9dmFyIHN1PU9iamVjdC5wcm90b3R5cGUsYXU9c3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gdXUodCl7aWYoIWllKHQpKXJldHVybiBvdSh0KTt2YXIgZT1Ebih0KSxuPVtdO2Zvcih2YXIgciBpbiB0KXI9PSJjb25zdHJ1Y3RvciImJihlfHwhYXUuY2FsbCh0LHIpKXx8bi5wdXNoKHIpO3JldHVybiBufWZ1bmN0aW9uIGpuKHQpe3JldHVybiB6cih0KT9Kcih0LCEwKTp1dSh0KX12YXIgY3U9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8saHU9L15cdyokLztmdW5jdGlvbiBmdSh0LGUpe2lmKEt0KHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8d24odCk/ITA6aHUudGVzdCh0KXx8IWN1LnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBsdT1zZShPYmplY3QsImNyZWF0ZSIpLExlPWx1O2Z1bmN0aW9uIGR1KCl7dGhpcy5fX2RhdGFfXz1MZT9MZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBFdSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgX3U9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLHB1PU9iamVjdC5wcm90b3R5cGUseXU9cHUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gQXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihMZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PV91P3ZvaWQgMDpufXJldHVybiB5dS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIFR1PU9iamVjdC5wcm90b3R5cGUsUnU9VHUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24geHUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gTGU/ZVt0XSE9PXZvaWQgMDpSdS5jYWxsKGUsdCl9dmFyIE91PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBidSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09TGUmJmU9PT12b2lkIDA/T3U6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1kdSxhZS5wcm90b3R5cGUuZGVsZXRlPUV1LGFlLnByb3RvdHlwZS5nZXQ9QXUsYWUucHJvdG90eXBlLmhhcz14dSxhZS5wcm90b3R5cGUuc2V0PWJ1O2Z1bmN0aW9uIGd1KCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBzbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFZyKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIFN1PUFycmF5LnByb3RvdHlwZSxtdT1TdS5zcGxpY2U7ZnVuY3Rpb24gRnUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPXNuKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTptdS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiB3dSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49c24oZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIEl1KHQpe3JldHVybiBzbih0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIE51KHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPXNuKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gSHQodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19SHQucHJvdG90eXBlLmNsZWFyPWd1LEh0LnByb3RvdHlwZS5kZWxldGU9RnUsSHQucHJvdG90eXBlLmdldD13dSxIdC5wcm90b3R5cGUuaGFzPUl1LEh0LnByb3RvdHlwZS5zZXQ9TnU7dmFyIE11PXNlKFV0LCJNYXAiKSxQZT1NdTtmdW5jdGlvbiBDdSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoUGV8fEh0KSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiB2dSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBhbih0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIHZ1KGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gRHUodCl7dmFyIGU9YW4odGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBMdSh0KXtyZXR1cm4gYW4odGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gUHUodCl7cmV0dXJuIGFuKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIEJ1KHQsZSl7dmFyIG49YW4odGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBadCh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1adC5wcm90b3R5cGUuY2xlYXI9Q3UsWnQucHJvdG90eXBlLmRlbGV0ZT1EdSxadC5wcm90b3R5cGUuZ2V0PUx1LFp0LnByb3RvdHlwZS5oYXM9UHUsWnQucHJvdG90eXBlLnNldD1CdTt2YXIgVXU9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIEduKHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoVXUpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiBuLmNhY2hlPW5ldyhHbi5DYWNoZXx8WnQpLG59R24uQ2FjaGU9WnQ7dmFyIGp1PTUwMDtmdW5jdGlvbiBHdSh0KXt2YXIgZT1Hbih0LGZ1bmN0aW9uKHIpe3JldHVybiBuLnNpemU9PT1qdSYmbi5jbGVhcigpLHJ9KSxuPWUuY2FjaGU7cmV0dXJuIGV9dmFyICR1PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLFZ1PS9cXChcXCk/L2csV3U9R3UoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHQuY2hhckNvZGVBdCgwKT09PTQ2JiZlLnB1c2goIiIpLHQucmVwbGFjZSgkdSxmdW5jdGlvbihuLHIsaSxvKXtlLnB1c2goaT9vLnJlcGxhY2UoVnUsIiQxIik6cnx8bil9KSxlfSksenU9V3U7ZnVuY3Rpb24gWHUodCl7cmV0dXJuIHQ9PW51bGw/IiI6QnIodCl9ZnVuY3Rpb24gdW4odCxlKXtyZXR1cm4gS3QodCk/dDpmdSh0LGUpP1t0XTp6dShYdSh0KSl9dmFyIEh1PTEvMDtmdW5jdGlvbiAkbih0KXtpZih0eXBlb2YgdD09InN0cmluZyJ8fHduKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIGU9PSIwIiYmMS90PT0tSHU/Ii0wIjplfWZ1bmN0aW9uIGt1KHQsZSl7ZT11bihlLHQpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7dCE9bnVsbCYmbjxyOyl0PXRbJG4oZVtuKytdKV07cmV0dXJuIG4mJm49PXI/dDp2b2lkIDB9ZnVuY3Rpb24gVm4odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH12YXIgZWk9anQ/anQuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMDtmdW5jdGlvbiBxdSh0KXtyZXR1cm4gS3QodCl8fExuKHQpfHwhIShlaSYmdCYmdFtlaV0pfWZ1bmN0aW9uIG5pKHQsZSxuLHIsaSl7dmFyIG89LTEscz10Lmxlbmd0aDtmb3Iobnx8KG49cXUpLGl8fChpPVtdKTsrK288czspe3ZhciB1PXRbb107ZT4wJiZuKHUpP2U+MT9uaSh1LGUtMSxuLHIsaSk6Vm4oaSx1KTpyfHwoaVtpLmxlbmd0aF09dSl9cmV0dXJuIGl9ZnVuY3Rpb24gWXUodCl7dmFyIGU9dD09bnVsbD8wOnQubGVuZ3RoO3JldHVybiBlP25pKHQsMSk6W119ZnVuY3Rpb24gS3UodCl7cmV0dXJuIG9hKGZhKHQsdm9pZCAwLFl1KSx0KyIiKX12YXIgWnU9dGkoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCkscmk9WnU7ZnVuY3Rpb24gUXUoKXt0aGlzLl9fZGF0YV9fPW5ldyBIdCx0aGlzLnNpemU9MH1mdW5jdGlvbiBKdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn1mdW5jdGlvbiB0Yyh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gZWModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBuYz0yMDA7ZnVuY3Rpb24gcmModCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBIdCl7dmFyIHI9bi5fX2RhdGFfXztpZighUGV8fHIubGVuZ3RoPG5jLTEpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBadChyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9ZnVuY3Rpb24gU2UodCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgSHQodCk7dGhpcy5zaXplPWUuc2l6ZX1TZS5wcm90b3R5cGUuY2xlYXI9UXUsU2UucHJvdG90eXBlLmRlbGV0ZT1KdSxTZS5wcm90b3R5cGUuZ2V0PXRjLFNlLnByb3RvdHlwZS5oYXM9ZWMsU2UucHJvdG90eXBlLnNldD1yYztmdW5jdGlvbiBpYyh0LGUpe3JldHVybiB0JiZvbihlLFVuKGUpLHQpfWZ1bmN0aW9uIG9jKHQsZSl7cmV0dXJuIHQmJm9uKGUsam4oZSksdCl9dmFyIGlpPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsb2k9aWkmJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxzYz1vaSYmb2kuZXhwb3J0cz09PWlpLHNpPXNjP1V0LkJ1ZmZlcjp2b2lkIDAsYWk9c2k/c2kuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uIGFjKHQsZSl7aWYoZSlyZXR1cm4gdC5zbGljZSgpO3ZhciBuPXQubGVuZ3RoLHI9YWk/YWkobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfWZ1bmN0aW9uIHVjKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtlKHMsbix0KSYmKG9baSsrXT1zKX1yZXR1cm4gb31mdW5jdGlvbiB1aSgpe3JldHVybltdfXZhciBjYz1PYmplY3QucHJvdG90eXBlLGhjPWNjLnByb3BlcnR5SXNFbnVtZXJhYmxlLGNpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsZmM9Y2k/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLHVjKGNpKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBoYy5jYWxsKHQsZSl9KSl9OnVpLFduPWZjO2Z1bmN0aW9uIGxjKHQsZSl7cmV0dXJuIG9uKHQsV24odCksZSl9dmFyIGRjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsRWM9ZGM/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KVZuKGUsV24odCkpLHQ9cmkodCk7cmV0dXJuIGV9OnVpLGhpPUVjO2Z1bmN0aW9uIF9jKHQsZSl7cmV0dXJuIG9uKHQsaGkodCksZSl9ZnVuY3Rpb24gZmkodCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIEt0KHQpP3I6Vm4ocixuKHQpKX1mdW5jdGlvbiBwYyh0KXtyZXR1cm4gZmkodCxVbixXbil9ZnVuY3Rpb24geWModCl7cmV0dXJuIGZpKHQsam4saGkpfXZhciBBYz1zZShVdCwiRGF0YVZpZXciKSx6bj1BYyxUYz1zZShVdCwiUHJvbWlzZSIpLFhuPVRjLFJjPXNlKFV0LCJTZXQiKSxIbj1SYyxsaT0iW29iamVjdCBNYXBdIix4Yz0iW29iamVjdCBPYmplY3RdIixkaT0iW29iamVjdCBQcm9taXNlXSIsRWk9IltvYmplY3QgU2V0XSIsX2k9IltvYmplY3QgV2Vha01hcF0iLHBpPSJbb2JqZWN0IERhdGFWaWV3XSIsT2M9b2Uoem4pLGJjPW9lKFBlKSxnYz1vZShYbiksU2M9b2UoSG4pLG1jPW9lKE5uKSx1ZT1PZTsoem4mJnVlKG5ldyB6bihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9cGl8fFBlJiZ1ZShuZXcgUGUpIT1saXx8WG4mJnVlKFhuLnJlc29sdmUoKSkhPWRpfHxIbiYmdWUobmV3IEhuKSE9RWl8fE5uJiZ1ZShuZXcgTm4pIT1faSkmJih1ZT1mdW5jdGlvbih0KXt2YXIgZT1PZSh0KSxuPWU9PXhjP3QuY29uc3RydWN0b3I6dm9pZCAwLHI9bj9vZShuKToiIjtpZihyKXN3aXRjaChyKXtjYXNlIE9jOnJldHVybiBwaTtjYXNlIGJjOnJldHVybiBsaTtjYXNlIGdjOnJldHVybiBkaTtjYXNlIFNjOnJldHVybiBFaTtjYXNlIG1jOnJldHVybiBfaX1yZXR1cm4gZX0pO3ZhciBrbj11ZSxGYz1PYmplY3QucHJvdG90eXBlLHdjPUZjLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEljKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmd2MuY2FsbCh0LCJpbmRleCIpJiYobi5pbmRleD10LmluZGV4LG4uaW5wdXQ9dC5pbnB1dCksbn12YXIgTmM9VXQuVWludDhBcnJheSx5aT1OYztmdW5jdGlvbiBxbih0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgeWkoZSkuc2V0KG5ldyB5aSh0KSksZX1mdW5jdGlvbiBNYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfXZhciBDYz0vXHcqJC87ZnVuY3Rpb24gdmModCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2UsQ2MuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9dmFyIEFpPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsVGk9QWk/QWkudmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gRGModCl7cmV0dXJuIFRpP09iamVjdChUaS5jYWxsKHQpKTp7fX1mdW5jdGlvbiBMYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCl9dmFyIFBjPSJbb2JqZWN0IEJvb2xlYW5dIixCYz0iW29iamVjdCBEYXRlXSIsVWM9IltvYmplY3QgTWFwXSIsamM9IltvYmplY3QgTnVtYmVyXSIsR2M9IltvYmplY3QgUmVnRXhwXSIsJGM9IltvYmplY3QgU2V0XSIsVmM9IltvYmplY3QgU3RyaW5nXSIsV2M9IltvYmplY3QgU3ltYm9sXSIsemM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixYYz0iW29iamVjdCBEYXRhVmlld10iLEhjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLGtjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHFjPSJbb2JqZWN0IEludDhBcnJheV0iLFljPSJbb2JqZWN0IEludDE2QXJyYXldIixLYz0iW29iamVjdCBJbnQzMkFycmF5XSIsWmM9IltvYmplY3QgVWludDhBcnJheV0iLFFjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsSmM9IltvYmplY3QgVWludDE2QXJyYXldIix0aD0iW29iamVjdCBVaW50MzJBcnJheV0iO2Z1bmN0aW9uIGVoKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlIHpjOnJldHVybiBxbih0KTtjYXNlIFBjOmNhc2UgQmM6cmV0dXJuIG5ldyByKCt0KTtjYXNlIFhjOnJldHVybiBNYyh0LG4pO2Nhc2UgSGM6Y2FzZSBrYzpjYXNlIHFjOmNhc2UgWWM6Y2FzZSBLYzpjYXNlIFpjOmNhc2UgUWM6Y2FzZSBKYzpjYXNlIHRoOnJldHVybiBMYyh0LG4pO2Nhc2UgVWM6cmV0dXJuIG5ldyByO2Nhc2UgamM6Y2FzZSBWYzpyZXR1cm4gbmV3IHIodCk7Y2FzZSBHYzpyZXR1cm4gdmModCk7Y2FzZSAkYzpyZXR1cm4gbmV3IHI7Y2FzZSBXYzpyZXR1cm4gRGModCl9fWZ1bmN0aW9uIG5oKHQpe3JldHVybiB0eXBlb2YgdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIURuKHQpP2tzKHJpKHQpKTp7fX12YXIgcmg9IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gaWgodCl7cmV0dXJuIGJlKHQpJiZrbih0KT09cmh9dmFyIFJpPWdlJiZnZS5pc01hcCxvaD1SaT9QbihSaSk6aWgsc2g9b2gsYWg9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gdWgodCl7cmV0dXJuIGJlKHQpJiZrbih0KT09YWh9dmFyIHhpPWdlJiZnZS5pc1NldCxjaD14aT9Qbih4aSk6dWgsaGg9Y2gsZmg9MSxsaD0yLGRoPTQsT2k9IltvYmplY3QgQXJndW1lbnRzXSIsRWg9IltvYmplY3QgQXJyYXldIixfaD0iW29iamVjdCBCb29sZWFuXSIscGg9IltvYmplY3QgRGF0ZV0iLHloPSJbb2JqZWN0IEVycm9yXSIsYmk9IltvYmplY3QgRnVuY3Rpb25dIixBaD0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLFRoPSJbb2JqZWN0IE1hcF0iLFJoPSJbb2JqZWN0IE51bWJlcl0iLGdpPSJbb2JqZWN0IE9iamVjdF0iLHhoPSJbb2JqZWN0IFJlZ0V4cF0iLE9oPSJbb2JqZWN0IFNldF0iLGJoPSJbb2JqZWN0IFN0cmluZ10iLGdoPSJbb2JqZWN0IFN5bWJvbF0iLFNoPSJbb2JqZWN0IFdlYWtNYXBdIixtaD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEZoPSJbb2JqZWN0IERhdGFWaWV3XSIsd2g9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsSWg9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsTmg9IltvYmplY3QgSW50OEFycmF5XSIsTWg9IltvYmplY3QgSW50MTZBcnJheV0iLENoPSJbb2JqZWN0IEludDMyQXJyYXldIix2aD0iW29iamVjdCBVaW50OEFycmF5XSIsRGg9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixMaD0iW29iamVjdCBVaW50MTZBcnJheV0iLFBoPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWj17fTtaW09pXT1aW0VoXT1aW21oXT1aW0ZoXT1aW19oXT1aW3BoXT1aW3doXT1aW0loXT1aW05oXT1aW01oXT1aW0NoXT1aW1RoXT1aW1JoXT1aW2dpXT1aW3hoXT1aW09oXT1aW2JoXT1aW2doXT1aW3ZoXT1aW0RoXT1aW0xoXT1aW1BoXT0hMCxaW3loXT1aW2JpXT1aW1NoXT0hMTtmdW5jdGlvbiBjbih0LGUsbixyLGksbyl7dmFyIHMsdT1lJmZoLGE9ZSZsaCxsPWUmZGg7aWYobiYmKHM9aT9uKHQscixpLG8pOm4odCkpLHMhPT12b2lkIDApcmV0dXJuIHM7aWYoIWllKHQpKXJldHVybiB0O3ZhciBkPUt0KHQpO2lmKGQpe2lmKHM9SWModCksIXUpcmV0dXJuIFlzKHQscyl9ZWxzZXt2YXIgXz1rbih0KSxPPV89PWJpfHxfPT1BaDtpZihLcih0KSlyZXR1cm4gYWModCx1KTtpZihfPT1naXx8Xz09T2l8fE8mJiFpKXtpZihzPWF8fE8/e306bmgodCksIXUpcmV0dXJuIGE/X2ModCxvYyhzLHQpKTpsYyh0LGljKHMsdCkpfWVsc2V7aWYoIVpbX10pcmV0dXJuIGk/dDp7fTtzPWVoKHQsXyx1KX19b3x8KG89bmV3IFNlKTt2YXIgYj1vLmdldCh0KTtpZihiKXJldHVybiBiO28uc2V0KHQscyksaGgodCk/dC5mb3JFYWNoKGZ1bmN0aW9uKG0pe3MuYWRkKGNuKG0sZSxuLG0sdCxvKSl9KTpzaCh0KSYmdC5mb3JFYWNoKGZ1bmN0aW9uKG0sZyl7cy5zZXQoZyxjbihtLGUsbixnLHQsbykpfSk7dmFyIEk9bD9hP3ljOnBjOmE/am46VW4sUz1kP3ZvaWQgMDpJKHQpO3JldHVybiBzYShTfHx0LGZ1bmN0aW9uKG0sZyl7UyYmKGc9bSxtPXRbZ10pLENuKHMsZyxjbihtLGUsbixnLHQsbykpfSksc312YXIgQmg9MSxVaD00O2Z1bmN0aW9uIGpoKHQpe3JldHVybiBjbih0LEJofFVoKX1mdW5jdGlvbiBHaCh0LGUpe3JldHVybiB0IT1udWxsJiZlIGluIE9iamVjdCh0KX1mdW5jdGlvbiAkaCh0LGUsbil7ZT11bihlLHQpO2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89ITE7KytyPGk7KXt2YXIgcz0kbihlW3JdKTtpZighKG89dCE9bnVsbCYmbih0LHMpKSlicmVhazt0PXRbc119cmV0dXJuIG98fCsrciE9aT9vOihpPXQ9PW51bGw/MDp0Lmxlbmd0aCwhIWkmJnZuKGkpJiZNbihzLGkpJiYoS3QodCl8fExuKHQpKSl9ZnVuY3Rpb24gVmgodCxlKXtyZXR1cm4gdCE9bnVsbCYmJGgodCxlLEdoKX1mdW5jdGlvbiBXaCh0LGUsbixyKXtpZighaWUodCkpcmV0dXJuIHQ7ZT11bihlLHQpO2Zvcih2YXIgaT0tMSxvPWUubGVuZ3RoLHM9by0xLHU9dDt1IT1udWxsJiYrK2k8bzspe3ZhciBhPSRuKGVbaV0pLGw9bjtpZihhPT09Il9fcHJvdG9fXyJ8fGE9PT0iY29uc3RydWN0b3IifHxhPT09InByb3RvdHlwZSIpcmV0dXJuIHQ7aWYoaSE9cyl7dmFyIGQ9dVthXTtsPXI/cihkLGEsdSk6dm9pZCAwLGw9PT12b2lkIDAmJihsPWllKGQpP2Q6TW4oZVtpKzFdKT9bXTp7fSl9Q24odSxhLGwpLHU9dVthXX1yZXR1cm4gdH1mdW5jdGlvbiB6aCh0LGUsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBzPWVbcl0sdT1rdSh0LHMpO24odSxzKSYmV2gobyx1bihzLHQpLHUpfXJldHVybiBvfWZ1bmN0aW9uIFhoKHQsZSl7cmV0dXJuIHpoKHQsZSxmdW5jdGlvbihuLHIpe3JldHVybiBWaCh0LHIpfSl9dmFyIEhoPUt1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306WGgodCxlKX0pLGtoPUhoO2Z1bmN0aW9uIHFoKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KX1mdW5jdGlvbiBkdCh0LGUpe3JldHVybiB0Pz9lfWNvbnN0IFloPW5ldyB0bigwLDApO2Z1bmN0aW9uIEtoKHQsZSxuKXtyZXR1cm4gdC5sZW5ndGg9PT0wfHx0WzBdLmxlbmd0aD09PTA/ITE6dFswXVswXS5kaXN0U3FyKGUpPD1uKioyfWZ1bmN0aW9uIFpoKHQsZSxuKXtpZih0Lmxlbmd0aD09PTApcmV0dXJuITE7Y29uc3Qgcj10WzBdLGk9bi8yO2ZvcihsZXQgbz0wO288ci5sZW5ndGgtMTtvKyspe2NvbnN0IHM9cltvXSx1PXJbbysxXTtpZihRaChzLHUsZSxpLFloKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBRaCh0LGUsbixyLGk9bmV3IHRuKDAsMCkpe2NvbnN0IG89dC5kaXN0U3FyKGUpO2lmKG89PT0wKXJldHVybiExO2NvbnN0IHM9KChuLngtdC54KSooZS54LXQueCkrKG4ueS10LnkpKihlLnktdC55KSkvbyx1PU1hdGgubWF4KDAsTWF0aC5taW4oMSxzKSksYT1pO3JldHVybiBhLng9dC54K3UqKGUueC10LngpLGEueT10LnkrdSooZS55LXQueSksbi5kaXN0U3FyKGEpPD1yKioyfWNvbnN0IEpoPXQ9PntsZXQgZT0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXQuY2hhckNvZGVBdChuKTtlPShlPDw1KS1lK3IsZSY9ZX1yZXR1cm4gZS50b1N0cmluZygxNil9LHRmPXFoKHttYXJrZXI6MSxwb2x5bGluZToxLHBvbHlnb246MSxlbGxpcHNvaWQ6MSxlbGxpcHNlOjEsbW9kZWw6MSwiM2R0aWxlcyI6MSxib3g6MSxwaG90b292ZXJsYXk6MSxyZXNvdXJjZToxLHJhc3RlcjoxLGhlYXRNYXA6MSxmcnVzdHVtOjEsdHJhbnNpdGlvbjoxfSk7dmFyIE09KHQ9Pih0W3QuVkFSSUFCTEU9MF09IlZBUklBQkxFIix0W3QuVU5BUlk9MV09IlVOQVJZIix0W3QuQklOQVJZPTJdPSJCSU5BUlkiLHRbdC5URVJOQVJZPTNdPSJURVJOQVJZIix0W3QuQ09ORElUSU9OQUw9NF09IkNPTkRJVElPTkFMIix0W3QuTUVNQkVSPTVdPSJNRU1CRVIiLHRbdC5GVU5DVElPTl9DQUxMPTZdPSJGVU5DVElPTl9DQUxMIix0W3QuQVJSQVk9N109IkFSUkFZIix0W3QuUkVHRVg9OF09IlJFR0VYIix0W3QuVkFSSUFCTEVfSU5fU1RSSU5HPTldPSJWQVJJQUJMRV9JTl9TVFJJTkciLHRbdC5MSVRFUkFMX05VTEw9MTBdPSJMSVRFUkFMX05VTEwiLHRbdC5MSVRFUkFMX0JPT0xFQU49MTFdPSJMSVRFUkFMX0JPT0xFQU4iLHRbdC5MSVRFUkFMX05VTUJFUj0xMl09IkxJVEVSQUxfTlVNQkVSIix0W3QuTElURVJBTF9TVFJJTkc9MTNdPSJMSVRFUkFMX1NUUklORyIsdFt0LkxJVEVSQUxfQ09MT1I9MTRdPSJMSVRFUkFMX0NPTE9SIix0W3QuTElURVJBTF9WRUNUT1I9MTVdPSJMSVRFUkFMX1ZFQ1RPUiIsdFt0LkxJVEVSQUxfUkVHRVg9MTZdPSJMSVRFUkFMX1JFR0VYIix0W3QuTElURVJBTF9VTkRFRklORUQ9MTddPSJMSVRFUkFMX1VOREVGSU5FRCIsdFt0LkJVSUxUSU5fVkFSSUFCTEU9MThdPSJCVUlMVElOX1ZBUklBQkxFIix0KSkoTXx8e30pO2NvbnN0IGVmPVsiISIsIi0iLCIrIl0sbmY9WyIrIiwiLSIsIioiLCIvIiwiJSIsIj09PSIsIiE9PSIsIj4iLCI+PSIsIjwiLCI8PSIsIiYmIiwifHwiLCIhfiIsIj1+IiwiPT0iLCIhPSJdLHJmPS9cXC9nLG9mPSJAIyUiLHNmPS9AIyUvZyxhZj0vXiMoWzAtOWEtZl0pKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pPyQvaSx1Zj0vXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPyQvaSxTaT17QUxJQ0VCTFVFOiIjRjBGOEZGIixBTlRJUVVFV0hJVEU6IiNGQUVCRDciLEFRVUE6IiMwMEZGRkYiLEFRVUFNQVJJTkU6IiM3RkZGRDQiLEFaVVJFOiIjRjBGRkZGIixCRUlHRToiI0Y1RjVEQyIsQklTUVVFOiIjRkZFNEM0IixCTEFDSzoiIzAwMDAwMCIsQkxBTkNIRURBTE1PTkQ6IiNGRkVCQ0QiLEJMVUU6IiMwMDAwRkYiLEJMVUVWSU9MRVQ6IiM4QTJCRTIiLEJST1dOOiIjQTUyQTJBIixCVVJMWVdPT0Q6IiNERUI4ODciLENBREVUQkxVRToiIzVGOUVBMCIsQ0hBUlRSRVVTRToiIzdGRkYwMCIsQ0hPQ09MQVRFOiIjRDI2OTFFIixDT1JBTDoiI0ZGN0Y1MCIsQ09STkZMT1dFUkJMVUU6IiM2NDk1RUQiLENPUk5TSUxLOiIjRkZGOERDIixDUklNU09OOiIjREMxNDNDIixDWUFOOiIjMDBGRkZGIixEQVJLQkxVRToiIzAwMDA4QiIsREFSS0NZQU46IiMwMDhCOEIiLERBUktHT0xERU5ST0Q6IiNCODg2MEIiLERBUktHUkFZOiIjQTlBOUE5IixEQVJLR1JFRU46IiMwMDY0MDAiLERBUktHUkVZOiIjQTlBOUE5IixEQVJLS0hBS0k6IiNCREI3NkIiLERBUktNQUdFTlRBOiIjOEIwMDhCIixEQVJLT0xJVkVHUkVFTjoiIzU1NkIyRiIsREFSS09SQU5HRToiI0ZGOEMwMCIsREFSS09SQ0hJRDoiIzk5MzJDQyIsREFSS1JFRDoiIzhCMDAwMCIsREFSS1NBTE1PTjoiI0U5OTY3QSIsREFSS1NFQUdSRUVOOiIjOEZCQzhGIixEQVJLU0xBVEVCTFVFOiIjNDgzRDhCIixEQVJLU0xBVEVHUkFZOiIjMkY0RjRGIixEQVJLU0xBVEVHUkVZOiIjMkY0RjRGIixEQVJLVFVSUVVPSVNFOiIjMDBDRUQxIixEQVJLVklPTEVUOiIjOTQwMEQzIixERUVQUElOSzoiI0ZGMTQ5MyIsREVFUFNLWUJMVUU6IiMwMEJGRkYiLERJTUdSQVk6IiM2OTY5NjkiLERJTUdSRVk6IiM2OTY5NjkiLERPREdFUkJMVUU6IiMxRTkwRkYiLEZJUkVCUklDSzoiI0IyMjIyMiIsRkxPUkFMV0hJVEU6IiNGRkZBRjAiLEZPUkVTVEdSRUVOOiIjMjI4QjIyIixGVUNIU0lBOiIjRkYwMEZGIixHQUlOU0JPUk86IiNEQ0RDREMiLEdIT1NUV0hJVEU6IiNGOEY4RkYiLEdPTEQ6IiNGRkQ3MDAiLEdPTERFTlJPRDoiI0RBQTUyMCIsR1JBWToiIzgwODA4MCIsR1JFRU46IiMwMDgwMDAiLEdSRUVOWUVMTE9XOiIjQURGRjJGIixHUkVZOiIjODA4MDgwIixIT05FWURFVzoiI0YwRkZGMCIsSE9UUElOSzoiI0ZGNjlCNCIsSU5ESUFOUkVEOiIjQ0Q1QzVDIixJTkRJR086IiM0QjAwODIiLElWT1JZOiIjRkZGRkYwIixLSEFLSToiI0YwRTY4QyIsTEFWRU5ERVI6IiNFNkU2RkEiLExBVkVOREFSX0JMVVNIOiIjRkZGMEY1IixMQVdOR1JFRU46IiM3Q0ZDMDAiLExFTU9OQ0hJRkZPTjoiI0ZGRkFDRCIsTElHSFRCTFVFOiIjQUREOEU2IixMSUdIVENPUkFMOiIjRjA4MDgwIixMSUdIVENZQU46IiNFMEZGRkYiLExJR0hUR09MREVOUk9EWUVMTE9XOiIjRkFGQUQyIixMSUdIVEdSQVk6IiNEM0QzRDMiLExJR0hUR1JFRU46IiM5MEVFOTAiLExJR0hUR1JFWToiI0QzRDNEMyIsTElHSFRQSU5LOiIjRkZCNkMxIixMSUdIVFNFQUdSRUVOOiIjMjBCMkFBIixMSUdIVFNLWUJMVUU6IiM4N0NFRkEiLExJR0hUU0xBVEVHUkFZOiIjNzc4ODk5IixMSUdIVFNMQVRFR1JFWToiIzc3ODg5OSIsTElHSFRTVEVFTEJMVUU6IiNCMEM0REUiLExJR0hUWUVMTE9XOiIjRkZGRkUwIixMSU1FOiIjMDBGRjAwIixMSU1FR1JFRU46IiMzMkNEMzIiLExJTkVOOiIjRkFGMEU2IixNQUdFTlRBOiIjRkYwMEZGIixNQVJPT046IiM4MDAwMDAiLE1FRElVTUFRVUFNQVJJTkU6IiM2NkNEQUEiLE1FRElVTUJMVUU6IiMwMDAwQ0QiLE1FRElVTU9SQ0hJRDoiI0JBNTVEMyIsTUVESVVNUFVSUExFOiIjOTM3MERCIixNRURJVU1TRUFHUkVFTjoiIzNDQjM3MSIsTUVESVVNU0xBVEVCTFVFOiIjN0I2OEVFIixNRURJVU1TUFJJTkdHUkVFTjoiIzAwRkE5QSIsTUVESVVNVFVSUVVPSVNFOiIjNDhEMUNDIixNRURJVU1WSU9MRVRSRUQ6IiNDNzE1ODUiLE1JRE5JR0hUQkxVRToiIzE5MTk3MCIsTUlOVENSRUFNOiIjRjVGRkZBIixNSVNUWVJPU0U6IiNGRkU0RTEiLE1PQ0NBU0lOOiIjRkZFNEI1IixOQVZBSk9XSElURToiI0ZGREVBRCIsTkFWWToiIzAwMDA4MCIsT0xETEFDRToiI0ZERjVFNiIsT0xJVkU6IiM4MDgwMDAiLE9MSVZFRFJBQjoiIzZCOEUyMyIsT1JBTkdFOiIjRkZBNTAwIixPUkFOR0VSRUQ6IiNGRjQ1MDAiLE9SQ0hJRDoiI0RBNzBENiIsUEFMRUdPTERFTlJPRDoiI0VFRThBQSIsUEFMRUdSRUVOOiIjOThGQjk4IixQQUxFVFVSUVVPSVNFOiIjQUZFRUVFIixQQUxFVklPTEVUUkVEOiIjREI3MDkzIixQQVBBWUFXSElQOiIjRkZFRkQ1IixQRUFDSFBVRkY6IiNGRkRBQjkiLFBFUlU6IiNDRDg1M0YiLFBJTks6IiNGRkMwQ0IiLFBMVU06IiNEREEwREQiLFBPV0RFUkJMVUU6IiNCMEUwRTYiLFBVUlBMRToiIzgwMDA4MCIsUkVEOiIjRkYwMDAwIixST1NZQlJPV046IiNCQzhGOEYiLFJPWUFMQkxVRToiIzQxNjlFMSIsU0FERExFQlJPV046IiM4QjQ1MTMiLFNBTE1PTjoiI0ZBODA3MiIsU0FORFlCUk9XTjoiI0Y0QTQ2MCIsU0VBR1JFRU46IiMyRThCNTciLFNFQVNIRUxMOiIjRkZGNUVFIixTSUVOTkE6IiNBMDUyMkQiLFNJTFZFUjoiI0MwQzBDMCIsU0tZQkxVRToiIzg3Q0VFQiIsU0xBVEVCTFVFOiIjNkE1QUNEIixTTEFURUdSQVk6IiM3MDgwOTAiLFNMQVRFR1JFWToiIzcwODA5MCIsU05PVzoiI0ZGRkFGQSIsU1BSSU5HR1JFRU46IiMwMEZGN0YiLFNURUVMQkxVRToiIzQ2ODJCNCIsVEFOOiIjRDJCNDhDIixURUFMOiIjMDA4MDgwIixUSElTVExFOiIjRDhCRkQ4IixUT01BVE86IiNGRjYzNDciLFRVUlFVT0lTRToiIzQwRTBEMCIsVklPTEVUOiIjRUU4MkVFIixXSEVBVDoiI0Y1REVCMyIsV0hJVEU6IiNGRkZGRkYiLFdISVRFU01PS0U6IiNGNUY1RjUiLFlFTExPVzoiI0ZGRkYwMCIsWUVMTE9XR1JFRU46IiM5QUNEMzIifTtmdW5jdGlvbiBjZih0KXtjb25zdCBlPVluW3RdO3JldHVybiBmdW5jdGlvbihuKXtjb25zdCByPXRoaXMuX2xlZnQuZXZhbHVhdGUobiksaT10aGlzLl9yaWdodC5ldmFsdWF0ZShuKTtyZXR1cm4gZSh0LHIsaSl9fWNvbnN0IFluPXthdGFuMjpCZShNYXRoLmF0YW4yLCExKSxwb3c6QmUoTWF0aC5wb3csITEpLG1pbjpCZShNYXRoLm1pbiwhMCksbWF4OkJlKE1hdGgubWF4LCEwKSxzdGFydHNXaXRoOkJlKGhmLCExKX07ZnVuY3Rpb24gQmUodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe2lmKGUmJnR5cGVvZiBpPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIifHx0eXBlb2Ygcj09Im51bWJlciImJnR5cGVvZiBpPT0ibnVtYmVyInx8dHlwZW9mIHI9PSJzdHJpbmciJiZ0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHQocixpKTt0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uICIke259IiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcy4gQXJndW1lbnRzIGFyZSAke3J9IGFuZCAke2l9LmApfX1mdW5jdGlvbiBoZih0LGUpe3JldHVybiB0LnN0YXJ0c1dpdGgoZSl9ZnVuY3Rpb24gZmYodCl7Y29uc3QgZT1Lblt0XTtyZXR1cm4gZnVuY3Rpb24obil7Y29uc3Qgcj10aGlzLl9sZWZ0LmV2YWx1YXRlKG4pO3JldHVybiBlKHQscil9fWNvbnN0IEtuPXthYnM6Y3QoTWF0aC5hYnMpLHNxcnQ6Y3QoTWF0aC5zcXJ0KSxjb3M6Y3QoTWF0aC5jb3MpLHNpbjpjdChNYXRoLnNpbiksdGFuOmN0KE1hdGgudGFuKSxhY29zOmN0KE1hdGguYWNvcyksYXNpbjpjdChNYXRoLmFzaW4pLGF0YW46Y3QoTWF0aC5hdGFuKSxyYWRpYW5zOmN0KFIudG9SYWRpYW5zKSxkZWdyZWVzOmN0KFIudG9EZWdyZWVzKSxzaWduOmN0KFIuc2lnbiksZmxvb3I6Y3QoTWF0aC5mbG9vciksY2VpbDpjdChNYXRoLmNlaWwpLHJvdW5kOmN0KE1hdGgucm91bmQpLGV4cDI6Y3QoZGYpLGxvZzpjdChNYXRoLmxvZyksbG9nMjpjdChFZiksZnJhY3Q6Y3QobGYpfTtmdW5jdGlvbiBjdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuIHQobik7dGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiAiJHtlfSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfX1mdW5jdGlvbiBsZih0KXtyZXR1cm4gdC1NYXRoLmZsb29yKHQpfWZ1bmN0aW9uIGRmKHQpe3JldHVybiBNYXRoLnBvdygyLHQpfWZ1bmN0aW9uIEVmKHQpe3JldHVybiBSLmxvZzIodCl9Y29uc3QgX2Y9L15yZ2JhP1woXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPykoPzpccyosXHMqKFswLTkuXSspKT9ccypcKSQvaSxwZj0vXmhzbGE/XChccyooWzAtOS5dKylccyosXHMqKFswLTkuXSslKVxzKixccyooWzAtOS5dKyUpKD86XHMqLFxzKihbMC05Ll0rKSk/XHMqXCkkL2k7Y2xhc3MgSntjb25zdHJ1Y3RvcihlLG4scixpKXtDKHRoaXMsInJlZCIpO0ModGhpcywiZ3JlZW4iKTtDKHRoaXMsImJsdWUiKTtDKHRoaXMsImFscGhhIik7dGhpcy5yZWQ9ZHQoZSwxKSx0aGlzLmdyZWVuPWR0KG4sMSksdGhpcy5ibHVlPWR0KHIsMSksdGhpcy5hbHBoYT1kdChpLDEpfXN0YXRpYyBieXRlVG9GbG9hdChlKXtyZXR1cm4gZS8yNTV9c3RhdGljIGZsb2F0VG9CeXRlKGUpe3JldHVybiBlPT09MT8yNTU6ZSoyNTZ8MH1zdGF0aWMgZnJvbUNzc0NvbG9yU3RyaW5nKGUpe2U9ZS5yZXBsYWNlKC9ccy9nLCIiKTtjb25zdCBuPXlmKGUpO2lmKHR5cGVvZiBuPCJ1IilyZXR1cm4gbjtsZXQgcj1hZi5leGVjKGUpO2lmKHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8xNSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzE1LGkuYmx1ZT1wYXJzZUludChyWzNdLDE2KS8xNSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImYiKSwxNikvMTUsaX1pZihyPXVmLmV4ZWMoZSksciE9PW51bGwpe2NvbnN0IGk9bmV3IEo7cmV0dXJuIGkucmVkPXBhcnNlSW50KHJbMV0sMTYpLzI1NSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzI1NSxpLmJsdWU9cGFyc2VJbnQoclszXSwxNikvMjU1LGkuYWxwaGE9cGFyc2VJbnQoZHQocls0XSwiZmYiKSwxNikvMjU1LGl9aWYocj1fZi5leGVjKGUpLHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUZsb2F0KHJbMV0pLyhyWzFdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ncmVlbj1wYXJzZUZsb2F0KHJbMl0pLyhyWzJdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ibHVlPXBhcnNlRmxvYXQoclszXSkvKHJbM10uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmFscGhhPXBhcnNlRmxvYXQoZHQocls0XSwiMS4wIikpLGl9aWYocj1wZi5leGVjKGUpLHIhPT1udWxsKXJldHVybiBKLmZyb21Ic2wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAscGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSkpfXN0YXRpYyBmcm9tSHNsKGUsbixyLGkpe2lmKGU9ZHQoZSwwKSUxLG49ZHQobiwwKSxyPWR0KHIsMCksaT1kdChpLDEpLGUmJm4mJnImJmkpe2xldCBvPXIscz1yLHU9cjtjb25zdCBhPW5ldyBKO2lmKG4hPT0wKXtsZXQgbDtyPC41P2w9ciooMStuKTpsPXIrbi1yKm47Y29uc3QgZD0yKnItbDtvPVpuKGQsbCxlKzEvMykscz1abihkLGwsZSksdT1abihkLGwsZS0xLzMpfXJldHVybiB0eXBlb2YgYT4idSI/bmV3IEoobyxzLHUsaSk6KGEucmVkPW8sYS5ncmVlbj1zLGEuYmx1ZT11LGEuYWxwaGE9aSxhKX19dG9Dc3NIZXhTdHJpbmcoKXtsZXQgZT1KLmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7ZS5sZW5ndGg8MiYmKGU9YDAke2V9YCk7bGV0IG49Si5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKS50b1N0cmluZygxNik7bi5sZW5ndGg8MiYmKG49YDAke259YCk7bGV0IHI9Si5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLnRvU3RyaW5nKDE2KTtpZihyLmxlbmd0aDwyJiYocj1gMCR7cn1gKSx0aGlzLmFscGhhPDEpe2xldCBpPUouZmxvYXRUb0J5dGUodGhpcy5hbHBoYSkudG9TdHJpbmcoMTYpO3JldHVybiBpLmxlbmd0aDwyJiYoaT1gMCR7aX1gKSxgIyR7ZX0ke259JHtyfSR7aX1gfXJldHVybmAjJHtlfSR7bn0ke3J9YC50b1VwcGVyQ2FzZSgpfXN0YXRpYyBmcm9tQnl0ZXMoZSxuLHIsaSl7cmV0dXJuIGU9dGhpcy5ieXRlVG9GbG9hdChkdChlLDI1NSkpLG49Si5ieXRlVG9GbG9hdChkdChuLDI1NSkpLHI9Si5ieXRlVG9GbG9hdChkdChyLDI1NSkpLGk9Si5ieXRlVG9GbG9hdChkdChpLDI1NSkpLG5ldyBKKGUsbixyLGkpfX1mdW5jdGlvbiB5Zih0KXtpZih0PXQudG9VcHBlckNhc2UoKSxTaVt0XSlyZXR1cm4gSi5mcm9tQ3NzQ29sb3JTdHJpbmcoU2lbdF0pO3N3aXRjaCh0KXtjYXNlIlRSQU5TUEFSRU5UIjpyZXR1cm4gbmV3IEooMCwwLDAsMCk7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIFpuKHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbio2PDE/dCsoZS10KSo2Km46bioyPDE/ZTpuKjM8Mj90KyhlLXQpKigyLzMtbikqNjp0fWNsYXNzIFB7Y29uc3RydWN0b3IoZSxuLHIsaSxvKXtDKHRoaXMsIl90eXBlIik7Qyh0aGlzLCJfdmFsdWUiKTtDKHRoaXMsIl9sZWZ0Iik7Qyh0aGlzLCJfcmlnaHQiKTtDKHRoaXMsIl90ZXN0Iik7Qyh0aGlzLCJldmFsdWF0ZSIpO3RoaXMuX3R5cGU9ZSx0aGlzLl92YWx1ZT1uLHRoaXMuX2xlZnQ9cix0aGlzLl9yaWdodD1pLHRoaXMuX3Rlc3Q9byx0aGlzLnNldEV2YWx1YXRlRnVuY3Rpb24oKX1zZXRFdmFsdWF0ZUZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLl90eXBlLG49dGhpcy5fdmFsdWU7c3dpdGNoKGUpe2Nhc2UgTS5DT05ESVRJT05BTDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uYWw7YnJlYWs7Y2FzZSBNLkZVTkNUSU9OX0NBTEw6c3dpdGNoKG4pe2Nhc2UidG9TdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVUb1N0cmluZzticmVha31icmVhaztjYXNlIE0uVU5BUlk6c3dpdGNoKG4pe2Nhc2UiISI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdDticmVhaztjYXNlIi0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOZWdhdGl2ZTticmVhaztjYXNlIisiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVQb3NpdGl2ZTticmVhaztjYXNlImlzTmFOIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTmFOO2JyZWFrO2Nhc2UiaXNGaW5pdGUiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVJc0Zpbml0ZTticmVhaztjYXNlIkJvb2xlYW4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVCb29sZWFuQ29udmVyc2lvbjticmVhaztjYXNlIk51bWJlciI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb247YnJlYWs7Y2FzZSJTdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVTdHJpbmdDb252ZXJzaW9uO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIEtuW25dPCJ1IiYmKHRoaXMuZXZhbHVhdGU9ZmYobikpO2JyZWFrfWJyZWFrO2Nhc2UgTS5CSU5BUlk6c3dpdGNoKG4pe2Nhc2UiKyI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZVBsdXM7YnJlYWs7Y2FzZSItIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWludXM7YnJlYWs7Y2FzZSIqIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVGltZXM7YnJlYWs7Y2FzZSIvIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRGl2aWRlO2JyZWFrO2Nhc2UiJSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1vZDticmVhaztjYXNlIj09PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUVxdWFsc1N0cmljdDticmVhaztjYXNlIiE9PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdEVxdWFsc1N0cmljdDticmVhaztjYXNlIjwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVMZXNzVGhhbjticmVhaztjYXNlIjw9Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGVzc1RoYW5PckVxdWFsczticmVhaztjYXNlIj4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVHcmVhdGVyVGhhbjticmVhaztjYXNlIj49Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlR3JlYXRlclRoYW5PckVxdWFsczticmVhaztjYXNlIiYmIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQW5kO2JyZWFrO2Nhc2UifHwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVPcjticmVhaztjYXNlIj09Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRXF1YWxzO2JyZWFrO2Nhc2UiIT0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOb3RFcXVhbHM7YnJlYWs7ZGVmYXVsdDp0eXBlb2YgWW5bbl08InUiJiYodGhpcy5ldmFsdWF0ZT1jZihuKSk7YnJlYWt9YnJlYWs7Y2FzZSBNLk1FTUJFUjpuPT09ImJyYWNrZXRzIj90aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWVtYmVyQnJhY2tldHM6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1lbWJlckRvdDticmVhaztjYXNlIE0uQVJSQVk6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUFycmF5O2JyZWFrO2Nhc2UgTS5WQVJJQUJMRTp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGU7YnJlYWs7Y2FzZSBNLlZBUklBQkxFX0lOX1NUUklORzp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGVTdHJpbmc7YnJlYWs7Y2FzZSBNLkxJVEVSQUxfQ09MT1I6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxDb2xvcjticmVhaztjYXNlIE0uTElURVJBTF9TVFJJTkc6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxTdHJpbmc7YnJlYWs7ZGVmYXVsdDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGl0ZXJhbDticmVha319X2V2YWx1YXRlTGl0ZXJhbCgpe3JldHVybiB0aGlzLl92YWx1ZX1fZXZhbHVhdGVMaXRlcmFsU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfV9ldmFsdWF0ZVZhcmlhYmxlU3RyaW5nKGUpe2NvbnN0IG49L1wkeyguKj8pfS9nO2xldCByPXRoaXMuX3ZhbHVlLGk9bi5leGVjKHIpO2Zvcig7aSE9PW51bGw7KXtjb25zdCBvPWlbMF0scz1pWzFdO2xldCB1PWU9PW51bGw/dm9pZCAwOmUucHJvcGVydGllc1tzXTt0eXBlb2YgdT4idSImJih1PSIiKSxyPXIucmVwbGFjZShvLHUpLGk9bi5leGVjKHIpfXJldHVybiByfV9ldmFsdWF0ZVZhcmlhYmxlKGUpe2xldCBuO3JldHVybiBlJiZTdHJpbmcodGhpcy5fdmFsdWUpaW4gZS5wcm9wZXJ0aWVzP249ZS5wcm9wZXJ0aWVzW1N0cmluZyh0aGlzLl92YWx1ZSldOlN0cmluZyh0aGlzLl92YWx1ZSk9PT0iaWQiP249ZT09bnVsbD92b2lkIDA6ZS5pZDplJiZTdHJpbmcodGhpcy5fdmFsdWUpPT09InJvb3RQcm9wZXJ0aWVzIiYmKG49ZS5wcm9wZXJ0aWVzKSx0eXBlb2Ygbj4idSImJihuPSIiKSxufV9ldmFsdWF0ZU1lbWJlckRvdChlKXtpZihtaSh0aGlzLl9sZWZ0KSlyZXR1cm4gZT09bnVsbD92b2lkIDA6ZS5wcm9wZXJ0aWVzW3RoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpXTtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4+InUiKXJldHVybjtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuW3JdfV9ldmFsdWF0ZU1lbWJlckJyYWNrZXRzKGUpe2lmKG1pKHRoaXMuX2xlZnQpKXJldHVybiBlPT1udWxsP3ZvaWQgMDplLnByb3BlcnRpZXNbdGhpcy5fcmlnaHQuZXZhbHVhdGUoZSldO2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj4idSIpcmV0dXJuO2NvbnN0IHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG5bcl19X2V2YWx1YXRlQXJyYXkoZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX3ZhbHVlLmxlbmd0aDtyKyspbltyXT10aGlzLl92YWx1ZVtyXS5ldmFsdWF0ZShlKTtyZXR1cm4gbn1fZXZhbHVhdGVOb3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiISIgcmVxdWlyZXMgYSBib29sZWFuIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiFufV9ldmFsdWF0ZU5lZ2F0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuLW47dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfV9ldmFsdWF0ZVBvc2l0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiKyIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiBufV9ldmFsdWF0ZUxlc3NUaGFuKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPCIgcmVxdWlyZXMgbnVtYmVyIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApLCExKTpuPHJ9X2V2YWx1YXRlTGVzc1RoYW5PckVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIG4hPSJudW1iZXIifHx0eXBlb2YgciE9Im51bWJlciI/KGNvbnNvbGUud2FybihgT3BlcmF0b3IgIjw9IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm48PXJ9X2V2YWx1YXRlR3JlYXRlclRoYW4oZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHR5cGVvZiBuIT0ibnVtYmVyInx8dHlwZW9mIHIhPSJudW1iZXIiPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICI+IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm4+cn1fZXZhbHVhdGVHcmVhdGVyVGhhbk9yRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPj0iIHJlcXVpcmVzIG51bWJlciBhcmd1bWVudHMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKSwhMSk6bj49cn1fZXZhbHVhdGVPcihlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4hPSJib29sZWFuIilyZXR1cm4gY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyAke259LmApLCExO2lmKG4pcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIHIhPSJib29sZWFuIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBTZWNvbmQgYXJndW1lbnQgaXMgJHtyfS5gKSwhMSk6bnx8cn1fZXZhbHVhdGVBbmQoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpcmV0dXJuIGNvbnNvbGUud2FybihgT3BlcmF0b3IgIiYmIiByZXF1aXJlcyBib29sZWFuIGFyZ3VtZW50cy4gRmlyc3QgYXJndW1lbnQgaXMgJHtufS5gKSwhMTtpZighbilyZXR1cm4hMTtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgciE9ImJvb2xlYW4iPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICImJiIgcmVxdWlyZXMgYm9vbGVhbiBhcmd1bWVudHMuIFNlY29uZCBhcmd1bWVudCBpcyAke3J9LmApLCExKTpuJiZyfV9ldmFsdWF0ZVBsdXMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4rcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIrIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYXQgbGVhc3Qgb25lIHN0cmluZyBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1pbnVzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIiKXJldHVybiBuLXI7dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVUaW1lcyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbipyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIioiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgdmVjdG9ycyB0aGV5IG11c3QgYmUgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVEaXZpZGUoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4vcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIvIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYSBudW1iZXIgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1vZChlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbiVyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIiUiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzIG9mIG1hdGNoaW5nIHR5cGVzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCl9X2V2YWx1YXRlRXF1YWxzU3RyaWN0KGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuPT09cn1fZXZhbHVhdGVOb3RFcXVhbHNTdHJpY3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG4hPT1yfV9ldmFsdWF0ZUNvbmRpdGlvbmFsKGUpe2NvbnN0IG49dGhpcy5fdGVzdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcihgQ29uZGl0aW9uYWwgYXJndW1lbnQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGEgYm9vbGVhbi4gQXJndW1lbnQgaXMgJHtufS5gKTtyZXR1cm4gbj90aGlzLl9sZWZ0LmV2YWx1YXRlKGUpOnRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpfV9ldmFsdWF0ZU5hTihlKXtyZXR1cm4gaXNOYU4odGhpcy5fbGVmdC5ldmFsdWF0ZShlKSl9X2V2YWx1YXRlSXNGaW5pdGUoZSl7cmV0dXJuIGlzRmluaXRlKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZUJvb2xlYW5Db252ZXJzaW9uKGUpe3JldHVybiBCb29sZWFuKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb24oZSl7Y29uc3Qgbj1BZih0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKTtyZXR1cm4gTnVtYmVyKG4pfV9ldmFsdWF0ZVN0cmluZ0NvbnZlcnNpb24oZSl7cmV0dXJuIFN0cmluZyh0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKX1fZXZhbHVhdGVUb1N0cmluZyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYobiBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gU3RyaW5nKG4pO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke3RoaXMuX3ZhbHVlfSIuYCl9X2V2YWx1YXRlTGl0ZXJhbENvbG9yKGUpe2NvbnN0IG49dGhpcy5fbGVmdDtsZXQgcj1uZXcgSjtpZih0aGlzLl92YWx1ZT09PSJjb2xvciIpaWYodHlwZW9mIG4+InUiKXI9Si5mcm9tQnl0ZXMoMjU1LDI1NSwyNTUsMjU1KTtlbHNlIGlmKG4ubGVuZ3RoPjEpe2NvbnN0IGk9Si5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCk7ci5hbHBoYT1uWzFdLmV2YWx1YXRlKGUpfWVsc2V7Y29uc3QgaT1KLmZyb21Dc3NDb2xvclN0cmluZyhuWzBdLmV2YWx1YXRlKGUpKTtpZihpKXI9aTtlbHNlIHRocm93IG5ldyBFcnJvcihgd3JvbmcgbGl0ZXJhbENvbG9yIGNhbGwgIiR7dGhpcy5fdmFsdWV9LCAke259fSJgKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09InJnYiIpcj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSwyNTUpO2Vsc2UgaWYodGhpcy5fdmFsdWU9PT0icmdiYSIpe2NvbnN0IGk9blszXS5ldmFsdWF0ZShlKSoyNTU7cj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSxpKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbCIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLDEpO2kmJihyPWkpfWVsc2UgaWYodGhpcy5fdmFsdWU9PT0iaHNsYSIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLG5bM10uZXZhbHVhdGUoZSkpO2kmJihyPWkpfXJldHVybiByLnRvQ3NzSGV4U3RyaW5nKCl9X2V2YWx1YXRlRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBGdChuKSYmIUZ0KHIpP24uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT9yLmluY2x1ZGVzKG4pOihGdChyKSYmRnQobikmJmNvbnNvbGUuZXJyb3IoIkVxdWFscyBsZWZ0IGFuZCByaWdodCBib3RoIGNhbid0IGJlIGFycmF5IGF0IHRoZSBzYW1lIHRpbWUiKSxuPT1yKX1fZXZhbHVhdGVOb3RFcXVhbHMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIEZ0KG4pJiYhRnQocik/IW4uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT8hci5pbmNsdWRlcyhuKTooRnQocikmJkZ0KG4pJiZjb25zb2xlLmVycm9yKCJOb3RFcXVhbHMgbGVmdCBhbmQgcmlnaHQgYm90aCBjYW4ndCBiZSBhcnJheSBhdCB0aGUgc2FtZSB0aW1lIiksbiE9cil9fWZ1bmN0aW9uIEFmKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDtjb25zdCBlPVsiJSJdO2Zvcihjb25zdCBuIG9mIGUpaWYodC5lbmRzV2l0aChuKSlyZXR1cm4gdC5zbGljZSgwLC1uLmxlbmd0aCkudHJpbSgpO3JldHVybiB0LnRyaW0oKX1mdW5jdGlvbiBtaSh0KXtyZXR1cm4gdC5fdmFsdWU9PT0iZmVhdHVyZSJ9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gVGYodCxlLG4pe3JldHVybiBlPVVlKGUpLFNmKHQsUW4oKT9SZWZsZWN0LmNvbnN0cnVjdChlLG58fFtdLFVlKHQpLmNvbnN0cnVjdG9yKTplLmFwcGx5KHQsbikpfWZ1bmN0aW9uIEZpKHQsZSxuKXtpZihRbigpKXJldHVybiBSZWZsZWN0LmNvbnN0cnVjdC5hcHBseShudWxsLGFyZ3VtZW50cyk7dmFyIHI9W251bGxdO3IucHVzaC5hcHBseShyLGUpO3ZhciBpPW5ldyh0LmJpbmQuYXBwbHkodCxyKSk7cmV0dXJuIG4mJmplKGksbi5wcm90b3R5cGUpLGl9ZnVuY3Rpb24gUW4oKXt0cnl7dmFyIHQ9IUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpfWNhdGNoe31yZXR1cm4oUW49ZnVuY3Rpb24oKXtyZXR1cm4hIXR9KSgpfWZ1bmN0aW9uIFJmKHQsZSl7aWYodHlwZW9mIHQhPSJvYmplY3QifHwhdClyZXR1cm4gdDt2YXIgbj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZih0eXBlb2YgciE9Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oZT09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKHQpfWZ1bmN0aW9uIHhmKHQpe3ZhciBlPVJmKHQsInN0cmluZyIpO3JldHVybiB0eXBlb2YgZT09InN5bWJvbCI/ZTpTdHJpbmcoZSl9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIEd0PXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxHdCh0KX1mdW5jdGlvbiB3aSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIElpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCx4ZihyLmtleSkscil9fWZ1bmN0aW9uIE5pKHQsZSxuKXtyZXR1cm4gZSYmSWkodC5wcm90b3R5cGUsZSksbiYmSWkodCxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0fWZ1bmN0aW9uIE9mKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGUmJmplKHQsZSl9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIFVlPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKG4pe3JldHVybiBuLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pfSxVZSh0KX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBqZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGkpe3JldHVybiByLl9fcHJvdG9fXz1pLHJ9LGplKHQsZSl9ZnVuY3Rpb24gYmYodCl7dHJ5e3JldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKSE9PS0xfWNhdGNoe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIn19ZnVuY3Rpb24gSm4odCl7dmFyIGU9dHlwZW9mIE1hcD09ImZ1bmN0aW9uIj9uZXcgTWFwOnZvaWQgMDtyZXR1cm4gSm49ZnVuY3Rpb24ocil7aWYocj09PW51bGx8fCFiZihyKSlyZXR1cm4gcjtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2lmKHR5cGVvZiBlPCJ1Iil7aWYoZS5oYXMocikpcmV0dXJuIGUuZ2V0KHIpO2Uuc2V0KHIsaSl9ZnVuY3Rpb24gaSgpe3JldHVybiBGaShyLGFyZ3VtZW50cyxVZSh0aGlzKS5jb25zdHJ1Y3Rvcil9cmV0dXJuIGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGplKGkscil9LEpuKHQpfWZ1bmN0aW9uIGdmKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBTZih0LGUpe2lmKGUmJih0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKSlyZXR1cm4gZTtpZihlIT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIGdmKHQpfWZ1bmN0aW9uIG1mKHQpe3JldHVybiBGZih0KXx8d2YodCl8fE1pKHQpfHxJZigpfWZ1bmN0aW9uIEZmKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHRyKHQpfWZ1bmN0aW9uIHdmKHQpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fHRbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbSh0KX1mdW5jdGlvbiBNaSh0LGUpe2lmKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdHIodCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIHRyKHQsZSl9fWZ1bmN0aW9uIHRyKHQsZSl7KGU9PW51bGx8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gSWYoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIE5mKHQsZSl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj1NaSh0KSl8fGUmJnQmJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciIpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIG89ITAscz0hMSx1O3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwodCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gbz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtzPSEwLHU9YX0sZjpmdW5jdGlvbigpe3RyeXshbyYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IHV9fX19dmFyIFR0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUXQodCxlKXtyZXR1cm4gdD10LnNsaWNlKCksdC5wdXNoKGUpLHR9ZnVuY3Rpb24gZXIodCxlKXtyZXR1cm4gZT1lLnNsaWNlKCksZS51bnNoaWZ0KHQpLGV9dmFyIE1mPWZ1bmN0aW9uKHQpe09mKGUsdCk7ZnVuY3Rpb24gZShuKXt2YXIgcjtyZXR1cm4gd2kodGhpcyxlKSxyPVRmKHRoaXMsZSxbJ0pTT05QYXRoIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggIm5ldyIgKGl0IHByZXZlbnRzIHJldHVybiBvZiAodW53cmFwcGVkKSBzY2FsYXIgdmFsdWVzKSddKSxyLmF2b2lkTmV3PSEwLHIudmFsdWU9bixyLm5hbWU9Ik5ld0Vycm9yIixyfXJldHVybiBOaShlKX0oSm4oRXJyb3IpKTtmdW5jdGlvbiBrKHQsZSxuLHIsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgaykpdHJ5e3JldHVybiBuZXcgayh0LGUsbixyLGkpfWNhdGNoKGEpe2lmKCFhLmF2b2lkTmV3KXRocm93IGE7cmV0dXJuIGEudmFsdWV9dHlwZW9mIHQ9PSJzdHJpbmciJiYoaT1yLHI9bixuPWUsZT10LHQ9bnVsbCk7dmFyIG89dCYmR3QodCk9PT0ib2JqZWN0IjtpZih0PXR8fHt9LHRoaXMuanNvbj10Lmpzb258fG4sdGhpcy5wYXRoPXQucGF0aHx8ZSx0aGlzLnJlc3VsdFR5cGU9dC5yZXN1bHRUeXBlfHwidmFsdWUiLHRoaXMuZmxhdHRlbj10LmZsYXR0ZW58fCExLHRoaXMud3JhcD1UdC5jYWxsKHQsIndyYXAiKT90LndyYXA6ITAsdGhpcy5zYW5kYm94PXQuc2FuZGJveHx8e30sdGhpcy5wcmV2ZW50RXZhbD10LnByZXZlbnRFdmFsfHwhMSx0aGlzLnBhcmVudD10LnBhcmVudHx8bnVsbCx0aGlzLnBhcmVudFByb3BlcnR5PXQucGFyZW50UHJvcGVydHl8fG51bGwsdGhpcy5jYWxsYmFjaz10LmNhbGxiYWNrfHxyfHxudWxsLHRoaXMub3RoZXJUeXBlQ2FsbGJhY2s9dC5vdGhlclR5cGVDYWxsYmFja3x8aXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBzdXBwbHkgYW4gb3RoZXJUeXBlQ2FsbGJhY2sgY2FsbGJhY2sgb3B0aW9uIHdpdGggdGhlIEBvdGhlcigpIG9wZXJhdG9yLiIpfSx0LmF1dG9zdGFydCE9PSExKXt2YXIgcz17cGF0aDpvP3QucGF0aDplfTtvPyJqc29uImluIHQmJihzLmpzb249dC5qc29uKTpzLmpzb249bjt2YXIgdT10aGlzLmV2YWx1YXRlKHMpO2lmKCF1fHxHdCh1KSE9PSJvYmplY3QiKXRocm93IG5ldyBNZih1KTtyZXR1cm4gdX19ay5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXRoaXMucGFyZW50LHM9dGhpcy5wYXJlbnRQcm9wZXJ0eSx1PXRoaXMuZmxhdHRlbixhPXRoaXMud3JhcDtpZih0aGlzLmN1cnJSZXN1bHRUeXBlPXRoaXMucmVzdWx0VHlwZSx0aGlzLmN1cnJQcmV2ZW50RXZhbD10aGlzLnByZXZlbnRFdmFsLHRoaXMuY3VyclNhbmRib3g9dGhpcy5zYW5kYm94LG49bnx8dGhpcy5jYWxsYmFjayx0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjaz1yfHx0aGlzLm90aGVyVHlwZUNhbGxiYWNrLGU9ZXx8dGhpcy5qc29uLHQ9dHx8dGhpcy5wYXRoLHQmJkd0KHQpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KHQpKXtpZighdC5wYXRoJiZ0LnBhdGghPT0iIil0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSAicGF0aCIgcHJvcGVydHkgd2hlbiBwcm92aWRpbmcgYW4gb2JqZWN0IGFyZ3VtZW50IHRvIEpTT05QYXRoLmV2YWx1YXRlKCkuJyk7aWYoIVR0LmNhbGwodCwianNvbiIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHN1cHBseSBhICJqc29uIiBwcm9wZXJ0eSB3aGVuIHByb3ZpZGluZyBhbiBvYmplY3QgYXJndW1lbnQgdG8gSlNPTlBhdGguZXZhbHVhdGUoKS4nKTt2YXIgbD10O2U9bC5qc29uLHU9VHQuY2FsbCh0LCJmbGF0dGVuIik/dC5mbGF0dGVuOnUsdGhpcy5jdXJyUmVzdWx0VHlwZT1UdC5jYWxsKHQsInJlc3VsdFR5cGUiKT90LnJlc3VsdFR5cGU6dGhpcy5jdXJyUmVzdWx0VHlwZSx0aGlzLmN1cnJTYW5kYm94PVR0LmNhbGwodCwic2FuZGJveCIpP3Quc2FuZGJveDp0aGlzLmN1cnJTYW5kYm94LGE9VHQuY2FsbCh0LCJ3cmFwIik/dC53cmFwOmEsdGhpcy5jdXJyUHJldmVudEV2YWw9VHQuY2FsbCh0LCJwcmV2ZW50RXZhbCIpP3QucHJldmVudEV2YWw6dGhpcy5jdXJyUHJldmVudEV2YWwsbj1UdC5jYWxsKHQsImNhbGxiYWNrIik/dC5jYWxsYmFjazpuLHRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrPVR0LmNhbGwodCwib3RoZXJUeXBlQ2FsbGJhY2siKT90Lm90aGVyVHlwZUNhbGxiYWNrOnRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrLG89VHQuY2FsbCh0LCJwYXJlbnQiKT90LnBhcmVudDpvLHM9VHQuY2FsbCh0LCJwYXJlbnRQcm9wZXJ0eSIpP3QucGFyZW50UHJvcGVydHk6cyx0PXQucGF0aH1pZihvPW98fG51bGwscz1zfHxudWxsLEFycmF5LmlzQXJyYXkodCkmJih0PWsudG9QYXRoU3RyaW5nKHQpKSwhKCF0JiZ0IT09IiJ8fCFlKSl7dmFyIGQ9ay50b1BhdGhBcnJheSh0KTtkWzBdPT09IiQiJiZkLmxlbmd0aD4xJiZkLnNoaWZ0KCksdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9bnVsbDt2YXIgXz10aGlzLl90cmFjZShkLGUsWyIkIl0sbyxzLG4pLmZpbHRlcihmdW5jdGlvbihPKXtyZXR1cm4gTyYmIU8uaXNQYXJlbnRTZWxlY3Rvcn0pO3JldHVybiBfLmxlbmd0aD8hYSYmXy5sZW5ndGg9PT0xJiYhX1swXS5oYXNBcnJFeHByP3RoaXMuX2dldFByZWZlcnJlZE91dHB1dChfWzBdKTpfLnJlZHVjZShmdW5jdGlvbihPLGIpe3ZhciBJPWkuX2dldFByZWZlcnJlZE91dHB1dChiKTtyZXR1cm4gdSYmQXJyYXkuaXNBcnJheShJKT9PPU8uY29uY2F0KEkpOk8ucHVzaChJKSxPfSxbXSk6YT9bXTp2b2lkIDB9fSxrLnByb3RvdHlwZS5fZ2V0UHJlZmVycmVkT3V0cHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VyclJlc3VsdFR5cGU7c3dpdGNoKGUpe2Nhc2UiYWxsIjp7dmFyIG49QXJyYXkuaXNBcnJheSh0LnBhdGgpP3QucGF0aDprLnRvUGF0aEFycmF5KHQucGF0aCk7cmV0dXJuIHQucG9pbnRlcj1rLnRvUG9pbnRlcihuKSx0LnBhdGg9dHlwZW9mIHQucGF0aD09InN0cmluZyI/dC5wYXRoOmsudG9QYXRoU3RyaW5nKHQucGF0aCksdH1jYXNlInZhbHVlIjpjYXNlInBhcmVudCI6Y2FzZSJwYXJlbnRQcm9wZXJ0eSI6cmV0dXJuIHRbZV07Y2FzZSJwYXRoIjpyZXR1cm4gay50b1BhdGhTdHJpbmcodFtlXSk7Y2FzZSJwb2ludGVyIjpyZXR1cm4gay50b1BvaW50ZXIodC5wYXRoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gcmVzdWx0IHR5cGUiKX19LGsucHJvdG90eXBlLl9oYW5kbGVDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7aWYoZSl7dmFyIHI9dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KHQpO3QucGF0aD10eXBlb2YgdC5wYXRoPT0ic3RyaW5nIj90LnBhdGg6ay50b1BhdGhTdHJpbmcodC5wYXRoKSxlKHIsbix0KX19LGsucHJvdG90eXBlLl90cmFjZT1mdW5jdGlvbih0LGUsbixyLGksbyxzLHUpe3ZhciBhPXRoaXMsbDtpZighdC5sZW5ndGgpcmV0dXJuIGw9e3BhdGg6bix2YWx1ZTplLHBhcmVudDpyLHBhcmVudFByb3BlcnR5OmksaGFzQXJyRXhwcjpzfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInZhbHVlIiksbDt2YXIgZD10WzBdLF89dC5zbGljZSgxKSxPPVtdO2Z1bmN0aW9uIGIoRCl7QXJyYXkuaXNBcnJheShEKT9ELmZvckVhY2goZnVuY3Rpb24oeXQpe08ucHVzaCh5dCl9KTpPLnB1c2goRCl9aWYoKHR5cGVvZiBkIT0ic3RyaW5nInx8dSkmJmUmJlR0LmNhbGwoZSxkKSliKHRoaXMuX3RyYWNlKF8sZVtkXSxRdChuLGQpLGUsZCxvLHMpKTtlbHNlIGlmKGQ9PT0iKiIpdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2IoYS5fdHJhY2UoXyxlW0RdLFF0KG4sRCksZSxELG8sITAsITApKX0pO2Vsc2UgaWYoZD09PSIuLiIpYih0aGlzLl90cmFjZShfLGUsbixyLGksbyxzKSksdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe0d0KGVbRF0pPT09Im9iamVjdCImJmIoYS5fdHJhY2UodC5zbGljZSgpLGVbRF0sUXQobixEKSxlLEQsbywhMCkpfSk7ZWxzZXtpZihkPT09Il4iKXJldHVybiB0aGlzLl9oYXNQYXJlbnRTZWxlY3Rvcj0hMCx7cGF0aDpuLnNsaWNlKDAsLTEpLGV4cHI6Xyxpc1BhcmVudFNlbGVjdG9yOiEwfTtpZihkPT09In4iKXJldHVybiBsPXtwYXRoOlF0KG4sZCksdmFsdWU6aSxwYXJlbnQ6cixwYXJlbnRQcm9wZXJ0eTpudWxsfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInByb3BlcnR5IiksbDtpZihkPT09IiQiKWIodGhpcy5fdHJhY2UoXyxlLG4sbnVsbCxudWxsLG8scykpO2Vsc2UgaWYoL14oXHgyRD9bMC05XSopOihceDJEP1swLTldKik6PyhbMC05XSopJC8udGVzdChkKSliKHRoaXMuX3NsaWNlKGQsXyxlLG4scixpLG8pKTtlbHNlIGlmKGQuaW5kZXhPZigiPygiKT09PTApe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbPyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7dmFyIEk9ZC5yZXBsYWNlKC9eXD9cKCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/KVwpJC8sIiQxIiksUz0vQCg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pPygoPzpbXDAtPkAtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsnXFtdKFw/P1woKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1wpKSg/ISg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pXClcXSlbJ1xdXS9nLmV4ZWMoSSk7Uz90aGlzLl93YWxrKGUsZnVuY3Rpb24oRCl7dmFyIHl0PVtTWzJdXSxvdD1TWzFdP2VbRF1bU1sxXV06ZVtEXSxndD1hLl90cmFjZSh5dCxvdCxuLHIsaSxvLCEwKTtndC5sZW5ndGg+MCYmYihhLl90cmFjZShfLGVbRF0sUXQobixEKSxlLEQsbywhMCkpfSk6dGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2EuX2V2YWwoSSxlW0RdLEQsbixyLGkpJiZiKGEuX3RyYWNlKF8sZVtEXSxRdChuLEQpLGUsRCxvLCEwKSl9KX1lbHNlIGlmKGRbMF09PT0iKCIpe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbKGV4cHIpXSBwcmV2ZW50ZWQgaW4gSlNPTlBhdGggZXhwcmVzc2lvbi4iKTtiKHRoaXMuX3RyYWNlKGVyKHRoaXMuX2V2YWwoZCxlLG5bbi5sZW5ndGgtMV0sbi5zbGljZSgwLC0xKSxyLGkpLF8pLGUsbixyLGksbyxzKSl9ZWxzZSBpZihkWzBdPT09IkAiKXt2YXIgbT0hMSxnPWQuc2xpY2UoMSwtMik7c3dpdGNoKGcpe2Nhc2Uic2NhbGFyIjooIWV8fCFbIm9iamVjdCIsImZ1bmN0aW9uIl0uaW5jbHVkZXMoR3QoZSkpKSYmKG09ITApO2JyZWFrO2Nhc2UiYm9vbGVhbiI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpjYXNlImZ1bmN0aW9uIjpHdChlKT09PWcmJihtPSEwKTticmVhaztjYXNlImludGVnZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmIShlJTEpJiYobT0hMCk7YnJlYWs7Y2FzZSJudW1iZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmKG09ITApO2JyZWFrO2Nhc2Uibm9uRmluaXRlIjp0eXBlb2YgZT09Im51bWJlciImJiFOdW1iZXIuaXNGaW5pdGUoZSkmJihtPSEwKTticmVhaztjYXNlIm9iamVjdCI6ZSYmR3QoZSk9PT1nJiYobT0hMCk7YnJlYWs7Y2FzZSJhcnJheSI6QXJyYXkuaXNBcnJheShlKSYmKG09ITApO2JyZWFrO2Nhc2Uib3RoZXIiOm09dGhpcy5jdXJyT3RoZXJUeXBlQ2FsbGJhY2soZSxuLHIsaSk7YnJlYWs7Y2FzZSJudWxsIjplPT09bnVsbCYmKG09ITApO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB2YWx1ZSB0eXBlICIrZyl9aWYobSlyZXR1cm4gbD17cGF0aDpuLHZhbHVlOmUscGFyZW50OnIscGFyZW50UHJvcGVydHk6aX0sdGhpcy5faGFuZGxlQ2FsbGJhY2sobCxvLCJ2YWx1ZSIpLGx9ZWxzZSBpZihkWzBdPT09ImAiJiZlJiZUdC5jYWxsKGUsZC5zbGljZSgxKSkpe3ZhciBHPWQuc2xpY2UoMSk7Yih0aGlzLl90cmFjZShfLGVbR10sUXQobixHKSxlLEcsbyxzLCEwKSl9ZWxzZSBpZihkLmluY2x1ZGVzKCIsIikpe3ZhciBxPWQuc3BsaXQoIiwiKSwkPU5mKHEpLG50O3RyeXtmb3IoJC5zKCk7IShudD0kLm4oKSkuZG9uZTspe3ZhciBsdD1udC52YWx1ZTtiKHRoaXMuX3RyYWNlKGVyKGx0LF8pLGUsbixyLGksbywhMCkpfX1jYXRjaChEKXskLmUoRCl9ZmluYWxseXskLmYoKX19ZWxzZSF1JiZlJiZUdC5jYWxsKGUsZCkmJmIodGhpcy5fdHJhY2UoXyxlW2RdLFF0KG4sZCksZSxkLG8scywhMCkpfWlmKHRoaXMuX2hhc1BhcmVudFNlbGVjdG9yKWZvcih2YXIgaXQ9MDtpdDxPLmxlbmd0aDtpdCsrKXt2YXIgQnQ9T1tpdF07aWYoQnQmJkJ0LmlzUGFyZW50U2VsZWN0b3Ipe3ZhciBUPXRoaXMuX3RyYWNlKEJ0LmV4cHIsZSxCdC5wYXRoLHIsaSxvLHMpO2lmKEFycmF5LmlzQXJyYXkoVCkpe09baXRdPVRbMF07Zm9yKHZhciBCPVQubGVuZ3RoLFY9MTtWPEI7VisrKWl0KyssTy5zcGxpY2UoaXQsMCxUW1ZdKX1lbHNlIE9baXRdPVR9fXJldHVybiBPfSxrLnByb3RvdHlwZS5fd2Fsaz1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBuPXQubGVuZ3RoLHI9MDtyPG47cisrKWUocik7ZWxzZSB0JiZHdCh0KT09PSJvYmplY3QiJiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2UoaSl9KX0say5wcm90b3R5cGUuX3NsaWNlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciB1PW4ubGVuZ3RoLGE9dC5zcGxpdCgiOiIpLGw9YVsyXSYmTnVtYmVyLnBhcnNlSW50KGFbMl0pfHwxLGQ9YVswXSYmTnVtYmVyLnBhcnNlSW50KGFbMF0pfHwwLF89YVsxXSYmTnVtYmVyLnBhcnNlSW50KGFbMV0pfHx1O2Q9ZDwwP01hdGgubWF4KDAsZCt1KTpNYXRoLm1pbih1LGQpLF89XzwwP01hdGgubWF4KDAsXyt1KTpNYXRoLm1pbih1LF8pO2Zvcih2YXIgTz1bXSxiPWQ7YjxfO2IrPWwpe3ZhciBJPXRoaXMuX3RyYWNlKGVyKGIsZSksbixyLGksbyxzLCEwKTtJLmZvckVhY2goZnVuY3Rpb24oUyl7Ty5wdXNoKFMpfSl9cmV0dXJuIE99fSxrLnByb3RvdHlwZS5fZXZhbD1mdW5jdGlvbih0LGUsbixyLGksbyl7dGhpcy5jdXJyU2FuZGJveC5fJF9wYXJlbnRQcm9wZXJ0eT1vLHRoaXMuY3VyclNhbmRib3guXyRfcGFyZW50PWksdGhpcy5jdXJyU2FuZGJveC5fJF9wcm9wZXJ0eT1uLHRoaXMuY3VyclNhbmRib3guXyRfcm9vdD10aGlzLmpzb24sdGhpcy5jdXJyU2FuZGJveC5fJF92PWU7dmFyIHM9dC5pbmNsdWRlcygiQHBhdGgiKTtzJiYodGhpcy5jdXJyU2FuZGJveC5fJF9wYXRoPWsudG9QYXRoU3RyaW5nKHIuY29uY2F0KFtuXSkpKTt2YXIgdT0ic2NyaXB0OiIrdDtpZighay5jYWNoZVt1XSl7dmFyIGE9dC5yZXBsYWNlKC9AcGFyZW50UHJvcGVydHkvZywiXyRfcGFyZW50UHJvcGVydHkiKS5yZXBsYWNlKC9AcGFyZW50L2csIl8kX3BhcmVudCIpLnJlcGxhY2UoL0Bwcm9wZXJ0eS9nLCJfJF9wcm9wZXJ0eSIpLnJlcGxhY2UoL0Byb290L2csIl8kX3Jvb3QiKS5yZXBsYWNlKC9AKFtcdC1cciBcKVwuXFtceEEwXHUxNjgwXHUyMDAwLVx1MjAwQVx1MjAyOFx1MjAyOVx1MjAyRlx1MjA1Rlx1MzAwMFx1RkVGRl0pL2csIl8kX3YkMSIpO3MmJihhPWEucmVwbGFjZSgvQHBhdGgvZywiXyRfcGF0aCIpKSxrLmNhY2hlW3VdPW5ldyB0aGlzLnZtLlNjcmlwdChhKX10cnl7cmV0dXJuIGsuY2FjaGVbdV0ucnVuSW5OZXdDb250ZXh0KHRoaXMuY3VyclNhbmRib3gpfWNhdGNoKGwpe3Rocm93IG5ldyBFcnJvcigianNvblBhdGg6ICIrbC5tZXNzYWdlKyI6ICIrdCl9fSxrLmNhY2hlPXt9LGsudG9QYXRoU3RyaW5nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iJCIsaT0xO2k8bjtpKyspL14ofnxcXnxAKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1woXCkpJC8udGVzdChlW2ldKXx8KHIrPS9eW1wqMC05XSskLy50ZXN0KGVbaV0pPyJbIitlW2ldKyJdIjoiWyciK2VbaV0rIiddIik7cmV0dXJuIHJ9LGsudG9Qb2ludGVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iIixpPTE7aTxuO2krKykvXih+fFxefEAoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XChcKSkkLy50ZXN0KGVbaV0pfHwocis9Ii8iK2VbaV0udG9TdHJpbmcoKS5yZXBsYWNlKC9+L2csIn4wIikucmVwbGFjZSgvXC8vZywifjEiKSk7cmV0dXJuIHJ9LGsudG9QYXRoQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9ay5jYWNoZTtpZihlW3RdKXJldHVybiBlW3RdLmNvbmNhdCgpO3ZhciBuPVtdLHI9dC5yZXBsYWNlKC9AKD86bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmd8aW50ZWdlcnx1bmRlZmluZWR8bm9uRmluaXRlfHNjYWxhcnxhcnJheXxvYmplY3R8ZnVuY3Rpb258b3RoZXIpXChcKS9nLCI7JCY7IikucmVwbGFjZSgvWydcW10oXD8/XCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XCkpWydcXV0oPyEoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKVxdKS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsjIisobi5wdXNoKHMpLTEpKyJdIn0pLnJlcGxhY2UoL1xbWyInXSgoPzpbXDAtJlwoLVxcXF4tXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsiJ11cXS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsnIitzLnJlcGxhY2UoL1wuL2csIiVAJSIpLnJlcGxhY2UoL34vZywiJSVAQCUlIikrIiddIn0pLnJlcGxhY2UoL34vZywiO347IikucmVwbGFjZSgvWyInXT9cLlsiJ10/KD8hKD86W1wwLVpcXC1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSpcXSl8XFtbIiddPy9nLCI7IikucmVwbGFjZSgvJUAlL2csIi4iKS5yZXBsYWNlKC8lJUBAJSUvZywifiIpLnJlcGxhY2UoLyg/OjspPyhcXispKD86Oyk/L2csZnVuY3Rpb24obyxzKXtyZXR1cm4iOyIrcy5zcGxpdCgiIikuam9pbigiOyIpKyI7In0pLnJlcGxhY2UoLzs7O3w7Oy9nLCI7Li47IikucmVwbGFjZSgvOyR8Jz9cXXwnJC9nLCIiKSxpPXIuc3BsaXQoIjsiKS5tYXAoZnVuY3Rpb24obyl7dmFyIHM9by5tYXRjaCgvIyhbMC05XSspLyk7cmV0dXJuIXN8fCFzWzFdP286bltzWzFdXX0pO3JldHVybiBlW3RdPWksZVt0XS5jb25jYXQoKX07dmFyIENmPWZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz0wO288aTtvKyspe3ZhciBzPWVbb107cihzKSYmbi5wdXNoKGUuc3BsaWNlKG8tLSwxKVswXSl9fSx2Zj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7d2kodGhpcyx0KSx0aGlzLmNvZGU9ZX1yZXR1cm4gTmkodCxbe2tleToicnVuSW5OZXdDb250ZXh0Iix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLmNvZGUsaT1PYmplY3Qua2V5cyhuKSxvPVtdO0NmKGksbyxmdW5jdGlvbihkKXtyZXR1cm4gdHlwZW9mIG5bZF09PSJmdW5jdGlvbiJ9KTt2YXIgcz1pLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbltkXX0pLHU9by5yZWR1Y2UoZnVuY3Rpb24oZCxfKXt2YXIgTz1uW19dLnRvU3RyaW5nKCk7cmV0dXJuL2Z1bmN0aW9uLy50ZXN0KE8pfHwoTz0iZnVuY3Rpb24gIitPKSwidmFyICIrXysiPSIrTysiOyIrZH0sIiIpO3I9dStyLCEvKFsiJ10pdXNlIHN0cmljdFwxLy50ZXN0KHIpJiYhaS5pbmNsdWRlcygiYXJndW1lbnRzIikmJihyPSJ2YXIgYXJndW1lbnRzID0gdW5kZWZpbmVkOyIrcikscj1yLnJlcGxhY2UoLztbXHQtXHIgXHhBMFx1MTY4MFx1MjAwMC1cdTIwMEFcdTIwMjhcdTIwMjlcdTIwMkZcdTIwNUZcdTMwMDBcdUZFRkZdKiQvLCIiKTt2YXIgYT1yLmxhc3RJbmRleE9mKCI7IiksbD1hPi0xP3Iuc2xpY2UoMCxhKzEpKyIgcmV0dXJuICIrci5zbGljZShhKzEpOiIgcmV0dXJuICIrcjtyZXR1cm4gRmkoRnVuY3Rpb24saS5jb25jYXQoW2xdKSkuYXBwbHkodm9pZCAwLG1mKHMpKX19XSksdH0oKTtrLnByb3RvdHlwZS52bT17U2NyaXB0OnZmfTtjb25zdCBEZj0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiLExmPXQ9PkFycmF5LmZyb20od2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkodCkpKS5tYXAoZT0+RGZbZSV0XSkuam9pbigiIikudG9Mb3dlckNhc2UoKSxDaT10PT57aWYodHlwZW9mIHQhPSJvYmplY3QifHx0PT09bnVsbClyZXR1cm4gdDtmb3IoY29uc3QgZSBpbiB0KWlmKHR5cGVvZiB0W2VdPT0ic3RyaW5nIil0cnl7dFtlXS5zdGFydHNXaXRoKCJ7IikmJnRbZV0uZW5kc1dpdGgoIn0iKSYmKHRbZV09SlNPTi5wYXJzZSh0W2VdKSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiSW52YWxpZCBKU09OOiIsdFtlXSl9ZWxzZSB0eXBlb2YgdFtlXT09Im9iamVjdCImJih0W2VdPUNpKHRbZV0pKTtyZXR1cm4gdH0sbnI9ImN6bV8iO2Z1bmN0aW9uIFBmKHQsZSl7bGV0IG49dCxyPSIiO2NvbnN0IGk9W107bGV0IG89bi5pbmRleE9mKCIkeyIpO2NvbnN0IHM9dHlwZW9mIGU8InUiLHU9e30sYT0vXlwkLi87Zm9yKDtvPj0wOylpZihCZihuLG8pKXtjb25zdCBsPVVmKG4sbyk7cis9bi5zbGljZSgwLGwrMSksbj1uLnNsaWNlKGwrMSksbz1uLmluZGV4T2YoIiR7Iil9ZWxzZXtyKz1uLnNsaWNlKDAsbyk7Y29uc3QgbD1qZihuLG8pLGQ9bi5zbGljZShvKzIsbCk7aWYoYS50ZXN0KGQpKXtpZighcylyZXR1cm5bcixbXV07bGV0IF89dVtkXTtpZighXyl0cnl7Xz1rKHtqc29uOmUscGF0aDpkfSksdVtkXT1ffWNhdGNoe3JldHVybltyLFtdXX1pZihfLmxlbmd0aCE9PTApe2NvbnN0IE89TGYoMTApO2kucHVzaCh7bGl0ZXJhbE5hbWU6TyxsaXRlcmFsVmFsdWU6X1swXX0pLHIrPU99ZWxzZSByZXR1cm5bImZhbHNlIixbXV19ZWxzZXtjb25zdCBfPUdmKGQpO3IrPWAke25yfSR7X31gfW49bi5zbGljZShsKzEpLG89bi5pbmRleE9mKCIkeyIpfXJldHVybiByKz1uLFtyLGldfWZ1bmN0aW9uIEJmKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoIiciKSxyPXQuaW5kZXhPZignIicpO3JldHVybiBuPj0wJiZuPGU/dC5pbmRleE9mKCInIixuKzEpPj1lOnI+PTAmJnI8ZT90LmluZGV4T2YoJyInLHIrMSk+PWU6ITF9ZnVuY3Rpb24gVWYodCxlKXtjb25zdCBuPXQuaW5kZXhPZigiJyIpLHI9dC5pbmRleE9mKCciJyk7cmV0dXJuIG4+PTAmJm48ZT90LmluZGV4T2YoIiciLG4rMSk6cj49MCYmcjxlP3QuaW5kZXhPZignIicscisxKTotMX1mdW5jdGlvbiBqZih0LGUpe2NvbnN0IG49dC5pbmRleE9mKCJ9IixlKTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJyZXBsYWNlVmFyaWFibGU6IFVubWF0Y2hlZCB7LiIpO3JldHVybiBufWNvbnN0IGNlPXQ9PmAkcmVlYXJ0aF8ke3R9XyRgLHJyPXsiWyI6Y2UoIm9wZW5lZF9zcXVhcmVfYnJhY2tldCIpLCJdIjpjZSgiY2xvc2VkX3NxdWFyZV9icmFja2V0IiksInsiOmNlKCJvcGVuZWRfY3VybHlfYnJhY2tldCIpLCJ9IjpjZSgiY2xvc2VkX2N1cmx5X2JyYWNrZXQiKSwiKCI6Y2UoIm9wZW5lZF9wYXJlbnRoZXNlcyIpLCIpIjpjZSgiY2xvc2VkX3BhcmVudGhlc2VzIiksIi0iOmNlKCJoeXBoZW4iKX0sR2Y9dD0+e2NvbnN0IGU9dC5yZXBsYWNlKC8tL2cscnJbIi0iXSk7cmV0dXJuLyhcXXxcKXxcfSlbXlsuXSskLy50ZXN0KGUpP09iamVjdC5lbnRyaWVzKHJyKS5yZWR1Y2UoKG4sW3IsaV0pPT5uLnJlcGxhY2VBbGwocixpKSxlKTplfSwkZj10PT5PYmplY3QuZW50cmllcyhycikucmVkdWNlKChlLFtuLHJdKT0+ZS5yZXBsYWNlQWxsKHIsbiksdCksVmY9bmV3IFNldChlZiksdmk9bmV3IFNldChuZik7ZnVuY3Rpb24geih0LGUpe2xldCBuPW5ldyBFcnJvcigiZmFpbGVkIHRvIHBhcnNlIik7Y29uc3Qgcj1lLnR5cGU7aWYocj09PSJMaXRlcmFsIiluPVdmKGUpO2Vsc2UgaWYocj09PSJDYWxsRXhwcmVzc2lvbiIpbj1YZih0LGUpO2Vsc2UgaWYocj09PSJJZGVudGlmaWVyIiluPUhmKGUpO2Vsc2UgaWYocj09PSJVbmFyeUV4cHJlc3Npb24iKXtjb25zdCBpPWUub3BlcmF0b3Isbz16KHQsZS5hcmd1bWVudCk7aWYoVmYuaGFzKGkpKW49bmV3IFAoTS5VTkFSWSxpLG8pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdG9yICIke2l9Ii5gKX1lbHNlIGlmKHI9PT0iQmluYXJ5RXhwcmVzc2lvbiIpe2NvbnN0IGk9ZS5vcGVyYXRvcixvPXoodCxlLmxlZnQpLHM9eih0LGUucmlnaHQpO2lmKHZpLmhhcyhpKSluPW5ldyBQKE0uQklOQVJZLGksbyxzKTtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcGVyYXRvciAiJHtpfSIuYCl9ZWxzZSBpZihyPT09IkxvZ2ljYWxFeHByZXNzaW9uIil7Y29uc3QgaT1lLm9wZXJhdG9yLG89eih0LGUubGVmdCkscz16KHQsZS5yaWdodCk7dmkuaGFzKGkpJiYobj1uZXcgUChNLkJJTkFSWSxpLG8scykpfWVsc2UgaWYocj09PSJDb25kaXRpb25hbEV4cHJlc3Npb24iKXtjb25zdCBpPXoodCxlLnRlc3QpLG89eih0LGUuY29uc2VxdWVudCkscz16KHQsZS5hbHRlcm5hdGUpO249bmV3IFAoTS5DT05ESVRJT05BTCwiPyIsbyxzLGkpfWVsc2UgaWYocj09PSJNZW1iZXJFeHByZXNzaW9uIiluPVlmKHQsZSk7ZWxzZSBpZihyPT09IkFycmF5RXhwcmVzc2lvbiIpe2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzxlLmVsZW1lbnRzLmxlbmd0aDtvKyspaVtvXT16KHQsZS5lbGVtZW50c1tvXSk7bj1uZXcgUChNLkFSUkFZLGkpfWVsc2UgdGhyb3cgcj09PSJDb21wb3VuZCI/bmV3IEVycm9yKCJQcm92aWRlIGV4YWN0bHkgb25lIGV4cHJlc3Npb24uIik6bmV3IEVycm9yKCJDYW5ub3QgcGFyc2UgZXhwcmVzc2lvbi4iKTtyZXR1cm4gbn1mdW5jdGlvbiBXZih0KXtjb25zdCBlPXR5cGVvZiB0LnZhbHVlO2lmKHQudmFsdWU9PT1udWxsKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVMTCxudWxsKTtpZihlPT09ImJvb2xlYW4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfQk9PTEVBTix0LnZhbHVlKTtpZihlPT09Im51bWJlciIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsdC52YWx1ZSk7aWYoZT09PSJzdHJpbmciKXJldHVybiB0LnZhbHVlLmluZGV4T2YoIiR7Iik+PTA/bmV3IFAoTS5WQVJJQUJMRV9JTl9TVFJJTkcsdC52YWx1ZSk6bmV3IFAoTS5MSVRFUkFMX1NUUklORyx6Zih0LnZhbHVlKSk7dGhyb3cgbmV3IEVycm9yKGAke3R9IGlzIG5vdCBhIGZ1bmN0aW9uLmApfWZ1bmN0aW9uIHpmKHQpe3JldHVybiB0LnJlcGxhY2Uoc2YsIlxcIil9ZnVuY3Rpb24gWGYodCxlKXtjb25zdCBuPWUuYXJndW1lbnRzLHI9bi5sZW5ndGg7aWYoZS5jYWxsZWUudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIil7Y29uc3Qgbz1lLmNhbGxlZS5wcm9wZXJ0eS5uYW1lLHM9ZS5jYWxsZWUub2JqZWN0O2lmKG89PT0idGVzdCJ8fG89PT0iZXhlYyIpe2lmKHMuY2FsbGVlLm5hbWUhPT0icmVnRXhwIil0aHJvdyBuZXcgRXJyb3IoYCR7b30gaXMgbm90IGEgZnVuY3Rpb24uYCk7aWYocj09PTApcmV0dXJuIG89PT0idGVzdCI/bmV3IFAoTS5MSVRFUkFMX0JPT0xFQU4sITEpOm5ldyBQKE0uTElURVJBTF9OVUxMLG51bGwpO2NvbnN0IHU9eih0LHMpLGE9eih0LG5bMF0pO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1LGEpfWVsc2UgaWYobz09PSJ0b1N0cmluZyIpe2NvbnN0IHU9eih0LHMpO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1KX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtvfSIuYCl9Y29uc3QgaT1lLmNhbGxlZS5uYW1lO2lmKGk9PT0iY29sb3IiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGkpO2NvbnN0IG89eih0LG5bMF0pO2lmKHR5cGVvZiBuWzFdPCJ1Iil7Y29uc3Qgcz16KHQsblsxXSk7cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLFtvLHNdKX1yZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGksW29dKX1lbHNlIGlmKGk9PT0icmdiInx8aT09PSJoc2wiKXtpZihyPDMpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIHRocmVlIGFyZ3VtZW50cy5gKTtjb25zdCBvPVt6KHQsblswXSkseih0LG5bMV0pLHoodCxuWzJdKV07cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLG8pfWVsc2UgaWYoaT09PSJyZ2JhInx8aT09PSJoc2xhIil7aWYocjw0KXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBmb3VyIGFyZ3VtZW50cy5gKTtjb25zdCBvPVt6KHQsblswXSkseih0LG5bMV0pLHoodCxuWzJdKSx6KHQsblszXSldO3JldHVybiBuZXcgUChNLkxJVEVSQUxfQ09MT1IsaSxvKX1lbHNlIGlmKGk9PT0iaXNOYU4ifHxpPT09ImlzRmluaXRlIil7aWYocj09PTApcmV0dXJuIGk9PT0iaXNOYU4iP25ldyBQKE0uTElURVJBTF9CT09MRUFOLCEwKTpuZXcgUChNLkxJVEVSQUxfQk9PTEVBTiwhMSk7Y29uc3Qgbz16KHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX1lbHNlIGlmKHR5cGVvZiBLbltpXTwidSIpe2lmKHIhPT0xKXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudC5gKTtjb25zdCBvPXoodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYodHlwZW9mIFluW2ldPCJ1Iil7aWYociE9PTIpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cy5gKTtjb25zdCBvPXoodCxuWzBdKSxzPXoodCxuWzFdKTtyZXR1cm4gbmV3IFAoTS5CSU5BUlksaSxvLHMpfWVsc2UgaWYoaT09PSJCb29sZWFuIil7aWYocj09PTApcmV0dXJuIG5ldyBQKE0uTElURVJBTF9CT09MRUFOLCExKTtjb25zdCBvPXoodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJOdW1iZXIiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUiwwKTtjb25zdCBvPXoodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJTdHJpbmciKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX1NUUklORywiIik7Y29uc3Qgbz16KHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtpfSIuYCl9ZnVuY3Rpb24gSGYodCl7Y29uc3QgZT10Lm5hbWU7aWYoS2YoZSkpe2NvbnN0IG49WmYoZSk7cmV0dXJuIG4uc3Vic3RyaW5nKDAsOCk9PT0idGlsZXMzZF8iP25ldyBQKE0uQlVJTFRJTl9WQVJJQUJMRSxuKTpuZXcgUChNLlZBUklBQkxFLG4pfWVsc2V7aWYoZT09PSJOYU4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE5hTik7aWYoZT09PSJJbmZpbml0eSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsMS8wKTtpZihlPT09InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9VTkRFRklORUQsdm9pZCAwKX10aHJvdyBuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IGRlZmluZWQuYCl9ZnVuY3Rpb24ga2YodCl7Y29uc3QgZT10LnByb3BlcnR5Lm5hbWU7aWYoZT09PSJQSSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsTWF0aC5QSSk7aWYoZT09PSJFIilyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUixNYXRoLkUpO3Rocm93IG5ldyBFcnJvcihgJHtlfSBNYXRoIENvbnN0YW50IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudGApfWZ1bmN0aW9uIHFmKHQpe2NvbnN0IGU9dC5wcm9wZXJ0eS5uYW1lO2lmKGU9PT0iUE9TSVRJVkVfSU5GSU5JVFkiKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dGhyb3cgbmV3IEVycm9yKGAke2V9IE51bWJlciBDb25zdGFudCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnRgKX1mdW5jdGlvbiBZZih0LGUpe2lmKGUub2JqZWN0Lm5hbWU9PT0iTWF0aCIpcmV0dXJuIGtmKGUpO2lmKGUub2JqZWN0Lm5hbWU9PT0iTnVtYmVyIilyZXR1cm4gcWYoZSk7bGV0IG47Y29uc3Qgcj16KHQsZS5vYmplY3QpO3JldHVybiBlLmNvbXB1dGVkPyhuPXoodCxlLnByb3BlcnR5KSxuZXcgUChNLk1FTUJFUiwiYnJhY2tldHMiLHIsbikpOihuPW5ldyBQKE0uTElURVJBTF9TVFJJTkcsZS5wcm9wZXJ0eS5uYW1lKSxuZXcgUChNLk1FTUJFUiwiZG90IixyLG4pKX1mdW5jdGlvbiBLZih0KXtyZXR1cm4gdC5zdWJzdHJpbmcoMCw0KT09PW5yfWZ1bmN0aW9uIFpmKHQpe3JldHVybiAkZih0KS5zdWJzdHJpbmcoNCl9Y29uc3QgRGk9bmV3IE1hcCxMaT1uZXcgTWFwLFBpPW5ldyBNYXAsQmk9bmV3IE1hcDtjbGFzcyBobntjb25zdHJ1Y3RvcihlLG4scil7Qyh0aGlzLCJfcnVudGltZUFzdCIpO0ModGhpcywiX2ZlYXR1cmUiKTt2YXIgdTt0aGlzLl9mZWF0dXJlPW47bGV0IGk9W107ZT1RZihlLHIpO2NvbnN0IG89TGkuZ2V0KGUpO2lmKG8pW2UsaV09bztlbHNle2NvbnN0IGE9ZTtbZSxpXT1QZihKZihlKSwodT10aGlzLl9mZWF0dXJlKT09bnVsbD92b2lkIDA6dS5wcm9wZXJ0aWVzKSxlLmluY2x1ZGVzKG5yKSYmTGkuc2V0KGEsW2UsaV0pfWNvbnN0IHM9RGkuZ2V0KGUpO2lmKHMpdGhpcy5fcnVudGltZUFzdD1zO2Vsc2V7aWYoaS5sZW5ndGghPT0wKWZvcihjb25zdCBsIG9mIGkpcXQuYWRkTGl0ZXJhbChsLmxpdGVyYWxOYW1lLGwubGl0ZXJhbFZhbHVlKTtxdC5hZGRCaW5hcnlPcCgiPX4iLDApLHF0LmFkZEJpbmFyeU9wKCIhfiIsMCk7bGV0IGE7dHJ5e2E9cXQoZSl9Y2F0Y2gobCl7dGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gZ2VuZXJhdGUgYXN0OiAke2x9YCl9dGhpcy5fcnVudGltZUFzdD16KHRoaXMsYSksRGkuc2V0KGUsdGhpcy5fcnVudGltZUFzdCl9fWV2YWx1YXRlKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVBc3QuZXZhbHVhdGUodGhpcy5fZmVhdHVyZSl9fWZ1bmN0aW9uIFFmKHQsZSl7aWYodHlwZW9mIGU+InUiKXJldHVybiB0O2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmVudHJpZXMoZSkuc29ydCgpKSxyPXQrbixpPUJpLmdldChyKTtpZihpKXJldHVybiBpO2xldCBvPVBpLmdldCh0KTtvfHwobz1uZXcgUmVnRXhwKGBcXCRcXHsoJHtPYmplY3Qua2V5cyhlKS5qb2luKCJ8Iil9KVxcfWAsImciKSxQaS5zZXQodCxvKSk7Y29uc3Qgcz10LnJlcGxhY2UobywodSxhKT0+dHlwZW9mIGVbYV08InUiP2AoJHtlW2FdfSlgOiIiKTtyZXR1cm4gQmkuc2V0KHIscyksc31mdW5jdGlvbiBKZih0KXtyZXR1cm4gdC5yZXBsYWNlKHJmLG9mKX1jbGFzcyB0MHtjb25zdHJ1Y3RvcihlLG4scil7Qyh0aGlzLCJfY29uZGl0aW9ucyIpO0ModGhpcywiX3J1bnRpbWVDb25kaXRpb25zIik7Qyh0aGlzLCJfZmVhdHVyZSIpO0ModGhpcywiX21lbW9pemVkUmVzdWx0Iik7dGhpcy5fY29uZGl0aW9ucz1lLmNvbmRpdGlvbnMsdGhpcy5fcnVudGltZUNvbmRpdGlvbnM9W10sdGhpcy5fZmVhdHVyZT1uLHRoaXMuX21lbW9pemVkUmVzdWx0PXZvaWQgMCx0aGlzLnNldFJ1bnRpbWUocil9c2V0UnVudGltZShlKXt2YXIgcjtjb25zdCBuPShyPXRoaXMuX2NvbmRpdGlvbnMpPT1udWxsP3ZvaWQgMDpyLm1hcChpPT57Y29uc3Qgbz1TdHJpbmcoaVswXSkscz1TdHJpbmcoaVsxXSk7cmV0dXJuIG5ldyBlMChuZXcgaG4obyx0aGlzLl9mZWF0dXJlLGUpLG5ldyBobihzLHRoaXMuX2ZlYXR1cmUsZSkpfSk7dGhpcy5fcnVudGltZUNvbmRpdGlvbnM9bj8/W10sdGhpcy5fbWVtb2l6ZWRSZXN1bHQ9dm9pZCAwfWV2YWx1YXRlKCl7aWYodHlwZW9mIHRoaXMuX21lbW9pemVkUmVzdWx0PCJ1IilyZXR1cm4gdGhpcy5fbWVtb2l6ZWRSZXN1bHQ7Y29uc3QgZT10aGlzLl9ydW50aW1lQ29uZGl0aW9ucyxuPWUubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjtpKyspe2NvbnN0IG89ZVtpXTtpZihvLmNvbmRpdGlvbi5ldmFsdWF0ZSgpKXtjb25zdCBzPW8uZXhwcmVzc2lvbi5ldmFsdWF0ZSgpO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1zLHN9fWNvbnN0IHI9dm9pZCAwO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1yLHJ9fWNsYXNzIGUwe2NvbnN0cnVjdG9yKGUsbil7Qyh0aGlzLCJjb25kaXRpb24iKTtDKHRoaXMsImV4cHJlc3Npb24iKTt0aGlzLmNvbmRpdGlvbj1lLHRoaXMuZXhwcmVzc2lvbj1ufX1jb25zdCBuMD0odCxlLG4pPT57Y29uc3Qgcj1raCh0LHRmKSxpPWEwKHQsZSk7cmV0dXJuey4uLmksLi4ucjAocix0LGkpLHR5cGU6ImNvbXB1dGVkRmVhdHVyZSIsaW50ZXJ2YWw6bn19O2Z1bmN0aW9uIHIwKHQsZSxuKXtpZighbil7aWYoIWUuaWQpdGhyb3cgbmV3IEVycm9yKCJsYXllciBpZCBpcyByZXF1aXJlZCIpO249e3R5cGU6ImZlYXR1cmUiLGlkOmUuaWQscHJvcGVydGllczplLnByb3BlcnRpZXN8fHt9fX1yZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoW3IsaV0pPT5pP1tyLFVpKGksZSxuKV06dm9pZCAwKS5maWx0ZXIocj0+ISFyKSl9ZnVuY3Rpb24gVWkodCxlLG4pe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKChbcixpXSk9Pm8wKGkpP1tyLFVpKGksZSxuKV06W3IsczAoaSxlLG4pXSkpfWZ1bmN0aW9uIGkwKHQpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQmJiJleHByZXNzaW9uImluIHR9ZnVuY3Rpb24gbzAodCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0IiYmdCYmISgiZXhwcmVzc2lvbiJpbiB0KSYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gczAodCxlLG4pe3RyeXtpZihpMCh0KSl7Y29uc3Qgcj10LmV4cHJlc3Npb24saT1DaShqaChuKSk7cmV0dXJuIHR5cGVvZiByPiJ1Ij92b2lkIDA6dHlwZW9mIHI9PSJvYmplY3QiJiZyLmNvbmRpdGlvbnM/bmV3IHQwKHIsaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJib29sZWFuInx8dHlwZW9mIHI9PSJudW1iZXIiP25ldyBobihTdHJpbmcociksaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJzdHJpbmciP25ldyBobihyLGksZS5kZWZpbmVzKS5ldmFsdWF0ZSgpOnJ9cmV0dXJuIHR9Y2F0Y2gocil7Y29uc29sZS5lcnJvcihyKTtyZXR1cm59fWZ1bmN0aW9uIGEwKHQsZSl7dmFyIGk7Y29uc3Qgbj0oaT10LmRhdGEpPT1udWxsP3ZvaWQgMDppLmpzb25Qcm9wZXJ0aWVzO2lmKCFlLnByb3BlcnRpZXN8fCFufHwhbi5sZW5ndGgpcmV0dXJuIGU7Y29uc3Qgcj17Li4uZSwuLi5lIT1udWxsJiZlLnByb3BlcnRpZXM/e3Byb3BlcnRpZXM6ey4uLmUucHJvcGVydGllc319Ont9fTtyZXR1cm4gbi5mb3JFYWNoKG89PntyLnByb3BlcnRpZXNbb109KCgpPT57Y29uc3Qgcz1yLnByb3BlcnRpZXNbb107dHJ5e3JldHVybiBKU09OLnBhcnNlKHMpfWNhdGNoe3JldHVybiBzfX0pKCl9KSxyfWZ1bmN0aW9uIGZuKHQsZSl7aWYodC50eXBlPT09InNpbXBsZSIpcmV0dXJuIG4wKHQsZSl9Y29uc3QgdTA9KHQsZSxuKT0+e2lmKCFuKXJldHVybjtjb25zdCByPSgoKT0+e3N3aXRjaCh6dC50eXBlc1t0LnR5cGVdKXtjYXNlIlBvbHlnb24iOnJldHVybiJwb2x5Z29uIjtjYXNlIkxpbmVTdHJpbmciOnJldHVybiJwb2x5bGluZSI7Y2FzZSJQb2ludCI6cmV0dXJuIm1hcmtlciI7ZGVmYXVsdDpyZXR1cm59fSkoKTtpZighcilyZXR1cm47Y29uc3QgaT10LmlkP1N0cmluZyh0LmlkKTpjMCh0LmxvYWRHZW9tZXRyeSgpLGUpLG89Zm4obixoMChpLHQsZSxyKSkscz1uZXcgU247cmV0dXJuIHMuZGF0YT17bGF5ZXJJZDpuPT1udWxsP3ZvaWQgMDpuLmlkLGZlYXR1cmVJZDppLGZlYXR1cmU6byxhcHBlYXJhbmNlVHlwZTp6dC50eXBlc1t0LnR5cGVdLnRvTG93ZXJDYXNlKCl9LHN9LGMwPSh0LGUpPT57Y29uc3Qgbj1bZS54LGUueSxlLmxldmVsLC4uLnQuZmxhdE1hcChyPT5yLm1hcChpPT5baS54LGkueV0pKV0uam9pbigiOiIpO3JldHVybiBKaChuKX0saDA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fSxtZT10eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZwZXJmb3JtYW5jZSYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj9wZXJmb3JtYW5jZTpEYXRlLGppPW5ldyBTZXQsaXI9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZwcm9jZXNzP3Byb2Nlc3M6e30sR2k9KHQsZSxuLHIpPT57dHlwZW9mIGlyLmVtaXRXYXJuaW5nPT0iZnVuY3Rpb24iP2lyLmVtaXRXYXJuaW5nKHQsZSxuLHIpOmNvbnNvbGUuZXJyb3IoYFske259XSAke2V9OiAke3R9YCl9O2xldCBsbj1nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciwkaT1nbG9iYWxUaGlzLkFib3J0U2lnbmFsO2lmKHR5cGVvZiBsbj4idSIpeyRpPWNsYXNze2NvbnN0cnVjdG9yKCl7Qyh0aGlzLCJvbmFib3J0Iik7Qyh0aGlzLCJfb25hYm9ydCIsW10pO0ModGhpcywicmVhc29uIik7Qyh0aGlzLCJhYm9ydGVkIiwhMSl9YWRkRXZlbnRMaXN0ZW5lcihyLGkpe3RoaXMuX29uYWJvcnQucHVzaChpKX19LGxuPWNsYXNze2NvbnN0cnVjdG9yKCl7Qyh0aGlzLCJzaWduYWwiLG5ldyAkaSk7ZSgpfWFib3J0KHIpe3ZhciBpLG87aWYoIXRoaXMuc2lnbmFsLmFib3J0ZWQpe3RoaXMuc2lnbmFsLnJlYXNvbj1yLHRoaXMuc2lnbmFsLmFib3J0ZWQ9ITA7Zm9yKGNvbnN0IHMgb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpcyhyKTsobz0oaT10aGlzLnNpZ25hbCkub25hYm9ydCk9PW51bGx8fG8uY2FsbChpLHIpfX19O2xldCB0PSgoa2k9aXIuZW52KT09bnVsbD92b2lkIDA6a2kuTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HKSE9PSIxIjtjb25zdCBlPSgpPT57dCYmKHQ9ITEsR2koIkFib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluIG5vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlIGBub2RlLWFib3J0LWNvbnRyb2xsZXJgIHBhY2thZ2UuIEEgbWluaW1hbCBwb2x5ZmlsbCBpcyBwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgdXNlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMpLiBZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuIiwiTk9fQUJPUlRfQ09OVFJPTExFUiIsIkVOT1RTVVAiLGUpKX19Y29uc3QgZjA9dD0+IWppLmhhcyh0KSxKdD10PT50JiZ0PT09TWF0aC5mbG9vcih0KSYmdD4wJiZpc0Zpbml0ZSh0KSxWaT10PT5KdCh0KT90PD1NYXRoLnBvdygyLDgpP1VpbnQ4QXJyYXk6dDw9TWF0aC5wb3coMiwxNik/VWludDE2QXJyYXk6dDw9TWF0aC5wb3coMiwzMik/VWludDMyQXJyYXk6dDw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/ZG46bnVsbDpudWxsO2NsYXNzIGRuIGV4dGVuZHMgQXJyYXl7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5maWxsKDApfX1jb25zdCB3ZT1jbGFzc3tjb25zdHJ1Y3RvcihlLG4pe0ModGhpcywiaGVhcCIpO0ModGhpcywibGVuZ3RoIik7aWYoIWMod2UsRmUpKXRocm93IG5ldyBUeXBlRXJyb3IoImluc3RhbnRpYXRlIFN0YWNrIHVzaW5nIFN0YWNrLmNyZWF0ZShuKSIpO3RoaXMuaGVhcD1uZXcgbihlKSx0aGlzLmxlbmd0aD0wfXN0YXRpYyBjcmVhdGUoZSl7Y29uc3Qgbj1WaShlKTtpZighbilyZXR1cm5bXTt2KHdlLEZlLCEwKTtjb25zdCByPW5ldyB3ZShlLG4pO3JldHVybiB2KHdlLEZlLCExKSxyfXB1c2goZSl7dGhpcy5oZWFwW3RoaXMubGVuZ3RoKytdPWV9cG9wKCl7cmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXX19O2xldCBFbj13ZTtGZT1uZXcgV2Vha01hcCxVKEVuLEZlLCExKTtjb25zdCBzcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXtVKHRoaXMsJGUpO1UodGhpcyxfbik7VSh0aGlzLCR0KTtVKHRoaXMsVnQpO1UodGhpcyx6ZSk7VSh0aGlzLE1lKTtVKHRoaXMsQ2UpO1UodGhpcyxLKTtVKHRoaXMsWGUpO1UodGhpcyxsZSk7VSh0aGlzLEl0LHZvaWQgMCk7VSh0aGlzLFJ0LHZvaWQgMCk7VSh0aGlzLE50LHZvaWQgMCk7VSh0aGlzLE10LHZvaWQgMCk7VSh0aGlzLEllLHZvaWQgMCk7Qyh0aGlzLCJ0dGwiKTtDKHRoaXMsInR0bFJlc29sdXRpb24iKTtDKHRoaXMsInR0bEF1dG9wdXJnZSIpO0ModGhpcywidXBkYXRlQWdlT25HZXQiKTtDKHRoaXMsInVwZGF0ZUFnZU9uSGFzIik7Qyh0aGlzLCJhbGxvd1N0YWxlIik7Qyh0aGlzLCJub0Rpc3Bvc2VPblNldCIpO0ModGhpcywibm9VcGRhdGVUVEwiKTtDKHRoaXMsIm1heEVudHJ5U2l6ZSIpO0ModGhpcywic2l6ZUNhbGN1bGF0aW9uIik7Qyh0aGlzLCJub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24iKTtDKHRoaXMsIm5vRGVsZXRlT25TdGFsZUdldCIpO0ModGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCIpO0ModGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24iKTtDKHRoaXMsImlnbm9yZUZldGNoQWJvcnQiKTtVKHRoaXMsdXQsdm9pZCAwKTtVKHRoaXMsQ3Qsdm9pZCAwKTtVKHRoaXMsYXQsdm9pZCAwKTtVKHRoaXMsdHQsdm9pZCAwKTtVKHRoaXMsTCx2b2lkIDApO1UodGhpcyxfdCx2b2lkIDApO1UodGhpcyx4dCx2b2lkIDApO1UodGhpcyxFdCx2b2lkIDApO1UodGhpcyxodCx2b2lkIDApO1UodGhpcyx2dCx2b2lkIDApO1UodGhpcyxmdCx2b2lkIDApO1UodGhpcyxEdCx2b2lkIDApO1UodGhpcyxMdCx2b2lkIDApO1UodGhpcyxPdCx2b2lkIDApO1UodGhpcyxQdCx2b2lkIDApO1UodGhpcyx0ZSx2b2lkIDApO1UodGhpcyxwdCx2b2lkIDApO1UodGhpcyxoZSwoKT0+e30pO1UodGhpcyxrdCwoKT0+e30pO1UodGhpcyxWZSwoKT0+e30pO1UodGhpcyxidCwoKT0+ITEpO1UodGhpcyxmZSxlPT57fSk7VSh0aGlzLE5lLChlLG4scik9Pnt9KTtVKHRoaXMsV2UsKGUsbixyLGkpPT57aWYocnx8aSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlIik7cmV0dXJuIDB9KTtDKHRoaXMsRjAsIkxSVUNhY2hlIik7Y29uc3R7bWF4Om49MCx0dGw6cix0dGxSZXNvbHV0aW9uOmk9MSx0dGxBdXRvcHVyZ2U6byx1cGRhdGVBZ2VPbkdldDpzLHVwZGF0ZUFnZU9uSGFzOnUsYWxsb3dTdGFsZTphLGRpc3Bvc2U6bCxkaXNwb3NlQWZ0ZXI6ZCxub0Rpc3Bvc2VPblNldDpfLG5vVXBkYXRlVFRMOk8sbWF4U2l6ZTpiPTAsbWF4RW50cnlTaXplOkk9MCxzaXplQ2FsY3VsYXRpb246UyxmZXRjaE1ldGhvZDptLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpnLG5vRGVsZXRlT25TdGFsZUdldDpHLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOnEsYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDokLGlnbm9yZUZldGNoQWJvcnQ6bnR9PWU7aWYobiE9PTAmJiFKdChuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggb3B0aW9uIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIik7Y29uc3QgbHQ9bj9WaShuKTpBcnJheTtpZighbHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG1heCB2YWx1ZTogIituKTtpZih2KHRoaXMsSXQsbiksdih0aGlzLFJ0LGIpLHRoaXMubWF4RW50cnlTaXplPUl8fGModGhpcyxSdCksdGhpcy5zaXplQ2FsY3VsYXRpb249Uyx0aGlzLnNpemVDYWxjdWxhdGlvbil7aWYoIWModGhpcyxSdCkmJiF0aGlzLm1heEVudHJ5U2l6ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUiKTtpZih0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24iKX1pZihtIT09dm9pZCAwJiZ0eXBlb2YgbSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkIik7aWYodih0aGlzLEllLG0pLHYodGhpcyx0ZSwhIW0pLHYodGhpcyxhdCxuZXcgTWFwKSx2KHRoaXMsdHQsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksdih0aGlzLEwsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksdih0aGlzLF90LG5ldyBsdChuKSksdih0aGlzLHh0LG5ldyBsdChuKSksdih0aGlzLEV0LDApLHYodGhpcyxodCwwKSx2KHRoaXMsdnQsRW4uY3JlYXRlKG4pKSx2KHRoaXMsdXQsMCksdih0aGlzLEN0LDApLHR5cGVvZiBsPT0iZnVuY3Rpb24iJiZ2KHRoaXMsTnQsbCksdHlwZW9mIGQ9PSJmdW5jdGlvbiI/KHYodGhpcyxNdCxkKSx2KHRoaXMsZnQsW10pKToodih0aGlzLE10LHZvaWQgMCksdih0aGlzLGZ0LHZvaWQgMCkpLHYodGhpcyxQdCwhIWModGhpcyxOdCkpLHYodGhpcyxwdCwhIWModGhpcyxNdCkpLHRoaXMubm9EaXNwb3NlT25TZXQ9ISFfLHRoaXMubm9VcGRhdGVUVEw9ISFPLHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uPSEhZyx0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uPSEhcSx0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQ9ISEkLHRoaXMuaWdub3JlRmV0Y2hBYm9ydD0hIW50LHRoaXMubWF4RW50cnlTaXplIT09MCl7aWYoYyh0aGlzLFJ0KSE9PTAmJiFKdChjKHRoaXMsUnQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO2lmKCFKdCh0aGlzLm1heEVudHJ5U2l6ZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO3codGhpcyxfbixxaSkuY2FsbCh0aGlzKX1pZih0aGlzLmFsbG93U3RhbGU9ISFhLHRoaXMubm9EZWxldGVPblN0YWxlR2V0PSEhRyx0aGlzLnVwZGF0ZUFnZU9uR2V0PSEhcyx0aGlzLnVwZGF0ZUFnZU9uSGFzPSEhdSx0aGlzLnR0bFJlc29sdXRpb249SnQoaSl8fGk9PT0wP2k6MSx0aGlzLnR0bEF1dG9wdXJnZT0hIW8sdGhpcy50dGw9cnx8MCx0aGlzLnR0bCl7aWYoIUp0KHRoaXMudHRsKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0dGwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7dyh0aGlzLCRlLGNyKS5jYWxsKHRoaXMpfWlmKGModGhpcyxJdCk9PT0wJiZ0aGlzLnR0bD09PTAmJmModGhpcyxSdCk9PT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkF0IGxlYXN0IG9uZSBvZiBtYXgsIG1heFNpemUsIG9yIHR0bCBpcyByZXF1aXJlZCIpO2lmKCF0aGlzLnR0bEF1dG9wdXJnZSYmIWModGhpcyxJdCkmJiFjKHRoaXMsUnQpKXtjb25zdCBpdD0iTFJVX0NBQ0hFX1VOQk9VTkRFRCI7ZjAoaXQpJiYoamkuYWRkKGl0KSxHaSgiVFRMIGNhY2hpbmcgd2l0aG91dCB0dGxBdXRvcHVyZ2UsIG1heCwgb3IgbWF4U2l6ZSBjYW4gcmVzdWx0IGluIHVuYm91bmRlZCBtZW1vcnkgY29uc3VtcHRpb24uIiwiVW5ib3VuZGVkQ2FjaGVXYXJuaW5nIixpdCxzcikpfX1zdGF0aWMgdW5zYWZlRXhwb3NlSW50ZXJuYWxzKGUpe3JldHVybntzdGFydHM6YyhlLEx0KSx0dGxzOmMoZSxPdCksc2l6ZXM6YyhlLER0KSxrZXlNYXA6YyhlLGF0KSxrZXlMaXN0OmMoZSx0dCksdmFsTGlzdDpjKGUsTCksbmV4dDpjKGUsX3QpLHByZXY6YyhlLHh0KSxnZXQgaGVhZCgpe3JldHVybiBjKGUsRXQpfSxnZXQgdGFpbCgpe3JldHVybiBjKGUsaHQpfSxmcmVlOmMoZSx2dCksaXNCYWNrZ3JvdW5kRmV0Y2g6bj0+e3ZhciByO3JldHVybiB3KHI9ZSxLLGV0KS5jYWxsKHIsbil9LGJhY2tncm91bmRGZXRjaDoobixyLGksbyk9Pnt2YXIgcztyZXR1cm4gdyhzPWUsQ2UsUm4pLmNhbGwocyxuLHIsaSxvKX0sbW92ZVRvVGFpbDpuPT57dmFyIHI7cmV0dXJuIHcocj1lLGxlLGtlKS5jYWxsKHIsbil9LGluZGV4ZXM6bj0+e3ZhciByO3JldHVybiB3KHI9ZSwkdCxlZSkuY2FsbChyLG4pfSxyaW5kZXhlczpuPT57dmFyIHI7cmV0dXJuIHcocj1lLFZ0LG5lKS5jYWxsKHIsbil9LGlzU3RhbGU6bj0+e3ZhciByO3JldHVybiBjKHI9ZSxidCkuY2FsbChyLG4pfX19Z2V0IG1heCgpe3JldHVybiBjKHRoaXMsSXQpfWdldCBtYXhTaXplKCl7cmV0dXJuIGModGhpcyxSdCl9Z2V0IGNhbGN1bGF0ZWRTaXplKCl7cmV0dXJuIGModGhpcyxDdCl9Z2V0IHNpemUoKXtyZXR1cm4gYyh0aGlzLHV0KX1nZXQgZmV0Y2hNZXRob2QoKXtyZXR1cm4gYyh0aGlzLEllKX1nZXQgZGlzcG9zZSgpe3JldHVybiBjKHRoaXMsTnQpfWdldCBkaXNwb3NlQWZ0ZXIoKXtyZXR1cm4gYyh0aGlzLE10KX1nZXRSZW1haW5pbmdUVEwoZSl7cmV0dXJuIGModGhpcyxhdCkuaGFzKGUpPzEvMDowfSplbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLCR0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KnJlbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LG5lKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KmtleXMoKXtmb3IoY29uc3QgZSBvZiB3KHRoaXMsJHQsZWUpLmNhbGwodGhpcykpe2NvbnN0IG49Yyh0aGlzLHR0KVtlXTtuIT09dm9pZCAwJiYhdyh0aGlzLEssZXQpLmNhbGwodGhpcyxjKHRoaXMsTClbZV0pJiYoeWllbGQgbil9fSpya2V5cygpe2Zvcihjb25zdCBlIG9mIHcodGhpcyxWdCxuZSkuY2FsbCh0aGlzKSl7Y29uc3Qgbj1jKHRoaXMsdHQpW2VdO24hPT12b2lkIDAmJiF3KHRoaXMsSyxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBuKX19KnZhbHVlcygpe2Zvcihjb25zdCBlIG9mIHcodGhpcywkdCxlZSkuY2FsbCh0aGlzKSljKHRoaXMsTClbZV0hPT12b2lkIDAmJiF3KHRoaXMsSyxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBjKHRoaXMsTClbZV0pfSpydmFsdWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LG5lKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmIXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkIGModGhpcyxMKVtlXSl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9ZmluZChlLG49e30pe2Zvcihjb25zdCByIG9mIHcodGhpcywkdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsSyxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtpZihvIT09dm9pZCAwJiZlKG8sYyh0aGlzLHR0KVtyXSx0aGlzKSlyZXR1cm4gdGhpcy5nZXQoYyh0aGlzLHR0KVtyXSxuKX19Zm9yRWFjaChlLG49dGhpcyl7Zm9yKGNvbnN0IHIgb2Ygdyh0aGlzLCR0LGVlKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyxMKVtyXSxvPXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO28hPT12b2lkIDAmJmUuY2FsbChuLG8sYyh0aGlzLHR0KVtyXSx0aGlzKX19cmZvckVhY2goZSxuPXRoaXMpe2Zvcihjb25zdCByIG9mIHcodGhpcyxWdCxuZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsSyxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtvIT09dm9pZCAwJiZlLmNhbGwobixvLGModGhpcyx0dClbcl0sdGhpcyl9fXB1cmdlU3RhbGUoKXtsZXQgZT0hMTtmb3IoY29uc3QgbiBvZiB3KHRoaXMsVnQsbmUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKWModGhpcyxidCkuY2FsbCh0aGlzLG4pJiYodGhpcy5kZWxldGUoYyh0aGlzLHR0KVtuXSksZT0hMCk7cmV0dXJuIGV9aW5mbyhlKXtjb25zdCBuPWModGhpcyxhdCkuZ2V0KGUpO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHI9Yyh0aGlzLEwpW25dLGk9dyh0aGlzLEssZXQpLmNhbGwodGhpcyxyKT9yLl9fc3RhbGVXaGlsZUZldGNoaW5nOnI7aWYoaT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbz17dmFsdWU6aX07aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7Y29uc3Qgcz1jKHRoaXMsT3QpW25dLHU9Yyh0aGlzLEx0KVtuXTtpZihzJiZ1KXtjb25zdCBhPXMtKG1lLm5vdygpLXUpO28udHRsPWEsby5zdGFydD1EYXRlLm5vdygpfX1yZXR1cm4gYyh0aGlzLER0KSYmKG8uc2l6ZT1jKHRoaXMsRHQpW25dKSxvfWR1bXAoKXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHcodGhpcywkdCxlZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpe2NvbnN0IHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXSxvPXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO2lmKG89PT12b2lkIDB8fHI9PT12b2lkIDApY29udGludWU7Y29uc3Qgcz17dmFsdWU6b307aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7cy50dGw9Yyh0aGlzLE90KVtuXTtjb25zdCB1PW1lLm5vdygpLWModGhpcyxMdClbbl07cy5zdGFydD1NYXRoLmZsb29yKERhdGUubm93KCktdSl9Yyh0aGlzLER0KSYmKHMuc2l6ZT1jKHRoaXMsRHQpW25dKSxlLnVuc2hpZnQoW3Isc10pfXJldHVybiBlfWxvYWQoZSl7dGhpcy5jbGVhcigpO2Zvcihjb25zdFtuLHJdb2YgZSl7aWYoci5zdGFydCl7Y29uc3QgaT1EYXRlLm5vdygpLXIuc3RhcnQ7ci5zdGFydD1tZS5ub3coKS1pfXRoaXMuc2V0KG4sci52YWx1ZSxyKX19c2V0KGUsbixyPXt9KXt2YXIgTyxiLEksUyxtO2lmKG49PT12b2lkIDApcmV0dXJuIHRoaXMuZGVsZXRlKGUpLHRoaXM7Y29uc3R7dHRsOmk9dGhpcy50dGwsc3RhcnQ6byxub0Rpc3Bvc2VPblNldDpzPXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZUNhbGN1bGF0aW9uOnU9dGhpcy5zaXplQ2FsY3VsYXRpb24sc3RhdHVzOmF9PXI7bGV0e25vVXBkYXRlVFRMOmw9dGhpcy5ub1VwZGF0ZVRUTH09cjtjb25zdCBkPWModGhpcyxXZSkuY2FsbCh0aGlzLGUsbixyLnNpemV8fDAsdSk7aWYodGhpcy5tYXhFbnRyeVNpemUmJmQ+dGhpcy5tYXhFbnRyeVNpemUpcmV0dXJuIGEmJihhLnNldD0ibWlzcyIsYS5tYXhFbnRyeVNpemVFeGNlZWRlZD0hMCksdGhpcy5kZWxldGUoZSksdGhpcztsZXQgXz1jKHRoaXMsdXQpPT09MD92b2lkIDA6Yyh0aGlzLGF0KS5nZXQoZSk7aWYoXz09PXZvaWQgMClfPWModGhpcyx1dCk9PT0wP2ModGhpcyxodCk6Yyh0aGlzLHZ0KS5sZW5ndGghPT0wP2ModGhpcyx2dCkucG9wKCk6Yyh0aGlzLHV0KT09PWModGhpcyxJdCk/dyh0aGlzLE1lLFRuKS5jYWxsKHRoaXMsITEpOmModGhpcyx1dCksYyh0aGlzLHR0KVtfXT1lLGModGhpcyxMKVtfXT1uLGModGhpcyxhdCkuc2V0KGUsXyksYyh0aGlzLF90KVtjKHRoaXMsaHQpXT1fLGModGhpcyx4dClbX109Yyh0aGlzLGh0KSx2KHRoaXMsaHQsXyksQW4odGhpcyx1dCkuXysrLGModGhpcyxOZSkuY2FsbCh0aGlzLF8sZCxhKSxhJiYoYS5zZXQ9ImFkZCIpLGw9ITE7ZWxzZXt3KHRoaXMsbGUsa2UpLmNhbGwodGhpcyxfKTtjb25zdCBnPWModGhpcyxMKVtfXTtpZihuIT09Zyl7aWYoYyh0aGlzLHRlKSYmdyh0aGlzLEssZXQpLmNhbGwodGhpcyxnKSl7Zy5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoInJlcGxhY2VkIikpO2NvbnN0e19fc3RhbGVXaGlsZUZldGNoaW5nOkd9PWc7RyE9PXZvaWQgMCYmIXMmJihjKHRoaXMsUHQpJiYoKE89Yyh0aGlzLE50KSk9PW51bGx8fE8uY2FsbCh0aGlzLEcsZSwic2V0IikpLGModGhpcyxwdCkmJigoYj1jKHRoaXMsZnQpKT09bnVsbHx8Yi5wdXNoKFtHLGUsInNldCJdKSkpfWVsc2Ugc3x8KGModGhpcyxQdCkmJigoST1jKHRoaXMsTnQpKT09bnVsbHx8SS5jYWxsKHRoaXMsZyxlLCJzZXQiKSksYyh0aGlzLHB0KSYmKChTPWModGhpcyxmdCkpPT1udWxsfHxTLnB1c2goW2csZSwic2V0Il0pKSk7aWYoYyh0aGlzLGZlKS5jYWxsKHRoaXMsXyksYyh0aGlzLE5lKS5jYWxsKHRoaXMsXyxkLGEpLGModGhpcyxMKVtfXT1uLGEpe2Euc2V0PSJyZXBsYWNlIjtjb25zdCBHPWcmJncodGhpcyxLLGV0KS5jYWxsKHRoaXMsZyk/Zy5fX3N0YWxlV2hpbGVGZXRjaGluZzpnO0chPT12b2lkIDAmJihhLm9sZFZhbHVlPUcpfX1lbHNlIGEmJihhLnNldD0idXBkYXRlIil9aWYoaSE9PTAmJiFjKHRoaXMsT3QpJiZ3KHRoaXMsJGUsY3IpLmNhbGwodGhpcyksYyh0aGlzLE90KSYmKGx8fGModGhpcyxWZSkuY2FsbCh0aGlzLF8saSxvKSxhJiZjKHRoaXMsa3QpLmNhbGwodGhpcyxhLF8pKSwhcyYmYyh0aGlzLHB0KSYmYyh0aGlzLGZ0KSl7Y29uc3QgZz1jKHRoaXMsZnQpO2xldCBHO2Zvcig7Rz1nPT1udWxsP3ZvaWQgMDpnLnNoaWZ0KCk7KShtPWModGhpcyxNdCkpPT1udWxsfHxtLmNhbGwodGhpcywuLi5HKX1yZXR1cm4gdGhpc31wb3AoKXt2YXIgZTt0cnl7Zm9yKDtjKHRoaXMsdXQpOyl7Y29uc3Qgbj1jKHRoaXMsTClbYyh0aGlzLEV0KV07aWYodyh0aGlzLE1lLFRuKS5jYWxsKHRoaXMsITApLHcodGhpcyxLLGV0KS5jYWxsKHRoaXMsbikpe2lmKG4uX19zdGFsZVdoaWxlRmV0Y2hpbmcpcmV0dXJuIG4uX19zdGFsZVdoaWxlRmV0Y2hpbmd9ZWxzZSBpZihuIT09dm9pZCAwKXJldHVybiBufX1maW5hbGx5e2lmKGModGhpcyxwdCkmJmModGhpcyxmdCkpe2NvbnN0IG49Yyh0aGlzLGZ0KTtsZXQgcjtmb3IoO3I9bj09bnVsbD92b2lkIDA6bi5zaGlmdCgpOykoZT1jKHRoaXMsTXQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsLi4ucil9fX1oYXMoZSxuPXt9KXtjb25zdHt1cGRhdGVBZ2VPbkhhczpyPXRoaXMudXBkYXRlQWdlT25IYXMsc3RhdHVzOml9PW4sbz1jKHRoaXMsYXQpLmdldChlKTtpZihvIT09dm9pZCAwKXtjb25zdCBzPWModGhpcyxMKVtvXTtpZih3KHRoaXMsSyxldCkuY2FsbCh0aGlzLHMpJiZzLl9fc3RhbGVXaGlsZUZldGNoaW5nPT09dm9pZCAwKXJldHVybiExO2lmKGModGhpcyxidCkuY2FsbCh0aGlzLG8pKWkmJihpLmhhcz0ic3RhbGUiLGModGhpcyxrdCkuY2FsbCh0aGlzLGksbykpO2Vsc2UgcmV0dXJuIHImJmModGhpcyxoZSkuY2FsbCh0aGlzLG8pLGkmJihpLmhhcz0iaGl0IixjKHRoaXMsa3QpLmNhbGwodGhpcyxpLG8pKSwhMH1lbHNlIGkmJihpLmhhcz0ibWlzcyIpO3JldHVybiExfXBlZWsoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlfT1uLGk9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoaT09PXZvaWQgMHx8IXImJmModGhpcyxidCkuY2FsbCh0aGlzLGkpKXJldHVybjtjb25zdCBvPWModGhpcyxMKVtpXTtyZXR1cm4gdyh0aGlzLEssZXQpLmNhbGwodGhpcyxvKT9vLl9fc3RhbGVXaGlsZUZldGNoaW5nOm99YXN5bmMgZmV0Y2goZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCx0dGw6cz10aGlzLnR0bCxub0Rpc3Bvc2VPblNldDp1PXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZTphPTAsc2l6ZUNhbGN1bGF0aW9uOmw9dGhpcy5zaXplQ2FsY3VsYXRpb24sbm9VcGRhdGVUVEw6ZD10aGlzLm5vVXBkYXRlVFRMLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfPXRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk89dGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixpZ25vcmVGZXRjaEFib3J0OmI9dGhpcy5pZ25vcmVGZXRjaEFib3J0LGFsbG93U3RhbGVPbkZldGNoQWJvcnQ6ST10aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsY29udGV4dDpTLGZvcmNlUmVmcmVzaDptPSExLHN0YXR1czpnLHNpZ25hbDpHfT1uO2lmKCFjKHRoaXMsdGUpKXJldHVybiBnJiYoZy5mZXRjaD0iZ2V0IiksdGhpcy5nZXQoZSx7YWxsb3dTdGFsZTpyLHVwZGF0ZUFnZU9uR2V0Omksbm9EZWxldGVPblN0YWxlR2V0Om8sc3RhdHVzOmd9KTtjb25zdCBxPXthbGxvd1N0YWxlOnIsdXBkYXRlQWdlT25HZXQ6aSxub0RlbGV0ZU9uU3RhbGVHZXQ6byx0dGw6cyxub0Rpc3Bvc2VPblNldDp1LHNpemU6YSxzaXplQ2FsY3VsYXRpb246bCxub1VwZGF0ZVRUTDpkLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk8sYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpJLGlnbm9yZUZldGNoQWJvcnQ6YixzdGF0dXM6ZyxzaWduYWw6R307bGV0ICQ9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoJD09PXZvaWQgMCl7ZyYmKGcuZmV0Y2g9Im1pc3MiKTtjb25zdCBudD13KHRoaXMsQ2UsUm4pLmNhbGwodGhpcyxlLCQscSxTKTtyZXR1cm4gbnQuX19yZXR1cm5lZD1udH1lbHNle2NvbnN0IG50PWModGhpcyxMKVskXTtpZih3KHRoaXMsSyxldCkuY2FsbCh0aGlzLG50KSl7Y29uc3QgQj1yJiZudC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMDtyZXR1cm4gZyYmKGcuZmV0Y2g9ImluZmxpZ2h0IixCJiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksQj9udC5fX3N0YWxlV2hpbGVGZXRjaGluZzpudC5fX3JldHVybmVkPW50fWNvbnN0IGx0PWModGhpcyxidCkuY2FsbCh0aGlzLCQpO2lmKCFtJiYhbHQpcmV0dXJuIGcmJihnLmZldGNoPSJoaXQiKSx3KHRoaXMsbGUsa2UpLmNhbGwodGhpcywkKSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcywkKSxnJiZjKHRoaXMsa3QpLmNhbGwodGhpcyxnLCQpLG50O2NvbnN0IGl0PXcodGhpcyxDZSxSbikuY2FsbCh0aGlzLGUsJCxxLFMpLFQ9aXQuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJnI7cmV0dXJuIGcmJihnLmZldGNoPWx0PyJzdGFsZSI6InJlZnJlc2giLFQmJmx0JiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksVD9pdC5fX3N0YWxlV2hpbGVGZXRjaGluZzppdC5fX3JldHVybmVkPWl0fX1nZXQoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCxzdGF0dXM6c309bix1PWModGhpcyxhdCkuZ2V0KGUpO2lmKHUhPT12b2lkIDApe2NvbnN0IGE9Yyh0aGlzLEwpW3VdLGw9dyh0aGlzLEssZXQpLmNhbGwodGhpcyxhKTtyZXR1cm4gcyYmYyh0aGlzLGt0KS5jYWxsKHRoaXMscyx1KSxjKHRoaXMsYnQpLmNhbGwodGhpcyx1KT8ocyYmKHMuZ2V0PSJzdGFsZSIpLGw/KHMmJnImJmEuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJihzLnJldHVybmVkU3RhbGU9ITApLHI/YS5fX3N0YWxlV2hpbGVGZXRjaGluZzp2b2lkIDApOihvfHx0aGlzLmRlbGV0ZShlKSxzJiZyJiYocy5yZXR1cm5lZFN0YWxlPSEwKSxyP2E6dm9pZCAwKSk6KHMmJihzLmdldD0iaGl0IiksbD9hLl9fc3RhbGVXaGlsZUZldGNoaW5nOih3KHRoaXMsbGUsa2UpLmNhbGwodGhpcyx1KSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyx1KSxhKSl9ZWxzZSBzJiYocy5nZXQ9Im1pc3MiKX1kZWxldGUoZSl7dmFyIHIsaSxvLHM7bGV0IG49ITE7aWYoYyh0aGlzLHV0KSE9PTApe2NvbnN0IHU9Yyh0aGlzLGF0KS5nZXQoZSk7aWYodSE9PXZvaWQgMClpZihuPSEwLGModGhpcyx1dCk9PT0xKXRoaXMuY2xlYXIoKTtlbHNle2ModGhpcyxmZSkuY2FsbCh0aGlzLHUpO2NvbnN0IGE9Yyh0aGlzLEwpW3VdO2lmKHcodGhpcyxLLGV0KS5jYWxsKHRoaXMsYSk/YS5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoImRlbGV0ZWQiKSk6KGModGhpcyxQdCl8fGModGhpcyxwdCkpJiYoYyh0aGlzLFB0KSYmKChyPWModGhpcyxOdCkpPT1udWxsfHxyLmNhbGwodGhpcyxhLGUsImRlbGV0ZSIpKSxjKHRoaXMscHQpJiYoKGk9Yyh0aGlzLGZ0KSk9PW51bGx8fGkucHVzaChbYSxlLCJkZWxldGUiXSkpKSxjKHRoaXMsYXQpLmRlbGV0ZShlKSxjKHRoaXMsdHQpW3VdPXZvaWQgMCxjKHRoaXMsTClbdV09dm9pZCAwLHU9PT1jKHRoaXMsaHQpKXYodGhpcyxodCxjKHRoaXMseHQpW3VdKTtlbHNlIGlmKHU9PT1jKHRoaXMsRXQpKXYodGhpcyxFdCxjKHRoaXMsX3QpW3VdKTtlbHNle2NvbnN0IGw9Yyh0aGlzLHh0KVt1XTtjKHRoaXMsX3QpW2xdPWModGhpcyxfdClbdV07Y29uc3QgZD1jKHRoaXMsX3QpW3VdO2ModGhpcyx4dClbZF09Yyh0aGlzLHh0KVt1XX1Bbih0aGlzLHV0KS5fLS0sYyh0aGlzLHZ0KS5wdXNoKHUpfX1pZihjKHRoaXMscHQpJiYoKG89Yyh0aGlzLGZ0KSkhPW51bGwmJm8ubGVuZ3RoKSl7Y29uc3QgdT1jKHRoaXMsZnQpO2xldCBhO2Zvcig7YT11PT1udWxsP3ZvaWQgMDp1LnNoaWZ0KCk7KShzPWModGhpcyxNdCkpPT1udWxsfHxzLmNhbGwodGhpcywuLi5hKX1yZXR1cm4gbn1jbGVhcigpe3ZhciBlLG4scjtmb3IoY29uc3QgaSBvZiB3KHRoaXMsVnQsbmUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKXtjb25zdCBvPWModGhpcyxMKVtpXTtpZih3KHRoaXMsSyxldCkuY2FsbCh0aGlzLG8pKW8uX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCJkZWxldGVkIikpO2Vsc2V7Y29uc3Qgcz1jKHRoaXMsdHQpW2ldO2ModGhpcyxQdCkmJigoZT1jKHRoaXMsTnQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsbyxzLCJkZWxldGUiKSksYyh0aGlzLHB0KSYmKChuPWModGhpcyxmdCkpPT1udWxsfHxuLnB1c2goW28scywiZGVsZXRlIl0pKX19aWYoYyh0aGlzLGF0KS5jbGVhcigpLGModGhpcyxMKS5maWxsKHZvaWQgMCksYyh0aGlzLHR0KS5maWxsKHZvaWQgMCksYyh0aGlzLE90KSYmYyh0aGlzLEx0KSYmKGModGhpcyxPdCkuZmlsbCgwKSxjKHRoaXMsTHQpLmZpbGwoMCkpLGModGhpcyxEdCkmJmModGhpcyxEdCkuZmlsbCgwKSx2KHRoaXMsRXQsMCksdih0aGlzLGh0LDApLGModGhpcyx2dCkubGVuZ3RoPTAsdih0aGlzLEN0LDApLHYodGhpcyx1dCwwKSxjKHRoaXMscHQpJiZjKHRoaXMsZnQpKXtjb25zdCBpPWModGhpcyxmdCk7bGV0IG87Zm9yKDtvPWk9PW51bGw/dm9pZCAwOmkuc2hpZnQoKTspKHI9Yyh0aGlzLE10KSk9PW51bGx8fHIuY2FsbCh0aGlzLC4uLm8pfX19O2xldCBvcj1zcjtGMD1TeW1ib2wudG9TdHJpbmdUYWcsSXQ9bmV3IFdlYWtNYXAsUnQ9bmV3IFdlYWtNYXAsTnQ9bmV3IFdlYWtNYXAsTXQ9bmV3IFdlYWtNYXAsSWU9bmV3IFdlYWtNYXAsdXQ9bmV3IFdlYWtNYXAsQ3Q9bmV3IFdlYWtNYXAsYXQ9bmV3IFdlYWtNYXAsdHQ9bmV3IFdlYWtNYXAsTD1uZXcgV2Vha01hcCxfdD1uZXcgV2Vha01hcCx4dD1uZXcgV2Vha01hcCxFdD1uZXcgV2Vha01hcCxodD1uZXcgV2Vha01hcCx2dD1uZXcgV2Vha01hcCxmdD1uZXcgV2Vha01hcCxEdD1uZXcgV2Vha01hcCxMdD1uZXcgV2Vha01hcCxPdD1uZXcgV2Vha01hcCxQdD1uZXcgV2Vha01hcCx0ZT1uZXcgV2Vha01hcCxwdD1uZXcgV2Vha01hcCwkZT1uZXcgV2Vha1NldCxjcj1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGRuKGModGhpcyxJdCkpLG49bmV3IGRuKGModGhpcyxJdCkpO3YodGhpcyxPdCxlKSx2KHRoaXMsTHQsbiksdih0aGlzLFZlLChvLHMsdT1tZS5ub3coKSk9PntpZihuW29dPXMhPT0wP3U6MCxlW29dPXMscyE9PTAmJnRoaXMudHRsQXV0b3B1cmdlKXtjb25zdCBhPXNldFRpbWVvdXQoKCk9PntjKHRoaXMsYnQpLmNhbGwodGhpcyxvKSYmdGhpcy5kZWxldGUoYyh0aGlzLHR0KVtvXSl9LHMrMSk7YS51bnJlZiYmYS51bnJlZigpfX0pLHYodGhpcyxoZSxvPT57bltvXT1lW29dIT09MD9tZS5ub3coKTowfSksdih0aGlzLGt0LChvLHMpPT57aWYoZVtzXSl7Y29uc3QgdT1lW3NdLGE9bltzXTtpZighdXx8IWEpcmV0dXJuO28udHRsPXUsby5zdGFydD1hLG8ubm93PXJ8fGkoKTtjb25zdCBsPW8ubm93LWE7by5yZW1haW5pbmdUVEw9dS1sfX0pO2xldCByPTA7Y29uc3QgaT0oKT0+e2NvbnN0IG89bWUubm93KCk7aWYodGhpcy50dGxSZXNvbHV0aW9uPjApe3I9bztjb25zdCBzPXNldFRpbWVvdXQoKCk9PnI9MCx0aGlzLnR0bFJlc29sdXRpb24pO3MudW5yZWYmJnMudW5yZWYoKX1yZXR1cm4gb307dGhpcy5nZXRSZW1haW5pbmdUVEw9bz0+e2NvbnN0IHM9Yyh0aGlzLGF0KS5nZXQobyk7aWYocz09PXZvaWQgMClyZXR1cm4gMDtjb25zdCB1PWVbc10sYT1uW3NdO2lmKCF1fHwhYSlyZXR1cm4gMS8wO2NvbnN0IGw9KHJ8fGkoKSktYTtyZXR1cm4gdS1sfSx2KHRoaXMsYnQsbz0+e2NvbnN0IHM9bltvXSx1PWVbb107cmV0dXJuISF1JiYhIXMmJihyfHxpKCkpLXM+dX0pfSxoZT1uZXcgV2Vha01hcCxrdD1uZXcgV2Vha01hcCxWZT1uZXcgV2Vha01hcCxidD1uZXcgV2Vha01hcCxfbj1uZXcgV2Vha1NldCxxaT1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGRuKGModGhpcyxJdCkpO3YodGhpcyxDdCwwKSx2KHRoaXMsRHQsZSksdih0aGlzLGZlLG49Pnt2KHRoaXMsQ3QsYyh0aGlzLEN0KS1lW25dKSxlW25dPTB9KSx2KHRoaXMsV2UsKG4scixpLG8pPT57aWYodyh0aGlzLEssZXQpLmNhbGwodGhpcyxyKSlyZXR1cm4gMDtpZighSnQoaSkpaWYobyl7aWYodHlwZW9mIG8hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIG11c3QgYmUgYSBmdW5jdGlvbiIpO2lmKGk9byhyLG4pLCFKdChpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSIpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiBXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiBvciBzaXplIG11c3QgYmUgc2V0LiIpO3JldHVybiBpfSksdih0aGlzLE5lLChuLHIsaSk9PntpZihlW25dPXIsYyh0aGlzLFJ0KSl7Y29uc3Qgbz1jKHRoaXMsUnQpLWVbbl07Zm9yKDtjKHRoaXMsQ3QpPm87KXcodGhpcyxNZSxUbikuY2FsbCh0aGlzLCEwKX12KHRoaXMsQ3QsYyh0aGlzLEN0KStlW25dKSxpJiYoaS5lbnRyeVNpemU9cixpLnRvdGFsQ2FsY3VsYXRlZFNpemU9Yyh0aGlzLEN0KSl9KX0sZmU9bmV3IFdlYWtNYXAsTmU9bmV3IFdlYWtNYXAsV2U9bmV3IFdlYWtNYXAsJHQ9bmV3IFdlYWtTZXQsZWU9ZnVuY3Rpb24qKHthbGxvd1N0YWxlOmU9dGhpcy5hbGxvd1N0YWxlfT17fSl7aWYoYyh0aGlzLHV0KSlmb3IobGV0IG49Yyh0aGlzLGh0KTshKCF3KHRoaXMsemUsaHIpLmNhbGwodGhpcyxuKXx8KChlfHwhYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbikpJiYoeWllbGQgbiksbj09PWModGhpcyxFdCkpKTspbj1jKHRoaXMseHQpW25dfSxWdD1uZXcgV2Vha1NldCxuZT1mdW5jdGlvbiooe2FsbG93U3RhbGU6ZT10aGlzLmFsbG93U3RhbGV9PXt9KXtpZihjKHRoaXMsdXQpKWZvcihsZXQgbj1jKHRoaXMsRXQpOyEoIXcodGhpcyx6ZSxocikuY2FsbCh0aGlzLG4pfHwoKGV8fCFjKHRoaXMsYnQpLmNhbGwodGhpcyxuKSkmJih5aWVsZCBuKSxuPT09Yyh0aGlzLGh0KSkpOyluPWModGhpcyxfdClbbl19LHplPW5ldyBXZWFrU2V0LGhyPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZjKHRoaXMsYXQpLmdldChjKHRoaXMsdHQpW2VdKT09PWV9LE1lPW5ldyBXZWFrU2V0LFRuPWZ1bmN0aW9uKGUpe3ZhciBvLHM7Y29uc3Qgbj1jKHRoaXMsRXQpLHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXTtyZXR1cm4gYyh0aGlzLHRlKSYmdyh0aGlzLEssZXQpLmNhbGwodGhpcyxpKT9pLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigiZXZpY3RlZCIpKTooYyh0aGlzLFB0KXx8Yyh0aGlzLHB0KSkmJihjKHRoaXMsUHQpJiYoKG89Yyh0aGlzLE50KSk9PW51bGx8fG8uY2FsbCh0aGlzLGksciwiZXZpY3QiKSksYyh0aGlzLHB0KSYmKChzPWModGhpcyxmdCkpPT1udWxsfHxzLnB1c2goW2ksciwiZXZpY3QiXSkpKSxjKHRoaXMsZmUpLmNhbGwodGhpcyxuKSxlJiYoYyh0aGlzLHR0KVtuXT12b2lkIDAsYyh0aGlzLEwpW25dPXZvaWQgMCxjKHRoaXMsdnQpLnB1c2gobikpLGModGhpcyx1dCk9PT0xPyh2KHRoaXMsRXQsdih0aGlzLGh0LDApKSxjKHRoaXMsdnQpLmxlbmd0aD0wKTp2KHRoaXMsRXQsYyh0aGlzLF90KVtuXSksYyh0aGlzLGF0KS5kZWxldGUociksQW4odGhpcyx1dCkuXy0tLG59LENlPW5ldyBXZWFrU2V0LFJuPWZ1bmN0aW9uKGUsbixyLGkpe2NvbnN0IG89bj09PXZvaWQgMD92b2lkIDA6Yyh0aGlzLEwpW25dO2lmKHcodGhpcyxLLGV0KS5jYWxsKHRoaXMsbykpcmV0dXJuIG87Y29uc3Qgcz1uZXcgbG4se3NpZ25hbDp1fT1yO3U9PW51bGx8fHUuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCgpPT5zLmFib3J0KHUucmVhc29uKSx7c2lnbmFsOnMuc2lnbmFsfSk7Y29uc3QgYT17c2lnbmFsOnMuc2lnbmFsLG9wdGlvbnM6cixjb250ZXh0Oml9LGw9KFMsbT0hMSk9Pntjb25zdHthYm9ydGVkOmd9PXMuc2lnbmFsLEc9ci5pZ25vcmVGZXRjaEFib3J0JiZTIT09dm9pZCAwO2lmKHIuc3RhdHVzJiYoZyYmIW0/KHIuc3RhdHVzLmZldGNoQWJvcnRlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPXMuc2lnbmFsLnJlYXNvbixHJiYoci5zdGF0dXMuZmV0Y2hBYm9ydElnbm9yZWQ9ITApKTpyLnN0YXR1cy5mZXRjaFJlc29sdmVkPSEwKSxnJiYhRyYmIW0pcmV0dXJuIF8ocy5zaWduYWwucmVhc29uKTtjb25zdCBxPWI7cmV0dXJuIGModGhpcyxMKVtuXT09PWImJihTPT09dm9pZCAwP3EuX19zdGFsZVdoaWxlRmV0Y2hpbmc/Yyh0aGlzLEwpW25dPXEuX19zdGFsZVdoaWxlRmV0Y2hpbmc6dGhpcy5kZWxldGUoZSk6KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hVcGRhdGVkPSEwKSx0aGlzLnNldChlLFMsYS5vcHRpb25zKSkpLFN9LGQ9Uz0+KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hSZWplY3RlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPVMpLF8oUykpLF89Uz0+e2NvbnN0e2Fib3J0ZWQ6bX09cy5zaWduYWwsZz1tJiZyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsRz1nfHxyLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLHE9R3x8ci5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sJD1iO2lmKGModGhpcyxMKVtuXT09PWImJighcXx8JC5fX3N0YWxlV2hpbGVGZXRjaGluZz09PXZvaWQgMD90aGlzLmRlbGV0ZShlKTpnfHwoYyh0aGlzLEwpW25dPSQuX19zdGFsZVdoaWxlRmV0Y2hpbmcpKSxHKXJldHVybiByLnN0YXR1cyYmJC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmKHIuc3RhdHVzLnJldHVybmVkU3RhbGU9ITApLCQuX19zdGFsZVdoaWxlRmV0Y2hpbmc7aWYoJC5fX3JldHVybmVkPT09JCl0aHJvdyBTfSxPPShTLG0pPT57dmFyIEc7Y29uc3QgZz0oRz1jKHRoaXMsSWUpKT09bnVsbD92b2lkIDA6Ry5jYWxsKHRoaXMsZSxvLGEpO2cmJmcgaW5zdGFuY2VvZiBQcm9taXNlJiZnLnRoZW4ocT0+UyhxPT09dm9pZCAwP3ZvaWQgMDpxKSxtKSxzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PnsoIXIuaWdub3JlRmV0Y2hBYm9ydHx8ci5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSYmKFModm9pZCAwKSxyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQmJihTPXE9PmwocSwhMCkpKX0pfTtyLnN0YXR1cyYmKHIuc3RhdHVzLmZldGNoRGlzcGF0Y2hlZD0hMCk7Y29uc3QgYj1uZXcgUHJvbWlzZShPKS50aGVuKGwsZCksST1PYmplY3QuYXNzaWduKGIse19fYWJvcnRDb250cm9sbGVyOnMsX19zdGFsZVdoaWxlRmV0Y2hpbmc6byxfX3JldHVybmVkOnZvaWQgMH0pO3JldHVybiBuPT09dm9pZCAwPyh0aGlzLnNldChlLEksey4uLmEub3B0aW9ucyxzdGF0dXM6dm9pZCAwfSksbj1jKHRoaXMsYXQpLmdldChlKSk6Yyh0aGlzLEwpW25dPUksSX0sSz1uZXcgV2Vha1NldCxldD1mdW5jdGlvbihlKXtpZighYyh0aGlzLHRlKSlyZXR1cm4hMTtjb25zdCBuPWU7cmV0dXJuISFuJiZuIGluc3RhbmNlb2YgUHJvbWlzZSYmbi5oYXNPd25Qcm9wZXJ0eSgiX19zdGFsZVdoaWxlRmV0Y2hpbmciKSYmbi5fX2Fib3J0Q29udHJvbGxlciBpbnN0YW5jZW9mIGxufSxYZT1uZXcgV2Vha1NldCxmcj1mdW5jdGlvbihlLG4pe2ModGhpcyx4dClbbl09ZSxjKHRoaXMsX3QpW2VdPW59LGxlPW5ldyBXZWFrU2V0LGtlPWZ1bmN0aW9uKGUpe2UhPT1jKHRoaXMsaHQpJiYoZT09PWModGhpcyxFdCk/dih0aGlzLEV0LGModGhpcyxfdClbZV0pOncodGhpcyxYZSxmcikuY2FsbCh0aGlzLGModGhpcyx4dClbZV0sYyh0aGlzLF90KVtlXSksdyh0aGlzLFhlLGZyKS5jYWxsKHRoaXMsYyh0aGlzLGh0KSxlKSx2KHRoaXMsaHQsZSkpfTtjb25zdCBXaT1uZXcgb3Ioe21heDoxZTN9KSxsMD0odCxlLG4pPT57Y29uc3Qgcj1KU09OLnN0cmluZ2lmeSh0LnByb3BlcnRpZXMpLGk9V2kuZ2V0KHIpO2lmKGkpcmV0dXJuIGk7Y29uc3Qgbz0oKCk9Pntzd2l0Y2goenQudHlwZXNbdC50eXBlXSl7Y2FzZSJQb2x5Z29uIjpyZXR1cm4icG9seWdvbiI7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4icG9seWxpbmUiO2Nhc2UiUG9pbnQiOnJldHVybiJtYXJrZXIiO2RlZmF1bHQ6cmV0dXJufX0pKCkscz0oKCk9PntpZigobj09bnVsbD92b2lkIDA6bi50eXBlKSE9PSJzaW1wbGUifHwhbylyZXR1cm47Y29uc3QgYT1kMCgiIix0LGUsbyk7aWYoYSlyZXR1cm4gZm49PW51bGw/dm9pZCAwOmZuKG4sYSl9KSgpLHU9KCgpPT57aWYobz09PSJwb2x5Z29uIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlnb247cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEuZmlsbCk/PyEwKSYmKChhPT1udWxsP3ZvaWQgMDphLnNob3cpPz8hMCk/YT09bnVsbD92b2lkIDA6YS5maWxsQ29sb3I6InJnYmEoMCwwLDAsMCkiLHN0cm9rZVN0eWxlOmEhPW51bGwmJmEuc3Ryb2tlJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aCxsaW5lSm9pbjphPT1udWxsP3ZvaWQgMDphLmxpbmVKb2lufX1pZihvPT09InBvbHlsaW5lIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlsaW5lO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yKT8/ITApJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixzdHJva2VTdHlsZTphIT1udWxsJiZhLnN0cm9rZUNvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aH19aWYobz09PSJtYXJrZXIiKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMubWFya2VyO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3IpPz8hMCkmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcjoicmdiYSgwLDAsMCwwKSIsc3Ryb2tlU3R5bGU6YSE9bnVsbCYmYS5wb2ludENvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnBvaW50U2l6ZX19fSkoKTtyZXR1cm4gV2kuc2V0KHIsdSksdX0sZDA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fTtmdW5jdGlvbiBFMCh0KXtyZXR1cm4gcDAodCk9PT1nbi5DT1VOVEVSX0NMT0NLV0lTRX1mdW5jdGlvbiB6aSh0LGUpe2NvbnN0IG49dC54LHI9dC55O2xldCBpPSExO2ZvcihsZXQgbz0wLHM9ZS5sZW5ndGgtMTtvPGUubGVuZ3RoO3M9bysrKXtjb25zdCB1PWVbb10ueCxhPWVbb10ueSxsPWVbc10ueCxkPWVbc10ueTthPnIhPWQ+ciYmbjwobC11KSooci1hKS8oZC1hKSt1JiYoaT0haSl9cmV0dXJuIGl9ZnVuY3Rpb24gXzAodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZih6aShlLHRbbl0pKXtsZXQgcj0hMTtmb3IoO24rMTx0Lmxlbmd0aCYmIUUwKHRbbisxXSk7KW4rKywhciYmemkoZSx0W25dKSYmKHI9ITApO2lmKCFyKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHAwKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49dFtlLTFdLngqKHRbMF0ueS10W2UtMl0ueSkrdFswXS54Kih0WzFdLnktdFtlLTFdLnkpO2ZvcihsZXQgcj0xO3I8PWUtMjtyKyspbis9dFtyXS54Kih0W3IrMV0ueS10W3ItMV0ueSk7aWYoaXNOYU4obikpdGhyb3cgbmV3IEVycm9yO3JldHVybiBuPjA/Z24uQ09VTlRFUl9DTE9DS1dJU0U6Z24uQ0xPQ0tXSVNFfWNvbnN0IEdlPTI1NjtjbGFzcyB5MHtjb25zdHJ1Y3RvcihlKXtDKHRoaXMsIl91cmxUZW1wbGF0ZSIpO0ModGhpcywiX3BhcnNlVGlsZSIpO0ModGhpcywiX3RpbGluZ1NjaGVtZSIpO0ModGhpcywiX2xheWVyTmFtZXMiKTtDKHRoaXMsIl90aWxlV2lkdGgiKTtDKHRoaXMsIl90aWxlSGVpZ2h0Iik7Qyh0aGlzLCJfcGlja1BvaW50UmFkaXVzIik7Qyh0aGlzLCJfcGlja0xpbmVXaWR0aCIpO0ModGhpcywiX3RpbGVDYWNoZXMiKTt0aGlzLl9wYXJzZVRpbGU9QTAsdGhpcy5fdXJsVGVtcGxhdGU9ZS51cmxUZW1wbGF0ZSx0aGlzLl90aWxlV2lkdGg9R2UsdGhpcy5fdGlsZUhlaWdodD1HZSx0aGlzLl9sYXllck5hbWVzPWUubGF5ZXJOYW1lcyx0aGlzLl90aWxpbmdTY2hlbWU9bmV3IFl0LHRoaXMuX3BpY2tQb2ludFJhZGl1cz1lLnBpY2tQb2ludFJhZGl1cz8/VDAsdGhpcy5fcGlja0xpbmVXaWR0aD1lLnBpY2tMaW5lV2lkdGg/P1IwfWFzeW5jIHJlbmRlcihlLG4scixpKXtjb25zdCBvPVhpKHRoaXMuX3VybFRlbXBsYXRlLG4pO2F3YWl0IFByb21pc2UuYWxsKHRoaXMuX2xheWVyTmFtZXMubWFwKHM9PnRoaXMuX3JlbmRlckNhbnZhcyhvLGUsbixzLHIsaSkpKX1hc3luYyBfcmVuZGVyQ2FudmFzKGUsbixyLGksbyxzKXtpZighZSlyZXR1cm47Y29uc3QgdT1hd2FpdCB0aGlzLl9jYWNoZWRUaWxlKGUpLGw9aS5zcGxpdCgvLCAqLykuZmlsdGVyKEJvb2xlYW4pLm1hcChkPT51PT1udWxsP3ZvaWQgMDp1LmxheWVyc1tkXSk7bCYmKG4uc3Ryb2tlU3R5bGU9ImJsYWNrIixuLmZpbGxTdHlsZT0iYmxhY2siLG4ubGluZVdpZHRoPTEsbi5taXRlckxpbWl0PTIsbi5zZXRUcmFuc2Zvcm0odGhpcy5fdGlsZVdpZHRoKm8vR2UsMCwwLHRoaXMuX3RpbGVIZWlnaHQqby9HZSwwLDApLGwuZm9yRWFjaChkPT57aWYoIWQpcmV0dXJuO2NvbnN0IF89R2UvZC5leHRlbnQ7Zm9yKGxldCBPPTA7TzxkLmxlbmd0aDtPKyspe2NvbnN0IGI9ZC5mZWF0dXJlKE8pLEk9bDAoYixyLHMpO2lmKCFJKWNvbnRpbnVlO24uZmlsbFN0eWxlPUkuZmlsbFN0eWxlPz9uLmZpbGxTdHlsZSxuLnN0cm9rZVN0eWxlPUkuc3Ryb2tlU3R5bGU/P24uc3Ryb2tlU3R5bGUsbi5saW5lV2lkdGg9SS5saW5lV2lkdGg/P24ubGluZVdpZHRoLG4ubGluZUpvaW49SS5saW5lSm9pbj8/bi5saW5lSm9pbjtjb25zdCBTPWIubG9hZEdlb21ldHJ5KCk7enQudHlwZXNbYi50eXBlXT09PSJQb2x5Z29uIj90aGlzLl9yZW5kZXJQb2x5Z29uKG4sUyxfLChJLmxpbmVXaWR0aD8/MSk+MCk6enQudHlwZXNbYi50eXBlXT09PSJQb2ludCI/dGhpcy5fcmVuZGVyUG9pbnQobixTLF8pOnp0LnR5cGVzW2IudHlwZV09PT0iTGluZVN0cmluZyI/dGhpcy5fcmVuZGVyTGluZVN0cmluZyhuLFMsXyk6Y29uc29sZS5lcnJvcihgVW5leHBlY3RlZCBnZW9tZXRyeSB0eXBlOiAke2IudHlwZX0gaW4gcmVnaW9uIG1hcCBvbiB0aWxlICR7W3IubGV2ZWwsci54LHIueV0uam9pbigiLyIpfWApfX0pKX1fcmVuZGVyUG9seWdvbihlLG4scixpKXtlLmJlZ2luUGF0aCgpO2NvbnN0IG89KCk9PntpJiZlLnN0cm9rZSgpLGUuZmlsbCgpfTtsZXQgcz0wO2ZvcihsZXQgdT0wO3U8bi5sZW5ndGg7dSsrKXtjb25zdCBhPW5bdV07cythLmxlbmd0aD41NDAwJiYobygpLHM9MCxlLmJlZ2luUGF0aCgpKTtsZXQgbD1hWzBdO2UubW92ZVRvKGwueCpyLGwueSpyKTtmb3IobGV0IGQ9MTtkPGEubGVuZ3RoO2QrKylsPWFbZF0sZS5saW5lVG8obC54KnIsbC55KnIpO3MrPWEubGVuZ3RofXM+MCYmbygpfV9yZW5kZXJQb2ludChlLG4scil7ZS5iZWdpblBhdGgoKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyl7Y29uc3Qgbz1uW2ldWzBdLFtzLHVdPVtvLngqcixvLnkqcl0sYT1lLmxpbmVXaWR0aDtlLmJlZ2luUGF0aCgpLGUuYXJjKHMsdSxhLDAsMipNYXRoLlBJKSxlLmZpbGwoKX19X3JlbmRlckxpbmVTdHJpbmcoZSxuLHIpe2UuYmVnaW5QYXRoKCk7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspe2xldCBvPW5baV1bMF07ZS5tb3ZlVG8oby54KnIsby55KnIpO2ZvcihsZXQgcz0xO3M8bltpXS5sZW5ndGg7cysrKW89bltpXVtzXSxlLmxpbmVUbyhvLngqcixvLnkqcil9ZS5zdHJva2UoKX1waWNrRmVhdHVyZXMoZSxuLHIsaSl7Y29uc3Qgbz1YaSh0aGlzLl91cmxUZW1wbGF0ZSxlKTtyZXR1cm4gdGhpcy5fcGlja0ZlYXR1cmVzRnJvbUxheWVyKG8sZSxuLHIsaSl9YXN5bmMgX3BpY2tGZWF0dXJlc0Zyb21MYXllcihlLG4scixpLG8pe3RyeXtjb25zdCBzPWF3YWl0IHRoaXMuX2NhY2hlZFRpbGUoZSk7cmV0dXJuIHM/KGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX2xheWVyTmFtZXMubWFwKGFzeW5jIGE9Pntjb25zdCBsPXMubGF5ZXJzW2FdO2lmKCFsKXJldHVybltdO2NvbnN0IGQ9YXdhaXQgdGhpcy5fcGlja0ZlYXR1cmVzKG4scixpLGwsbyk7cmV0dXJuIGR8fFtdfSkpKS5mbGF0KCk6W119Y2F0Y2h7cmV0dXJuW119fWFzeW5jIF9waWNrRmVhdHVyZXMoZSxuLHIsaSxvKXtjb25zdCBzPXRoaXMuX3RpbGluZ1NjaGVtZS50aWxlWFlUb05hdGl2ZVJlY3RhbmdsZShlLngsZS55LGUubGV2ZWwpLHU9W3Mud2VzdCxzLmVhc3RdLGE9W3Mubm9ydGgscy5zb3V0aF0sbD1mdW5jdGlvbihTLG0sZyxHLHEpe2NvbnN0ICQ9bmV3IEE7QS5zdWJ0cmFjdChTLG5ldyBBKG1bMF0sZ1swXSksJCk7Y29uc3QgbnQ9bmV3IEEoKEdbMV0tR1swXSkvKG1bMV0tbVswXSksKHFbMV0tcVswXSkvKGdbMV0tZ1swXSkpO3JldHVybiBBLmFkZChBLm11bHRpcGx5Q29tcG9uZW50cygkLG50LG5ldyBBKSxuZXcgQShHWzBdLHFbMF0pLG5ldyBBKX0sZD1bXSxfPVswLGkuZXh0ZW50LTFdLE89KF9bMV0tX1swXSkvdGhpcy5fdGlsZVdpZHRoLGI9bChBLmZyb21DYXJ0ZXNpYW4zKHRoaXMuX3RpbGluZ1NjaGVtZS5wcm9qZWN0aW9uLnByb2plY3QobmV3IEgobixyKSkpLHUsYSxfLF8pLEk9bmV3IHRuKGIueCxiLnkpO2ZvcihsZXQgUz0wO1M8aS5sZW5ndGg7UysrKXtjb25zdCBtPWkuZmVhdHVyZShTKTtpZih6dC50eXBlc1ttLnR5cGVdPT09IlBvbHlnb24iJiZfMChtLmxvYWRHZW9tZXRyeSgpLEkpfHx6dC50eXBlc1ttLnR5cGVdPT09IkxpbmVTdHJpbmciJiZaaChtLmxvYWRHZW9tZXRyeSgpLEksSGkodGhpcy5fcGlja0xpbmVXaWR0aCxtLGUpKk8pfHx6dC50eXBlc1ttLnR5cGVdPT09IlBvaW50IiYmS2gobS5sb2FkR2VvbWV0cnkoKSxJLEhpKHRoaXMuX3BpY2tQb2ludFJhZGl1cyxtLGUpKk8pKXtjb25zdCBnPXUwKG0sZSxvKTtnJiZkLnB1c2goZyl9fXJldHVybiBkfWFzeW5jIF9jYWNoZWRUaWxlKGUpe3ZhciBuLHI7aWYoZSl7aWYoKG49dGhpcy5fdGlsZUNhY2hlcykhPW51bGwmJm4uaGFzKGUpKXJldHVybiB0aGlzLl90aWxlQ2FjaGVzLmdldChlKTt0cnl7Y29uc3QgaT1iMChhd2FpdCB0aGlzLl9wYXJzZVRpbGUoZSkpO3JldHVybiBpJiYoKHI9dGhpcy5fdGlsZUNhY2hlcyk9PW51bGx8fHIuc2V0KGUsaSkpLGl9Y2F0Y2h7cmV0dXJufX19Y2xlYXJDYWNoZSgpe3ZhciBlOyhlPXRoaXMuX3RpbGVDYWNoZXMpPT1udWxsfHxlLmNsZWFyKCl9fWNvbnN0IEEwPWFzeW5jIHQ9Pnt0cnl7Y29uc3QgZT1hd2FpdCBPMCh0KTtyZXR1cm4gZT94MChlKTp2b2lkIDB9Y2F0Y2h7cmV0dXJufX0sVDA9NSxSMD01LHgwPXQ9Pm5ldyBIbyhuZXcga28odCkpLE8wPWFzeW5jIHQ9PntpZighdCl7Y29uc29sZS5lcnJvcigiZmV0Y2ggcmVxdWVzdCBmYWlsZWQgYmVjYXVzZSByZXF1ZXN0IHVybCBpcyB1bmRlZmluZWQiKTtyZXR1cm59dHJ5e2NvbnN0IGU9YXdhaXQgZmV0Y2godCk7cmV0dXJuIGUub2s/YXdhaXQgZS5hcnJheUJ1ZmZlcigpOnZvaWQgMH1jYXRjaHtyZXR1cm59fSxiMD10PT57dmFyIG47aWYoIXQpcmV0dXJuO2NvbnN0IGU9e307Zm9yKGNvbnN0W3IsaV1vZiBPYmplY3QuZW50cmllcyh0LmxheWVycykpe2NvbnN0IG89W10scz1pO2ZvcihsZXQgdT0wO3U8cy5sZW5ndGg7dSsrKXtjb25zdCBhPXMuZmVhdHVyZSh1KTtsZXQgbDtjb25zdCBkPShuPWEuYmJveCk9PW51bGw/dm9pZCAwOm4uY2FsbChhKSxfPXsuLi5hLGlkOmEuaWQsbG9hZEdlb21ldHJ5OigpPT4obHx8KGw9YS5sb2FkR2VvbWV0cnkoKSksbCksYmJveDpkPygpPT5kOnZvaWQgMCx0b0dlb0pTT046YS50b0dlb0pTT059O28ucHVzaChfKX1lW3JdPXsuLi5zLGZlYXR1cmU6dT0+b1t1XX19cmV0dXJue2xheWVyczplfX0sWGk9KHQsZSk9PmRlY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKCJ7en0iLFN0cmluZyhlLmxldmVsKSkucmVwbGFjZSgie3h9IixTdHJpbmcoZS54KSkucmVwbGFjZSgie3l9IixTdHJpbmcoZS55KSk7ZnVuY3Rpb24gSGkodCxlLG4pe3JldHVybiB0eXBlb2YgdD09Im51bWJlciI/dDp0KGUsbil9Y29uc3QgZzA9bmV3IE1hcDtmdW5jdGlvbiBTMCh7dXJsVGVtcGxhdGU6dCxtYXhpbXVtTGV2ZWw6ZX0pe3JldHVybmAke3R9OiR7ZX1gfWFzeW5jIGZ1bmN0aW9uIG0wKHQpe2NvbnN0IGU9UzAodCk7bGV0IG47cmV0dXJuIG49PW51bGwmJihuPW5ldyB5MCh0KSxnMC5zZXQoZSxuKSksbn1zbyh7cmVuZGVyVGlsZTphc3luYyh7cmVxdWVzdGVkVGlsZTp0LGNhbnZhczplLHNjYWxlRmFjdG9yOm4sLi4ucn0pPT57Y29uc3QgaT1lLmdldENvbnRleHQoIjJkIik7aWYoIWkpcmV0dXJuO2NvbnN0IG89YXdhaXQgbTAocik7YXdhaXQgby5yZW5kZXIoaSx0LG4sci5jdXJyZW50TGF5ZXIpLG8uY2xlYXJDYWNoZSgpLGF3YWl0IG5ldyBQcm9taXNlKHM9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUocyl9KX19KX0pKCk7Cg==",dc=typeof window<"u"&&window.Blob&&new Blob([atob(hd)],{type:"text/javascript;charset=utf-8"});function zm(){const t=dc&&(window.URL||window.webkitURL).createObjectURL(dc);try{return t?new Worker(t):new Worker("data:application/javascript;base64,"+hd)}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}const xe=[];function Qm(t){let n=xe.find(o=>o.layerId===t);return n==null&&(n=km(async()=>await Mm(new zm),{size:Math.ceil(navigator.hardwareConcurrency/4)}),n.layerId=t,xe.push(n)),n}function Pm(t,n){return Qm(n).queue(o=>t(o,n))}function Em(t,n){const o=xe.find(s=>s.layerId===t);return o==null||o.taskQueue.length<n}async function wm(t){const n=xe.findIndex(o=>o.layerId===t);n!==-1&&(await xe[n].terminate(!0),xe.splice(n,1))}async function vm(t){var n;const{canvas:o,...s}=t,c=o.transferControlToOffscreen();await Pm(async d=>{await d.renderTile(Hm({canvas:c,...s},[c]))},(n=t.currentLayer)==null?void 0:n.id)}let Be;const Hi=class{constructor(t){U(this,"taskCount",0),U(this,"tileCache"),U(this,"_minimumLevel"),U(this,"_maximumLevel"),U(this,"_credit"),U(this,"_resolution"),U(this,"_tilingScheme"),U(this,"_tileWidth"),U(this,"_tileHeight"),U(this,"_rectangle"),U(this,"_ready"),U(this,"_readyPromise",Promise.resolve(!0)),U(this,"_errorEvent",new Cesium$1.Event),U(this,"_currentLayer"),U(this,"_useWorker"),U(this,"_urlTemplate"),U(this,"_layerNames"),U(this,"_pickPointRadius"),U(this,"_pickLineWidth"),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=re,this._tileHeight=re,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,this._pickPointRadius=t.pickPointRadius,this._pickLineWidth=t.pickLineWidth}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&&!I0(Be,d)&&Be.id===d.id&&wm(Be.id),Be=d,this._useWorker&&(this.taskCount>=Hi.maximumTasksPerImagery||!Em(d==null?void 0:d.id,Hi.maximumTasks))))return;const h=`${t}/${n}/${o}`;if(((c=this.tileCache)==null?void 0:c.has(h))===!0){const N=this.tileCache.get(h);return Promise.resolve(N)}const p=document.createElement("canvas"),y={x:t,y:n,level:o},S=(o>=this.maximumLevel?this._resolution:void 0)??1;p.width=this._tileWidth*S,p.height=this._tileHeight*S;const P=this._urlTemplate,L=this._layerNames,F=this._maximumLevel;return++this.taskCount,vm({canvas:p,requestedTile:y,scaleFactor:S,urlTemplate:P,layerNames:L,maximumLevel:F,currentLayer:d,pickPointRadius:this._pickPointRadius,pickLineWidth:this._pickLineWidth}).then(()=>{var N;return(N=this.tileCache)==null||N.set(h,p),p}).catch(N=>{if(N instanceof Error&&N.message.startsWith("Unimplemented type"))return p;throw N}).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 sb({urlTemplate:p,layerNames:y}).pickFeatures(d,s,c,h)??[]}};let Gi=Hi;U(Gi,"maximumTasks",50),U(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:S}=useData$1(o),P=extractSimpleLayer(o)||void 0,L=React.useMemo(()=>{if(!(!t||!s||!y||!S||p!=="mvt"))return new Gi({minimumLevel:c,maximumLevel:d,credit:h,urlTemplate:normalizeUrl(y,"mvt"),layerName:S,layer:P,worker:!0})},[t,s,y,S,p,c,d,h,P]);useImageryProvider(L,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),S=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(S,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),[S,P]=React.useState();React.useEffect(()=>{if(!t||!s||!y||p!=="tms")return;(async()=>{P(await Cesium$1.TileMapServiceImageryProvider.fromUrl(y,{minimumLevel:c,maximumLevel:d,credit:h}))})()},[t,s,y,p,c,d,h]),useImageryProvider(S,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:S,parameters:P}=useData$1(o),L=React.useMemo(()=>{if(!(!t||!s||!y||!S||p!=="wms"))return new Cesium$1.WebMapServiceImageryProvider({url:y,layers:S,minimumLevel:c,maximumLevel:d,credit:h,parameters:P})},[t,s,y,S,p,c,d,h,P]);useImageryProvider(L,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(P=>[(P==null?void 0:P.x)??0,(P==null?void 0:P.y)??0,(P==null?void 0:P.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(P=>[(P==null?void 0:P.x)??0,(P==null?void 0:P.y)??0,(P==null?void 0:P.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),S=((p==null?void 0:p.originalProperties)||{})[c];let P=!1;Object.entries(s).forEach(([L,F])=>{var Pe;const N=F.name,z=F.type;let W=F.override??((Pe=n==null?void 0:n[c])==null?void 0:Pe[N]);const nt=W==null&&!!F.default;if(W=W??F.default,!((W==null||nt)&&!S)){switch(P=!0,z){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][L]&&(t[d][L]=W??h[L])}}),overrideOriginalProperties(t,p,c,P)}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,S,P,L,F,N,z;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),nt=getGeometryFromEntity(s,t),Pe={type:"feature",id:makeFeatureId$1(t),geometry:nt,properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:W[0],y:W[1],z:W[2]}},se=o(n.layer,Pe);return se?(c&&(((p=se==null?void 0:se.marker)==null?void 0:p.style)==="point"&&!t.point&&(t.point=new Cesium$1.PointGraphics,t.billboard=void 0),attachProperties(t,se,["marker","point"],{show:{name:"show",...(y=se==null?void 0:se.marker)!=null&&y.style?{override:((S=se==null?void 0:se.marker)==null?void 0:S.style)==="point"&&((se==null?void 0:se.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&&(((P=se==null?void 0:se.marker)==null?void 0:P.style)==="image"&&!t.billboard&&(t.billboard=new Cesium$1.BillboardGraphics,t.point=void 0),attachProperties(t,se,["marker","billboard"],{show:{name:"show",...(L=se==null?void 0:se.marker)!=null&&L.style?{override:((F=se==null?void 0:se.marker)==null?void 0:F.style)==="image"&&((se==null?void 0:se.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,se,["marker","label"],{show:{name:"show",default:!0},text:{name:"labelText"},backgroundColor:{name:"labelBackground",type:"color"},heightReference:{name:"heightReference",type:"heightReference"}})),[Pe,se]):void 0}if(t.polyline){const W=(N=t.position)==null?void 0:N.getValue(s),nt=getGeometryFromEntity(s,t),Pe={type:"feature",id:makeFeatureId$1(t),geometry:nt,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}},se=o(n.layer,Pe);return se?(hasAppearance(n,t,["polyline","polyline"])&&attachProperties(t,se,["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"}}),[Pe,se]):void 0}if(t.polygon){const W=(z=t.position)==null?void 0:z.getValue(s),nt=getGeometryFromEntity(s,t),Pe={type:"feature",id:makeFeatureId$1(t),geometry:nt,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}},se=o(n.layer,Pe);return se?(hasAppearance(n,t,["polygon","polygon"])&&attachProperties(t,se,["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"}}),[Pe,se]):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 lt,pi,ba,Sc,ms,Xs;const{show:d=!0,clampToGround:h,stroke:p,strokeWidth:y,markerColor:S,markerSize:P,fill:L,hideIndicator:F}=n??{},[N,z,W]=React.useMemo(()=>{var Ru;const Nl=extractSimpleLayerData(o),pu=n==null?void 0:n.type,yu=n==null?void 0:n.url;return[pu??(Nl==null?void 0:Nl.type),yu??(Nl==null?void 0:Nl.url),((Ru=Nl==null?void 0:Nl.time)==null?void 0:Ru.updateClockOnLoad)??!0]},[n,o]),{viewer:nt}=$e$1(),Pe=React.useRef([]),se=React.useRef(new Set),mt=React.useMemo(()=>!N||N==="auto"?guessType(z):void 0,[N,z]),kt=mt?types[mt]:N!=="auto"?N:void 0,mn=kt?comps[kt]:void 0,{requestRender:_i,timelineManagerRef:zi}=useContext(),Sa=React.useCallback(Nl=>{if(!nt)return;const pu=[],yu=[];Nl.entities.values.forEach(Ru=>{var ff;const Vd=attachStyle(Ru,o,evalFeature,nt.clock.currentTime),[Gd,uf]=Vd||[];attachTag(Ru,{layerId:o==null?void 0:o.id,featureId:Gd==null?void 0:Gd.id,hideIndicator:(ff=uf==null?void 0:uf.resource)==null?void 0:ff.hideIndicator}),Gd&&!se.current.has(Gd.id)&&(pu.push(Gd),Pe.current.push({feature:Gd,raw:Ru}),se.current.add(Gd.id)),uf&&yu.push(uf)}),N!=="geojson"&&(s==null||s(pu,yu)),_i==null||_i()},[o,nt,s,N,_i]),fa=React.useRef({start:(pi=(lt=zi==null?void 0:zi.current)==null?void 0:lt.timeline)==null?void 0:pi.start,stop:(Sc=(ba=zi==null?void 0:zi.current)==null?void 0:ba.timeline)==null?void 0:Sc.stop,current:(Xs=(ms=zi==null?void 0:zi.current)==null?void 0:ms.timeline)==null?void 0:Xs.current}),La=React.useCallback(Nl=>{var pu,yu;if(Nl.entities.values.forEach(Ru=>requestAnimationFrame(()=>{const Vd=getTag(Ru);attachTag(Ru,{layerId:o==null?void 0:o.id,featureId:makeFeatureId$1(Ru),hideIndicator:F??(Vd==null?void 0:Vd.hideIndicator)})})),!W){fa.current.current&&fa.current.start&&fa.current.stop&&((pu=zi==null?void 0:zi.current)==null||pu.commit({cmd:"SET_TIME",payload:{start:fa.current.start,stop:fa.current.stop,current:fa.current.current},committer:{source:"featureResource",id:o==null?void 0:o.id}}));return}Nl.clock&&((yu=zi==null?void 0:zi.current)==null||yu.commit({cmd:"SET_TIME",payload:{start:Cesium$1.JulianDate.toDate(Nl.clock.startTime),stop:Cesium$1.JulianDate.toDate(Nl.clock.stopTime),current:Cesium$1.JulianDate.toDate(Nl.clock.currentTime)},committer:{source:"featureResource",id:o==null?void 0:o.id}})),_i==null||_i()},[W,zi,o==null?void 0:o.id,_i,F]),Ra=React.useMemo(()=>p?Cesium$1.Color.fromCssColorString(p):void 0,[p]),ma=React.useMemo(()=>L?Cesium$1.Color.fromCssColorString(L):void 0,[L]),yt=React.useMemo(()=>S?Cesium$1.Color.fromCssColorString(S):void 0,[S]);return React.useEffect(()=>{nt&&Pe.current.forEach(Nl=>{attachStyle(Nl.raw,o,evalFeature,nt.clock.currentTime)})},[o,nt]),React.useEffect(()=>()=>{requestIdleCallbackWithRequiredWork(()=>{c==null||c(Array.from(se.current.values()))})},[]),!t||!d||!mn||!z?null:jsxRuntimeExports.jsx(mn,{data:z,show:!0,clampToGround:h,onChange:Sa,onLoad:La,stroke:Ra,fill:ma,strokeWidth:y,markerSize:P,markerColor:yt})}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(){Rf(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:S,pitch:P,roll:L,disabledSelection:F}=t||{},{viewer:N}=$e$1(),z=React.useRef(!1),W=React.useRef(!1),nt=React.useRef(),[Pe,se]=React.useState(d);React.useEffect(()=>{o&&!Pe&&se(d)},[Pe,d,o]);const[mt,kt]=React.useState({width:h,height:p,length:y,heading:S,pitch:P,roll:L});React.useEffect(()=>{o&&!mt&&kt({width:h,height:p,length:y,heading:S,pitch:P,roll:L})},[mt,h,p,y,S,P,L,o]);const[mn,_i]=React.useState({activeBox:!1,activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1,cursor:"default"}),zi=React.useCallback(Nl=>{_i(pu=>({...pu,...Nl}))},[]),Sa=React.useCallback(Nl=>{if(!N||!F)return;const pu=N.scene.pick(Nl.position),yu=getLayerId$1(pu);if(yu!=null&&yu.startsWith(`${n}-scale-point`)){const Ru=Number(yu.split("-").slice(-1)[0]);zi({cursor:"nesw-resize",activeScalePointIndex:Ru,isScalePointClicked:!0})}if(yu!=null&&yu.startsWith(`${n}-edge-draggable`)){const Ru=Number(yu.split("-").slice(-1)[0]);zi({cursor:"grabbing",activeEdgeIndex:Ru,isEdgeClicked:!0})}if(yu!=null&&yu.startsWith(`${n}-plane`)&&(z.current=!0,W.current=yu.endsWith("top")||yu.endsWith("bottom")),z.current){const Ru=getCamera(N);nt.current=Ru,updateMapController(N,!1),(!mn.isScalePointClicked||!mn.isEdgeClicked)&&zi({cursor:"grabbing",activeBox:!0})}},[n,mn,zi,N,F]),fa=React.useCallback(()=>{!N||!F||((mn.activeScalePointIndex||mn.activeEdgeIndex)&&zi({cursor:"default",activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1}),z.current&&(updateMapController(N,!0),nt.current=void 0,z.current=!1,W.current=!1,mn.activeBox=!1,mn.cursor="default",zi({activeBox:!1,cursor:"default"})))},[mn,zi,N,F]),La=React.useRef(0),Ra=React.useCallback(async Nl=>{if(!z.current||!N||!F)return;const pu=Cesium$1.Cartesian3.fromDegrees((Pe==null?void 0:Pe[0])||0,(Pe==null?void 0:Pe[1])||0,Pe==null?void 0:Pe[2]);if(W.current){const yu=(Pe==null?void 0:Pe[2])||0,Ru=(()=>{if(!c){const of=yu-((mt==null?void 0:mt.height)||0)/2,gf=La.current;if(of<gf)return yu+(gf-of)}})(),Vd=new Cesium$1.Cartesian2(Nl.startPosition.x,Nl.startPosition.y),Gd=new Cesium$1.Cartesian2(Nl.endPosition.x,Nl.endPosition.y),uf=Cesium$1.Cartesian2.subtract(Gd,Vd,new Cesium$1.Cartesian2),ff=new Cesium$1.Cartesian3(0,0,uf.y<0?-1:1),{moveAmount:pf}=computeMoveAmount(N.scene,{startPosition:Vd,endPosition:Gd},pu,ff),hf=Cesium$1.Cartesian3.multiplyByScalar(ff,pf,new Cesium$1.Cartesian3);se(of=>[(of==null?void 0:of[0])||0,(of==null?void 0:of[1])||0,(Ru||(of==null?void 0:of[2])||0)+hf.z])}else{const yu=Nl.endPosition?getLocationFromScreen(N.scene,Nl.endPosition.x,Nl.endPosition.y,!c):void 0;se(Ru=>[(yu==null?void 0:yu.lng)||0,(yu==null?void 0:yu.lat)||0,(c?Ru==null?void 0:Ru[2]:yu==null?void 0:yu.height)||0]),sampleTerrainHeight(N.scene,(Pe==null?void 0:Pe[0])||0,(Pe==null?void 0:Pe[1])||0).then(Ru=>{La.current=Ru||0})}},[c,Pe,mt==null?void 0:mt.height,N,F]),ma=React.useCallback(({layerId:Nl}={})=>{const pu=!mn.isScalePointClicked&&!mn.isEdgeClicked&&!z.current;if(Nl!=null&&Nl.startsWith(`${n}-scale-point`)&&pu){const yu=Number(Nl.split("-").slice(-1)[0]);zi({cursor:"nesw-resize",activeScalePointIndex:yu})}if(Nl!=null&&Nl.startsWith(`${n}-edge-draggable`)&&pu){const yu=Number(Nl.split("-").slice(-1)[0]);zi({cursor:"grab",activeEdgeIndex:yu})}Nl!=null&&Nl.startsWith(`${n}-plane`)&&pu&&zi({cursor:"grab",activeBox:!0})},[n,mn.isEdgeClicked,mn.isScalePointClicked,zi]),yt=React.useCallback(({layerId:Nl}={})=>{const pu=!mn.isScalePointClicked&&!mn.isEdgeClicked&&!z.current;Nl!=null&&Nl.startsWith(`${n}-scale-point`)&&pu&&zi({cursor:"default",activeScalePointIndex:void 0}),Nl!=null&&Nl.startsWith(`${n}-edge-draggable`)&&pu&&zi({cursor:"default",activeEdgeIndex:void 0}),Nl!=null&&Nl.startsWith(`${n}-plane`)&&pu&&zi({cursor:"default",activeBox:!1})},[n,mn.isEdgeClicked,mn.isScalePointClicked,zi]),lt=React.useRef(),pi=React.useCallback(Nl=>{const pu=N==null?void 0:N.scene.pick(Nl.endPosition);if(lt.current!==pu){if(lt.current){const yu=getLayerId$1(lt.current);yt({layerId:yu}),yt()}if(pu){const yu=getLayerId$1(pu);ma({layerId:yu}),ma()}}Ra(Nl),lt.current=pu},[ma,yt,Ra,N==null?void 0:N.scene]),ba=React.useCallback(Nl=>{var pu,yu;if((pu=Nl.layerId)!=null&&pu.startsWith(`${n}-scale-point`)&&Nl.scale){const Ru=Nl.scale;kt(Vd=>({...Vd,width:Ru.width,height:Ru.height,length:Ru.length})),se([Ru.location.lng,Ru.location.lat,Ru.location.height])}if((yu=Nl.layerId)!=null&&yu.startsWith(`${n}-edge-draggable`)&&Nl.rotate){const Ru=Nl.rotate;kt(Vd=>({...Vd,heading:Ru.heading,pitch:Ru.pitch,roll:Ru.roll}))}},[n]),Sc=React.useMemo(()=>new Cesium$1.ScreenSpaceEventHandler(N==null?void 0:N.scene.canvas),[N]);React.useEffect(()=>{Sc.setInputAction(Sa,Cesium$1.ScreenSpaceEventType.LEFT_DOWN),Sc.setInputAction(pi,Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),Sc.setInputAction(fa,Cesium$1.ScreenSpaceEventType.LEFT_UP)},[Sc,Sa,pi,fa]),React.useEffect(()=>()=>{requestAnimationFrame(()=>{Sc.isDestroyed()||Sc.destroy()})},[Sc]);const ms=React.useMemo(()=>({...mn,...mt,allowEnterGround:c}),[mn,mt,c]),Xs=React.useMemo(()=>o?{visible:s,handleLayerEdit:ba,geometry:{type:"Point",coordinates:Pe||d||[0,0,0]},property:ms}:void 0,[ms,d,Pe,ba,o,s]);return{...t,planes:o?BUILTIN_BOX_SIDE_PLANES:t==null?void 0:t.planes,width:o?mt==null?void 0:mt.width:t==null?void 0:t.width,height:o?mt==null?void 0:mt.height:t==null?void 0:t.height,length:o?mt==null?void 0:mt.length:t==null?void 0:t.length,heading:o?mt==null?void 0:mt.heading:t==null?void 0:t.heading,pitch:o?mt==null?void 0:mt.pitch:t==null?void 0:t.pitch,roll:o?mt==null?void 0:mt.roll:t==null?void 0:t.roll,coordinates:o?Pe:t==null?void 0:t.coordinates,builtinBoxProps:Xs}};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:S,isTilesetReady:P})=>{const[L,F]=React.useState(0),N=React.useMemo(()=>s??100,[s]),z=React.useMemo(()=>c??10,[c]),[W,nt]=React.useState(!1),{requestRender:Pe}=useContext();React.useEffect(()=>{(async()=>{if(!(p!=null&&p.current)||!P)return;if(!t||!n||(n==null?void 0:n.length)<2){S.removeAll(),F(0),Pe==null||Pe();return}S.modelMatrix=Cesium$1.Matrix4.IDENTITY.clone(),nt(!1);const kt=polygon([n.map(fa=>[fa.lng,fa.lat])]),mn=centroid(kt),_i=y!=null&&y.scene?await sampleTerrainHeight(y==null?void 0:y.scene,mn.geometry.coordinates[0],mn.geometry.coordinates[1])??0:0;F(_i);const zi=Cesium$1.Matrix4.inverse(Cesium$1.Transforms.eastNorthUpToFixedFrame(p.current.boundingSphere.center),new Cesium$1.Matrix4);let Sa=0;for(let fa=0;fa<n.length;fa++){const La=n[fa],Ra=n[(fa+1)%n.length];Sa+=(Ra.lng-La.lng)*(Ra.lat+La.lat)}Sa>0&&n.reverse(),S.removeAll();for(let fa=0;fa<n.length-1;fa++){const La=n[fa],Ra=n[fa+1];S.add(createSidePlane(La,Ra,zi,o))}S.add(createHorizontalPlane(n[0],_i+N,zi,o==="inside"?1:-1)),S.add(createHorizontalPlane(n[0],_i-z,zi,o==="inside"?-1:1)),nt(!0)})()},[n,p,S,N,z,t,o,y,P,Pe]),React.useEffect(()=>{S.unionClippingRegions=o==="outside"},[S,o,t]);const se=React.useMemo(()=>({coordiantes:(n==null?void 0:n.map(mt=>[mt.lng,mt.lat]))??[],top:L+N,bottom:L-z,visible:d,style:h,ready:W}),[n,L,N,z,d,h,W]);return{drawClippingEnabled:t,drawClippingEdgeProps:se}},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),S=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),P=Cesium$1.Plane.fromPointNormal(c,S);return Cesium$1.ClippingPlane.fromPlane(P)},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:S,isTilesetReady:P})=>{const L=React.useRef([]),F=React.useRef(s),N=React.useRef(new Set),z=(s==null?void 0:s.id)||t,W=useRefValue(z),nt=React.useCallback(async yt=>{var pi;const lt=(pi=F==null?void 0:F.current)==null?void 0:pi.layer;if((lt==null?void 0:lt.type)==="simple"&&(yt!=null&&yt.feature)){const ba=yt.raw,Sc=getTag(ba),ms=c&&!(ba instanceof Cesium$1.Model)?convertCesium3DTileFeatureProperties(ba):{},Xs=S?h.current.includes((Sc==null?void 0:Sc.featureId)??""):Sc==null?void 0:Sc.isFeatureSelected,Nl=p(lt,{...yt==null?void 0:yt.feature,properties:ms}),pu=Nl==null?void 0:Nl["3dtiles"];return COMMON_STYLE_PROPERTIES.forEach(({name:yu,convert:Ru})=>{var Gd,uf;if(yu==="color"){if(Xs){ba.color=typeof((Gd=lt["3dtiles"])==null?void 0:Gd.selectedFeatureColor)=="string"?toColor((uf=lt["3dtiles"])==null?void 0:uf.selectedFeatureColor)??ba.color:ba.color;return}ba.color=DEFAULT_FEATURE_COLOR}const Vd=convertStyle(pu==null?void 0:pu[yu],Ru);Vd!==void 0&&(ba[yu]=Vd)}),ba instanceof Cesium$1.Cesium3DTilePointFeature&&POINT_STYLE_PROPERTIES.forEach(({name:yu,convert:Ru})=>{const Vd=convertStyle(pu==null?void 0:pu[yu],Ru);Vd!==void 0&&(ba[yu]=Vd)}),"style"in ba&&(ba.style=new Cesium$1.Cesium3DTileStyle(MODEL_STYLE_PROPERTIES.reduce((yu,{name:Ru,convert:Vd})=>{const Gd=convertStyle(pu==null?void 0:pu[Ru],Vd);return Gd===void 0?yu:{...yu,[Ru]:Gd}},{}))),attachTag(yt.raw,{layerId:z,featureId:yt.feature.id,computedFeature:Nl,isFeatureSelected:Sc==null?void 0:Sc.isFeatureSelected}),Nl}},[p,z,c,S,h]),Pe=React.useCallback(async yt=>{if(yt.tileset.isDestroyed())return;const lt=new Set;await lookupFeatures(yt.content,async(pi,ba,Sc)=>{const ms={feature:makeFeatureFrom3DTile(pi,ba,o),raw:pi};attachTag(ms.raw,{layerId:W.current,featureId:ms.feature.id}),Sc!=null&&S&&d.addFeature(ba,Sc,ms.feature.id),await nt(ms),L.current.push(ms),N.current.add(ms.feature.id),lt.add(pick(ms.feature,["id","type","range"]))}),y==null||y(Array.from(lt.values()),[])},[L,nt,y,o,d,S,W]),se=React.useRef(Pe);se.current=Pe,React.useEffect(()=>{var yt;return(yt=n.current)==null?void 0:yt.tileLoad.addEventListener(lt=>se.current(lt))},[n,P]);const mt=React.useCallback(async yt=>{yt.tileset.isDestroyed()||!S||await lookupFeatures(yt.content,async(lt,pi)=>{d.deleteFeature(makeFeatureId(lt,pi,o))})},[o,d,S]),kt=React.useRef(mt);kt.current=mt,React.useEffect(()=>{var yt;return(yt=n.current)==null?void 0:yt.tileUnload.addEventListener(lt=>kt.current(lt))},[n,P]),React.useEffect(()=>{F.current=s},[s]);const mn=React.useMemo(()=>{var yt;return(yt=extractSimpleLayer(s))==null?void 0:yt["3dtiles"]},[s]),_i=usePick(mn,TILESET_APPEARANCE_FIELDS),zi=S?0:s==null?void 0:s.layer._updateStyle,Sa=React.useRef(zi),fa=React.useRef();React.useEffect(()=>{fa.current=Date.now()},[_i,zi]);const La=React.useCallback(async(yt,lt)=>new Promise(pi=>requestAnimationFrame(()=>{if(fa.current&&fa.current>lt){pi(void 0);return}(_i||zi)&&nt(yt),pi(void 0)})),[_i,nt,zi]),Ra=React.useCallback(async yt=>{const lt=[];let pi=!1;for(const ba of L.current){if(fa.current&&fa.current>yt){pi=!0;break}lt.push(La(ba,yt)),lt.length>MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES&&(await Promise.all(lt),lt.length=0)}pi||await Promise.all(lt),Sa.current=zi,lt.length=0},[La,zi]),{requestRender:ma}=useContext();React.useEffect(()=>{(async()=>{const lt=Date.now();await Ra(lt),ma==null||ma()})()},[Ra,ma,zi])},useHooks$2=({id:t,boxId:n,isVisible:o,property:s,viewerProperty:c,layer:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:S})=>{var Af,Hf,_f,wf,Yf,Nf;const{viewer:P}=$e$1(),L=React.useRef(),{onLayerLoad:F,updateCredits:N}=useContext(),z=React.useRef(d==null?void 0:d.id);z.current=d==null?void 0:d.id;const{tileset:W,styleUrl:nt,edgeColor:Pe,edgeWidth:se,experimental_clipping:mt,selectedFeatureColor:kt,disableIndexingFeature:mn}=s??{},{width:_i,height:zi,length:Sa,location:fa,coordinates:La,heading:Ra,roll:ma,pitch:yt,planes:lt,visible:pi=!0,direction:ba="inside",builtinBoxProps:Sc,allowEnterGround:ms}=useClippingBox({clipping:mt,boxId:n}),[Xs,Nl]=React.useState(),{url:pu,type:yu,idProperty:Ru,googleMapApiKey:Vd}=useData(d),Gd=!mn&&!!Ru,[uf,ff]=React.useState(!1),pf=React.useRef(lt),hf=React.useMemo(()=>{var vf,Ff;return(!((vf=pf.current)!=null&&vf.length)||!((Ff=pf.current)!=null&&Ff.every((Xf,Wf)=>{var Qf,_m,Bf,$m,qf,qm;return((Qf=Xf.normal)==null?void 0:Qf.x)===((_m=lt==null?void 0:lt[Wf].normal)==null?void 0:_m.x)&&((Bf=Xf.normal)==null?void 0:Bf.y)===(($m=lt==null?void 0:lt[Wf].normal)==null?void 0:$m.y)&&((qf=Xf.normal)==null?void 0:qf.z)===((qm=lt==null?void 0:lt[Wf].normal)==null?void 0:qm.z)&&Xf.distance===(lt==null?void 0:lt[Wf].distance)})))&&(pf.current=lt),pf.current},[lt]),of=ba==="inside"?-1:1,[gf,Ef]=React.useState(()=>new Cesium$1.ClippingPlaneCollection({planes:hf==null?void 0:hf.map(vf=>{var Ff,Xf,Wf;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Ff=vf.normal)==null?void 0:Ff.x,(Xf=vf.normal)==null?void 0:Xf.y,(Wf=vf.normal)==null?void 0:Wf.z),(vf.distance||0)*of)}),unionClippingRegions:ba==="outside",edgeWidth:se,edgeColor:toColor(Pe)}));React.useEffect(()=>()=>{Ef(new Cesium$1.ClippingPlaneCollection({planes:hf==null?void 0:hf.map(vf=>{var Ff,Xf,Wf;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Ff=vf.normal)==null?void 0:Ff.x,(Xf=vf.normal)==null?void 0:Xf.y,(Wf=vf.normal)==null?void 0:Wf.z),(vf.distance||0)*of)}),unionClippingRegions:ba==="outside",edgeWidth:se,edgeColor:toColor(Pe)}))},[]);const{drawClippingEnabled:xf,drawClippingEdgeProps:Wa}=useDrawClipping({...mt==null?void 0:mt.draw,tilesetRef:L,viewer:P,clippingPlanes:gf,isTilesetReady:uf}),[af]=React.useState(()=>new TilesetFeatureIndex),Xd=React.useCallback(vf=>{vf!=null&&vf.cesiumElement&&attachTag(vf.cesiumElement,{layerId:(d==null?void 0:d.id)||t,featureIndex:Gd?af:void 0,appearanceType:"3dtiles"}),d!=null&&d.id&&(vf!=null&&vf.cesiumElement)&&((vf==null?void 0:vf.cesiumElement)[layerIdField]=d.id),L.current=vf==null?void 0:vf.cesiumElement},[t,d==null?void 0:d.id,af,Gd]),gd=React.useRef([]),pd=React.useRef(kt);pd.current=kt;const[Zd]=React.useState(()=>new Map);React.useEffect(()=>{!L.current||!Gd||!uf||Object.assign(L.current,{onSelectFeature:vf=>{const Ff=getTag(vf);Ff!=null&&Ff.featureId&&(gd.current.push(Ff.featureId),Zd.set(Ff.featureId,vf.color)),pd.current&&(vf.color=toColor(pd.current)??vf.color)},onUnselectFeature:vf=>{const Ff=getTag(vf);Ff!=null&&Ff.featureId&&(gd.current=gd.current.filter(Xf=>Xf!==Ff.featureId)),vf.color=Zd.get((Ff==null?void 0:Ff.featureId)??"")??DEFAULT_FEATURE_COLOR}})},[Zd,af,Gd,uf]),useFeature({id:t,tileset:L,layer:d,idProperty:Ru,viewer:P,evalFeature:p,onComputedFeatureFetch:y,featureIndex:af,selectedFeatureIdsRef:gd,shouldUseFeatureIndex:Gd,isTilesetReady:uf});const[cf,sf]=React.useState(0),nf=React.useRef(!1),df=React.useCallback(vf=>{nf.current||!P||ms||(nf.current=!0,sampleTerrainHeightFromCartesian(P.scene,vf).then(Ff=>{sf(Ff??0),nf.current=!1}))},[ms,P]);React.useEffect(()=>{if(mt!=null&&mt.draw)return;const vf=La||(fa?[fa.lng,fa.lat,fa.height??0]:void 0),Ff=Cesium$1.Cartesian3.fromDegrees((vf==null?void 0:vf[0])||0,(vf==null?void 0:vf[1])||0,(vf==null?void 0:vf[2])||0);(async()=>{if(!L.current||!uf)return;const Wf=L.current.clippingPlanesOriginMatrix.clone(),Qf=new Cesium$1.Cartesian3(_i||100,Sa||100,zi||100);if(!ms){const qf=new Cesium$1.TranslationRotationScale(Ff,void 0,Qf);translationWithClamping(qf,!!ms,cf),Ff.x=qf.translation.x,Ff.y=qf.translation.y,Ff.z=qf.translation.z}const _m=Ra&&yt&&ma?new Cesium$1.HeadingPitchRoll(Ra,yt,ma):void 0,Bf=Cesium$1.Matrix4.multiply(_m?Cesium$1.Matrix4.fromRotationTranslation(Cesium$1.Matrix3.fromHeadingPitchRoll(_m),Ff):Cesium$1.Transforms.eastNorthUpToFixedFrame(Ff),Cesium$1.Matrix4.fromScale(Qf,new Cesium$1.Matrix4),new Cesium$1.Matrix4),$m=Cesium$1.Matrix4.inverse(Wf,new Cesium$1.Matrix4);Cesium$1.Matrix4.multiply($m,Bf,gf.modelMatrix)})(),ms||df(Ff)},[_i,Sa,zi,Ra,yt,ma,fa,La,gf.modelMatrix,df,ms,cf,mt==null?void 0:mt.draw,uf]),React.useEffect(()=>{mt!=null&&mt.draw||(gf.enabled=pi)},[gf,pi,mt==null?void 0:mt.draw]),React.useEffect(()=>{mt!=null&&mt.draw||(gf.unionClippingRegions=ba==="outside")},[gf,ba,mt==null?void 0:mt.draw]),React.useEffect(()=>{mt!=null&&mt.draw||(gf.removeAll(),hf==null||hf.forEach(vf=>{var Ff,Xf,Wf;return gf.add(new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Ff=vf.normal)==null?void 0:Ff.x,(Xf=vf.normal)==null?void 0:Xf.y,(Wf=vf.normal)==null?void 0:Wf.z),(vf.distance||0)*of))}))},[hf,gf,of,mt==null?void 0:mt.draw]),React.useEffect(()=>{if(!nt){Nl(void 0);return}(async()=>{const vf=await fetch(nt);vf.ok&&Nl(new Cesium$1.Cesium3DTileStyle(await vf.json()))})()},[nt]);const Cf=React.useMemo(()=>yu!=="google-photorealistic"||!o?null:(async()=>{try{return Vd?(await Cesium$1.createGooglePhotorealistic3DTileset(Vd)).resource:Cesium$1.IonResource.fromAssetId(2275207,{accessToken:h==null?void 0:h.cesiumIonAccessToken})}catch(Ff){throw console.error(`Error loading Photorealistic 3D Tiles tileset: ${Ff}`),Ff}})(),[yu,o,Vd,h==null?void 0:h.cesiumIonAccessToken]),mf=React.useMemo(()=>yu==="osm-buildings"&&o?Cesium$1.IonResource.fromAssetId(96188,{accessToken:h==null?void 0:h.cesiumIonAccessToken}):Cf&&o?Cf:yu==="3dtiles"&&o?pu??W:null,[yu,o,h==null?void 0:h.cesiumIonAccessToken,Cf,pu,W]),Sf=React.useMemo(()=>{var Qf,_m,Bf,$m,qf,qm,ep,Tf,rf,bf;if(!(s!=null&&s.specularEnvironmentMaps)&&!(s!=null&&s.sphericalHarmonicCoefficients)&&!((_m=(Qf=c==null?void 0:c.scene)==null?void 0:Qf.imageBasedLighting)!=null&&_m.specularEnvironmentMaps)&&!(($m=(Bf=c==null?void 0:c.scene)==null?void 0:Bf.imageBasedLighting)!=null&&$m.sphericalHarmonicCoefficients))return;const vf=new Cesium$1.ImageBasedLighting,Ff=(s==null?void 0:s.specularEnvironmentMaps)??((qm=(qf=c==null?void 0:c.scene)==null?void 0:qf.imageBasedLighting)==null?void 0:qm.specularEnvironmentMaps),Xf=(s==null?void 0:s.imageBasedLightIntensity)??((Tf=(ep=c==null?void 0:c.scene)==null?void 0:ep.imageBasedLighting)==null?void 0:Tf.intensity),Wf=arrayToCartecian3((s==null?void 0:s.sphericalHarmonicCoefficients)??((bf=(rf=c==null?void 0:c.scene)==null?void 0:rf.imageBasedLighting)==null?void 0:bf.sphericalHarmonicCoefficients),Xf);return Ff&&(vf.specularEnvironmentMaps=Ff),Wf&&(vf.sphericalHarmonicCoefficients=Wf),vf},[s==null?void 0:s.specularEnvironmentMaps,s==null?void 0:s.sphericalHarmonicCoefficients,s==null?void 0:s.imageBasedLightIntensity,(Hf=(Af=c==null?void 0:c.scene)==null?void 0:Af.imageBasedLighting)==null?void 0:Hf.specularEnvironmentMaps,(wf=(_f=c==null?void 0:c.scene)==null?void 0:_f.imageBasedLighting)==null?void 0:wf.sphericalHarmonicCoefficients,(Nf=(Yf=c==null?void 0:c.scene)==null?void 0:Yf.imageBasedLighting)==null?void 0:Nf.intensity]),Pf=React.useCallback(vf=>{ff(!0),S==null||S({properties:vf.properties}),F==null||F({layerId:z.current})},[S,F]);return React.useEffect(()=>(N==null||N(),()=>{N==null||N()}),[yu,N]),{tilesetUrl:mf,ref:Xd,style:Xs,clippingPlanes:gf,drawClippingEnabled:xf,drawClippingEdgeProps:Wa,builtinBoxProps:Sc,imageBasedLighting:Sf,handleReady:Pf}};function Tileset({id:t,isVisible:n,property:o,layer:s,feature:c,viewerProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:S,...P}){const{shadows:L,colorBlendMode:F,pbr:N,showWireframe:z,showBoundingVolume:W,cacheBytes:nt}=o??{},Pe=`${s==null?void 0:s.id}_box`,{tilesetUrl:se,ref:mt,style:kt,clippingPlanes:mn,drawClippingEnabled:_i,drawClippingEdgeProps:zi,builtinBoxProps:Sa,imageBasedLighting:fa,handleReady:La}=useHooks$2({id:t,boxId:Pe,isVisible:n,layer:s,feature:c,property:o,viewerProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:S}),Ra=React.useMemo(()=>{var yt,lt;return{...((yt=s==null?void 0:s.layer)==null?void 0:yt.type)==="simple"?(lt=s==null?void 0:s.layer)==null?void 0:lt.box:{},...(Sa==null?void 0:Sa.property)||{}}},[s==null?void 0:s.layer,Sa==null?void 0:Sa.property]),ma=React.useMemo(()=>({...s,id:Pe}),[s,Pe]);return!n||!se?null:jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(Ds$1,{ref:mt,url:se,customShader:N===!1?NonPBRLightingShader:N==="withTexture"?NonPBRWithTextureLightingShader:void 0,cacheBytes:nt,style:kt,shadows:shadowMode(L),clippingPlanes:mn,colorBlendMode:colorBlendModeFor3DTile(F),imageBasedLighting:fa,onReady:La,debugWireframe:z,debugShowBoundingVolume:W}),Sa&&jsxRuntimeExports.jsx(Box,{...P,id:Pe,viewerProperty:d,property:Ra,geometry:Sa.geometry,feature:c,layer:ma,isVisible:Sa.visible,evalFeature:p,onLayerEdit:Sa.handleLayerEdit}),_i&&jsxRuntimeExports.jsx(DrawClippingPolygon,{...zi})]})}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 z,W,nt;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];(((z=t.features)==null?void 0:z.length)>FEATURE_DELEGATE_THRESHOLD||(W=c==null?void 0:c.geojson)!=null&&W.useAsResource)&&(h=["resource"]);const p=Array.isArray(h)&&h.every(Pe=>components[Pe][1].noFeature&&!components[Pe][1].noLayer),y=!!((nt=t==null?void 0:t.transition)!=null&&nt.useTransition),S=!(c!=null&&c.updateInterval)&&!y,P=React.useMemo(()=>c!=null&&c.url?generateIDWithMD5(c.url):"",[c==null?void 0:c.url]),{requestRender:L}=useContext();React.useEffect(()=>{setTimeout(()=>{L==null||L()},300)}),React.useEffect(()=>()=>L==null?void 0:L(),[L]);const F=(Pe,se)=>{var zi,Sa,fa,La,Ra,ma,yt;if(!isRenderableAppearance(Pe))return null;const mt=!!((fa=(Sa=(zi=s.viewerProperty)==null?void 0:zi.scene)==null?void 0:Sa.imageBasedLighting)!=null&&fa.sphericalHarmonicCoefficients),kt=!!((ma=(Ra=(La=s.viewerProperty)==null?void 0:La.scene)==null?void 0:Ra.imageBasedLighting)!=null&&ma.specularEnvironmentMaps),mn=t.layer.visible!==!1&&!n&&!((o==null?void 0:o.layerId)===t.id&&((yt=o==null?void 0:o.feature)==null?void 0:yt.id)===(se==null?void 0:se.id)),_i=P+generateIDWithMD5(`${t.id}_${(se==null?void 0:se.id)??""}_${Pe}_${mn}_${mt}_${kt}_${JSON.stringify(se==null?void 0:se[Pe])??""}_${JSON.stringify(t.transition)??""}_${JSON.stringify(se==null?void 0:se.geometry)??""}`);if(S){const lt=CACHED_COMPONENTS.get(_i);if(S&&lt)return lt}try{const[lt,pi]=components[Pe]??[];if(!lt||se&&!se[Pe]||pi.noLayer&&!se||pi.noFeature&&se||Array.isArray(h)&&!h.includes(Pe)||!Array.isArray(h)&&h!=="auto"||(c==null?void 0:c.type)==="geojson"&&h==="auto"&&Pe==="resource")return null;const ba=React.createElement(lt,{...s,key:y?void 0:_i,id:y?(se==null?void 0:se.id)??t.id:_i,property:se?se[Pe]:t[Pe]||pickProperty(Pe,t),geometry:se==null?void 0:se.geometry,feature:se,layer:t,isVisible:mn});return S&&CACHED_COMPONENTS.set(_i,ba),ba}catch(lt){return console.error(`Error rendering component ${_i}`,lt),null}},N=React.useMemo(()=>!p||!h||!Array.isArray(h)?null:jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:h.map(Pe=>{var fa,La,Ra,ma,yt,lt,pi,ba,Sc,ms,Xs,Nl;const[se]=components[Pe]??[],mt=t.layer.visible!==!1&&!n,kt=!!((Ra=(La=(fa=s.viewerProperty)==null?void 0:fa.scene)==null?void 0:La.imageBasedLighting)!=null&&Ra.sphericalHarmonicCoefficients),mn=!!((lt=(yt=(ma=s.viewerProperty)==null?void 0:ma.scene)==null?void 0:yt.imageBasedLighting)!=null&&lt.specularEnvironmentMaps),_i=((pi=t==null?void 0:t.layer)==null?void 0:pi.type)==="simple"&&!!((Sc=(ba=t==null?void 0:t.layer)==null?void 0:ba["3dtiles"])!=null&&Sc.sphericalHarmonicCoefficients),zi=((ms=t==null?void 0:t.layer)==null?void 0:ms.type)==="simple"&&!!((Nl=(Xs=t==null?void 0:t.layer)==null?void 0:Xs["3dtiles"])!=null&&Nl.specularEnvironmentMaps),Sa=P+generateIDWithMD5(`${(t==null?void 0:t.id)||""}_${Pe}_${mt}_${kt}_${mn}_${_i}}_${zi}`);return React.createElement(se,{...s,key:Sa,id:`${t.id}_${Pe}`,property:pickProperty(Pe,t)||t[Pe],layer:t,isVisible:mt})})}),[p,h,t,n,P,s]);return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:N||[void 0,...t.features].flatMap(Pe=>Object.keys(components).map(se=>F(se,Pe)))})}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 P,L;const S=(P=t.current)==null?void 0:P.cesiumElement;if(!(!S||S.isDestroyed()||!(o!=null&&o.enabled)||!((L=o.targetArea)!=null&&L.lng)||!o.targetArea.lat))return getGeodesic(S,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 S=typeof(o==null?void 0:o.targetWidth)=="number"?o.targetWidth:targetWidth,P=typeof(o==null?void 0:o.targetLength)=="number"?o.targetLength:targetLength,{cartesianArray:L,cartographicDimensions:F}=calcBoundaryBox(s,P/2,S/2);return{cartographicDimensions:F,cartesianArray:L}},[o==null?void 0:o.targetWidth,o==null?void 0:o.targetLength,s]),[d,h]=React.useState();return React.useEffect(()=>{var Pe;const S=(Pe=t.current)==null?void 0:Pe.cesiumElement;if(!S||S.isDestroyed()||!(o!=null&&o.targetArea)||!s)return;const P=new Cesium$1.Camera(S.scene);P.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:P.up}});const L=P.computeViewRectangle();if(!L)return;const F=Cesium$1.Rectangle.computeWidth(L)*Cesium$1.Math.PI*1e6,N=Cesium$1.Rectangle.computeHeight(L)*Cesium$1.Math.PI*1e6,{targetWidth:z=targetWidth,targetLength:W=targetLength}=o??{},{cartesianArray:nt}=calcBoundaryBox(s,W/2+N,z/2+F);h(nt)},[t,o,s]),React.useEffect(()=>{var L,F;const S=(L=t==null?void 0:t.current)==null?void 0:L.cesiumElement,P=getCamera((F=t==null?void 0:t.current)==null?void 0:F.cesiumElement);!S||S.isDestroyed()||!P||!(o!=null&&o.enabled)||!c||S.camera.setView({destination:getAllowedCameraDestination(P,c),orientation:{heading:S.camera.heading,pitch:S.camera.pitch,roll:S.camera.roll,up:S.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),S=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(y),s),P=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(p),s);return{vertical:S,horizontal:P}},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),S=new Cesium$1.Cartographic(d.longitude,c.latitude,0),P=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(P),Cesium$1.Cartographic.toCartesian(S),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 se,mt,kt;const p=React.useRef([]),y=React.useCallback(()=>{var zi;const mn=(zi=t==null?void 0:t.current)==null?void 0:zi.cesiumElement;if(!mn||mn.isDestroyed()||!h)return;const _i=getCamera(mn);_i&&!isEqual(_i,o)&&(p.current.push(_i),p.current.length>10&&p.current.shift(),h==null||h(_i))},[t,o,h]),S=React.useCallback(()=>{y()},[y]),P=React.useCallback(()=>{y()},[y]);React.useEffect(()=>{o&&!p.current.includes(o)&&(c.flyTo(o,{duration:0}),p.current=[])},[o,c]),React.useEffect(()=>{var fa;if(!((fa=t.current)!=null&&fa.cesiumElement))return;const mn=!!(s&FEATURE_FLAGS.CAMERA_MOVE),_i=!!(s&FEATURE_FLAGS.CAMERA_ZOOM),zi=!!(s&FEATURE_FLAGS.CAMERA_TILT),Sa=!!(s&FEATURE_FLAGS.CAMERA_LOOK);t.current.cesiumElement.scene.screenSpaceCameraController.enableTranslate=mn,t.current.cesiumElement.scene.screenSpaceCameraController.enableRotate=mn,t.current.cesiumElement.scene.screenSpaceCameraController.enableLook=Sa,t.current.cesiumElement.scene.screenSpaceCameraController.enableTilt=zi,t.current.cesiumElement.scene.screenSpaceCameraController.enableZoom=_i},[t,s]);const L=React.useRef(!1),F=useCustomCompareCallback(()=>{var mn,_i,zi,Sa,fa,La;L.current||(L.current=!0,(_i=(mn=n==null?void 0:n.camera)==null?void 0:mn.limiter)!=null&&_i.enabled&&((Sa=(zi=n==null?void 0:n.camera)==null?void 0:zi.limiter)!=null&&Sa.targetArea)?c.flyTo((La=(fa=n==null?void 0:n.camera)==null?void 0:fa.limiter)==null?void 0:La.targetArea,{duration:0}):o&&c.flyTo(o,{duration:0}))},[c,(mt=(se=n==null?void 0:n.camera)==null?void 0:se.limiter)==null?void 0:mt.enabled],(mn,_i)=>mn[0]===_i[0]&&mn[1]===_i[1]),N=React.useCallback(()=>{L.current=!1},[]),{cameraViewBoundaries:z,cameraViewOuterBoundaries:W,cameraViewBoundariesMaterial:nt}=useCameraLimiter(t,o,(kt=n==null?void 0:n.camera)==null?void 0:kt.limiter),Pe=React.useCallback(mn=>{!mn.camera||!d||Math.abs(Cesium$1.Math.negativePiToPi(mn.camera.roll))>Math.PI/86400&&mn.camera.setView({orientation:{heading:mn.camera.heading,pitch:mn.camera.pitch,roll:0}})},[d]);return React.useEffect(()=>{var _i;const mn=(_i=t.current)==null?void 0:_i.cesiumElement;if(mn)return mn.scene.preRender.addEventListener(Pe)},[t,Pe]),{cameraViewBoundaries:z,cameraViewOuterBoundaries:W,cameraViewBoundariesMaterial:nt,mountCamera:F,unmountCamera:N,handleCameraChange:S,handleCameraMoveEnd:P}},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),S=h.aspectRatio*y,P=n.x,L=n.y,F=2*(P-c.x)/c.width-1,N=2*(c.height-L-c.y)/c.height-1,z=F*p*S,W=N*p*y,nt=h.getPixelDimensions(c.width,c.height,p,getPixelRatio(t),pixelSizeScratch),Pe=nt.x*o/2,se=nt.y*s/2,mt=pickingFrustumScratch;return mt.top=W+se,mt.bottom=W-se,mt.right=z+Pe,mt.left=z-Pe,mt.near=p,mt.far=h.far,mt.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),S=getPixelRatio(t),P=o*S,L=s*S,F=t.frameState;F.cullingVolume=getPickCullingVolume(t,y,P,L,p),F.invertClassification=!1,F.passes.pick=!0,F.tilesetPassState=pickTilesetPassState,d.uniformState.update(F),t.updateEnvironment(),rectangleScratch.x=y.x-P/2,rectangleScratch.y=t.drawingBufferHeight-y.y-L/2,rectangleScratch.height=L,rectangleScratch.width=P;const N=getIntersection(rectangleScratch,h.viewport,rectangleScratch);invariant$1(N!=null);const z=h.pickFramebuffer.begin(N,h.viewport);t.updateAndExecuteCommands(z,zeroColor),t.resolveFramebuffers(z);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,S]=convertObjToComputedFeature(t.clock.currentTime,p)??[],P=S?{...S,layerId:y}:void 0;!P||c&&!c(P)||h.push(P)}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$1([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$1(t.map(L=>{const F=Cartographic.fromCartesian(L,n,cartographicScratch);return[CesiumMath.toDegrees(F.longitude),CesiumMath.toDegrees(F.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(P=>{const L=Cartographic.fromCartesian(P,n,cartographicScratch);return[CesiumMath.toDegrees(L.longitude),CesiumMath.toDegrees(L.latitude)]})]).geometry}catch(o){console.error(o)}}function createPolyline(t,n){if(!(t.length<2))try{return lineString$1(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$1(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 P;const S=(P=n.current)==null?void 0:P.cesiumElement;if(!(!S||S.isDestroyed()))return getLocationFromScreen(S.scene,h,p,y)},getCameraFovInfo:({withTerrain:h,calcViewSize:p})=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))try{let P,L,F;return h&&(L=getCameraTerrainIntersection(y.scene),L&&(P=cartesianToLatLngHeight(L,y.scene))),P||(L=new Cesium__namespace.Cartesian3,getCameraEllipsoidIntersection(y.scene,L),P=cartesianToLatLngHeight(L,y.scene)),p&&L&&y.scene.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(F=Cesium__namespace.Cartesian3.distance(y.scene.camera.positionWC,L)*Math.tan(y.scene.camera.frustum.fov/2)),{center:P,viewSize:F}}catch{return}},sampleTerrainHeight:async(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))return await sampleTerrainHeight(y.scene,h,p)},computeGlobeHeight:(h,p,y)=>{var P;const S=(P=n.current)==null?void 0:P.cesiumElement;if(!(!S||S.isDestroyed()))return S.scene.globe.getHeight(Cesium__namespace.Cartographic.fromDegrees(h,p,y))},getGlobeHeight:()=>{var S;const h=(S=n.current)==null?void 0:S.cesiumElement;if(!h||h.isDestroyed())return;const p=h.scene,{globeHeight:y}=p;if(!(!p||y==null))return y},toXYZ:(h,p,y,S)=>{var F;const P=(F=n.current)==null?void 0:F.cesiumElement;if(!P||P.isDestroyed())return;const L=Cesium__namespace.Cartesian3.fromDegrees(h,p,y,S!=null&&S.useGlobeEllipsoid?P.scene.globe.ellipsoid:void 0);return[L.x,L.y,L.z]},toLngLatHeight:(h,p,y,S)=>{var F;const P=(F=n.current)==null?void 0:F.cesiumElement;if(!P||P.isDestroyed())return;const L=Cesium__namespace.Cartographic.fromCartesian(Cesium__namespace.Cartesian3.fromElements(h,p,y),S!=null&&S.useGlobeEllipsoid?P.scene.globe.ellipsoid:void 0);return[Cesium$1.Math.toDegrees(L.longitude),Cesium$1.Math.toDegrees(L.latitude),L.height]},toWindowPosition:h=>{var S;const p=(S=n.current)==null?void 0:S.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 fa;const y=(fa=n.current)==null?void 0:fa.cesiumElement;if(!y||y.isDestroyed())return;const S=Cesium__namespace.Cartesian3.fromElements(...h),P=new Cesium__namespace.Cartesian3,L=new Cesium__namespace.Cartographic,F=new Cesium__namespace.Cartesian3,N=new Cesium__namespace.Ellipsoid,z=new Cesium__namespace.Ray,W=new Cesium__namespace.Cartesian3,nt=y.scene,Pe=nt.globe.ellipsoid;let se;try{se=Cesium__namespace.Cartographic.fromCartesian(S,Pe,L)}catch{return}F.x=Pe.radii.x+se.height,F.y=Pe.radii.y+se.height,F.z=Pe.radii.z+se.height;const mt=Cesium__namespace.Ellipsoid.fromCartesian3(F,N),kt=new Cesium__namespace.Cartesian2;try{[kt.x,kt.y]=d.toWindowPosition(h)??[0,0]}catch{return}kt.x+=p[0],kt.y+=p[1];const mn=nt.camera.getPickRay(kt,z);if(mn==null)return;const _i=Cesium__namespace.IntersectionTests.rayEllipsoid(mn,mt);if(_i==null)return;const zi=Cesium__namespace.Ray.getPoint(mn,_i.start,W),Sa=Cesium__namespace.Cartesian3.subtract(zi,S,P);return[Sa.x,Sa.y,Sa.z]},isPositionVisible:h=>{var S;const p=(S=n.current)==null?void 0:S.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 S;const p=(S=n.current)==null?void 0:S.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 P=Cesium__namespace.Cartesian3.fromDegrees(h.lng,h.lat,h.height);y.camera.position.x=P.x,y.camera.position.y=P.y,y.camera.position.z=P.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,y)=>{var P;const S=(P=n.current)==null?void 0:P.cesiumElement;if(!(!S||S.isDestroyed()))return getExtrudedHeight(S.scene,new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian2(p[0],p[1]),y)},getExtrudedPoint:(h,p)=>{var N,z;if(!h||!p)return;const y=(N=n.current)==null?void 0:N.cesiumElement;if(!y||y.isDestroyed())return;const S=new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),P=new Cesium__namespace.Cartesian3,L=(z=y.scene)==null?void 0:z.globe.ellipsoid.geodeticSurfaceNormal(S,P);if(!L)return;const F=Cesium__namespace.Cartesian3.add(S,Cesium__namespace.Cartesian3.multiplyByScalar(L,p,P),P);return[F.x,F.y,F.z]},getSurfaceDistance:(h,p)=>{var L;const y=(L=n.current)==null?void 0:L.cesiumElement;if(!y||y.isDestroyed())return;const S=y.scene,P=new Cesium__namespace.EllipsoidGeodesic(void 0,void 0,S.globe.ellipsoid);return P.setEndPoints(Cesium__namespace.Cartographic.fromCartesian(h,S.globe.ellipsoid,new Cesium__namespace.Cartographic),Cesium__namespace.Cartographic.fromCartesian(p,S.globe.ellipsoid,new Cesium__namespace.Cartographic)),P.surfaceDistance},equalsEpsilon2d:(h,p,y=0,S=0)=>Cesium__namespace.Cartesian2.equalsEpsilon(new Cesium__namespace.Cartesian2(h[0],h[1]),new Cesium__namespace.Cartesian2(p[0],p[1]),y,S),equalsEpsilon3d:(h,p,y=0,S=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,S),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,S,P,L,F;if(h&&typeof h=="object"){const N=(y=n.current)==null?void 0:y.cesiumElement;if(!N||N.isDestroyed())return;(S=o.current)==null||S.call(o),o.current=flyTo((P=N.scene)==null?void 0:P.camera,{...getCamera(N),...h},p)}if(h&&typeof h=="string"){const N=(L=n.current)==null?void 0:L.cesiumElement;if(!N||N.isDestroyed())return;const z=h,W=findEntity(N,z,z,!0),nt=getTag(W);if(W instanceof Cesium__namespace.Primitive){N.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(W.modelMatrix));return}if(W instanceof Cesium__namespace.GroundPrimitive){N.scene.camera.flyToBoundingSphere(nt==null?void 0:nt.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))N.flyTo(W,p);else{for(const mt of[N.dataSourceDisplay.dataSources,N.dataSources])for(let kt=0;kt<mt.length;kt++){const mn=mt.get(kt);if(mn.entities.values.find(Sa=>{var fa;return((fa=getTag(Sa))==null?void 0:fa.layerId)===z})){N.flyTo(mn,p);return}}const Pe=[];for(const mt of N.entities.values)((F=getTag(mt))==null?void 0:F.layerId)===z&&Pe.push(mt);if(Pe.length){N.flyTo(Pe,p);return}const se=findEntity(N,z);if(se instanceof Cesium__namespace.Primitive){N.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(se.modelMatrix));return}se&&!(se instanceof Cesium__namespace.Cesium3DTileFeature||se instanceof Cesium__namespace.Cesium3DTilePointFeature||se instanceof Cesium__namespace.Model||se instanceof Cesium__namespace.Primitive||se instanceof Cesium__namespace.GroundPrimitive)&&N.flyTo(se,p)}}},flyToBBox:(h,p)=>{var L,F;const y=(L=n.current)==null?void 0:L.cesiumElement;if(!y||y.isDestroyed())return;(F=o.current)==null||F.call(o);const S=Cesium__namespace.BoundingSphere.fromRectangle3D(Cesium__namespace.Rectangle.fromDegrees(...h)),P=y.scene.camera;y.camera.flyToBoundingSphere(S,{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):P.pitch,range:(p==null?void 0:p.range)??0},duration:p==null?void 0:p.duration}),o.current=()=>{P==null||P.cancelFlight()}},rotateOnCenter:h=>{var P;const p=(P=n.current)==null?void 0:P.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,S=getCameraEllipsoidIntersection(y,new Cesium__namespace.Cartesian3);S&&y.camera.rotate(S,h)},overrideScreenSpaceController:h=>{var P,L;const p=(P=n.current)==null?void 0:P.cesiumElement;if(!p||p.isDestroyed())return;const y=(L=p.scene)==null?void 0:L.screenSpaceCameraController,S=getOverriddenScreenSpaceCameraOptions(h);Object.assign(y,S)},lookAt:(h,p)=>{var S,P,L;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed())){if(p!=null&&p.withoutAnimation)return lookAtWithoutAnimation(y.scene,{...getCamera(y),...h});(P=o.current)==null||P.call(o),o.current=lookAt((L=y.scene)==null?void 0:L.camera,{...getCamera(y),...h},p)}},lookAtLayer:h=>{var z,W;const p=(z=n.current)==null?void 0:z.cesiumElement;if(!p||p.isDestroyed())return;const y=p.entities.getById(h);if(!y)return;const S=(W=y.position)==null?void 0:W.getValue(p.clock.currentTime);if(!S)return;const P=p.camera.positionWC,L=Cesium__namespace.Cartesian3.distance(S,P);if(Math.round(L*1e3)/1e3===5e3)return;const F=getCamera(p),N=new Cesium__namespace.HeadingPitchRange((F==null?void 0:F.heading)??0,(F==null?void 0:F.pitch)??-90,5e3);p.zoomTo(y,N)},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 S;const y=(S=n.current)==null?void 0:S.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:1/h},p)},zoomOut:(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:h},p)},orbit:h=>{var nt;const p=(nt=n.current)==null?void 0:nt.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,S=y.camera,P=.02,L=h+Cesium$1.Math.PI_OVER_TWO,F=Math.cos(L)*P,N=Math.sin(L)*P,z=Cesium__namespace.Matrix4.clone(S.transform),W=getCenterCamera({camera:S,scene:y});if(W||S.positionWC){const Pe=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(W||S.positionWC,y.globe.ellipsoid);S.lookAtTransform(Pe)}p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?S.move(new Cesium__namespace.Cartesian3(F,N,0),Math.max(y.canvas.clientWidth,y.canvas.clientHeight)/100*S.positionCartographic.height*P):W?(S.rotateLeft(F),S.rotateUp(N)):(S.look(Cesium__namespace.Cartesian3.UNIT_Z,F),S.look(S.right,N)),S.lookAtTransform(z)},rotateRight:h=>{var F;const p=(F=n.current)==null?void 0:F.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,S=y.camera,P=Cesium__namespace.Matrix4.clone(S.transform),L=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(S.positionWC,y.globe.ellipsoid);p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?(S.twistRight(h- -S.heading),S.twistLeft(h- -S.heading)):(S.lookAtTransform(L),S.rotateRight(h- -S.heading),S.lookAtTransform(P))},changeSceneMode:(h,p=2)=>{var S,P,L,F;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()||!y.scene))switch(h){case"2d":(P=y==null?void 0:y.scene)==null||P.morphTo2D(p);break;case"columbus":(L=y==null?void 0:y.scene)==null||L.morphToColumbusView(p);break;case"3d":default:(F=y==null?void 0:y.scene)==null||F.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 S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))return y.scene.requestRender(),y.render(),y.canvas.toDataURL(h,p)},enableScreenSpaceCameraController:(h=!0)=>{var S;const p=(S=n.current)==null?void 0:S.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 P;const S=(P=n.current)==null?void 0:P.cesiumElement;!S||S.isDestroyed()||flyToGround(S,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 L;const y=(L=n.current)==null?void 0:L.cesiumElement;if(!y||y.isDestroyed())return;const S=findEntity(y,h,p),P=getTag(S);if(P!=null&&P.featureId){if(S instanceof Cesium__namespace.Entity)return{type:"feature",id:P.featureId,properties:convertEntityProperties(y.clock.currentTime,S),metaData:{description:convertEntityDescription(y.clock.currentTime,S)}};if(S instanceof Cesium__namespace.Cesium3DTileFeature||S instanceof Cesium__namespace.Cesium3DTilePointFeature)return{type:"feature",id:P.featureId,properties:convertCesium3DTileFeatureProperties(S)}}},findFeaturesByIds:(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,P=>{var F;const L=(F=convertObjToComputedFeature(y.clock.currentTime,P))==null?void 0:F[1];return L?{...L,type:"feature"}:void 0})},findComputedFeatureById:(h,p)=>{var L;const y=(L=n.current)==null?void 0:L.cesiumElement;if(!y||y.isDestroyed())return;const S=findEntity(y,h,p),P=getTag(S);if(P!=null&&P.featureId){if(S instanceof Cesium__namespace.Entity)return P.computedFeature??{type:"computedFeature",id:P.featureId,geometry:getGeometryFromEntity(y.clock.currentTime,S),properties:convertEntityProperties(y.clock.currentTime,S),metaData:{description:convertEntityDescription(y.clock.currentTime,S)}};if(S instanceof Cesium__namespace.Cesium3DTileFeature||S instanceof Cesium__namespace.Cesium3DTilePointFeature)return P.computedFeature??{type:"computedFeature",id:P.featureId,properties:convertCesium3DTileFeatureProperties(S)}}},findComputedFeaturesByIds:(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,P=>{var L;return(L=convertObjToComputedFeature(y.clock.currentTime,P))==null?void 0:L[1]})},bringToFront:h=>{var S;const p=(S=n.current)==null?void 0:S.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"bringToFront"in y&&typeof y.bringToFront=="function"&&y.bringToFront()},sendToBack:h=>{var S;const p=(S=n.current)==null?void 0:S.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 S;const y=(S=n.current)==null?void 0:S.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(P,L)=>{L&&"onSelectFeature"in L&&typeof L.onSelectFeature=="function"&&L.onSelectFeature(P);const N={...getTag(P)??{},isFeatureSelected:!0};return attachTag(P,N),P})},unselectFeatures:(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(P,L)=>{L&&"onUnselectFeature"in L&&typeof L.onUnselectFeature=="function"&&L.onUnselectFeature(P);const F=getTag(P)??{};return F.isFeatureSelected=!1,attachTag(P,F),P})},pickManyFromViewport:(h,p,y,S)=>{var L;const P=(L=n.current)==null?void 0:L.cesiumElement;if(!(!P||P.isDestroyed()))return pickManyFromViewportAsFeature(P,new Cesium__namespace.Cartesian2(h[0],h[1]),p,y,S)},onTick:h=>{c.current.push(h)},removeTickEventListener:h=>{c.current=c.current.filter(p=>p!==h)||[]},tickEventCallback:c,calcRectangleControlPoint:(h,p,y)=>{const S=new Cesium__namespace.Cartesian3(...h),P=new Cesium__namespace.Cartesian3(...p),L=new Cesium__namespace.Cartesian3(...y),F=new Cesium__namespace.Cartesian3,N=new Cesium__namespace.Cartesian3,z=Cesium__namespace.Cartesian3.projectVector(Cesium__namespace.Cartesian3.subtract(L,S,F),Cesium__namespace.Cartesian3.subtract(P,S,N),F),W=Cesium__namespace.Cartesian3.subtract(L,Cesium__namespace.Cartesian3.add(S,z,F),N),nt=Cesium__namespace.Cartesian3.midpoint(S,P,F),Pe=Cesium__namespace.Cartesian3.add(nt,W,N),se=[Pe.x,Pe.y,Pe.z];return[h,p,se]},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 S;(S=h.current)==null||S.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,S;if(this._entity||this.viewer.isDestroyed())return;this._timeout=void 0,this._initialPosition=d.position,this._initialScreenPosition=s.position.clone();const P=(p=d.position)==null?void 0:p.getValue(this.viewer.clock.currentTime);if(P){const N=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(P).height;this._ellipsoid=CesiumDnD.enlargeEllipsoid(this.viewer.scene.globe.ellipsoid,N),this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW?this._initialHeight=N:this._initialHeight=void 0}const L=this._resetHeight(this._convertCartesian2ToPosition(s.position)),F=this._context(L,s.position);if(F&&((S=(y=this.options)==null?void 0:y.onDrag)==null?void 0:S.call(y,d,L,F))===!1){this._initialPosition=void 0,this._initialScreenPosition=void 0,this._ellipsoid=void 0;return}this._position=L,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,S)=>{var N,z;const P=(N=t.current)==null?void 0:N.cesiumElement;if(!P||P.isDestroyed()||!isSelectable(p)||!isDraggable(p))return!1;const L=convertCartesian3ToPosition((z=t.current)==null?void 0:z.cesiumElement,y);if(!L)return!1;const F=getTag(p);if(!F)return!1;o==null||o(F.layerId||"",F.featureId,L)},[t,o]),d=React.useCallback((p,y)=>{var F,N;const S=(F=t.current)==null?void 0:F.cesiumElement;if(!S||S.isDestroyed())return!1;const P=getTag(p),L=convertCartesian3ToPosition((N=t.current)==null?void 0:N.cesiumElement,y);return s==null||s((P==null?void 0:P.layerId)||"",(P==null?void 0:P.featureId)||"",L),!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 S;!p||p.isDestroyed()||(S=h.current)==null||S.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),S=React.useCallback((N,z)=>{var nt;if(p.current||y.current||o!==INTERACTION_MODES.selection||!((nt=t.current)!=null&&nt.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const W=makeMouseEventProps(t.current.cesiumElement,N)??{};h.current=[W.x??0,W.y??0],y.current=!0,p.current=!1,s==null||s({...W,pressedKey:z})},[s,t,o]),P=React.useCallback((N,z,W)=>{var _i;if(!y.current||!((_i=t.current)!=null&&_i.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const nt=makeMouseEventProps(t.current.cesiumElement,N)??{};let[Pe,se]=h.current,[mt,kt]=[nt.x??0,nt.y??0];if(mt-Pe===0&&kt-se===0)return nt;W||(p.current=!0),Pe>mt&&([mt,Pe]=[Pe,mt]),se>kt&&([kt,se]=[se,kt]);const mn={...nt,pressedKey:z,x:mt,y:kt,startX:Pe,startY:se,width:mt-Pe,height:kt-se};return c==null||c(mn),mn},[c,t]),L=React.useCallback((N,z)=>{var fa;if(!y.current||!((fa=t.current)!=null&&fa.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const W=P(N,z,!0),{startX:nt=0,startY:Pe=0,x:se=0,y:mt=0,width:kt=0,height:mn=0}=W??{},[_i,zi]=[nt+kt/2,Pe+mn/2],Sa=p.current?n.pickManyFromViewport([_i,zi],kt,mn):n.pickManyFromViewport([se,mt],1,1);d==null||d({...W,pressedKey:z,features:Sa??[],isClick:!p.current}),p.current=!1,y.current=!1},[d,t,n,P]);return React.useMemo(()=>Object.fromEntries(Object.entries({start:{handler:S,keys:["shift"]},move:{handler:P,keys:["shift"]},end:{handler:L,keys:["shift"]}}).map(([z,W])=>[z,{handler:W.handler,...Object.fromEntries(W.keys.map(nt=>[nt,Pe=>W.handler(Pe,nt)]))}])),[L,P,S])},GlobeFSDefinitions=`uniform vec3 u_reearth_sphericalHarmonicCoefficients[9];
6102
+ Original error:`,fa)}}function zi(fa,La,Ra){return n(this,void 0,void 0,function*(){let ma;try{ma=La(...Ra)}catch(lt){return mt(fa,lt)}const yt=z(ma)?"observable":"promise";if(mn(fa,yt),z(ma)){const lt=ma.subscribe(pi=>kt(fa,!1,c.serialize(pi)),pi=>{mt(fa,c.serialize(pi)),L.delete(fa)},()=>{kt(fa,!0),L.delete(fa)});L.set(fa,lt)}else try{const lt=yield ma;kt(fa,!0,c.serialize(lt))}catch(lt){mt(fa,c.serialize(lt))}})}function Sa(fa){if(!p.default.isWorkerRuntime())throw Error("expose() called in the master thread.");if(P)throw Error("expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.");if(P=!0,typeof fa=="function")p.default.subscribeToMasterMessages(La=>{N(La)&&!La.method&&zi(La.uid,fa,La.args.map(c.deserialize))}),Pe();else if(typeof fa=="object"&&fa){p.default.subscribeToMasterMessages(Ra=>{N(Ra)&&Ra.method&&zi(Ra.uid,fa[Ra.method],Ra.args.map(c.deserialize))});const La=Object.keys(fa).filter(Ra=>typeof fa[Ra]=="function");se(La)}else throw Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${fa}`);p.default.subscribeToMasterMessages(La=>{if(F(La)){const Ra=La.uid,ma=L.get(Ra);ma&&(ma.unsubscribe(),L.delete(Ra))}})}t.expose=Sa,typeof self<"u"&&typeof self.addEventListener=="function"&&p.default.isWorkerRuntime()&&(self.addEventListener("error",fa=>{setTimeout(()=>_i(fa.error||fa),250)}),self.addEventListener("unhandledrejection",fa=>{const La=fa.reason;La&&typeof La.message=="string"&&setTimeout(()=>_i(La),250)})),typeof process<"u"&&typeof process.on=="function"&&p.default.isWorkerRuntime()&&(process.on("uncaughtException",fa=>{setTimeout(()=>_i(fa),250)}),process.on("unhandledRejection",fa=>{fa&&typeof fa.message=="string"&&setTimeout(()=>_i(fa),250)}))}(rd),function(t){var n=rt&&rt.__createBinding||(Object.create?function(p,y,S,P){P===void 0&&(P=S),Object.defineProperty(p,P,{enumerable:!0,get:function(){return y[S]}})}:function(p,y,S,P){P===void 0&&(P=S),p[P]=y[S]}),o=rt&&rt.__exportStar||function(p,y){for(var S in p)S!=="default"&&!Object.prototype.hasOwnProperty.call(y,S)&&n(y,p,S)};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(Ac,t);var c=rd;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=Dt;Object.defineProperty(t,"Transfer",{enumerable:!0,get:function(){return h.Transfer}})}(Oc);const oe=K0(Oc);oe.registerSerializer;const Mm=oe.spawn;oe.BlobWorker,oe.DefaultSerializer;const km=oe.Pool;oe.Thread;const Hm=oe.Transfer;oe.Worker;const hd="dmFyIHcwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgSTA9KFgsWSxydCk9PlkgaW4gWD93MChYLFkse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnJ0fSk6WFtZXT1ydDt2YXIgQz0oWCxZLHJ0KT0+KEkwKFgsdHlwZW9mIFkhPSJzeW1ib2wiP1krIiI6WSxydCkscnQpLHVyPShYLFkscnQpPT57aWYoIVkuaGFzKFgpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrcnQpfTt2YXIgYz0oWCxZLHJ0KT0+KHVyKFgsWSwicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxydD9ydC5jYWxsKFgpOlkuZ2V0KFgpKSxVPShYLFkscnQpPT57aWYoWS5oYXMoWCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7WSBpbnN0YW5jZW9mIFdlYWtTZXQ/WS5hZGQoWCk6WS5zZXQoWCxydCl9LHY9KFgsWSxydCxFZSk9Pih1cihYLFksIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxFZT9FZS5jYWxsKFgscnQpOlkuc2V0KFgscnQpLHJ0KSxBbj0oWCxZLHJ0LEVlKT0+KHtzZXQgXyh3dCl7dihYLFksd3QscnQpfSxnZXQgXygpe3JldHVybiBjKFgsWSxFZSl9fSksdz0oWCxZLHJ0KT0+KHVyKFgsWSwiYWNjZXNzIHByaXZhdGUgbWV0aG9kIikscnQpOyhmdW5jdGlvbigpe3ZhciBraSxGZSxJdCxSdCxOdCxNdCxJZSx1dCxDdCxhdCx0dCxMLF90LHh0LEV0LGh0LHZ0LGZ0LER0LEx0LE90LFB0LHRlLHB0LCRlLGNyLGhlLGt0LFZlLGJ0LF9uLHFpLGZlLE5lLFdlLCR0LGVlLFZ0LG5lLHplLGhyLEYwLE1lLFRuLENlLFJuLEssZXQsWGUsZnIsbGUsa2U7InVzZSBzdHJpY3QiO3ZhciBYPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6e307ZnVuY3Rpb24gWSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBydD17fSxFZT10PT50P3R5cGVvZiBTeW1ib2wub2JzZXJ2YWJsZT09InN5bWJvbCImJnR5cGVvZiB0W1N5bWJvbC5vYnNlcnZhYmxlXT09ImZ1bmN0aW9uIj90PT09dFtTeW1ib2wub2JzZXJ2YWJsZV0oKTp0eXBlb2YgdFsiQEBvYnNlcnZhYmxlIl09PSJmdW5jdGlvbiI/dD09PXRbIkBAb2JzZXJ2YWJsZSJdKCk6ITE6ITEsd3Q9e30sX2U9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KF9lLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxfZS5EZWZhdWx0U2VyaWFsaXplcj1fZS5leHRlbmRTZXJpYWxpemVyPXZvaWQgMDtmdW5jdGlvbiBZaSh0LGUpe2NvbnN0IG49dC5kZXNlcmlhbGl6ZS5iaW5kKHQpLHI9dC5zZXJpYWxpemUuYmluZCh0KTtyZXR1cm57ZGVzZXJpYWxpemUoaSl7cmV0dXJuIGUuZGVzZXJpYWxpemUoaSxuKX0sc2VyaWFsaXplKGkpe3JldHVybiBlLnNlcmlhbGl6ZShpLHIpfX19X2UuZXh0ZW5kU2VyaWFsaXplcj1ZaTtjb25zdCBscj17ZGVzZXJpYWxpemUodCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IodC5tZXNzYWdlKSx7bmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFja30pfSxzZXJpYWxpemUodCl7cmV0dXJue19fZXJyb3JfbWFya2VyOiIkJGVycm9yIixtZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrfX19LEtpPXQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIl9fZXJyb3JfbWFya2VyImluIHQmJnQuX19lcnJvcl9tYXJrZXI9PT0iJCRlcnJvciI7X2UuRGVmYXVsdFNlcmlhbGl6ZXI9e2Rlc2VyaWFsaXplKHQpe3JldHVybiBLaSh0KT9sci5kZXNlcmlhbGl6ZSh0KTp0fSxzZXJpYWxpemUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcj9sci5zZXJpYWxpemUodCk6dH19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksd3Quc2VyaWFsaXplPXd0LmRlc2VyaWFsaXplPXd0LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3QgZHI9X2U7bGV0IHFlPWRyLkRlZmF1bHRTZXJpYWxpemVyO2Z1bmN0aW9uIFppKHQpe3FlPWRyLmV4dGVuZFNlcmlhbGl6ZXIocWUsdCl9d3QucmVnaXN0ZXJTZXJpYWxpemVyPVppO2Z1bmN0aW9uIFFpKHQpe3JldHVybiBxZS5kZXNlcmlhbGl6ZSh0KX13dC5kZXNlcmlhbGl6ZT1RaTtmdW5jdGlvbiBKaSh0KXtyZXR1cm4gcWUuc2VyaWFsaXplKHQpfXd0LnNlcmlhbGl6ZT1KaTt2YXIgcmU9e30sU3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxTdC4kd29ya2VyPVN0LiR0cmFuc2ZlcmFibGU9U3QuJHRlcm1pbmF0ZT1TdC4kZXZlbnRzPVN0LiRlcnJvcnM9dm9pZCAwLFN0LiRlcnJvcnM9U3ltYm9sKCJ0aHJlYWQuZXJyb3JzIiksU3QuJGV2ZW50cz1TeW1ib2woInRocmVhZC5ldmVudHMiKSxTdC4kdGVybWluYXRlPVN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpLFN0LiR0cmFuc2ZlcmFibGU9U3ltYm9sKCJ0aHJlYWQudHJhbnNmZXJhYmxlIiksU3QuJHdvcmtlcj1TeW1ib2woInRocmVhZC53b3JrZXIiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHJlLlRyYW5zZmVyPXJlLmlzVHJhbnNmZXJEZXNjcmlwdG9yPXZvaWQgMDtjb25zdCBFcj1TdDtmdW5jdGlvbiB0byh0KXtyZXR1cm4hKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpfWZ1bmN0aW9uIGVvKHQpe3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCImJnRbRXIuJHRyYW5zZmVyYWJsZV19cmUuaXNUcmFuc2ZlckRlc2NyaXB0b3I9ZW87ZnVuY3Rpb24gbm8odCxlKXtpZighZSl7aWYoIXRvKHQpKXRocm93IEVycm9yKCk7ZT1bdF19cmV0dXJue1tFci4kdHJhbnNmZXJhYmxlXTohMCxzZW5kOnQsdHJhbnNmZXJhYmxlczplfX1yZS5UcmFuc2Zlcj1ubzt2YXIgX3I9e307KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lldvcmtlck1lc3NhZ2VUeXBlPXQuTWFzdGVyTWVzc2FnZVR5cGU9dm9pZCAwLGZ1bmN0aW9uKGUpe2UuY2FuY2VsPSJjYW5jZWwiLGUucnVuPSJydW4ifSh0Lk1hc3Rlck1lc3NhZ2VUeXBlfHwodC5NYXN0ZXJNZXNzYWdlVHlwZT17fSkpLGZ1bmN0aW9uKGUpe2UuZXJyb3I9ImVycm9yIixlLmluaXQ9ImluaXQiLGUucmVzdWx0PSJyZXN1bHQiLGUucnVubmluZz0icnVubmluZyIsZS51bmNhdWdodEVycm9yPSJ1bmNhdWdodEVycm9yIn0odC5Xb3JrZXJNZXNzYWdlVHlwZXx8KHQuV29ya2VyTWVzc2FnZVR5cGU9e30pKX0pKF9yKTt2YXIgeG49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHhuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBybz1mdW5jdGlvbigpe2NvbnN0IGU9dHlwZW9mIHNlbGY8InUiJiZ0eXBlb2YgV2luZG93PCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdpbmRvdztyZXR1cm4hISh0eXBlb2Ygc2VsZjwidSImJnNlbGYucG9zdE1lc3NhZ2UmJiFlKX0saW89ZnVuY3Rpb24oZSxuKXtzZWxmLnBvc3RNZXNzYWdlKGUsbil9LG9vPWZ1bmN0aW9uKGUpe2NvbnN0IG49aT0+e2UoaS5kYXRhKX0scj0oKT0+e3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHJ9O3huLmRlZmF1bHQ9e2lzV29ya2VyUnVudGltZTpybyxwb3N0TWVzc2FnZVRvTWFzdGVyOmlvLHN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXM6b299LGZ1bmN0aW9uKHQpe3ZhciBlPVgmJlguX19hd2FpdGVyfHxmdW5jdGlvbihULEIsVixEKXtmdW5jdGlvbiB5dChvdCl7cmV0dXJuIG90IGluc3RhbmNlb2YgVj9vdDpuZXcgVihmdW5jdGlvbihndCl7Z3Qob3QpfSl9cmV0dXJuIG5ldyhWfHwoVj1Qcm9taXNlKSkoZnVuY3Rpb24ob3QsZ3Qpe2Z1bmN0aW9uIHBuKGRlKXt0cnl7SGUoRC5uZXh0KGRlKSl9Y2F0Y2goYXIpe2d0KGFyKX19ZnVuY3Rpb24geW4oZGUpe3RyeXtIZShELnRocm93KGRlKSl9Y2F0Y2goYXIpe2d0KGFyKX19ZnVuY3Rpb24gSGUoZGUpe2RlLmRvbmU/b3QoZGUudmFsdWUpOnl0KGRlLnZhbHVlKS50aGVuKHBuLHluKX1IZSgoRD1ELmFwcGx5KFQsQnx8W10pKS5uZXh0KCkpfSl9LG49WCYmWC5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKFQpe3JldHVybiBUJiZULl9fZXNNb2R1bGU/VDp7ZGVmYXVsdDpUfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZXhwb3NlPXQuaXNXb3JrZXJSdW50aW1lPXQuVHJhbnNmZXI9dC5yZWdpc3RlclNlcmlhbGl6ZXI9dm9pZCAwO2NvbnN0IHI9bihFZSksaT13dCxvPXJlLHM9X3IsdT1uKHhuKTt2YXIgYT13dDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJTZXJpYWxpemVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5yZWdpc3RlclNlcmlhbGl6ZXJ9fSk7dmFyIGw9cmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlRyYW5zZmVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5UcmFuc2Zlcn19KSx0LmlzV29ya2VyUnVudGltZT11LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lO2xldCBkPSExO2NvbnN0IF89bmV3IE1hcCxPPVQ9PlQmJlQudHlwZT09PXMuTWFzdGVyTWVzc2FnZVR5cGUuY2FuY2VsLGI9VD0+VCYmVC50eXBlPT09cy5NYXN0ZXJNZXNzYWdlVHlwZS5ydW4sST1UPT5yLmRlZmF1bHQoVCl8fFMoVCk7ZnVuY3Rpb24gUyhUKXtyZXR1cm4gVCYmdHlwZW9mIFQ9PSJvYmplY3QiJiZ0eXBlb2YgVC5zdWJzY3JpYmU9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gbShUKXtyZXR1cm4gby5pc1RyYW5zZmVyRGVzY3JpcHRvcihUKT97cGF5bG9hZDpULnNlbmQsdHJhbnNmZXJhYmxlczpULnRyYW5zZmVyYWJsZXN9OntwYXlsb2FkOlQsdHJhbnNmZXJhYmxlczp2b2lkIDB9fWZ1bmN0aW9uIGcoKXtjb25zdCBUPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUuaW5pdCxleHBvc2VkOnt0eXBlOiJmdW5jdGlvbiJ9fTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihUKX1mdW5jdGlvbiBHKFQpe2NvbnN0IEI9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LGV4cG9zZWQ6e3R5cGU6Im1vZHVsZSIsbWV0aG9kczpUfX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9ZnVuY3Rpb24gcShULEIpe2NvbnN0e3BheWxvYWQ6Vix0cmFuc2ZlcmFibGVzOkR9PW0oQikseXQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5lcnJvcix1aWQ6VCxlcnJvcjppLnNlcmlhbGl6ZShWKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoeXQsRCl9ZnVuY3Rpb24gJChULEIsVil7Y29uc3R7cGF5bG9hZDpELHRyYW5zZmVyYWJsZXM6eXR9PW0oViksb3Q9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5yZXN1bHQsdWlkOlQsY29tcGxldGU6Qj8hMDp2b2lkIDAscGF5bG9hZDpEfTt1LmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihvdCx5dCl9ZnVuY3Rpb24gbnQoVCxCKXtjb25zdCBWPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUucnVubmluZyx1aWQ6VCxyZXN1bHRUeXBlOkJ9O3UuZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKFYpfWZ1bmN0aW9uIGx0KFQpe3RyeXtjb25zdCBCPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvcixlcnJvcjppLnNlcmlhbGl6ZShUKX07dS5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQil9Y2F0Y2goQil7Y29uc29sZS5lcnJvcihgTm90IHJlcG9ydGluZyB1bmNhdWdodCBlcnJvciBiYWNrIHRvIG1hc3RlciB0aHJlYWQgYXMgaXQgb2NjdXJlZCB3aGlsZSByZXBvcnRpbmcgYW4gdW5jYXVnaHQgZXJyb3IgYWxyZWFkeS4KTGF0ZXN0IGVycm9yOmAsQixgCk9yaWdpbmFsIGVycm9yOmAsVCl9fWZ1bmN0aW9uIGl0KFQsQixWKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IEQ7dHJ5e0Q9QiguLi5WKX1jYXRjaChvdCl7cmV0dXJuIHEoVCxvdCl9Y29uc3QgeXQ9SShEKT8ib2JzZXJ2YWJsZSI6InByb21pc2UiO2lmKG50KFQseXQpLEkoRCkpe2NvbnN0IG90PUQuc3Vic2NyaWJlKGd0PT4kKFQsITEsaS5zZXJpYWxpemUoZ3QpKSxndD0+e3EoVCxpLnNlcmlhbGl6ZShndCkpLF8uZGVsZXRlKFQpfSwoKT0+eyQoVCwhMCksXy5kZWxldGUoVCl9KTtfLnNldChULG90KX1lbHNlIHRyeXtjb25zdCBvdD15aWVsZCBEOyQoVCwhMCxpLnNlcmlhbGl6ZShvdCkpfWNhdGNoKG90KXtxKFQsaS5zZXJpYWxpemUob3QpKX19KX1mdW5jdGlvbiBCdChUKXtpZighdS5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKXRocm93IEVycm9yKCJleHBvc2UoKSBjYWxsZWQgaW4gdGhlIG1hc3RlciB0aHJlYWQuIik7aWYoZCl0aHJvdyBFcnJvcigiZXhwb3NlKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiBUaGlzIGlzIG5vdCBwb3NzaWJsZS4gUGFzcyBhbiBvYmplY3QgdG8gZXhwb3NlKCkgaWYgeW91IHdhbnQgdG8gZXhwb3NlIG11bHRpcGxlIGZ1bmN0aW9ucy4iKTtpZihkPSEwLHR5cGVvZiBUPT0iZnVuY3Rpb24iKXUuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntiKEIpJiYhQi5tZXRob2QmJml0KEIudWlkLFQsQi5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KSxnKCk7ZWxzZSBpZih0eXBlb2YgVD09Im9iamVjdCImJlQpe3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKFY9PntiKFYpJiZWLm1ldGhvZCYmaXQoVi51aWQsVFtWLm1ldGhvZF0sVi5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KTtjb25zdCBCPU9iamVjdC5rZXlzKFQpLmZpbHRlcihWPT50eXBlb2YgVFtWXT09ImZ1bmN0aW9uIik7RyhCKX1lbHNlIHRocm93IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBleHBvc2UoKS4gRXhwZWN0ZWQgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QsIGdvdDogJHtUfWApO3UuZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKEI9PntpZihPKEIpKXtjb25zdCBWPUIudWlkLEQ9Xy5nZXQoVik7RCYmKEQudW5zdWJzY3JpYmUoKSxfLmRlbGV0ZShWKSl9fSl9dC5leHBvc2U9QnQsdHlwZW9mIHNlbGY8InUiJiZ0eXBlb2Ygc2VsZi5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixUPT57c2V0VGltZW91dCgoKT0+bHQoVC5lcnJvcnx8VCksMjUwKX0pLHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigidW5oYW5kbGVkcmVqZWN0aW9uIixUPT57Y29uc3QgQj1ULnJlYXNvbjtCJiZ0eXBlb2YgQi5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoQiksMjUwKX0pKSx0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZiBwcm9jZXNzLm9uPT0iZnVuY3Rpb24iJiZ1LmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsVD0+e3NldFRpbWVvdXQoKCk9Pmx0KFQpLDI1MCl9KSxwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLFQ9PntUJiZ0eXBlb2YgVC5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+bHQoVCksMjUwKX0pKX0ocnQpO3ZhciBPbj1ZKHJ0KTtjb25zdCBzbz1Pbi5leHBvc2U7T24ucmVnaXN0ZXJTZXJpYWxpemVyLE9uLlRyYW5zZmVyO2Z1bmN0aW9uIEYodCxlKXtyZXR1cm4gdD8/ZX1GLkVNUFRZX09CSkVDVD1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBwKHQpe3JldHVybiB0IT1udWxsfWZ1bmN0aW9uIHgodCl7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXAoT2JqZWN0LmNyZWF0ZSkmJih4LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSkseC5wcm90b3R5cGUuY29uc3RydWN0b3I9eCkseC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBwKHRoaXMuc3RhY2spJiYodCs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSx0fSx4LnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IHgoIlRoaXMgZnVuY3Rpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiIpfTtjb25zdCBzdD17fTtzdC50eXBlT2Y9e307ZnVuY3Rpb24gYW8odCl7cmV0dXJuYCR7dH0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiBwZSh0LGUsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7ZX0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7dH1gfXN0LmRlZmluZWQ9ZnVuY3Rpb24odCxlKXtpZighcChlKSl0aHJvdyBuZXcgeChhbyh0KSl9LHN0LnR5cGVPZi5mdW5jPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImZ1bmN0aW9uIix0KSl9LHN0LnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsInN0cmluZyIsdCkpfSxzdC50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyB4KHBlKHR5cGVvZiBlLCJudW1iZXIiLHQpKX0sc3QudHlwZU9mLm51bWJlci5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU+PW4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKHN0LnR5cGVPZi5udW1iZXIodCxlKSxlPm4pdGhyb3cgbmV3IHgoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZihzdC50eXBlT2YubnVtYmVyKHQsZSksZTw9bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU8bil0aHJvdyBuZXcgeChgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsIm9iamVjdCIsdCkpfSxzdC50eXBlT2YuYm9vbD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IHgocGUodHlwZW9mIGUsImJvb2xlYW4iLHQpKX0sc3QudHlwZU9mLmJpZ2ludD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYmlnaW50Iil0aHJvdyBuZXcgeChwZSh0eXBlb2YgZSwiYmlnaW50Iix0KSl9LHN0LnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHN0LnR5cGVPZi5udW1iZXIodCxuKSxzdC50eXBlT2YubnVtYmVyKGUsciksbiE9PXIpdGhyb3cgbmV3IHgoYCR7dH0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHtufSBhbmQgJHtyfWApfTt2YXIgaD1zdCxXdD1mdW5jdGlvbih0KXt0PT1udWxsJiYodD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHQuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheSh0LHQubGVuZ3RoKTp0aGlzLmluaXRfc2VlZCh0KX07V3QucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbih0KXtmb3IodGhpcy5tdFswXT10Pj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgdD10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKCh0JjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsodCY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0sV3QucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEscj0wLGk9dGhpcy5OPmU/dGhpcy5OOmU7aTtpLS0pe3ZhciBvPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKG8mNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhvJjY1NTM1KSoxNjY0NTI1KSt0W3JdK3IsdGhpcy5tdFtuXT4+Pj0wLG4rKyxyKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLHI+PWUmJihyPTApfWZvcihpPXRoaXMuTi0xO2k7aS0tKXt2YXIgbz10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChvJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsobyY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LFd0LnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIHQsZT1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV50Pj4+MV5lW3QmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV50Pj4+MV5lW3QmMV07dD10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1edD4+PjFeZVt0JjFdLHRoaXMubXRpPTB9cmV0dXJuIHQ9dGhpcy5tdFt0aGlzLm10aSsrXSx0Xj10Pj4+MTEsdF49dDw8NyYyNjM2OTI4NjQwLHRePXQ8PDE1JjQwMjI3MzA3NTIsdF49dD4+PjE4LHQ+Pj4wfSxXdC5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX0sV3QucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfSxXdC5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfSxXdC5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfSxXdC5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmRvbV9pbnQoKT4+PjUsZT10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKHQqNjcxMDg4NjQrZSkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3ZhciBwcj1XdDtjb25zdCB5PXt9O3kuRVBTSUxPTjE9LjEseS5FUFNJTE9OMj0uMDEseS5FUFNJTE9OMz0uMDAxLHkuRVBTSUxPTjQ9MWUtNCx5LkVQU0lMT041PTFlLTUseS5FUFNJTE9ONj0xZS02LHkuRVBTSUxPTjc9MWUtNyx5LkVQU0lMT044PTFlLTgseS5FUFNJTE9OOT0xZS05LHkuRVBTSUxPTjEwPTFlLTEwLHkuRVBTSUxPTjExPTFlLTExLHkuRVBTSUxPTjEyPTFlLTEyLHkuRVBTSUxPTjEzPTFlLTEzLHkuRVBTSUxPTjE0PTFlLTE0LHkuRVBTSUxPTjE1PTFlLTE1LHkuRVBTSUxPTjE2PTFlLTE2LHkuRVBTSUxPTjE3PTFlLTE3LHkuRVBTSUxPTjE4PTFlLTE4LHkuRVBTSUxPTjE5PTFlLTE5LHkuRVBTSUxPTjIwPTFlLTIwLHkuRVBTSUxPTjIxPTFlLTIxLHkuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTUseS5TT0xBUl9SQURJVVM9Njk1NWU1LHkuTFVOQVJfUkFESVVTPTE3Mzc0MDAseS5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0LHkuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNCx5LnNpZ249RihNYXRoLnNpZ24sZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PTB8fGUhPT1lP2U6ZT4wPzE6LTF9KSx5LnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX0seS50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9RihlLDI1NSksTWF0aC5yb3VuZCgoeS5jbGFtcCh0LC0xLDEpKi41Ky41KSplKX0seS5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1GKGUsMjU1KSx5LmNsYW1wKHQsMCxlKS9lKjItMX0seS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPU1hdGgubWF4KG4tZSwwKSxuPT09MD8wOnkuY2xhbXAoKHQtZSkvbiwwLDEpfSx5LnNpbmg9RihNYXRoLnNpbmgsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpLU1hdGguZXhwKC1lKSkvMn0pLHkuY29zaD1GKE1hdGguY29zaCxmdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfSkseS5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX0seS5QST1NYXRoLlBJLHkuT05FX09WRVJfUEk9MS9NYXRoLlBJLHkuUElfT1ZFUl9UV089TWF0aC5QSS8yLHkuUElfT1ZFUl9USFJFRT1NYXRoLlBJLzMseS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80LHkuUElfT1ZFUl9TSVg9TWF0aC5QSS82LHkuVEhSRUVfUElfT1ZFUl9UV089MypNYXRoLlBJLzIseS5UV09fUEk9MipNYXRoLlBJLHkuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSkseS5SQURJQU5TX1BFUl9ERUdSRUU9TWF0aC5QSS8xODAseS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEkseS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9eS5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMCx5LnRvUmFkaWFucz1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZGVncmVlcyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdCp5LlJBRElBTlNfUEVSX0RFR1JFRX0seS50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqeS5ERUdSRUVTX1BFUl9SQURJQU59LHkuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtjb25zdCBlPXkuVFdPX1BJLG49dC1NYXRoLmZsb29yKHQvZSkqZTtyZXR1cm4gbjwtTWF0aC5QST9uK2U6bj49TWF0aC5QST9uLWU6bn0seS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHkuY2xhbXAodCwtMSp5LlBJX09WRVJfVFdPLHkuUElfT1ZFUl9UV08pfSx5Lm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49LXkuUEkmJnQ8PXkuUEk/dDp5Lnplcm9Ub1R3b1BpKHQreS5QSSkteS5QSX0seS56ZXJvVG9Ud29QaT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgeCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYodD49MCYmdDw9eS5UV09fUEkpcmV0dXJuIHQ7Y29uc3QgZT15Lm1vZCh0LHkuVFdPX1BJKTtyZXR1cm4gTWF0aC5hYnMoZSk8eS5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPnkuRVBTSUxPTjE0P3kuVFdPX1BJOmV9LHkubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoIm0gaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IHgoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIHkuc2lnbih0KT09PXkuc2lnbihlKSYmTWF0aC5hYnModCk8TWF0aC5hYnMoZSk/dDoodCVlK2UpJWV9LHkuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixyKXtpZighcCh0KSl0aHJvdyBuZXcgeCgibGVmdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmlnaHQgaXMgcmVxdWlyZWQuIik7bj1GKG4sMCkscj1GKHIsbik7Y29uc3QgaT1NYXRoLmFicyh0LWUpO3JldHVybiBpPD1yfHxpPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX0seS5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIXAodCkpdGhyb3cgbmV3IHgoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFwKGUpKXRocm93IG5ldyB4KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIXAobikpdGhyb3cgbmV3IHgoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPC1ufSx5Lmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFwKHQpKXRocm93IG5ldyB4KCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufSx5LmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn0seS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgeCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+LW59O2NvbnN0IFllPVsxXTt5LmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgeCgiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7Y29uc3QgZT1ZZS5sZW5ndGg7aWYodD49ZSl7bGV0IG49WWVbZS0xXTtmb3IobGV0IHI9ZTtyPD10O3IrKyl7Y29uc3QgaT1uKnI7WWUucHVzaChpKSxuPWl9fXJldHVybiBZZVt0XX0seS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPUYobiwwKSwhcCh0KSl0aHJvdyBuZXcgeCgibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyB4KCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9LHkuaXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQhPT0wJiYodCZ0LTEpPT09MH0seS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD4yMTQ3NDgzNjQ4KXRocm93IG5ldyB4KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuIik7cmV0dXJuLS10LHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsKyt0LHR9LHkucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHgoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH0seS5jbGFtcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLGgudHlwZU9mLm51bWJlcigibWluIixlKSxoLnR5cGVPZi5udW1iZXIoIm1heCIsbiksdDxlP2U6dD5uP246dH07bGV0IHlyPW5ldyBwcjt5LnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInNlZWQgaXMgcmVxdWlyZWQuIik7eXI9bmV3IHByKHQpfSx5Lm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4geXIucmFuZG9tKCl9LHkucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB5Lm5leHRSYW5kb21OdW1iZXIoKSooZS10KSt0fSx5LmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKHkuY2xhbXAodCwtMSwxKSl9LHkuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IHgoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmFzaW4oeS5jbGFtcCh0LC0xLDEpKX0seS5jaG9yZExlbmd0aD1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJhbmdsZSBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgicmFkaXVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiAyKmUqTWF0aC5zaW4odCouNSl9LHkubG9nQmFzZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyB4KCJudW1iZXIgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IHgoImJhc2UgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGgubG9nKHQpL01hdGgubG9nKGUpfSx5LmNicnQ9RihNYXRoLmNicnQsZnVuY3Rpb24oZSl7Y29uc3Qgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufSkseS5sb2cyPUYoTWF0aC5sb2cyLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfSkseS5mb2c9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigieCIsdCksdCooLS4xNzg0Kk1hdGguYWJzKHQpLS4wNjYzKnQqdCsxLjAzMDEpfSx5LmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2YubnVtYmVyKCJ4Iix0KSxoLnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLHI9TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtjb25zdCBpPU1hdGgubWF4KHIsbik7bj1NYXRoLm1pbihyLG4pO2NvbnN0IG89bi9pO2lmKGlzTmFOKG8pKXRocm93IG5ldyB4KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpO3JldHVybiByPXkuZmFzdEFwcHJveGltYXRlQXRhbihvKSxyPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP3kuUElfT1ZFUl9UV08tcjpyLHI9dDwwP3kuUEktcjpyLHI9ZTwwPy1yOnIscn07dmFyIFI9eTtmdW5jdGlvbiBBKHQsZSl7dGhpcy54PUYodCwwKSx0aGlzLnk9RihlLDApfUEuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcChuKT8obi54PXQsbi55PWUsbik6bmV3IEEodCxlKX0sQS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcgQSh0LngsdC55KX0sQS5mcm9tQ2FydGVzaWFuMz1BLmNsb25lLEEuZnJvbUNhcnRlc2lhbjQ9QS5jbG9uZSxBLnBhY2tlZExlbmd0aD0yLEEucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGguZGVmaW5lZCgiYXJyYXkiLGUpLG49RihuLDApLGVbbisrXT10LngsZVtuXT10LnksZX0sQS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLmRlZmluZWQoImFycmF5Iix0KSxlPUYoZSwwKSxwKG4pfHwobj1uZXcgQSksbi54PXRbZSsrXSxuLnk9dFtlXSxufSxBLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjI7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMiBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpQS5wYWNrKHRbaV0sZSxpKjIpO3JldHVybiBlfSxBLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMiksdC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8yOmU9bmV3IEFycmF5KG4vMik7Zm9yKGxldCByPTA7cjxuO3IrPTIpe2NvbnN0IGk9ci8yO2VbaV09QS51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxBLmZyb21BcnJheT1BLnVucGFjayxBLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55KX0sQS5taW5pbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5taW4odC54LHQueSl9LEEubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59LEEubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG59LEEuY2xhbXA9ZnVuY3Rpb24odCxlLG4scil7aC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLGgudHlwZU9mLm9iamVjdCgibWF4IixuKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIscik7Y29uc3QgaT1SLmNsYW1wKHQueCxlLngsbi54KSxvPVIuY2xhbXAodC55LGUueSxuLnkpO3JldHVybiByLng9aSxyLnk9byxyfSxBLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0Lnl9LEEubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoQS5tYWduaXR1ZGVTcXVhcmVkKHQpKX07Y29uc3QgS2U9bmV3IEE7QS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLEEuc3VidHJhY3QodCxlLEtlKSxBLm1hZ25pdHVkZShLZSl9LEEuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5zdWJ0cmFjdCh0LGUsS2UpLEEubWFnbml0dWRlU3F1YXJlZChLZSl9LEEubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtjb25zdCBuPUEubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24saXNOYU4oZS54KXx8aXNOYU4oZS55KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LEEuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55fSxBLmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fSxBLm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG59LEEuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG59LEEuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn0sQS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG59LEEubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbn0sQS5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn0sQS5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlfSxBLmFicz1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGV9O2NvbnN0IEFyPW5ldyBBO0EubGVycD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCksaC50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLGgudHlwZU9mLm51bWJlcigidCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLEEubXVsdGlwbHlCeVNjYWxhcihlLG4sQXIpLHI9QS5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLHIpLEEuYWRkKEFyLHIscil9O2NvbnN0IFRyPW5ldyBBLFJyPW5ldyBBO0EuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksQS5ub3JtYWxpemUodCxUciksQS5ub3JtYWxpemUoZSxSciksUi5hY29zQ2xhbXBlZChBLmRvdChUcixScikpfTtjb25zdCB1bz1uZXcgQTtBLm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7Y29uc3Qgbj1BLm5vcm1hbGl6ZSh0LHVvKTtyZXR1cm4gQS5hYnMobixuKSxuLng8PW4ueT9lPUEuY2xvbmUoQS5VTklUX1gsZSk6ZT1BLmNsb25lKEEuVU5JVF9ZLGUpLGV9LEEuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxwKHQpJiZwKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueX0sQS5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX0sQS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKX0sQS5aRVJPPU9iamVjdC5mcmVlemUobmV3IEEoMCwwKSksQS5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgQSgxLDEpKSxBLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBBKDEsMCkpLEEuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IEEoMCwxKSksQS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIEEuY2xvbmUodGhpcyx0KX0sQS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBBLmVxdWFscyh0aGlzLHQpfSxBLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gQS5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfSxBLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0pYH07ZnVuY3Rpb24gZih0LGUsbil7dGhpcy54PUYodCwwKSx0aGlzLnk9RihlLDApLHRoaXMuej1GKG4sMCl9Zi5mcm9tU3BoZXJpY2FsPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQuY2xvY2sscj10LmNvbmUsaT1GKHQubWFnbml0dWRlLDEpLG89aSpNYXRoLnNpbihyKTtyZXR1cm4gZS54PW8qTWF0aC5jb3MobiksZS55PW8qTWF0aC5zaW4obiksZS56PWkqTWF0aC5jb3MociksZX0sZi5mcm9tRWxlbWVudHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHAocik/KHIueD10LHIueT1lLHIuej1uLHIpOm5ldyBmKHQsZSxuKX0sZi5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBmKHQueCx0LnksdC56KX0sZi5mcm9tQ2FydGVzaWFuND1mLmNsb25lLGYucGFja2VkTGVuZ3RoPTMsZi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1GKG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbl09dC56LGV9LGYudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJhcnJheSIsdCksZT1GKGUsMCkscChuKXx8KG49bmV3IGYpLG4ueD10W2UrK10sbi55PXRbZSsrXSxuLno9dFtlXSxufSxmLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2guZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjM7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyB4KCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpZi5wYWNrKHRbaV0sZSxpKjMpO3JldHVybiBlfSxmLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYoaC5kZWZpbmVkKCJhcnJheSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMyksdC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IHgoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCByPTA7cjxuO3IrPTMpe2NvbnN0IGk9ci8zO2VbaV09Zi51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxmLmZyb21BcnJheT1mLnVucGFjayxmLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55LHQueil9LGYubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX0sZi5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSxoLnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG59LGYubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksaC50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG4uej1NYXRoLm1heCh0LnosZS56KSxufSxmLmNsYW1wPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLGgudHlwZU9mLm9iamVjdCgibWluIixlKSxoLnR5cGVPZi5vYmplY3QoIm1heCIsbiksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpO2NvbnN0IGk9Ui5jbGFtcCh0LngsZS54LG4ueCksbz1SLmNsYW1wKHQueSxlLnksbi55KSxzPVIuY2xhbXAodC56LGUueixuLnopO3JldHVybiByLng9aSxyLnk9byxyLno9cyxyfSxmLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0LnkrdC56KnQuen0sZi5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChmLm1hZ25pdHVkZVNxdWFyZWQodCkpfTtjb25zdCBaZT1uZXcgZjtmLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5zdWJ0cmFjdCh0LGUsWmUpLGYubWFnbml0dWRlKFplKX0sZi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxmLnN1YnRyYWN0KHQsZSxaZSksZi5tYWduaXR1ZGVTcXVhcmVkKFplKX0sZi5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5tYWduaXR1ZGUodCk7aWYoZS54PXQueC9uLGUueT10LnkvbixlLno9dC56L24saXNOYU4oZS54KXx8aXNOYU4oZS55KXx8aXNOYU4oZS56KSl0aHJvdyBuZXcgeCgibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LGYuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9LGYubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbn0sZi5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbi56PXQuei9lLnosbn0sZi5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufSxmLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbn0sZi5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxuLno9dC56KmUsbn0sZi5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59LGYubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZX0sZi5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlfTtjb25zdCB4cj1uZXcgZjtmLmxlcnA9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLGgudHlwZU9mLm9iamVjdCgiZW5kIixlKSxoLnR5cGVPZi5udW1iZXIoInQiLG4pLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKSxmLm11bHRpcGx5QnlTY2FsYXIoZSxuLHhyKSxyPWYubXVsdGlwbHlCeVNjYWxhcih0LDEtbixyKSxmLmFkZCh4cixyLHIpfTtjb25zdCBRZT1uZXcgZixibj1uZXcgZjtmLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgibGVmdCIsdCksaC50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksZi5ub3JtYWxpemUodCxRZSksZi5ub3JtYWxpemUoZSxibik7Y29uc3Qgbj1mLmRvdChRZSxibikscj1mLm1hZ25pdHVkZShmLmNyb3NzKFFlLGJuLFFlKSk7cmV0dXJuIE1hdGguYXRhbjIocixuKX07Y29uc3QgY289bmV3IGY7Zi5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49Zi5ub3JtYWxpemUodCxjbyk7cmV0dXJuIGYuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1mLmNsb25lKGYuVU5JVF9YLGUpOmU9Zi5jbG9uZShmLlVOSVRfWixlKTpuLnk8PW4uej9lPWYuY2xvbmUoZi5VTklUX1ksZSk6ZT1mLmNsb25lKGYuVU5JVF9aLGUpLGV9LGYucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhIix0KSxoLmRlZmluZWQoImIiLGUpLGguZGVmaW5lZCgicmVzdWx0IixuKTtjb25zdCByPWYuZG90KHQsZSkvZi5kb3QoZSxlKTtyZXR1cm4gZi5tdWx0aXBseUJ5U2NhbGFyKGUscixuKX0sZi5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQueD09PWUueCYmdC55PT09ZS55JiZ0Lno9PT1lLnp9LGYuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX0sZi5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueixlLnosbixyKX0sZi5jcm9zcz1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSxoLnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxoLnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7Y29uc3Qgcj10LngsaT10Lnksbz10Lnoscz1lLngsdT1lLnksYT1lLnosbD1pKmEtbyp1LGQ9bypzLXIqYSxfPXIqdS1pKnM7cmV0dXJuIG4ueD1sLG4ueT1kLG4uej1fLG59LGYubWlkcG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLGgudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGgudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9KHQueCtlLngpKi41LG4ueT0odC55K2UueSkqLjUsbi56PSh0LnorZS56KSouNSxufSxmLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksZi5mcm9tUmFkaWFucyh0LGUsbixyLGkpfTtsZXQgbXQ9bmV3IGYseWU9bmV3IGY7Y29uc3QgaG89bmV3IGYoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO2YuZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXtoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1GKG4sMCk7Y29uc3Qgbz1wKHIpP3IucmFkaWlTcXVhcmVkOmhvLHM9TWF0aC5jb3MoZSk7bXQueD1zKk1hdGguY29zKHQpLG10Lnk9cypNYXRoLnNpbih0KSxtdC56PU1hdGguc2luKGUpLG10PWYubm9ybWFsaXplKG10LG10KSxmLm11bHRpcGx5Q29tcG9uZW50cyhvLG10LHllKTtjb25zdCB1PU1hdGguc3FydChmLmRvdChtdCx5ZSkpO3JldHVybiB5ZT1mLmRpdmlkZUJ5U2NhbGFyKHllLHUseWUpLG10PWYubXVsdGlwbHlCeVNjYWxhcihtdCxuLG10KSxwKGkpfHwoaT1uZXcgZiksZi5hZGQoeWUsbXQsaSl9LGYuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYoaC5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IHgoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtjb25zdCByPXQubGVuZ3RoO3Aobik/bi5sZW5ndGg9ci8yOm49bmV3IEFycmF5KHIvMik7Zm9yKGxldCBpPTA7aTxyO2krPTIpe2NvbnN0IG89dFtpXSxzPXRbaSsxXSx1PWkvMjtuW3VdPWYuZnJvbURlZ3JlZXMobyxzLDAsZSxuW3VdKX1yZXR1cm4gbn0sZi5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzI6bj1uZXcgQXJyYXkoci8yKTtmb3IobGV0IGk9MDtpPHI7aSs9Mil7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9aS8yO25bdV09Zi5mcm9tUmFkaWFucyhvLHMsMCxlLG5bdV0pfXJldHVybiBufSxmLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tRGVncmVlcyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZihoLmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgeCgidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLHU9dFtpKzJdLGE9aS8zO25bYV09Zi5mcm9tUmFkaWFucyhvLHMsdSxlLG5bYV0pfXJldHVybiBufSxmLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgZigwLDAsMCkpLGYuT05FPU9iamVjdC5mcmVlemUobmV3IGYoMSwxLDEpKSxmLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBmKDEsMCwwKSksZi5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgZigwLDEsMCkpLGYuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IGYoMCwwLDEpKSxmLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gZi5jbG9uZSh0aGlzLHQpfSxmLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGYuZXF1YWxzKHRoaXMsdCl9LGYucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9LGYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9KWB9O2NvbnN0IGZvPW5ldyBmLGxvPW5ldyBmO2Z1bmN0aW9uIE9yKHQsZSxuLHIsaSl7aWYoIXAodCkpdGhyb3cgbmV3IHgoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgeCgib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyB4KCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFwKHIpKXRocm93IG5ldyB4KCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2NvbnN0IG89dC54LHM9dC55LHU9dC56LGE9ZS54LGw9ZS55LGQ9ZS56LF89bypvKmEqYSxPPXMqcypsKmwsYj11KnUqZCpkLEk9XytPK2IsUz1NYXRoLnNxcnQoMS9JKSxtPWYubXVsdGlwbHlCeVNjYWxhcih0LFMsZm8pO2lmKEk8cilyZXR1cm4gaXNGaW5pdGUoUyk/Zi5jbG9uZShtLGkpOnZvaWQgMDtjb25zdCBnPW4ueCxHPW4ueSxxPW4ueiwkPWxvOyQueD1tLngqZyoyLCQueT1tLnkqRyoyLCQuej1tLnoqcSoyO2xldCBudD0oMS1TKSpmLm1hZ25pdHVkZSh0KS8oLjUqZi5tYWduaXR1ZGUoJCkpLGx0PTAsaXQsQnQsVCxCLFYsRCx5dCxvdCxndCxwbix5bjtkb3tudC09bHQsVD0xLygxK250KmcpLEI9MS8oMStudCpHKSxWPTEvKDErbnQqcSksRD1UKlQseXQ9QipCLG90PVYqVixndD1EKlQscG49eXQqQix5bj1vdCpWLGl0PV8qRCtPKnl0K2Iqb3QtMSxCdD1fKmd0KmcrTypwbipHK2IqeW4qcTtjb25zdCBIZT0tMipCdDtsdD1pdC9IZX13aGlsZShNYXRoLmFicyhpdCk+Ui5FUFNJTE9OMTIpO3JldHVybiBwKGkpPyhpLng9bypULGkueT1zKkIsaS56PXUqVixpKTpuZXcgZihvKlQscypCLHUqVil9ZnVuY3Rpb24gSCh0LGUsbil7dGhpcy5sb25naXR1ZGU9Rih0LDApLHRoaXMubGF0aXR1ZGU9RihlLDApLHRoaXMuaGVpZ2h0PUYobiwwKX1ILmZyb21SYWRpYW5zPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBoLnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksaC50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1GKG4sMCkscChyKT8oci5sb25naXR1ZGU9dCxyLmxhdGl0dWRlPWUsci5oZWlnaHQ9bixyKTpuZXcgSCh0LGUsbil9LEguZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGgudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSxoLnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksSC5mcm9tUmFkaWFucyh0LGUsbixyKX07Y29uc3QgRW89bmV3IGYsX289bmV3IGYscG89bmV3IGYseW89bmV3IGYoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpLEFvPW5ldyBmKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKSxUbz1SLkVQU0lMT04xO0guZnJvbUNhcnRlc2lhbj1mdW5jdGlvbih0LGUsbil7Y29uc3Qgcj1wKGUpP2Uub25lT3ZlclJhZGlpOnlvLGk9cChlKT9lLm9uZU92ZXJSYWRpaVNxdWFyZWQ6QW8sbz1wKGUpP2UuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ6VG8scz1Pcih0LHIsaSxvLF9vKTtpZighcChzKSlyZXR1cm47bGV0IHU9Zi5tdWx0aXBseUNvbXBvbmVudHMocyxpLEVvKTt1PWYubm9ybWFsaXplKHUsdSk7Y29uc3QgYT1mLnN1YnRyYWN0KHQscyxwbyksbD1NYXRoLmF0YW4yKHUueSx1LngpLGQ9TWF0aC5hc2luKHUueiksXz1SLnNpZ24oZi5kb3QoYSx0KSkqZi5tYWduaXR1ZGUoYSk7cmV0dXJuIHAobik/KG4ubG9uZ2l0dWRlPWwsbi5sYXRpdHVkZT1kLG4uaGVpZ2h0PV8sbik6bmV3IEgobCxkLF8pfSxILnRvQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWMiLHQpLGYuZnJvbVJhZGlhbnModC5sb25naXR1ZGUsdC5sYXRpdHVkZSx0LmhlaWdodCxlLG4pfSxILmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYocCh0KSlyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBIKHQubG9uZ2l0dWRlLHQubGF0aXR1ZGUsdC5oZWlnaHQpfSxILmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC5sb25naXR1ZGU9PT1lLmxvbmdpdHVkZSYmdC5sYXRpdHVkZT09PWUubGF0aXR1ZGUmJnQuaGVpZ2h0PT09ZS5oZWlnaHR9LEguZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49RihuLDApLHQ9PT1lfHxwKHQpJiZwKGUpJiZNYXRoLmFicyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSk8PW4mJk1hdGguYWJzKHQubGF0aXR1ZGUtZS5sYXRpdHVkZSk8PW4mJk1hdGguYWJzKHQuaGVpZ2h0LWUuaGVpZ2h0KTw9bn0sSC5aRVJPPU9iamVjdC5mcmVlemUobmV3IEgoMCwwLDApKSxILnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gSC5jbG9uZSh0aGlzLHQpfSxILnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIEguZXF1YWxzKHRoaXMsdCl9LEgucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gSC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX0sSC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5sb25naXR1ZGV9LCAke3RoaXMubGF0aXR1ZGV9LCAke3RoaXMuaGVpZ2h0fSlgfTtmdW5jdGlvbiBicih0LGUsbixyKXtlPUYoZSwwKSxuPUYobiwwKSxyPUYociwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieCIsZSwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieSIsbiwwKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygieiIsciwwKSx0Ll9yYWRpaT1uZXcgZihlLG4sciksdC5fcmFkaWlTcXVhcmVkPW5ldyBmKGUqZSxuKm4scipyKSx0Ll9yYWRpaVRvVGhlRm91cnRoPW5ldyBmKGUqZSplKmUsbipuKm4qbixyKnIqcipyKSx0Ll9vbmVPdmVyUmFkaWk9bmV3IGYoZT09PTA/MDoxL2Usbj09PTA/MDoxL24scj09PTA/MDoxL3IpLHQuX29uZU92ZXJSYWRpaVNxdWFyZWQ9bmV3IGYoZT09PTA/MDoxLyhlKmUpLG49PT0wPzA6MS8obipuKSxyPT09MD8wOjEvKHIqcikpLHQuX21pbmltdW1SYWRpdXM9TWF0aC5taW4oZSxuLHIpLHQuX21heGltdW1SYWRpdXM9TWF0aC5tYXgoZSxuLHIpLHQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9Ui5FUFNJTE9OMSx0Ll9yYWRpaVNxdWFyZWQueiE9PTAmJih0Ll9zcXVhcmVkWE92ZXJTcXVhcmVkWj10Ll9yYWRpaVNxdWFyZWQueC90Ll9yYWRpaVNxdWFyZWQueil9ZnVuY3Rpb24gaih0LGUsbil7dGhpcy5fcmFkaWk9dm9pZCAwLHRoaXMuX3JhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aD12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9taW5pbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9tYXhpbXVtUmFkaXVzPXZvaWQgMCx0aGlzLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXZvaWQgMCx0aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWj12b2lkIDAsYnIodGhpcyx0LGUsbil9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoai5wcm90b3R5cGUse3JhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWl9fSxyYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVNxdWFyZWR9fSxyYWRpaVRvVGhlRm91cnRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aH19LG9uZU92ZXJSYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaX19LG9uZU92ZXJSYWRpaVNxdWFyZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkfX0sbWluaW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbmltdW1SYWRpdXN9fSxtYXhpbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4aW11bVJhZGl1c319fSksai5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXJldHVybjtjb25zdCBuPXQuX3JhZGlpO3JldHVybiBwKGUpPyhmLmNsb25lKG4sZS5fcmFkaWkpLGYuY2xvbmUodC5fcmFkaWlTcXVhcmVkLGUuX3JhZGlpU3F1YXJlZCksZi5jbG9uZSh0Ll9yYWRpaVRvVGhlRm91cnRoLGUuX3JhZGlpVG9UaGVGb3VydGgpLGYuY2xvbmUodC5fb25lT3ZlclJhZGlpLGUuX29uZU92ZXJSYWRpaSksZi5jbG9uZSh0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkLGUuX29uZU92ZXJSYWRpaVNxdWFyZWQpLGUuX21pbmltdW1SYWRpdXM9dC5fbWluaW11bVJhZGl1cyxlLl9tYXhpbXVtUmFkaXVzPXQuX21heGltdW1SYWRpdXMsZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD10Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLGUpOm5ldyBqKG4ueCxuLnksbi56KX0sai5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgaikscCh0KSYmYnIoZSx0LngsdC55LHQueiksZX0sai5XR1M4ND1PYmplY3QuZnJlZXplKG5ldyBqKDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSksai5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyBqKDEsMSwxKSksai5NT09OPU9iamVjdC5mcmVlemUobmV3IGooUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMsUi5MVU5BUl9SQURJVVMpKSxqLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gai5jbG9uZSh0aGlzLHQpfSxqLnBhY2tlZExlbmd0aD1mLnBhY2tlZExlbmd0aCxqLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSxoLmRlZmluZWQoImFycmF5IixlKSxuPUYobiwwKSxmLnBhY2sodC5fcmFkaWksZSxuKSxlfSxqLnVucGFjaz1mdW5jdGlvbih0LGUsbil7aC5kZWZpbmVkKCJhcnJheSIsdCksZT1GKGUsMCk7Y29uc3Qgcj1mLnVucGFjayh0LGUpO3JldHVybiBqLmZyb21DYXJ0ZXNpYW4zKHIsbil9LGoucHJvdG90eXBlLmdlb2NlbnRyaWNTdXJmYWNlTm9ybWFsPWYubm9ybWFsaXplLGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIix0KTtjb25zdCBuPXQubG9uZ2l0dWRlLHI9dC5sYXRpdHVkZSxpPU1hdGguY29zKHIpLG89aSpNYXRoLmNvcyhuKSxzPWkqTWF0aC5zaW4obiksdT1NYXRoLnNpbihyKTtyZXR1cm4gcChlKXx8KGU9bmV3IGYpLGUueD1vLGUueT1zLGUuej11LGYubm9ybWFsaXplKGUsZSl9LGoucHJvdG90eXBlLmdlb2RldGljU3VyZmFjZU5vcm1hbD1mdW5jdGlvbih0LGUpe2lmKCFmLmVxdWFsc0Vwc2lsb24odCxmLlpFUk8sUi5FUFNJTE9OMTQpKXJldHVybiBwKGUpfHwoZT1uZXcgZiksZT1mLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsZSksZi5ub3JtYWxpemUoZSxlKX07Y29uc3QgUm89bmV3IGYseG89bmV3IGY7ai5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlKXtjb25zdCBuPVJvLHI9eG87dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWModCxuKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0aGlzLl9yYWRpaVNxdWFyZWQsbixyKTtjb25zdCBpPU1hdGguc3FydChmLmRvdChuLHIpKTtyZXR1cm4gZi5kaXZpZGVCeVNjYWxhcihyLGksciksZi5tdWx0aXBseUJ5U2NhbGFyKG4sdC5oZWlnaHQsbikscChlKXx8KGU9bmV3IGYpLGYuYWRkKHIsbixlKX0sai5wcm90b3R5cGUuY2FydG9ncmFwaGljQXJyYXlUb0NhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47cisrKWVbcl09dGhpcy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbih0W3JdLGVbcl0pO3JldHVybiBlfTtjb25zdCBPbz1uZXcgZixibz1uZXcgZixnbz1uZXcgZjtqLnByb3RvdHlwZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYz1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKHQsYm8pO2lmKCFwKG4pKXJldHVybjtjb25zdCByPXRoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4sT28pLGk9Zi5zdWJ0cmFjdCh0LG4sZ28pLG89TWF0aC5hdGFuMihyLnksci54KSxzPU1hdGguYXNpbihyLnopLHU9Ui5zaWduKGYuZG90KGksdCkpKmYubWFnbml0dWRlKGkpO3JldHVybiBwKGUpPyhlLmxvbmdpdHVkZT1vLGUubGF0aXR1ZGU9cyxlLmhlaWdodD11LGUpOm5ldyBIKG8scyx1KX0sai5wcm90b3R5cGUuY2FydGVzaWFuQXJyYXlUb0NhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IHI9MDtyPG47KytyKWVbcl09dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W3JdLGVbcl0pO3JldHVybiBlfSxqLnByb3RvdHlwZS5zY2FsZVRvR2VvZGV0aWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9yKHQsdGhpcy5fb25lT3ZlclJhZGlpLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKX0sai5wcm90b3R5cGUuc2NhbGVUb0dlb2NlbnRyaWNTdXJmYWNlPWZ1bmN0aW9uKHQsZSl7aC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHAoZSl8fChlPW5ldyBmKTtjb25zdCBuPXQueCxyPXQueSxpPXQueixvPXRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQscz0xL01hdGguc3FydChuKm4qby54K3IqcipvLnkraSppKm8ueik7cmV0dXJuIGYubXVsdGlwbHlCeVNjYWxhcih0LHMsZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgZiksZi5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWksZSl9LGoucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uRnJvbVNjYWxlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHAoZSl8fChlPW5ldyBmKSxmLm11bHRpcGx5Q29tcG9uZW50cyh0LHRoaXMuX3JhZGlpLGUpfSxqLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHxwKHQpJiZmLmVxdWFscyh0aGlzLl9yYWRpaSx0Ll9yYWRpaSl9LGoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpLnRvU3RyaW5nKCl9LGoucHJvdG90eXBlLmdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXM9ZnVuY3Rpb24odCxlLG4pe2lmKGgudHlwZU9mLm9iamVjdCgicG9zaXRpb24iLHQpLCFSLmVxdWFsc0Vwc2lsb24odGhpcy5fcmFkaWkueCx0aGlzLl9yYWRpaS55LFIuRVBTSUxPTjE1KSl0aHJvdyBuZXcgeCgiRWxsaXBzb2lkIG11c3QgYmUgYW4gZWxsaXBzb2lkIG9mIHJldm9sdXRpb24gKHJhZGlpLnggPT0gcmFkaWkueSkiKTtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW4oIkVsbGlwc29pZC5yYWRpaS56Iix0aGlzLl9yYWRpaS56LDApLGU9RihlLDApO2NvbnN0IHI9dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYocChuKXx8KG49bmV3IGYpLG4ueD0wLG4ueT0wLG4uej10LnoqKDEtciksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LWUpKXJldHVybiBufTtjb25zdCBTbz1bLjE0ODg3NDMzODk4MTYzLC40MzMzOTUzOTQxMjkyNSwuNjc5NDA5NTY4Mjk5MDIsLjg2NTA2MzM2NjY4ODk4LC45NzM5MDY1Mjg1MTcxNywwXSxtbz1bLjI5NTUyNDIyNDcxNDc1LC4yNjkyNjY3MTkzMDk5OSwuMjE5MDg2MzYyNTE1OTgsLjE0OTQ1MTM0OTE1MDU4LC4wNjY2NzEzNDQzMDg2ODQsMF07ZnVuY3Rpb24gZ3IodCxlLG4pe2gudHlwZU9mLm51bWJlcigiYSIsdCksaC50eXBlT2YubnVtYmVyKCJiIixlKSxoLnR5cGVPZi5mdW5jKCJmdW5jIixuKTtjb25zdCByPS41KihlK3QpLGk9LjUqKGUtdCk7bGV0IG89MDtmb3IobGV0IHM9MDtzPDU7cysrKXtjb25zdCB1PWkqU29bc107bys9bW9bc10qKG4ocit1KStuKHItdSkpfXJldHVybiBvKj1pLG99ai5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24odCl7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2NvbnN0IGU9dC53ZXN0O2xldCBuPXQuZWFzdDtjb25zdCByPXQuc291dGgsaT10Lm5vcnRoO2Zvcig7bjxlOyluKz1SLlRXT19QSTtjb25zdCBvPXRoaXMuX3JhZGlpU3F1YXJlZCxzPW8ueCx1PW8ueSxhPW8ueixsPXMqdTtyZXR1cm4gZ3IocixpLGZ1bmN0aW9uKGQpe2NvbnN0IF89TWF0aC5jb3MoZCksTz1NYXRoLnNpbihkKTtyZXR1cm4gTWF0aC5jb3MoZCkqZ3IoZSxuLGZ1bmN0aW9uKGIpe2NvbnN0IEk9TWF0aC5jb3MoYiksUz1NYXRoLnNpbihiKTtyZXR1cm4gTWF0aC5zcXJ0KGwqTypPK2EqKHUqSSpJK3MqUypTKSpfKl8pfSl9KX07ZnVuY3Rpb24gTih0LGUsbixyKXt0aGlzLndlc3Q9Rih0LDApLHRoaXMuc291dGg9RihlLDApLHRoaXMuZWFzdD1GKG4sMCksdGhpcy5ub3J0aD1GKHIsMCl9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTi5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTi5jb21wdXRlV2lkdGgodGhpcyl9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBOLmNvbXB1dGVIZWlnaHQodGhpcyl9fX0pLE4ucGFja2VkTGVuZ3RoPTQsTi5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksaC5kZWZpbmVkKCJhcnJheSIsZSksbj1GKG4sMCksZVtuKytdPXQud2VzdCxlW24rK109dC5zb3V0aCxlW24rK109dC5lYXN0LGVbbl09dC5ub3J0aCxlfSxOLnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGguZGVmaW5lZCgiYXJyYXkiLHQpLGU9RihlLDApLHAobil8fChuPW5ldyBOKSxuLndlc3Q9dFtlKytdLG4uc291dGg9dFtlKytdLG4uZWFzdD10W2UrK10sbi5ub3J0aD10W2VdLG59LE4uY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgZT10LmVhc3Q7Y29uc3Qgbj10Lndlc3Q7cmV0dXJuIGU8biYmKGUrPVIuVFdPX1BJKSxlLW59LE4uY29tcHV0ZUhlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHQubm9ydGgtdC5zb3V0aH0sTi5mcm9tRGVncmVlcz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB0PVIudG9SYWRpYW5zKEYodCwwKSksZT1SLnRvUmFkaWFucyhGKGUsMCkpLG49Ui50b1JhZGlhbnMoRihuLDApKSxyPVIudG9SYWRpYW5zKEYociwwKSkscChpKT8oaS53ZXN0PXQsaS5zb3V0aD1lLGkuZWFzdD1uLGkubm9ydGg9cixpKTpuZXcgTih0LGUsbixyKX0sTi5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiBwKGkpPyhpLndlc3Q9Rih0LDApLGkuc291dGg9RihlLDApLGkuZWFzdD1GKG4sMCksaS5ub3J0aD1GKHIsMCksaSk6bmV3IE4odCxlLG4scil9LE4uZnJvbUNhcnRvZ3JhcGhpY0FycmF5PWZ1bmN0aW9uKHQsZSl7aC5kZWZpbmVkKCJjYXJ0b2dyYXBoaWNzIix0KTtsZXQgbj1OdW1iZXIuTUFYX1ZBTFVFLHI9LU51bWJlci5NQVhfVkFMVUUsaT1OdW1iZXIuTUFYX1ZBTFVFLG89LU51bWJlci5NQVhfVkFMVUUscz1OdW1iZXIuTUFYX1ZBTFVFLHU9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBhPTAsbD10Lmxlbmd0aDthPGw7YSsrKXtjb25zdCBkPXRbYV07bj1NYXRoLm1pbihuLGQubG9uZ2l0dWRlKSxyPU1hdGgubWF4KHIsZC5sb25naXR1ZGUpLHM9TWF0aC5taW4ocyxkLmxhdGl0dWRlKSx1PU1hdGgubWF4KHUsZC5sYXRpdHVkZSk7Y29uc3QgXz1kLmxvbmdpdHVkZT49MD9kLmxvbmdpdHVkZTpkLmxvbmdpdHVkZStSLlRXT19QSTtpPU1hdGgubWluKGksXyksbz1NYXRoLm1heChvLF8pfXJldHVybiByLW4+by1pJiYobj1pLHI9byxyPlIuUEkmJihyPXItUi5UV09fUEkpLG4+Ui5QSSYmKG49bi1SLlRXT19QSSkpLHAoZSk/KGUud2VzdD1uLGUuc291dGg9cyxlLmVhc3Q9cixlLm5vcnRoPXUsZSk6bmV3IE4obixzLHIsdSl9LE4uZnJvbUNhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKHQsZSxuKXtoLmRlZmluZWQoImNhcnRlc2lhbnMiLHQpLGU9RihlLGouV0dTODQpO2xldCByPU51bWJlci5NQVhfVkFMVUUsaT0tTnVtYmVyLk1BWF9WQUxVRSxvPU51bWJlci5NQVhfVkFMVUUscz0tTnVtYmVyLk1BWF9WQUxVRSx1PU51bWJlci5NQVhfVkFMVUUsYT0tTnVtYmVyLk1BWF9WQUxVRTtmb3IobGV0IGw9MCxkPXQubGVuZ3RoO2w8ZDtsKyspe2NvbnN0IF89ZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W2xdKTtyPU1hdGgubWluKHIsXy5sb25naXR1ZGUpLGk9TWF0aC5tYXgoaSxfLmxvbmdpdHVkZSksdT1NYXRoLm1pbih1LF8ubGF0aXR1ZGUpLGE9TWF0aC5tYXgoYSxfLmxhdGl0dWRlKTtjb25zdCBPPV8ubG9uZ2l0dWRlPj0wP18ubG9uZ2l0dWRlOl8ubG9uZ2l0dWRlK1IuVFdPX1BJO289TWF0aC5taW4obyxPKSxzPU1hdGgubWF4KHMsTyl9cmV0dXJuIGktcj5zLW8mJihyPW8saT1zLGk+Ui5QSSYmKGk9aS1SLlRXT19QSSkscj5SLlBJJiYocj1yLVIuVFdPX1BJKSkscChuKT8obi53ZXN0PXIsbi5zb3V0aD11LG4uZWFzdD1pLG4ubm9ydGg9YSxuKTpuZXcgTihyLHUsaSxhKX0sTi5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUud2VzdD10Lndlc3QsZS5zb3V0aD10LnNvdXRoLGUuZWFzdD10LmVhc3QsZS5ub3J0aD10Lm5vcnRoLGUpOm5ldyBOKHQud2VzdCx0LnNvdXRoLHQuZWFzdCx0Lm5vcnRoKX0sTi5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbj1GKG4sMCksdD09PWV8fHAodCkmJnAoZSkmJk1hdGguYWJzKHQud2VzdC1lLndlc3QpPD1uJiZNYXRoLmFicyh0LnNvdXRoLWUuc291dGgpPD1uJiZNYXRoLmFicyh0LmVhc3QtZS5lYXN0KTw9biYmTWF0aC5hYnModC5ub3J0aC1lLm5vcnRoKTw9bn0sTi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIE4uY2xvbmUodGhpcyx0KX0sTi5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBOLmVxdWFscyh0aGlzLHQpfSxOLmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmdC53ZXN0PT09ZS53ZXN0JiZ0LnNvdXRoPT09ZS5zb3V0aCYmdC5lYXN0PT09ZS5lYXN0JiZ0Lm5vcnRoPT09ZS5ub3J0aH0sTi5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUpe3JldHVybiBOLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfSxOLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtjb25zdCBlPXQubm9ydGg7aC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoIixlLC1SLlBJX09WRVJfVFdPKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGgiLGUsUi5QSV9PVkVSX1RXTyk7Y29uc3Qgbj10LnNvdXRoO2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJzb3V0aCIsbiwtUi5QSV9PVkVSX1RXTyksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoInNvdXRoIixuLFIuUElfT1ZFUl9UV08pO2NvbnN0IHI9dC53ZXN0O2gudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ3ZXN0IixyLC1NYXRoLlBJKSxoLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygid2VzdCIscixNYXRoLlBJKTtjb25zdCBpPXQuZWFzdDtoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiZWFzdCIsaSwtTWF0aC5QSSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoImVhc3QiLGksTWF0aC5QSSl9LE4uc291dGh3ZXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10Lndlc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC53ZXN0LHQuc291dGgpfSxOLm5vcnRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5ub3J0aCxlLmhlaWdodD0wLGUpOm5ldyBIKHQud2VzdCx0Lm5vcnRoKX0sTi5ub3J0aGVhc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHAoZSk/KGUubG9uZ2l0dWRlPXQuZWFzdCxlLmxhdGl0dWRlPXQubm9ydGgsZS5oZWlnaHQ9MCxlKTpuZXcgSCh0LmVhc3QsdC5ub3J0aCl9LE4uc291dGhlYXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGgudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10LmVhc3QsZS5sYXRpdHVkZT10LnNvdXRoLGUuaGVpZ2h0PTAsZSk6bmV3IEgodC5lYXN0LHQuc291dGgpfSxOLmNlbnRlcj1mdW5jdGlvbih0LGUpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtsZXQgbj10LmVhc3Q7Y29uc3Qgcj10Lndlc3Q7bjxyJiYobis9Ui5UV09fUEkpO2NvbnN0IGk9Ui5uZWdhdGl2ZVBpVG9QaSgocituKSouNSksbz0odC5zb3V0aCt0Lm5vcnRoKSouNTtyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9aSxlLmxhdGl0dWRlPW8sZS5oZWlnaHQ9MCxlKTpuZXcgSChpLG8pfSxOLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2xldCByPXQuZWFzdCxpPXQud2VzdCxvPWUuZWFzdCxzPWUud2VzdDtyPGkmJm8+MD9yKz1SLlRXT19QSTpvPHMmJnI+MCYmKG8rPVIuVFdPX1BJKSxyPGkmJnM8MD9zKz1SLlRXT19QSTpvPHMmJmk8MCYmKGkrPVIuVFdPX1BJKTtjb25zdCB1PVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgoaSxzKSksYT1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWluKHIsbykpO2lmKCh0Lndlc3Q8dC5lYXN0fHxlLndlc3Q8ZS5lYXN0KSYmYTw9dSlyZXR1cm47Y29uc3QgbD1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLGQ9TWF0aC5taW4odC5ub3J0aCxlLm5vcnRoKTtpZighKGw+PWQpKXJldHVybiBwKG4pPyhuLndlc3Q9dSxuLnNvdXRoPWwsbi5lYXN0PWEsbi5ub3J0aD1kLG4pOm5ldyBOKHUsbCxhLGQpfSxOLnNpbXBsZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7aC50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLGgudHlwZU9mLm9iamVjdCgib3RoZXJSZWN0YW5nbGUiLGUpO2NvbnN0IHI9TWF0aC5tYXgodC53ZXN0LGUud2VzdCksaT1NYXRoLm1heCh0LnNvdXRoLGUuc291dGgpLG89TWF0aC5taW4odC5lYXN0LGUuZWFzdCkscz1NYXRoLm1pbih0Lm5vcnRoLGUubm9ydGgpO2lmKCEoaT49c3x8cj49bykpcmV0dXJuIHAobik/KG4ud2VzdD1yLG4uc291dGg9aSxuLmVhc3Q9byxuLm5vcnRoPXMsbik6bmV3IE4ocixpLG8scyl9LE4udW5pb249ZnVuY3Rpb24odCxlLG4pe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxoLnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKSxwKG4pfHwobj1uZXcgTik7bGV0IHI9dC5lYXN0LGk9dC53ZXN0LG89ZS5lYXN0LHM9ZS53ZXN0O3I8aSYmbz4wP3IrPVIuVFdPX1BJOm88cyYmcj4wJiYobys9Ui5UV09fUEkpLHI8aSYmczwwP3MrPVIuVFdPX1BJOm88cyYmaTwwJiYoaSs9Ui5UV09fUEkpO2NvbnN0IHU9Ui5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihpLHMpKSxhPVIubmVnYXRpdmVQaVRvUGkoTWF0aC5tYXgocixvKSk7cmV0dXJuIG4ud2VzdD11LG4uc291dGg9TWF0aC5taW4odC5zb3V0aCxlLnNvdXRoKSxuLmVhc3Q9YSxuLm5vcnRoPU1hdGgubWF4KHQubm9ydGgsZS5ub3J0aCksbn0sTi5leHBhbmQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpLHAobil8fChuPW5ldyBOKSxuLndlc3Q9TWF0aC5taW4odC53ZXN0LGUubG9uZ2l0dWRlKSxuLnNvdXRoPU1hdGgubWluKHQuc291dGgsZS5sYXRpdHVkZSksbi5lYXN0PU1hdGgubWF4KHQuZWFzdCxlLmxvbmdpdHVkZSksbi5ub3J0aD1NYXRoLm1heCh0Lm5vcnRoLGUubGF0aXR1ZGUpLG59LE4uY29udGFpbnM9ZnVuY3Rpb24odCxlKXtoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLGUpO2xldCBuPWUubG9uZ2l0dWRlO2NvbnN0IHI9ZS5sYXRpdHVkZSxpPXQud2VzdDtsZXQgbz10LmVhc3Q7cmV0dXJuIG88aSYmKG8rPVIuVFdPX1BJLG48MCYmKG4rPVIuVFdPX1BJKSksKG4+aXx8Ui5lcXVhbHNFcHNpbG9uKG4saSxSLkVQU0lMT04xNCkpJiYobjxvfHxSLmVxdWFsc0Vwc2lsb24obixvLFIuRVBTSUxPTjE0KSkmJnI+PXQuc291dGgmJnI8PXQubm9ydGh9O2NvbnN0IEZvPW5ldyBIO04uc3Vic2FtcGxlPWZ1bmN0aW9uKHQsZSxuLHIpe2gudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxlPUYoZSxqLldHUzg0KSxuPUYobiwwKSxwKHIpfHwocj1bXSk7bGV0IGk9MDtjb25zdCBvPXQubm9ydGgscz10LnNvdXRoLHU9dC5lYXN0LGE9dC53ZXN0LGw9Rm87bC5oZWlnaHQ9bixsLmxvbmdpdHVkZT1hLGwubGF0aXR1ZGU9byxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sYXRpdHVkZT1zLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxsLmxvbmdpdHVkZT1hLHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyxvPDA/bC5sYXRpdHVkZT1vOnM+MD9sLmxhdGl0dWRlPXM6bC5sYXRpdHVkZT0wO2ZvcihsZXQgZD0xO2Q8ODsrK2QpbC5sb25naXR1ZGU9LU1hdGguUEkrZCpSLlBJX09WRVJfVFdPLE4uY29udGFpbnModCxsKSYmKHJbaV09ZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbihsLHJbaV0pLGkrKyk7cmV0dXJuIGwubGF0aXR1ZGU9PT0wJiYobC5sb25naXR1ZGU9YSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyssbC5sb25naXR1ZGU9dSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4obCxyW2ldKSxpKyspLHIubGVuZ3RoPWkscn0sTi5zdWJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXtpZihoLnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGhMZXJwIixuLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4sMSksaC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImVhc3RMZXJwIixyLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0TGVycCIsciwxKSxoLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygibm9ydGhMZXJwIixpLDApLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJub3J0aExlcnAiLGksMSksaC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3RMZXJwIixlLHIpLGgudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aExlcnAiLG4saSkscChvKXx8KG89bmV3IE4pLHQud2VzdDw9dC5lYXN0KXtjb25zdCB1PXQuZWFzdC10Lndlc3Q7by53ZXN0PXQud2VzdCtlKnUsby5lYXN0PXQud2VzdCtyKnV9ZWxzZXtjb25zdCB1PVIuVFdPX1BJK3QuZWFzdC10Lndlc3Q7by53ZXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K2UqdSksby5lYXN0PVIubmVnYXRpdmVQaVRvUGkodC53ZXN0K3IqdSl9Y29uc3Qgcz10Lm5vcnRoLXQuc291dGg7cmV0dXJuIG8uc291dGg9dC5zb3V0aCtuKnMsby5ub3J0aD10LnNvdXRoK2kqcyxlPT09MSYmKG8ud2VzdD10LmVhc3QpLHI9PT0xJiYoby5lYXN0PXQuZWFzdCksbj09PTEmJihvLnNvdXRoPXQubm9ydGgpLGk9PT0xJiYoby5ub3J0aD10Lm5vcnRoKSxvfSxOLk1BWF9WQUxVRT1PYmplY3QuZnJlZXplKG5ldyBOKC1NYXRoLlBJLC1SLlBJX09WRVJfVFdPLE1hdGguUEksUi5QSV9PVkVSX1RXTykpO3ZhciBTcj1PYmplY3QuZnJlZXplKHtERVBUSF9CVUZGRVJfQklUOjI1NixTVEVOQ0lMX0JVRkZFUl9CSVQ6MTAyNCxDT0xPUl9CVUZGRVJfQklUOjE2Mzg0LFBPSU5UUzowLExJTkVTOjEsTElORV9MT09QOjIsTElORV9TVFJJUDozLFRSSUFOR0xFUzo0LFRSSUFOR0xFX1NUUklQOjUsVFJJQU5HTEVfRkFOOjYsWkVSTzowLE9ORToxLFNSQ19DT0xPUjo3NjgsT05FX01JTlVTX1NSQ19DT0xPUjo3NjksU1JDX0FMUEhBOjc3MCxPTkVfTUlOVVNfU1JDX0FMUEhBOjc3MSxEU1RfQUxQSEE6NzcyLE9ORV9NSU5VU19EU1RfQUxQSEE6NzczLERTVF9DT0xPUjo3NzQsT05FX01JTlVTX0RTVF9DT0xPUjo3NzUsU1JDX0FMUEhBX1NBVFVSQVRFOjc3NixGVU5DX0FERDozMjc3NCxCTEVORF9FUVVBVElPTjozMjc3NyxCTEVORF9FUVVBVElPTl9SR0I6MzI3NzcsQkxFTkRfRVFVQVRJT05fQUxQSEE6MzQ4NzcsRlVOQ19TVUJUUkFDVDozMjc3OCxGVU5DX1JFVkVSU0VfU1VCVFJBQ1Q6MzI3NzksQkxFTkRfRFNUX1JHQjozMjk2OCxCTEVORF9TUkNfUkdCOjMyOTY5LEJMRU5EX0RTVF9BTFBIQTozMjk3MCxCTEVORF9TUkNfQUxQSEE6MzI5NzEsQ09OU1RBTlRfQ09MT1I6MzI3NjksT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOjMyNzcwLENPTlNUQU5UX0FMUEhBOjMyNzcxLE9ORV9NSU5VU19DT05TVEFOVF9BTFBIQTozMjc3MixCTEVORF9DT0xPUjozMjc3MyxBUlJBWV9CVUZGRVI6MzQ5NjIsRUxFTUVOVF9BUlJBWV9CVUZGRVI6MzQ5NjMsQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjQsRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORzozNDk2NSxTVFJFQU1fRFJBVzozNTA0MCxTVEFUSUNfRFJBVzozNTA0NCxEWU5BTUlDX0RSQVc6MzUwNDgsQlVGRkVSX1NJWkU6MzQ2NjAsQlVGRkVSX1VTQUdFOjM0NjYxLENVUlJFTlRfVkVSVEVYX0FUVFJJQjozNDM0MixGUk9OVDoxMDI4LEJBQ0s6MTAyOSxGUk9OVF9BTkRfQkFDSzoxMDMyLENVTExfRkFDRToyODg0LEJMRU5EOjMwNDIsRElUSEVSOjMwMjQsU1RFTkNJTF9URVNUOjI5NjAsREVQVEhfVEVTVDoyOTI5LFNDSVNTT1JfVEVTVDozMDg5LFBPTFlHT05fT0ZGU0VUX0ZJTEw6MzI4MjMsU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOjMyOTI2LFNBTVBMRV9DT1ZFUkFHRTozMjkyOCxOT19FUlJPUjowLElOVkFMSURfRU5VTToxMjgwLElOVkFMSURfVkFMVUU6MTI4MSxJTlZBTElEX09QRVJBVElPTjoxMjgyLE9VVF9PRl9NRU1PUlk6MTI4NSxDVzoyMzA0LENDVzoyMzA1LExJTkVfV0lEVEg6Mjg0OSxBTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6MzM5MDEsQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOjMzOTAyLENVTExfRkFDRV9NT0RFOjI4ODUsRlJPTlRfRkFDRToyODg2LERFUFRIX1JBTkdFOjI5MjgsREVQVEhfV1JJVEVNQVNLOjI5MzAsREVQVEhfQ0xFQVJfVkFMVUU6MjkzMSxERVBUSF9GVU5DOjI5MzIsU1RFTkNJTF9DTEVBUl9WQUxVRToyOTYxLFNURU5DSUxfRlVOQzoyOTYyLFNURU5DSUxfRkFJTDoyOTY0LFNURU5DSUxfUEFTU19ERVBUSF9GQUlMOjI5NjUsU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1M6Mjk2NixTVEVOQ0lMX1JFRjoyOTY3LFNURU5DSUxfVkFMVUVfTUFTSzoyOTYzLFNURU5DSUxfV1JJVEVNQVNLOjI5NjgsU1RFTkNJTF9CQUNLX0ZVTkM6MzQ4MTYsU1RFTkNJTF9CQUNLX0ZBSUw6MzQ4MTcsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTDozNDgxOCxTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTOjM0ODE5LFNURU5DSUxfQkFDS19SRUY6MzYwMDMsU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0s6MzYwMDQsU1RFTkNJTF9CQUNLX1dSSVRFTUFTSzozNjAwNSxWSUVXUE9SVDoyOTc4LFNDSVNTT1JfQk9YOjMwODgsQ09MT1JfQ0xFQVJfVkFMVUU6MzEwNixDT0xPUl9XUklURU1BU0s6MzEwNyxVTlBBQ0tfQUxJR05NRU5UOjMzMTcsUEFDS19BTElHTk1FTlQ6MzMzMyxNQVhfVEVYVFVSRV9TSVpFOjMzNzksTUFYX1ZJRVdQT1JUX0RJTVM6MzM4NixTVUJQSVhFTF9CSVRTOjM0MDgsUkVEX0JJVFM6MzQxMCxHUkVFTl9CSVRTOjM0MTEsQkxVRV9CSVRTOjM0MTIsQUxQSEFfQklUUzozNDEzLERFUFRIX0JJVFM6MzQxNCxTVEVOQ0lMX0JJVFM6MzQxNSxQT0xZR09OX09GRlNFVF9VTklUUzoxMDc1MixQT0xZR09OX09GRlNFVF9GQUNUT1I6MzI4MjQsVEVYVFVSRV9CSU5ESU5HXzJEOjMyODczLFNBTVBMRV9CVUZGRVJTOjMyOTM2LFNBTVBMRVM6MzI5MzcsU0FNUExFX0NPVkVSQUdFX1ZBTFVFOjMyOTM4LFNBTVBMRV9DT1ZFUkFHRV9JTlZFUlQ6MzI5MzksQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6MzQ0NjcsRE9OVF9DQVJFOjQzNTIsRkFTVEVTVDo0MzUzLE5JQ0VTVDo0MzU0LEdFTkVSQVRFX01JUE1BUF9ISU5UOjMzMTcwLEJZVEU6NTEyMCxVTlNJR05FRF9CWVRFOjUxMjEsU0hPUlQ6NTEyMixVTlNJR05FRF9TSE9SVDo1MTIzLElOVDo1MTI0LFVOU0lHTkVEX0lOVDo1MTI1LEZMT0FUOjUxMjYsREVQVEhfQ09NUE9ORU5UOjY0MDIsQUxQSEE6NjQwNixSR0I6NjQwNyxSR0JBOjY0MDgsTFVNSU5BTkNFOjY0MDksTFVNSU5BTkNFX0FMUEhBOjY0MTAsVU5TSUdORURfU0hPUlRfNF80XzRfNDozMjgxOSxVTlNJR05FRF9TSE9SVF81XzVfNV8xOjMyODIwLFVOU0lHTkVEX1NIT1JUXzVfNl81OjMzNjM1LEZSQUdNRU5UX1NIQURFUjozNTYzMixWRVJURVhfU0hBREVSOjM1NjMzLE1BWF9WRVJURVhfQVRUUklCUzozNDkyMSxNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzozNjM0NyxNQVhfVkFSWUlOR19WRUNUT1JTOjM2MzQ4LE1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOjM1NjYxLE1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MCxNQVhfVEVYVFVSRV9JTUFHRV9VTklUUzozNDkzMCxNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTOjM2MzQ5LFNIQURFUl9UWVBFOjM1NjYzLERFTEVURV9TVEFUVVM6MzU3MTIsTElOS19TVEFUVVM6MzU3MTQsVkFMSURBVEVfU1RBVFVTOjM1NzE1LEFUVEFDSEVEX1NIQURFUlM6MzU3MTcsQUNUSVZFX1VOSUZPUk1TOjM1NzE4LEFDVElWRV9BVFRSSUJVVEVTOjM1NzIxLFNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjozNTcyNCxDVVJSRU5UX1BST0dSQU06MzU3MjUsTkVWRVI6NTEyLExFU1M6NTEzLEVRVUFMOjUxNCxMRVFVQUw6NTE1LEdSRUFURVI6NTE2LE5PVEVRVUFMOjUxNyxHRVFVQUw6NTE4LEFMV0FZUzo1MTksS0VFUDo3NjgwLFJFUExBQ0U6NzY4MSxJTkNSOjc2ODIsREVDUjo3NjgzLElOVkVSVDo1Mzg2LElOQ1JfV1JBUDozNDA1NSxERUNSX1dSQVA6MzQwNTYsVkVORE9SOjc5MzYsUkVOREVSRVI6NzkzNyxWRVJTSU9OOjc5MzgsTkVBUkVTVDo5NzI4LExJTkVBUjo5NzI5LE5FQVJFU1RfTUlQTUFQX05FQVJFU1Q6OTk4NCxMSU5FQVJfTUlQTUFQX05FQVJFU1Q6OTk4NSxORUFSRVNUX01JUE1BUF9MSU5FQVI6OTk4NixMSU5FQVJfTUlQTUFQX0xJTkVBUjo5OTg3LFRFWFRVUkVfTUFHX0ZJTFRFUjoxMDI0MCxURVhUVVJFX01JTl9GSUxURVI6MTAyNDEsVEVYVFVSRV9XUkFQX1M6MTAyNDIsVEVYVFVSRV9XUkFQX1Q6MTAyNDMsVEVYVFVSRV8yRDozNTUzLFRFWFRVUkU6NTg5MCxURVhUVVJFX0NVQkVfTUFQOjM0MDY3LFRFWFRVUkVfQklORElOR19DVUJFX01BUDozNDA2OCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1g6MzQwNjksVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOjM0MDcwLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWTozNDA3MSxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1k6MzQwNzIsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aOjM0MDczLFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjozNDA3NCxNQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOjM0MDc2LFRFWFRVUkUwOjMzOTg0LFRFWFRVUkUxOjMzOTg1LFRFWFRVUkUyOjMzOTg2LFRFWFRVUkUzOjMzOTg3LFRFWFRVUkU0OjMzOTg4LFRFWFRVUkU1OjMzOTg5LFRFWFRVUkU2OjMzOTkwLFRFWFRVUkU3OjMzOTkxLFRFWFRVUkU4OjMzOTkyLFRFWFRVUkU5OjMzOTkzLFRFWFRVUkUxMDozMzk5NCxURVhUVVJFMTE6MzM5OTUsVEVYVFVSRTEyOjMzOTk2LFRFWFRVUkUxMzozMzk5NyxURVhUVVJFMTQ6MzM5OTgsVEVYVFVSRTE1OjMzOTk5LFRFWFRVUkUxNjozNGUzLFRFWFRVUkUxNzozNDAwMSxURVhUVVJFMTg6MzQwMDIsVEVYVFVSRTE5OjM0MDAzLFRFWFRVUkUyMDozNDAwNCxURVhUVVJFMjE6MzQwMDUsVEVYVFVSRTIyOjM0MDA2LFRFWFRVUkUyMzozNDAwNyxURVhUVVJFMjQ6MzQwMDgsVEVYVFVSRTI1OjM0MDA5LFRFWFRVUkUyNjozNDAxMCxURVhUVVJFMjc6MzQwMTEsVEVYVFVSRTI4OjM0MDEyLFRFWFRVUkUyOTozNDAxMyxURVhUVVJFMzA6MzQwMTQsVEVYVFVSRTMxOjM0MDE1LEFDVElWRV9URVhUVVJFOjM0MDE2LFJFUEVBVDoxMDQ5NyxDTEFNUF9UT19FREdFOjMzMDcxLE1JUlJPUkVEX1JFUEVBVDozMzY0OCxGTE9BVF9WRUMyOjM1NjY0LEZMT0FUX1ZFQzM6MzU2NjUsRkxPQVRfVkVDNDozNTY2NixJTlRfVkVDMjozNTY2NyxJTlRfVkVDMzozNTY2OCxJTlRfVkVDNDozNTY2OSxCT09MOjM1NjcwLEJPT0xfVkVDMjozNTY3MSxCT09MX1ZFQzM6MzU2NzIsQk9PTF9WRUM0OjM1NjczLEZMT0FUX01BVDI6MzU2NzQsRkxPQVRfTUFUMzozNTY3NSxGTE9BVF9NQVQ0OjM1Njc2LFNBTVBMRVJfMkQ6MzU2NzgsU0FNUExFUl9DVUJFOjM1NjgwLFZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDozNDMzOCxWRVJURVhfQVRUUklCX0FSUkFZX1NJWkU6MzQzMzksVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREU6MzQzNDAsVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFOjM0MzQxLFZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDozNDkyMixWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVI6MzQzNzMsVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORzozNDk3NSxJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6MzU3MzgsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6MzU3MzksQ09NUElMRV9TVEFUVVM6MzU3MTMsTE9XX0ZMT0FUOjM2MzM2LE1FRElVTV9GTE9BVDozNjMzNyxISUdIX0ZMT0FUOjM2MzM4LExPV19JTlQ6MzYzMzksTUVESVVNX0lOVDozNjM0MCxISUdIX0lOVDozNjM0MSxGUkFNRUJVRkZFUjozNjE2MCxSRU5ERVJCVUZGRVI6MzYxNjEsUkdCQTQ6MzI4NTQsUkdCNV9BMTozMjg1NSxSR0I1NjU6MzYxOTQsREVQVEhfQ09NUE9ORU5UMTY6MzMxODksU1RFTkNJTF9JTkRFWDo2NDAxLFNURU5DSUxfSU5ERVg4OjM2MTY4LERFUFRIX1NURU5DSUw6MzQwNDEsUkVOREVSQlVGRkVSX1dJRFRIOjM2MTYyLFJFTkRFUkJVRkZFUl9IRUlHSFQ6MzYxNjMsUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVDozNjE2NCxSRU5ERVJCVUZGRVJfUkVEX1NJWkU6MzYxNzYsUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU6MzYxNzcsUkVOREVSQlVGRkVSX0JMVUVfU0laRTozNjE3OCxSRU5ERVJCVUZGRVJfQUxQSEFfU0laRTozNjE3OSxSRU5ERVJCVUZGRVJfREVQVEhfU0laRTozNjE4MCxSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFOjM2MTgxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6MzYwNDgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRTozNjA0OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUw6MzYwNTAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6MzYwNTEsQ09MT1JfQVRUQUNITUVOVDA6MzYwNjQsREVQVEhfQVRUQUNITUVOVDozNjA5NixTVEVOQ0lMX0FUVEFDSE1FTlQ6MzYxMjgsREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOjMzMzA2LE5PTkU6MCxGUkFNRUJVRkZFUl9DT01QTEVURTozNjA1MyxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQ6MzYwNTQsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6MzYwNTUsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOjM2MDU3LEZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOjM2MDYxLEZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVOREVSQlVGRkVSX0JJTkRJTkc6MzYwMDcsTUFYX1JFTkRFUkJVRkZFUl9TSVpFOjM0MDI0LElOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOjEyODYsVU5QQUNLX0ZMSVBfWV9XRUJHTDozNzQ0MCxVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6Mzc0NDEsQ09OVEVYVF9MT1NUX1dFQkdMOjM3NDQyLFVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0w6Mzc0NDMsQlJPV1NFUl9ERUZBVUxUX1dFQkdMOjM3NDQ0LENPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ6MzM3NzYsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6MzM3NzcsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6MzM3NzgsQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6MzM3NzksQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRzozNTg0MCxDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOjM1ODQxLENPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HOjM1ODQyLENPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOjM1ODQzLENPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9XRUJHTDozNzgwOCxDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOjM2MTk2LENPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNOjM2NDkyLEhBTEZfRkxPQVRfT0VTOjM2MTkzLERPVUJMRTo1MTMwLFJFQURfQlVGRkVSOjMwNzQsVU5QQUNLX1JPV19MRU5HVEg6MzMxNCxVTlBBQ0tfU0tJUF9ST1dTOjMzMTUsVU5QQUNLX1NLSVBfUElYRUxTOjMzMTYsUEFDS19ST1dfTEVOR1RIOjMzMzAsUEFDS19TS0lQX1JPV1M6MzMzMSxQQUNLX1NLSVBfUElYRUxTOjMzMzIsQ09MT1I6NjE0NCxERVBUSDo2MTQ1LFNURU5DSUw6NjE0NixSRUQ6NjQwMyxSR0I4OjMyODQ5LFJHQkE4OjMyODU2LFJHQjEwX0EyOjMyODU3LFRFWFRVUkVfQklORElOR18zRDozMjg3NCxVTlBBQ0tfU0tJUF9JTUFHRVM6MzI4NzcsVU5QQUNLX0lNQUdFX0hFSUdIVDozMjg3OCxURVhUVVJFXzNEOjMyODc5LFRFWFRVUkVfV1JBUF9SOjMyODgyLE1BWF8zRF9URVhUVVJFX1NJWkU6MzI4ODMsVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWOjMzNjQwLE1BWF9FTEVNRU5UU19WRVJUSUNFUzozM2UzLE1BWF9FTEVNRU5UU19JTkRJQ0VTOjMzMDAxLFRFWFRVUkVfTUlOX0xPRDozMzA4MixURVhUVVJFX01BWF9MT0Q6MzMwODMsVEVYVFVSRV9CQVNFX0xFVkVMOjMzMDg0LFRFWFRVUkVfTUFYX0xFVkVMOjMzMDg1LE1JTjozMjc3NSxNQVg6MzI3NzYsREVQVEhfQ09NUE9ORU5UMjQ6MzMxOTAsTUFYX1RFWFRVUkVfTE9EX0JJQVM6MzQwNDUsVEVYVFVSRV9DT01QQVJFX01PREU6MzQ4OTIsVEVYVFVSRV9DT01QQVJFX0ZVTkM6MzQ4OTMsQ1VSUkVOVF9RVUVSWTozNDkxNyxRVUVSWV9SRVNVTFQ6MzQ5MTgsUVVFUllfUkVTVUxUX0FWQUlMQUJMRTozNDkxOSxTVFJFQU1fUkVBRDozNTA0MSxTVFJFQU1fQ09QWTozNTA0MixTVEFUSUNfUkVBRDozNTA0NSxTVEFUSUNfQ09QWTozNTA0NixEWU5BTUlDX1JFQUQ6MzUwNDksRFlOQU1JQ19DT1BZOjM1MDUwLE1BWF9EUkFXX0JVRkZFUlM6MzQ4NTIsRFJBV19CVUZGRVIwOjM0ODUzLERSQVdfQlVGRkVSMTozNDg1NCxEUkFXX0JVRkZFUjI6MzQ4NTUsRFJBV19CVUZGRVIzOjM0ODU2LERSQVdfQlVGRkVSNDozNDg1NyxEUkFXX0JVRkZFUjU6MzQ4NTgsRFJBV19CVUZGRVI2OjM0ODU5LERSQVdfQlVGRkVSNzozNDg2MCxEUkFXX0JVRkZFUjg6MzQ4NjEsRFJBV19CVUZGRVI5OjM0ODYyLERSQVdfQlVGRkVSMTA6MzQ4NjMsRFJBV19CVUZGRVIxMTozNDg2NCxEUkFXX0JVRkZFUjEyOjM0ODY1LERSQVdfQlVGRkVSMTM6MzQ4NjYsRFJBV19CVUZGRVIxNDozNDg2NyxEUkFXX0JVRkZFUjE1OjM0ODY4LE1BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTcsTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzU2NTgsU0FNUExFUl8zRDozNTY3OSxTQU1QTEVSXzJEX1NIQURPVzozNTY4MixGUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UOjM1NzIzLFBJWEVMX1BBQ0tfQlVGRkVSOjM1MDUxLFBJWEVMX1VOUEFDS19CVUZGRVI6MzUwNTIsUElYRUxfUEFDS19CVUZGRVJfQklORElORzozNTA1MyxQSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTUsRkxPQVRfTUFUMngzOjM1Njg1LEZMT0FUX01BVDJ4NDozNTY4NixGTE9BVF9NQVQzeDI6MzU2ODcsRkxPQVRfTUFUM3g0OjM1Njg4LEZMT0FUX01BVDR4MjozNTY4OSxGTE9BVF9NQVQ0eDM6MzU2OTAsU1JHQjozNTkwNCxTUkdCODozNTkwNSxTUkdCOF9BTFBIQTg6MzU5MDcsQ09NUEFSRV9SRUZfVE9fVEVYVFVSRTozNDg5NCxSR0JBMzJGOjM0ODM2LFJHQjMyRjozNDgzNyxSR0JBMTZGOjM0ODQyLFJHQjE2RjozNDg0MyxWRVJURVhfQVRUUklCX0FSUkFZX0lOVEVHRVI6MzUwNjksTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTOjM1MDcxLE1JTl9QUk9HUkFNX1RFWEVMX09GRlNFVDozNTA3NixNQVhfUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzcsTUFYX1ZBUllJTkdfQ09NUE9ORU5UUzozNTY1OSxURVhUVVJFXzJEX0FSUkFZOjM1ODY2LFRFWFRVUkVfQklORElOR18yRF9BUlJBWTozNTg2OSxSMTFGX0cxMUZfQjEwRjozNTg5OCxVTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWOjM1ODk5LFJHQjlfRTU6MzU5MDEsVU5TSUdORURfSU5UXzVfOV85XzlfUkVWOjM1OTAyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERTozNTk2NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0NPTVBPTkVOVFM6MzU5NjgsVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTOjM1OTcxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQ6MzU5NzIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFOjM1OTczLFRSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU46MzU5NzYsUkFTVEVSSVpFUl9ESVNDQVJEOjM1OTc3LE1BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfSU5URVJMRUFWRURfQ09NUE9ORU5UUzozNTk3OCxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlM6MzU5NzksSU5URVJMRUFWRURfQVRUUklCUzozNTk4MCxTRVBBUkFURV9BVFRSSUJTOjM1OTgxLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVI6MzU5ODIsVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HOjM1OTgzLFJHQkEzMlVJOjM2MjA4LFJHQjMyVUk6MzYyMDksUkdCQTE2VUk6MzYyMTQsUkdCMTZVSTozNjIxNSxSR0JBOFVJOjM2MjIwLFJHQjhVSTozNjIyMSxSR0JBMzJJOjM2MjI2LFJHQjMySTozNjIyNyxSR0JBMTZJOjM2MjMyLFJHQjE2STozNjIzMyxSR0JBOEk6MzYyMzgsUkdCOEk6MzYyMzksUkVEX0lOVEVHRVI6MzYyNDQsUkdCX0lOVEVHRVI6MzYyNDgsUkdCQV9JTlRFR0VSOjM2MjQ5LFNBTVBMRVJfMkRfQVJSQVk6MzYyODksU0FNUExFUl8yRF9BUlJBWV9TSEFET1c6MzYyOTIsU0FNUExFUl9DVUJFX1NIQURPVzozNjI5MyxVTlNJR05FRF9JTlRfVkVDMjozNjI5NCxVTlNJR05FRF9JTlRfVkVDMzozNjI5NSxVTlNJR05FRF9JTlRfVkVDNDozNjI5NixJTlRfU0FNUExFUl8yRDozNjI5OCxJTlRfU0FNUExFUl8zRDozNjI5OSxJTlRfU0FNUExFUl9DVUJFOjM2MzAwLElOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzAzLFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEOjM2MzA2LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzNEOjM2MzA3LFVOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkU6MzYzMDgsVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVk6MzYzMTEsREVQVEhfQ09NUE9ORU5UMzJGOjM2MDEyLERFUFRIMzJGX1NURU5DSUw4OjM2MDEzLEZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFVjozNjI2OSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HOjMzMjk2LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEU6MzMyOTcsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRTozMzI5OCxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0dSRUVOX1NJWkU6MzMyOTksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkU6MzMzMDAsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFOjMzMzAxLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfREVQVEhfU0laRTozMzMwMixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRTozMzMwMyxGUkFNRUJVRkZFUl9ERUZBVUxUOjMzMzA0LFVOU0lHTkVEX0lOVF8yNF84OjM0MDQyLERFUFRIMjRfU1RFTkNJTDg6MzUwNTYsVU5TSUdORURfTk9STUFMSVpFRDozNTg2MyxEUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMDYsUkVBRF9GUkFNRUJVRkZFUjozNjAwOCxEUkFXX0ZSQU1FQlVGRkVSOjM2MDA5LFJFQURfRlJBTUVCVUZGRVJfQklORElORzozNjAxMCxSRU5ERVJCVUZGRVJfU0FNUExFUzozNjAxMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVI6MzYwNTIsTUFYX0NPTE9SX0FUVEFDSE1FTlRTOjM2MDYzLENPTE9SX0FUVEFDSE1FTlQxOjM2MDY1LENPTE9SX0FUVEFDSE1FTlQyOjM2MDY2LENPTE9SX0FUVEFDSE1FTlQzOjM2MDY3LENPTE9SX0FUVEFDSE1FTlQ0OjM2MDY4LENPTE9SX0FUVEFDSE1FTlQ1OjM2MDY5LENPTE9SX0FUVEFDSE1FTlQ2OjM2MDcwLENPTE9SX0FUVEFDSE1FTlQ3OjM2MDcxLENPTE9SX0FUVEFDSE1FTlQ4OjM2MDcyLENPTE9SX0FUVEFDSE1FTlQ5OjM2MDczLENPTE9SX0FUVEFDSE1FTlQxMDozNjA3NCxDT0xPUl9BVFRBQ0hNRU5UMTE6MzYwNzUsQ09MT1JfQVRUQUNITUVOVDEyOjM2MDc2LENPTE9SX0FUVEFDSE1FTlQxMzozNjA3NyxDT0xPUl9BVFRBQ0hNRU5UMTQ6MzYwNzgsQ09MT1JfQVRUQUNITUVOVDE1OjM2MDc5LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEU6MzYxODIsTUFYX1NBTVBMRVM6MzYxODMsSEFMRl9GTE9BVDo1MTMxLFJHOjMzMzE5LFJHX0lOVEVHRVI6MzMzMjAsUjg6MzMzMjEsUkc4OjMzMzIzLFIxNkY6MzMzMjUsUjMyRjozMzMyNixSRzE2RjozMzMyNyxSRzMyRjozMzMyOCxSOEk6MzMzMjksUjhVSTozMzMzMCxSMTZJOjMzMzMxLFIxNlVJOjMzMzMyLFIzMkk6MzMzMzMsUjMyVUk6MzMzMzQsUkc4STozMzMzNSxSRzhVSTozMzMzNixSRzE2STozMzMzNyxSRzE2VUk6MzMzMzgsUkczMkk6MzMzMzksUkczMlVJOjMzMzQwLFZFUlRFWF9BUlJBWV9CSU5ESU5HOjM0MjI5LFI4X1NOT1JNOjM2NzU2LFJHOF9TTk9STTozNjc1NyxSR0I4X1NOT1JNOjM2NzU4LFJHQkE4X1NOT1JNOjM2NzU5LFNJR05FRF9OT1JNQUxJWkVEOjM2NzY0LENPUFlfUkVBRF9CVUZGRVI6MzY2NjIsQ09QWV9XUklURV9CVUZGRVI6MzY2NjMsQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSX0JJTkRJTkc6MzY2NjMsVU5JRk9STV9CVUZGRVI6MzUzNDUsVU5JRk9STV9CVUZGRVJfQklORElORzozNTM2OCxVTklGT1JNX0JVRkZFUl9TVEFSVDozNTM2OSxVTklGT1JNX0JVRkZFUl9TSVpFOjM1MzcwLE1BWF9WRVJURVhfVU5JRk9STV9CTE9DS1M6MzUzNzEsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQkxPQ0tTOjM1MzczLE1BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUzozNTM3NCxNQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1M6MzUzNzUsTUFYX1VOSUZPUk1fQkxPQ0tfU0laRTozNTM3NixNQVhfQ09NQklORURfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3NyxNQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1Mzc5LFVOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQ6MzUzODAsQUNUSVZFX1VOSUZPUk1fQkxPQ0tTOjM1MzgyLFVOSUZPUk1fVFlQRTozNTM4MyxVTklGT1JNX1NJWkU6MzUzODQsVU5JRk9STV9CTE9DS19JTkRFWDozNTM4NixVTklGT1JNX09GRlNFVDozNTM4NyxVTklGT1JNX0FSUkFZX1NUUklERTozNTM4OCxVTklGT1JNX01BVFJJWF9TVFJJREU6MzUzODksVU5JRk9STV9JU19ST1dfTUFKT1I6MzUzOTAsVU5JRk9STV9CTE9DS19CSU5ESU5HOjM1MzkxLFVOSUZPUk1fQkxPQ0tfREFUQV9TSVpFOjM1MzkyLFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TOjM1Mzk0LFVOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1fSU5ESUNFUzozNTM5NSxVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUjozNTM5NixVTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSOjM1Mzk4LElOVkFMSURfSU5ERVg6NDI5NDk2NzI5NSxNQVhfVkVSVEVYX09VVFBVVF9DT01QT05FTlRTOjM3MTU0LE1BWF9GUkFHTUVOVF9JTlBVVF9DT01QT05FTlRTOjM3MTU3LE1BWF9TRVJWRVJfV0FJVF9USU1FT1VUOjM3MTM3LE9CSkVDVF9UWVBFOjM3MTM4LFNZTkNfQ09ORElUSU9OOjM3MTM5LFNZTkNfU1RBVFVTOjM3MTQwLFNZTkNfRkxBR1M6MzcxNDEsU1lOQ19GRU5DRTozNzE0MixTWU5DX0dQVV9DT01NQU5EU19DT01QTEVURTozNzE0MyxVTlNJR05BTEVEOjM3MTQ0LFNJR05BTEVEOjM3MTQ1LEFMUkVBRFlfU0lHTkFMRUQ6MzcxNDYsVElNRU9VVF9FWFBJUkVEOjM3MTQ3LENPTkRJVElPTl9TQVRJU0ZJRUQ6MzcxNDgsV0FJVF9GQUlMRUQ6MzcxNDksU1lOQ19GTFVTSF9DT01NQU5EU19CSVQ6MSxWRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1I6MzUwNzAsQU5ZX1NBTVBMRVNfUEFTU0VEOjM1ODg3LEFOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkU6MzYyMDIsU0FNUExFUl9CSU5ESU5HOjM1MDk3LFJHQjEwX0EyVUk6MzY5NzUsSU5UXzJfMTBfMTBfMTBfUkVWOjM2MjU1LFRSQU5TRk9STV9GRUVEQkFDSzozNjM4NixUUkFOU0ZPUk1fRkVFREJBQ0tfUEFVU0VEOjM2Mzg3LFRSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkU6MzYzODgsVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkc6MzYzODksQ09NUFJFU1NFRF9SMTFfRUFDOjM3NDg4LENPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUM6Mzc0ODksQ09NUFJFU1NFRF9SRzExX0VBQzozNzQ5MCxDT01QUkVTU0VEX1NJR05FRF9SRzExX0VBQzozNzQ5MSxDT01QUkVTU0VEX1JHQjhfRVRDMjozNzQ5MixDT01QUkVTU0VEX1NSR0I4X0VUQzI6Mzc0OTMsQ09NUFJFU1NFRF9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NCxDT01QUkVTU0VEX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMjozNzQ5NSxDT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDOjM3NDk2LENPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDOjM3NDk3LFRFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVDozNzE2NyxNQVhfRUxFTUVOVF9JTkRFWDozNjIwMyxURVhUVVJFX0lNTVVUQUJMRV9MRVZFTFM6MzM1MDMsTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUOjM0MDQ3fSk7Y29uc3QgSmU9e0NMT0NLV0lTRTpTci5DVyxDT1VOVEVSX0NMT0NLV0lTRTpTci5DQ1d9O0plLnZhbGlkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09SmUuQ0xPQ0tXSVNFfHx0PT09SmUuQ09VTlRFUl9DTE9DS1dJU0V9O3ZhciBnbj1PYmplY3QuZnJlZXplKEplKTtmdW5jdGlvbiBBdCh0KXt0aGlzLl9lbGxpcHNvaWQ9Rih0LGouV0dTODQpLHRoaXMuX3NlbWltYWpvckF4aXM9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsdGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXM9MS90aGlzLl9zZW1pbWFqb3JBeGlzfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KSxBdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBSLlBJX09WRVJfVFdPLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10KSl9LEF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGU9ZnVuY3Rpb24odCl7dD5BdC5NYXhpbXVtTGF0aXR1ZGU/dD1BdC5NYXhpbXVtTGF0aXR1ZGU6dDwtQXQuTWF4aW11bUxhdGl0dWRlJiYodD0tQXQuTWF4aW11bUxhdGl0dWRlKTtjb25zdCBlPU1hdGguc2luKHQpO3JldHVybiAuNSpNYXRoLmxvZygoMStlKS8oMS1lKSl9LEF0Lk1heGltdW1MYXRpdHVkZT1BdC5tZXJjYXRvckFuZ2xlVG9HZW9kZXRpY0xhdGl0dWRlKE1hdGguUEkpLEF0LnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9zZW1pbWFqb3JBeGlzLHI9dC5sb25naXR1ZGUqbixpPUF0Lmdlb2RldGljTGF0aXR1ZGVUb01lcmNhdG9yQW5nbGUodC5sYXRpdHVkZSkqbixvPXQuaGVpZ2h0O3JldHVybiBwKGUpPyhlLng9cixlLnk9aSxlLno9byxlKTpuZXcgZihyLGksbyl9LEF0LnByb3RvdHlwZS51bnByb2plY3Q9ZnVuY3Rpb24odCxlKXtpZighcCh0KSl0aHJvdyBuZXcgeCgiY2FydGVzaWFuIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxyPXQueCpuLGk9QXQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZSh0Lnkqbiksbz10Lno7cmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPXIsZS5sYXRpdHVkZT1pLGUuaGVpZ2h0PW8sZSk6bmV3IEgocixpLG8pfTtjbGFzcyB3b3thZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19Y2xhc3MgSW97Y29uc3RydWN0b3IoZSl7dGhpcy5qc2VwPWUsdGhpcy5yZWdpc3RlcmVkPXt9fXJlZ2lzdGVyKC4uLmUpe2UuZm9yRWFjaChuPT57aWYodHlwZW9mIG4hPSJvYmplY3QifHwhbi5uYW1lfHwhbi5pbml0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBKU0VQIHBsdWdpbiBmb3JtYXQiKTt0aGlzLnJlZ2lzdGVyZWRbbi5uYW1lXXx8KG4uaW5pdCh0aGlzLmpzZXApLHRoaXMucmVnaXN0ZXJlZFtuLm5hbWVdPW4pfSl9fWNsYXNzIEV7c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjEuMy44In1zdGF0aWMgdG9TdHJpbmcoKXtyZXR1cm4iSmF2YVNjcmlwdCBFeHByZXNzaW9uIFBhcnNlciAoSlNFUCkgdiIrRS52ZXJzaW9ufXN0YXRpYyBhZGRVbmFyeU9wKGUpe3JldHVybiBFLm1heF91bm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF91bm9wX2xlbiksRS51bmFyeV9vcHNbZV09MSxFfXN0YXRpYyBhZGRCaW5hcnlPcChlLG4scil7cmV0dXJuIEUubWF4X2Jpbm9wX2xlbj1NYXRoLm1heChlLmxlbmd0aCxFLm1heF9iaW5vcF9sZW4pLEUuYmluYXJ5X29wc1tlXT1uLHI/RS5yaWdodF9hc3NvY2lhdGl2ZS5hZGQoZSk6RS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSksRX1zdGF0aWMgYWRkSWRlbnRpZmllckNoYXIoZSl7cmV0dXJuIEUuYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzLmFkZChlKSxFfXN0YXRpYyBhZGRMaXRlcmFsKGUsbil7cmV0dXJuIEUubGl0ZXJhbHNbZV09bixFfXN0YXRpYyByZW1vdmVVbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS51bmFyeV9vcHNbZV0sZS5sZW5ndGg9PT1FLm1heF91bm9wX2xlbiYmKEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSksRX1zdGF0aWMgcmVtb3ZlQWxsVW5hcnlPcHMoKXtyZXR1cm4gRS51bmFyeV9vcHM9e30sRS5tYXhfdW5vcF9sZW49MCxFfXN0YXRpYyByZW1vdmVJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4gRS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUJpbmFyeU9wKGUpe3JldHVybiBkZWxldGUgRS5iaW5hcnlfb3BzW2VdLGUubGVuZ3RoPT09RS5tYXhfYmlub3BfbGVuJiYoRS5tYXhfYmlub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUuYmluYXJ5X29wcykpLEUucmlnaHRfYXNzb2NpYXRpdmUuZGVsZXRlKGUpLEV9c3RhdGljIHJlbW92ZUFsbEJpbmFyeU9wcygpe3JldHVybiBFLmJpbmFyeV9vcHM9e30sRS5tYXhfYmlub3BfbGVuPTAsRX1zdGF0aWMgcmVtb3ZlTGl0ZXJhbChlKXtyZXR1cm4gZGVsZXRlIEUubGl0ZXJhbHNbZV0sRX1zdGF0aWMgcmVtb3ZlQWxsTGl0ZXJhbHMoKXtyZXR1cm4gRS5saXRlcmFscz17fSxFfWdldCBjaGFyKCl7cmV0dXJuIHRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCl9Z2V0IGNvZGUoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCl9Y29uc3RydWN0b3IoZSl7dGhpcy5leHByPWUsdGhpcy5pbmRleD0wfXN0YXRpYyBwYXJzZShlKXtyZXR1cm4gbmV3IEUoZSkucGFyc2UoKX1zdGF0aWMgZ2V0TWF4S2V5TGVuKGUpe3JldHVybiBNYXRoLm1heCgwLC4uLk9iamVjdC5rZXlzKGUpLm1hcChuPT5uLmxlbmd0aCkpfXN0YXRpYyBpc0RlY2ltYWxEaWdpdChlKXtyZXR1cm4gZT49NDgmJmU8PTU3fXN0YXRpYyBiaW5hcnlQcmVjZWRlbmNlKGUpe3JldHVybiBFLmJpbmFyeV9vcHNbZV18fDB9c3RhdGljIGlzSWRlbnRpZmllclN0YXJ0KGUpe3JldHVybiBlPj02NSYmZTw9OTB8fGU+PTk3JiZlPD0xMjJ8fGU+PTEyOCYmIUUuYmluYXJ5X29wc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGUpXXx8RS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuaGFzKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfXN0YXRpYyBpc0lkZW50aWZpZXJQYXJ0KGUpe3JldHVybiBFLmlzSWRlbnRpZmllclN0YXJ0KGUpfHxFLmlzRGVjaW1hbERpZ2l0KGUpfXRocm93RXJyb3IoZSl7Y29uc3Qgbj1uZXcgRXJyb3IoZSsiIGF0IGNoYXJhY3RlciAiK3RoaXMuaW5kZXgpO3Rocm93IG4uaW5kZXg9dGhpcy5pbmRleCxuLmRlc2NyaXB0aW9uPWUsbn1ydW5Ib29rKGUsbil7aWYoRS5ob29rc1tlXSl7Y29uc3Qgcj17Y29udGV4dDp0aGlzLG5vZGU6bn07cmV0dXJuIEUuaG9va3MucnVuKGUsciksci5ub2RlfXJldHVybiBufXNlYXJjaEhvb2soZSl7aWYoRS5ob29rc1tlXSl7Y29uc3Qgbj17Y29udGV4dDp0aGlzfTtyZXR1cm4gRS5ob29rc1tlXS5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNhbGwobi5jb250ZXh0LG4pLG4ubm9kZX0pLG4ubm9kZX19Z29iYmxlU3BhY2VzKCl7bGV0IGU9dGhpcy5jb2RlO2Zvcig7ZT09PUUuU1BBQ0VfQ09ERXx8ZT09PUUuVEFCX0NPREV8fGU9PT1FLkxGX0NPREV8fGU9PT1FLkNSX0NPREU7KWU9dGhpcy5leHByLmNoYXJDb2RlQXQoKyt0aGlzLmluZGV4KTt0aGlzLnJ1bkhvb2soImdvYmJsZS1zcGFjZXMiKX1wYXJzZSgpe3RoaXMucnVuSG9vaygiYmVmb3JlLWFsbCIpO2NvbnN0IGU9dGhpcy5nb2JibGVFeHByZXNzaW9ucygpLG49ZS5sZW5ndGg9PT0xP2VbMF06e3R5cGU6RS5DT01QT1VORCxib2R5OmV9O3JldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLWFsbCIsbil9Z29iYmxlRXhwcmVzc2lvbnMoZSl7bGV0IG49W10scixpO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOylpZihyPXRoaXMuY29kZSxyPT09RS5TRU1DT0xfQ09ERXx8cj09PUUuQ09NTUFfQ09ERSl0aGlzLmluZGV4Kys7ZWxzZSBpZihpPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpKW4ucHVzaChpKTtlbHNlIGlmKHRoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCl7aWYocj09PWUpYnJlYWs7dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpfXJldHVybiBufWdvYmJsZUV4cHJlc3Npb24oKXtjb25zdCBlPXRoaXMuc2VhcmNoSG9vaygiZ29iYmxlLWV4cHJlc3Npb24iKXx8dGhpcy5nb2JibGVCaW5hcnlFeHByZXNzaW9uKCk7cmV0dXJuIHRoaXMuZ29iYmxlU3BhY2VzKCksdGhpcy5ydW5Ib29rKCJhZnRlci1leHByZXNzaW9uIixlKX1nb2JibGVCaW5hcnlPcCgpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IGU9dGhpcy5leHByLnN1YnN0cih0aGlzLmluZGV4LEUubWF4X2Jpbm9wX2xlbiksbj1lLmxlbmd0aDtmb3IoO24+MDspe2lmKEUuYmluYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShlKSYmKCFFLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrZS5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIUUuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K2UubGVuZ3RoKSkpKXJldHVybiB0aGlzLmluZGV4Kz1uLGU7ZT1lLnN1YnN0cigwLC0tbil9cmV0dXJuITF9Z29iYmxlQmluYXJ5RXhwcmVzc2lvbigpe2xldCBlLG4scixpLG8scyx1LGEsbDtpZihzPXRoaXMuZ29iYmxlVG9rZW4oKSwhc3x8KG49dGhpcy5nb2JibGVCaW5hcnlPcCgpLCFuKSlyZXR1cm4gcztmb3Iobz17dmFsdWU6bixwcmVjOkUuYmluYXJ5UHJlY2VkZW5jZShuKSxyaWdodF9hOkUucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSx1PXRoaXMuZ29iYmxlVG9rZW4oKSx1fHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24gYWZ0ZXIgIituKSxpPVtzLG8sdV07bj10aGlzLmdvYmJsZUJpbmFyeU9wKCk7KXtpZihyPUUuYmluYXJ5UHJlY2VkZW5jZShuKSxyPT09MCl7dGhpcy5pbmRleC09bi5sZW5ndGg7YnJlYWt9bz17dmFsdWU6bixwcmVjOnIscmlnaHRfYTpFLnJpZ2h0X2Fzc29jaWF0aXZlLmhhcyhuKX0sbD1uO2NvbnN0IGQ9Xz0+by5yaWdodF9hJiZfLnJpZ2h0X2E/cj5fLnByZWM6cjw9Xy5wcmVjO2Zvcig7aS5sZW5ndGg+MiYmZChpW2kubGVuZ3RoLTJdKTspdT1pLnBvcCgpLG49aS5wb3AoKS52YWx1ZSxzPWkucG9wKCksZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6bixsZWZ0OnMscmlnaHQ6dX0saS5wdXNoKGUpO2U9dGhpcy5nb2JibGVUb2tlbigpLGV8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK2wpLGkucHVzaChvLGUpfWZvcihhPWkubGVuZ3RoLTEsZT1pW2FdO2E+MTspZT17dHlwZTpFLkJJTkFSWV9FWFAsb3BlcmF0b3I6aVthLTFdLnZhbHVlLGxlZnQ6aVthLTJdLHJpZ2h0OmV9LGEtPTI7cmV0dXJuIGV9Z29iYmxlVG9rZW4oKXtsZXQgZSxuLHIsaTtpZih0aGlzLmdvYmJsZVNwYWNlcygpLGk9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtdG9rZW4iKSxpKXJldHVybiB0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIixpKTtpZihlPXRoaXMuY29kZSxFLmlzRGVjaW1hbERpZ2l0KGUpfHxlPT09RS5QRVJJT0RfQ09ERSlyZXR1cm4gdGhpcy5nb2JibGVOdW1lcmljTGl0ZXJhbCgpO2lmKGU9PT1FLlNRVU9URV9DT0RFfHxlPT09RS5EUVVPVEVfQ09ERSlpPXRoaXMuZ29iYmxlU3RyaW5nTGl0ZXJhbCgpO2Vsc2UgaWYoZT09PUUuT0JSQUNLX0NPREUpaT10aGlzLmdvYmJsZUFycmF5KCk7ZWxzZXtmb3Iobj10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgsRS5tYXhfdW5vcF9sZW4pLHI9bi5sZW5ndGg7cj4wOyl7aWYoRS51bmFyeV9vcHMuaGFzT3duUHJvcGVydHkobikmJighRS5pc0lkZW50aWZpZXJTdGFydCh0aGlzLmNvZGUpfHx0aGlzLmluZGV4K24ubGVuZ3RoPHRoaXMuZXhwci5sZW5ndGgmJiFFLmlzSWRlbnRpZmllclBhcnQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCtuLmxlbmd0aCkpKSl7dGhpcy5pbmRleCs9cjtjb25zdCBvPXRoaXMuZ29iYmxlVG9rZW4oKTtyZXR1cm4gb3x8dGhpcy50aHJvd0Vycm9yKCJtaXNzaW5nIHVuYXJ5T3AgYXJndW1lbnQiKSx0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIix7dHlwZTpFLlVOQVJZX0VYUCxvcGVyYXRvcjpuLGFyZ3VtZW50Om8scHJlZml4OiEwfSl9bj1uLnN1YnN0cigwLC0tcil9RS5pc0lkZW50aWZpZXJTdGFydChlKT8oaT10aGlzLmdvYmJsZUlkZW50aWZpZXIoKSxFLmxpdGVyYWxzLmhhc093blByb3BlcnR5KGkubmFtZSk/aT17dHlwZTpFLkxJVEVSQUwsdmFsdWU6RS5saXRlcmFsc1tpLm5hbWVdLHJhdzppLm5hbWV9OmkubmFtZT09PUUudGhpc19zdHImJihpPXt0eXBlOkUuVEhJU19FWFB9KSk6ZT09PUUuT1BBUkVOX0NPREUmJihpPXRoaXMuZ29iYmxlR3JvdXAoKSl9cmV0dXJuIGk/KGk9dGhpcy5nb2JibGVUb2tlblByb3BlcnR5KGkpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpKTp0aGlzLnJ1bkhvb2soImFmdGVyLXRva2VuIiwhMSl9Z29iYmxlVG9rZW5Qcm9wZXJ0eShlKXt0aGlzLmdvYmJsZVNwYWNlcygpO2xldCBuPXRoaXMuY29kZTtmb3IoO249PT1FLlBFUklPRF9DT0RFfHxuPT09RS5PQlJBQ0tfQ09ERXx8bj09PUUuT1BBUkVOX0NPREV8fG49PT1FLlFVTUFSS19DT0RFOyl7bGV0IHI7aWYobj09PUUuUVVNQVJLX0NPREUpe2lmKHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrMSkhPT1FLlBFUklPRF9DT0RFKWJyZWFrO3I9ITAsdGhpcy5pbmRleCs9Mix0aGlzLmdvYmJsZVNwYWNlcygpLG49dGhpcy5jb2RlfXRoaXMuaW5kZXgrKyxuPT09RS5PQlJBQ0tfQ09ERT8oZT17dHlwZTpFLk1FTUJFUl9FWFAsY29tcHV0ZWQ6ITAsb2JqZWN0OmUscHJvcGVydHk6dGhpcy5nb2JibGVFeHByZXNzaW9uKCl9LHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PUUuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PUUuT1BBUkVOX0NPREU/ZT17dHlwZTpFLkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT1FLlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6RS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDtFLmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT1FLlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7RS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUsRS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT1FLlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PUUuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6RS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOkUuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2ZvcihFLmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLEUuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTpFLklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT1FLkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09RS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PUUuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT1FLkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT1FLkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoRS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09RS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOkUuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTpFLkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNCUkFDS19DT0RFKX19fWNvbnN0IE5vPW5ldyB3bztPYmplY3QuYXNzaWduKEUse2hvb2tzOk5vLHBsdWdpbnM6bmV3IElvKEUpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiJiYiOjIsInwiOjMsIl4iOjQsIiYiOjUsIj09Ijo2LCIhPSI6NiwiPT09Ijo2LCIhPT0iOjYsIjwiOjcsIj4iOjcsIjw9Ijo3LCI+PSI6NywiPDwiOjgsIj4+Ijo4LCI+Pj4iOjgsIisiOjksIi0iOjksIioiOjEwLCIvIjoxMCwiJSI6MTB9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQsYWRkaXRpb25hbF9pZGVudGlmaWVyX2NoYXJzOm5ldyBTZXQoWyIkIiwiXyJdKSxsaXRlcmFsczp7dHJ1ZTohMCxmYWxzZTohMSxudWxsOm51bGx9LHRoaXNfc3RyOiJ0aGlzIn0pLEUubWF4X3Vub3BfbGVuPUUuZ2V0TWF4S2V5TGVuKEUudW5hcnlfb3BzKSxFLm1heF9iaW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS5iaW5hcnlfb3BzKTtjb25zdCBxdD10PT5uZXcgRSh0KS5wYXJzZSgpO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEUpLmZvckVhY2godD0+e3F0W3RdPT09dm9pZCAwJiZ0IT09InByb3RvdHlwZSImJihxdFt0XT1FW3RdKX0pLHF0LkpzZXA9RTtjb25zdCBNbz0iQ29uZGl0aW9uYWxFeHByZXNzaW9uIjt2YXIgQ289e25hbWU6InRlcm5hcnkiLGluaXQodCl7dC5ob29rcy5hZGQoImFmdGVyLWV4cHJlc3Npb24iLGZ1bmN0aW9uKG4pe2lmKG4ubm9kZSYmdGhpcy5jb2RlPT09dC5RVU1BUktfQ09ERSl7dGhpcy5pbmRleCsrO2NvbnN0IHI9bi5ub2RlLGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7aWYoaXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIiksdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLmNvZGU9PT10LkNPTE9OX0NPREUpe3RoaXMuaW5kZXgrKztjb25zdCBvPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpO2lmKG98fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiIpLG4ubm9kZT17dHlwZTpNbyx0ZXN0OnIsY29uc2VxdWVudDppLGFsdGVybmF0ZTpvfSxyLm9wZXJhdG9yJiZ0LmJpbmFyeV9vcHNbci5vcGVyYXRvcl08PS45KXtsZXQgcz1yO2Zvcig7cy5yaWdodC5vcGVyYXRvciYmdC5iaW5hcnlfb3BzW3MucmlnaHQub3BlcmF0b3JdPD0uOTspcz1zLnJpZ2h0O24ubm9kZS50ZXN0PXMucmlnaHQscy5yaWdodD1uLm5vZGUsbi5ub2RlPXJ9fWVsc2UgdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCA6Iil9fSl9fTtxdC5wbHVnaW5zLnJlZ2lzdGVyKENvKTtmdW5jdGlvbiBZdCh0KXtpZih0PUYodCxGLkVNUFRZX09CSkVDVCksdGhpcy5fZWxsaXBzb2lkPUYodC5lbGxpcHNvaWQsai5XR1M4NCksdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1g9Rih0Lm51bWJlck9mTGV2ZWxaZXJvVGlsZXNYLDEpLHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNZPUYodC5udW1iZXJPZkxldmVsWmVyb1RpbGVzWSwxKSx0aGlzLl9wcm9qZWN0aW9uPW5ldyBBdCh0aGlzLl9lbGxpcHNvaWQpLHAodC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycykmJnAodC5yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycykpdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnM9dC5yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycyx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz10LnJlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzO2Vsc2V7Y29uc3Qgcj10aGlzLl9lbGxpcHNvaWQubWF4aW11bVJhZGl1cypNYXRoLlBJO3RoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzPW5ldyBBKC1yLC1yKSx0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycz1uZXcgQShyLHIpfWNvbnN0IGU9dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMpLG49dGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QodGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMpO3RoaXMuX3JlY3RhbmdsZT1uZXcgTihlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLG4ubG9uZ2l0dWRlLG4ubGF0aXR1ZGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFl0LnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX0scmVjdGFuZ2xlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVjdGFuZ2xlfX0scHJvamVjdGlvbjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb2plY3Rpb259fX0pLFl0LnByb3RvdHlwZS5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNYPDx0fSxZdC5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWTw8dH0sWXQucHJvdG90eXBlLnJlY3RhbmdsZVRvTmF0aXZlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9wcm9qZWN0aW9uLHI9bi5wcm9qZWN0KE4uc291dGh3ZXN0KHQpKSxpPW4ucHJvamVjdChOLm5vcnRoZWFzdCh0KSk7cmV0dXJuIHAoZSk/KGUud2VzdD1yLngsZS5zb3V0aD1yLnksZS5lYXN0PWkueCxlLm5vcnRoPWkueSxlKTpuZXcgTihyLngsci55LGkueCxpLnkpfSxZdC5wcm90b3R5cGUudGlsZVhZVG9OYXRpdmVSZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLmdldE51bWJlck9mWFRpbGVzQXRMZXZlbChuKSxvPXRoaXMuZ2V0TnVtYmVyT2ZZVGlsZXNBdExldmVsKG4pLHM9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLngtdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCkvaSx1PXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngrdCpzLGE9dGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueCsodCsxKSpzLGw9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueSkvbyxkPXRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktZSpsLF89dGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS0oZSsxKSpsO3JldHVybiBwKHIpPyhyLndlc3Q9dSxyLnNvdXRoPV8sci5lYXN0PWEsci5ub3J0aD1kLHIpOm5ldyBOKHUsXyxhLGQpfSxZdC5wcm90b3R5cGUudGlsZVhZVG9SZWN0YW5nbGU9ZnVuY3Rpb24odCxlLG4scil7Y29uc3QgaT10aGlzLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlKHQsZSxuLHIpLG89dGhpcy5fcHJvamVjdGlvbixzPW8udW5wcm9qZWN0KG5ldyBBKGkud2VzdCxpLnNvdXRoKSksdT1vLnVucHJvamVjdChuZXcgQShpLmVhc3QsaS5ub3J0aCkpO3JldHVybiBpLndlc3Q9cy5sb25naXR1ZGUsaS5zb3V0aD1zLmxhdGl0dWRlLGkuZWFzdD11LmxvbmdpdHVkZSxpLm5vcnRoPXUubGF0aXR1ZGUsaX0sWXQucHJvdG90eXBlLnBvc2l0aW9uVG9UaWxlWFk9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9dGhpcy5fcmVjdGFuZ2xlO2lmKCFOLmNvbnRhaW5zKHIsdCkpcmV0dXJuO2NvbnN0IGk9dGhpcy5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWwoZSksbz10aGlzLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbChlKSx1PSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngpL2ksbD0odGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy55KS9vLF89dGhpcy5fcHJvamVjdGlvbi5wcm9qZWN0KHQpLE89Xy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngsYj10aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LV8ueTtsZXQgST1PL3V8MDtJPj1pJiYoST1pLTEpO2xldCBTPWIvbHwwO3JldHVybiBTPj1vJiYoUz1vLTEpLHAobik/KG4ueD1JLG4ueT1TLG4pOm5ldyBBKEksUyl9O2Z1bmN0aW9uIFNuKCl7dGhpcy5uYW1lPXZvaWQgMCx0aGlzLmRlc2NyaXB0aW9uPXZvaWQgMCx0aGlzLnBvc2l0aW9uPXZvaWQgMCx0aGlzLmRhdGE9dm9pZCAwLHRoaXMuaW1hZ2VyeUxheWVyPXZvaWQgMH1Tbi5wcm90b3R5cGUuY29uZmlndXJlTmFtZUZyb21Qcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe2xldCBlPTEwLG47Zm9yKGNvbnN0IHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpJiZ0W3JdKXtjb25zdCBpPXIudG9Mb3dlckNhc2UoKTtlPjEmJmk9PT0ibmFtZSI/KGU9MSxuPXIpOmU+MiYmaT09PSJ0aXRsZSI/KGU9MixuPXIpOmU+MyYmL25hbWUvaS50ZXN0KHIpPyhlPTMsbj1yKTplPjQmJi90aXRsZS9pLnRlc3QocikmJihlPTQsbj1yKX1wKG4pJiYodGhpcy5uYW1lPXRbbl0pfSxTbi5wcm90b3R5cGUuY29uZmlndXJlRGVzY3JpcHRpb25Gcm9tUHJvcGVydGllcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe2xldCByPSc8dGFibGUgY2xhc3M9ImNlc2l1bS1pbmZvQm94LWRlZmF1bHRUYWJsZSI+Jztmb3IoY29uc3QgaSBpbiBuKWlmKG4uaGFzT3duUHJvcGVydHkoaSkpe2NvbnN0IG89bltpXTtwKG8pJiYodHlwZW9mIG89PSJvYmplY3QiP3IrPWA8dHI+PHRkPiR7aX08L3RkPjx0ZD4ke2Uobyl9PC90ZD48L3RyPmA6cis9YDx0cj48dGQ+JHtpfTwvdGQ+PHRkPiR7b308L3RkPjwvdHI+YCl9cmV0dXJuIHIrPSI8L3RhYmxlPiIscn10aGlzLmRlc2NyaXB0aW9uPWUodCl9O3ZhciB0bj1BZTtmdW5jdGlvbiBBZSh0LGUpe3RoaXMueD10LHRoaXMueT1lfUFlLnByb3RvdHlwZT17Y2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFlKHRoaXMueCx0aGlzLnkpfSxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHQpfSxzdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHQpfSxtdWx0QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludCh0KX0sZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHQpfSxtdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX211bHQodCl9LGRpdjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYodCl9LHJvdGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUodCl9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZUFyb3VuZCh0LGUpfSxtYXRNdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQodCl9LHVuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCl9LHBlcnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCl9LHJvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKX0sbWFnOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55fSxkaXN0OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHQpKX0sZGlzdFNxcjpmdW5jdGlvbih0KXt2YXIgZT10LngtdGhpcy54LG49dC55LXRoaXMueTtyZXR1cm4gZSplK24qbn0sYW5nbGU6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksdGhpcy54KX0sYW5nbGVUbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLnktdC55LHRoaXMueC10LngpfSxhbmdsZVdpdGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKHQueCx0LnkpfSxhbmdsZVdpdGhTZXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLngqZS10aGlzLnkqdCx0aGlzLngqdCt0aGlzLnkqZSl9LF9tYXRNdWx0OmZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0qdGhpcy54K3RbMV0qdGhpcy55LG49dFsyXSp0aGlzLngrdFszXSp0aGlzLnk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXN9LF9hZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9LF9zdWI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9LF9tdWx0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9LF9kaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dCx0aGlzLnkvPXQsdGhpc30sX211bHRCeVBvaW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfSxfZGl2QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc30sX3VuaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGl2KHRoaXMubWFnKCkpLHRoaXN9LF9wZXJwOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55O3JldHVybiB0aGlzLnk9dGhpcy54LHRoaXMueD0tdCx0aGlzfSxfcm90YXRlOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCkscj1lKnRoaXMueC1uKnRoaXMueSxpPW4qdGhpcy54K2UqdGhpcy55O3JldHVybiB0aGlzLng9cix0aGlzLnk9aSx0aGlzfSxfcm90YXRlQXJvdW5kOmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5jb3ModCkscj1NYXRoLnNpbih0KSxpPWUueCtuKih0aGlzLngtZS54KS1yKih0aGlzLnktZS55KSxvPWUueStyKih0aGlzLngtZS54KStuKih0aGlzLnktZS55KTtyZXR1cm4gdGhpcy54PWksdGhpcy55PW8sdGhpc30sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfX0sQWUuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEFlP3Q6QXJyYXkuaXNBcnJheSh0KT9uZXcgQWUodFswXSx0WzFdKTp0fTt2YXIgdm89dG4sbXI9VGU7ZnVuY3Rpb24gVGUodCxlLG4scixpKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9bix0aGlzLnR5cGU9MCx0aGlzLl9wYmY9dCx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPXIsdGhpcy5fdmFsdWVzPWksdC5yZWFkRmllbGRzKERvLHRoaXMsZSl9ZnVuY3Rpb24gRG8odCxlLG4pe3Q9PTE/ZS5pZD1uLnJlYWRWYXJpbnQoKTp0PT0yP0xvKG4sZSk6dD09Mz9lLnR5cGU9bi5yZWFkVmFyaW50KCk6dD09NCYmKGUuX2dlb21ldHJ5PW4ucG9zKX1mdW5jdGlvbiBMbyh0LGUpe2Zvcih2YXIgbj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxuOyl7dmFyIHI9ZS5fa2V5c1t0LnJlYWRWYXJpbnQoKV0saT1lLl92YWx1ZXNbdC5yZWFkVmFyaW50KCldO2UucHJvcGVydGllc1tyXT1pfX1UZS50eXBlcz1bIlVua25vd24iLCJQb2ludCIsIkxpbmVTdHJpbmciLCJQb2x5Z29uIl0sVGUucHJvdG90eXBlLmxvYWRHZW9tZXRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BiZjt0LnBvcz10aGlzLl9nZW9tZXRyeTtmb3IodmFyIGU9dC5yZWFkVmFyaW50KCkrdC5wb3Msbj0xLHI9MCxpPTAsbz0wLHM9W10sdTt0LnBvczxlOyl7aWYocjw9MCl7dmFyIGE9dC5yZWFkVmFyaW50KCk7bj1hJjcscj1hPj4zfWlmKHItLSxuPT09MXx8bj09PTIpaSs9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxuPT09MSYmKHUmJnMucHVzaCh1KSx1PVtdKSx1LnB1c2gobmV3IHZvKGksbykpO2Vsc2UgaWYobj09PTcpdSYmdS5wdXNoKHVbMF0uY2xvbmUoKSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybiB1JiZzLnB1c2godSksc30sVGUucHJvdG90eXBlLmJib3g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYmY7dC5wb3M9dGhpcy5fZ2VvbWV0cnk7Zm9yKHZhciBlPXQucmVhZFZhcmludCgpK3QucG9zLG49MSxyPTAsaT0wLG89MCxzPTEvMCx1PS0xLzAsYT0xLzAsbD0tMS8wO3QucG9zPGU7KXtpZihyPD0wKXt2YXIgZD10LnJlYWRWYXJpbnQoKTtuPWQmNyxyPWQ+PjN9aWYoci0tLG49PT0xfHxuPT09MilpKz10LnJlYWRTVmFyaW50KCksbys9dC5yZWFkU1ZhcmludCgpLGk8cyYmKHM9aSksaT51JiYodT1pKSxvPGEmJihhPW8pLG8+bCYmKGw9byk7ZWxzZSBpZihuIT09Nyl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gY29tbWFuZCAiK24pfXJldHVybltzLGEsdSxsXX0sVGUucHJvdG90eXBlLnRvR2VvSlNPTj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5leHRlbnQqTWF0aC5wb3coMixuKSxpPXRoaXMuZXh0ZW50KnQsbz10aGlzLmV4dGVudCplLHM9dGhpcy5sb2FkR2VvbWV0cnkoKSx1PVRlLnR5cGVzW3RoaXMudHlwZV0sYSxsO2Z1bmN0aW9uIGQoYil7Zm9yKHZhciBJPTA7STxiLmxlbmd0aDtJKyspe3ZhciBTPWJbSV0sbT0xODAtKFMueStvKSozNjAvcjtiW0ldPVsoUy54K2kpKjM2MC9yLTE4MCwzNjAvTWF0aC5QSSpNYXRoLmF0YW4oTWF0aC5leHAobSpNYXRoLlBJLzE4MCkpLTkwXX19c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSAxOnZhciBfPVtdO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspX1thXT1zW2FdWzBdO3M9XyxkKHMpO2JyZWFrO2Nhc2UgMjpmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKWQoc1thXSk7YnJlYWs7Y2FzZSAzOmZvcihzPVBvKHMpLGE9MDthPHMubGVuZ3RoO2ErKylmb3IobD0wO2w8c1thXS5sZW5ndGg7bCsrKWQoc1thXVtsXSk7YnJlYWt9cy5sZW5ndGg9PT0xP3M9c1swXTp1PSJNdWx0aSIrdTt2YXIgTz17dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6e3R5cGU6dSxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOnRoaXMucHJvcGVydGllc307cmV0dXJuImlkImluIHRoaXMmJihPLmlkPXRoaXMuaWQpLE99O2Z1bmN0aW9uIFBvKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PTEpcmV0dXJuW3RdO2Zvcih2YXIgbj1bXSxyLGksbz0wO288ZTtvKyspe3ZhciBzPUJvKHRbb10pO3MhPT0wJiYoaT09PXZvaWQgMCYmKGk9czwwKSxpPT09czwwPyhyJiZuLnB1c2gocikscj1bdFtvXV0pOnIucHVzaCh0W29dKSl9cmV0dXJuIHImJm4ucHVzaChyKSxufWZ1bmN0aW9uIEJvKHQpe2Zvcih2YXIgZT0wLG49MCxyPXQubGVuZ3RoLGk9ci0xLG8scztuPHI7aT1uKyspbz10W25dLHM9dFtpXSxlKz0ocy54LW8ueCkqKG8ueStzLnkpO3JldHVybiBlfXZhciBVbz1tcixqbz1GcjtmdW5jdGlvbiBGcih0LGUpe3RoaXMudmVyc2lvbj0xLHRoaXMubmFtZT1udWxsLHRoaXMuZXh0ZW50PTQwOTYsdGhpcy5sZW5ndGg9MCx0aGlzLl9wYmY9dCx0aGlzLl9rZXlzPVtdLHRoaXMuX3ZhbHVlcz1bXSx0aGlzLl9mZWF0dXJlcz1bXSx0LnJlYWRGaWVsZHMoR28sdGhpcyxlKSx0aGlzLmxlbmd0aD10aGlzLl9mZWF0dXJlcy5sZW5ndGh9ZnVuY3Rpb24gR28odCxlLG4pe3Q9PT0xNT9lLnZlcnNpb249bi5yZWFkVmFyaW50KCk6dD09PTE/ZS5uYW1lPW4ucmVhZFN0cmluZygpOnQ9PT01P2UuZXh0ZW50PW4ucmVhZFZhcmludCgpOnQ9PT0yP2UuX2ZlYXR1cmVzLnB1c2gobi5wb3MpOnQ9PT0zP2UuX2tleXMucHVzaChuLnJlYWRTdHJpbmcoKSk6dD09PTQmJmUuX3ZhbHVlcy5wdXNoKCRvKG4pKX1mdW5jdGlvbiAkbyh0KXtmb3IodmFyIGU9bnVsbCxuPXQucmVhZFZhcmludCgpK3QucG9zO3QucG9zPG47KXt2YXIgcj10LnJlYWRWYXJpbnQoKT4+MztlPXI9PT0xP3QucmVhZFN0cmluZygpOnI9PT0yP3QucmVhZEZsb2F0KCk6cj09PTM/dC5yZWFkRG91YmxlKCk6cj09PTQ/dC5yZWFkVmFyaW50NjQoKTpyPT09NT90LnJlYWRWYXJpbnQoKTpyPT09Nj90LnJlYWRTVmFyaW50KCk6cj09PTc/dC5yZWFkQm9vbGVhbigpOm51bGx9cmV0dXJuIGV9RnIucHJvdG90eXBlLmZlYXR1cmU9ZnVuY3Rpb24odCl7aWYodDwwfHx0Pj10aGlzLl9mZWF0dXJlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLl9wYmYucG9zPXRoaXMuX2ZlYXR1cmVzW3RdO3ZhciBlPXRoaXMuX3BiZi5yZWFkVmFyaW50KCkrdGhpcy5fcGJmLnBvcztyZXR1cm4gbmV3IFVvKHRoaXMuX3BiZixlLHRoaXMuZXh0ZW50LHRoaXMuX2tleXMsdGhpcy5fdmFsdWVzKX07dmFyIFZvPWpvLFdvPXpvO2Z1bmN0aW9uIHpvKHQsZSl7dGhpcy5sYXllcnM9dC5yZWFkRmllbGRzKFhvLHt9LGUpfWZ1bmN0aW9uIFhvKHQsZSxuKXtpZih0PT09Myl7dmFyIHI9bmV3IFZvKG4sbi5yZWFkVmFyaW50KCkrbi5wb3MpO3IubGVuZ3RoJiYoZVtyLm5hbWVdPXIpfX12YXIgSG89V28senQ9bXIsbW49e307LyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9tbi5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8scyx1PWkqOC1yLTEsYT0oMTw8dSktMSxsPWE+PjEsZD0tNyxfPW4/aS0xOjAsTz1uPy0xOjEsYj10W2UrX107Zm9yKF8rPU8sbz1iJigxPDwtZCktMSxiPj49LWQsZCs9dTtkPjA7bz1vKjI1Nit0W2UrX10sXys9TyxkLT04KTtmb3Iocz1vJigxPDwtZCktMSxvPj49LWQsZCs9cjtkPjA7cz1zKjI1Nit0W2UrX10sXys9TyxkLT04KTtpZihvPT09MClvPTEtbDtlbHNle2lmKG89PT1hKXJldHVybiBzP05hTjooYj8tMToxKSooMS8wKTtzPXMrTWF0aC5wb3coMixyKSxvPW8tbH1yZXR1cm4oYj8tMToxKSpzKk1hdGgucG93KDIsby1yKX0sbW4ud3JpdGU9ZnVuY3Rpb24odCxlLG4scixpLG8pe3ZhciBzLHUsYSxsPW8qOC1pLTEsZD0oMTw8bCktMSxfPWQ+PjEsTz1pPT09MjM/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGI9cj8wOm8tMSxJPXI/MTotMSxTPWU8MHx8ZT09PTAmJjEvZTwwPzE6MDtmb3IoZT1NYXRoLmFicyhlKSxpc05hTihlKXx8ZT09PTEvMD8odT1pc05hTihlKT8xOjAscz1kKToocz1NYXRoLmZsb29yKE1hdGgubG9nKGUpL01hdGguTE4yKSxlKihhPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGEqPTIpLHMrXz49MT9lKz1PL2E6ZSs9TypNYXRoLnBvdygyLDEtXyksZSphPj0yJiYocysrLGEvPTIpLHMrXz49ZD8odT0wLHM9ZCk6cytfPj0xPyh1PShlKmEtMSkqTWF0aC5wb3coMixpKSxzPXMrXyk6KHU9ZSpNYXRoLnBvdygyLF8tMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O3RbbitiXT11JjI1NSxiKz1JLHUvPTI1NixpLT04KTtmb3Iocz1zPDxpfHUsbCs9aTtsPjA7dFtuK2JdPXMmMjU1LGIrPUkscy89MjU2LGwtPTgpO3RbbitiLUldfD1TKjEyOH07dmFyIGtvPVcsZW49bW47ZnVuY3Rpb24gVyh0KXt0aGlzLmJ1Zj1BcnJheUJ1ZmZlci5pc1ZpZXcmJkFycmF5QnVmZmVyLmlzVmlldyh0KT90Om5ldyBVaW50OEFycmF5KHR8fDApLHRoaXMucG9zPTAsdGhpcy50eXBlPTAsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofVcuVmFyaW50PTAsVy5GaXhlZDY0PTEsVy5CeXRlcz0yLFcuRml4ZWQzMj01O3ZhciBGbj0oMTw8MTYpKigxPDwxNiksd3I9MS9Gbixxbz0xMixJcj10eXBlb2YgVGV4dERlY29kZXI+InUiP251bGw6bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik7Vy5wcm90b3R5cGU9e2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmJ1Zj1udWxsfSxyZWFkRmllbGRzOmZ1bmN0aW9uKHQsZSxuKXtmb3Iobj1ufHx0aGlzLmxlbmd0aDt0aGlzLnBvczxuOyl7dmFyIHI9dGhpcy5yZWFkVmFyaW50KCksaT1yPj4zLG89dGhpcy5wb3M7dGhpcy50eXBlPXImNyx0KGksZSx0aGlzKSx0aGlzLnBvcz09PW8mJnRoaXMuc2tpcChyKX1yZXR1cm4gZX0scmVhZE1lc3NhZ2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZWFkRmllbGRzKHQsZSx0aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyl9LHJlYWRGaXhlZDMyOmZ1bmN0aW9uKCl7dmFyIHQ9bm4odGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkU0ZpeGVkMzI6ZnVuY3Rpb24oKXt2YXIgdD1Ncih0aGlzLmJ1Zix0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9bm4odGhpcy5idWYsdGhpcy5wb3MpK25uKHRoaXMuYnVmLHRoaXMucG9zKzQpKkZuO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkU0ZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD1ubih0aGlzLmJ1Zix0aGlzLnBvcykrTXIodGhpcy5idWYsdGhpcy5wb3MrNCkqRm47cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRGbG9hdDpmdW5jdGlvbigpe3ZhciB0PWVuLnJlYWQodGhpcy5idWYsdGhpcy5wb3MsITAsMjMsNCk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWREb3VibGU6ZnVuY3Rpb24oKXt2YXIgdD1lbi5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDUyLDgpO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkVmFyaW50OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYnVmLG4scjtyZXR1cm4gcj1lW3RoaXMucG9zKytdLG49ciYxMjcscjwxMjh8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8NyxyPDEyOCl8fChyPWVbdGhpcy5wb3MrK10sbnw9KHImMTI3KTw8MTQscjwxMjgpfHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDIxLHI8MTI4KT9uOihyPWVbdGhpcy5wb3NdLG58PShyJjE1KTw8MjgsWW8obix0LHRoaXMpKX0scmVhZFZhcmludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFZhcmludCghMCl9LHJlYWRTVmFyaW50OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVmFyaW50KCk7cmV0dXJuIHQlMj09PTE/KHQrMSkvLTI6dC8yfSxyZWFkQm9vbGVhbjpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKX0scmVhZFN0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGU9dGhpcy5wb3M7cmV0dXJuIHRoaXMucG9zPXQsdC1lPj1xbyYmSXI/Y3ModGhpcy5idWYsZSx0KTp1cyh0aGlzLmJ1ZixlLHQpfSxyZWFkQnl0ZXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxlPXRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGV9LHJlYWRQYWNrZWRWYXJpbnQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnR5cGUhPT1XLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTt2YXIgbj1YdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxuOyl0LnB1c2godGhpcy5yZWFkVmFyaW50KGUpKTtyZXR1cm4gdH0scmVhZFBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09Vy5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7dmFyIGU9WHQodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PVcuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09Vy5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gdH0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1XLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PVcuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO3JldHVybiB0fSxyZWFkUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09Vy5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO3ZhciBlPVh0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09Vy5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7dmFyIGU9WHQodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1XLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7dmFyIGU9WHQodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8ZTspdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiB0fSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBlPXQmNztpZihlPT09Vy5WYXJpbnQpZm9yKDt0aGlzLmJ1Zlt0aGlzLnBvcysrXT4xMjc7KTtlbHNlIGlmKGU9PT1XLkJ5dGVzKXRoaXMucG9zPXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zO2Vsc2UgaWYoZT09PVcuRml4ZWQzMil0aGlzLnBvcys9NDtlbHNlIGlmKGU9PT1XLkZpeGVkNjQpdGhpcy5wb3MrPTg7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuaW1wbGVtZW50ZWQgdHlwZTogIitlKX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8ZSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGVuZ3RofHwxNjtlPHRoaXMucG9zK3Q7KWUqPTI7aWYoZSE9PXRoaXMubGVuZ3RoKXt2YXIgbj1uZXcgVWludDhBcnJheShlKTtuLnNldCh0aGlzLmJ1ZiksdGhpcy5idWY9bix0aGlzLmxlbmd0aD1lfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc3ViYXJyYXkoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCkseGUodGhpcy5idWYsdCx0aGlzLnBvcyksdGhpcy5wb3MrPTR9LHdyaXRlU0ZpeGVkMzI6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLHhlKHRoaXMuYnVmLHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHhlKHRoaXMuYnVmLHQmLTEsdGhpcy5wb3MpLHhlKHRoaXMuYnVmLE1hdGguZmxvb3IodCp3ciksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlVmFyaW50OmZ1bmN0aW9uKHQpe2lmKHQ9K3R8fDAsdD4yNjg0MzU0NTV8fHQ8MCl7S28odCx0aGlzKTtyZXR1cm59dGhpcy5yZWFsbG9jKDQpLHRoaXMuYnVmW3RoaXMucG9zKytdPXQmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109KHQ+Pj49NykmMTI3fCh0PjEyNz8xMjg6MCksISh0PD0xMjcpJiYodGhpcy5idWZbdGhpcy5wb3MrK109dD4+PjcmMTI3KSkpfSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCh0PDA/LXQqMi0xOnQqMil9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KSx0aGlzLnJlYWxsb2ModC5sZW5ndGgqNCksdGhpcy5wb3MrKzt2YXIgZT10aGlzLnBvczt0aGlzLnBvcz1ocyh0aGlzLmJ1Zix0LHRoaXMucG9zKTt2YXIgbj10aGlzLnBvcy1lO24+PTEyOCYmTnIoZSxuLHRoaXMpLHRoaXMucG9zPWUtMSx0aGlzLndyaXRlVmFyaW50KG4pLHRoaXMucG9zKz1ufSx3cml0ZUZsb2F0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg0KSxlbi53cml0ZSh0aGlzLmJ1Zix0LHRoaXMucG9zLCEwLDIzLDQpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksZW4ud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCw1Miw4KSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGUpLHRoaXMucmVhbGxvYyhlKTtmb3IodmFyIG49MDtuPGU7bisrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbbl19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGUpe3RoaXMucG9zKys7dmFyIG49dGhpcy5wb3M7dChlLHRoaXMpO3ZhciByPXRoaXMucG9zLW47cj49MTI4JiZOcihuLHIsdGhpcyksdGhpcy5wb3M9bi0xLHRoaXMud3JpdGVWYXJpbnQociksdGhpcy5wb3MrPXJ9LHdyaXRlTWVzc2FnZTpmdW5jdGlvbih0LGUsbil7dGhpcy53cml0ZVRhZyh0LFcuQnl0ZXMpLHRoaXMud3JpdGVSYXdNZXNzYWdlKGUsbil9LHdyaXRlUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsSm8sZSl9LHdyaXRlUGFja2VkU1ZhcmludDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LHRzLGUpfSx3cml0ZVBhY2tlZEJvb2xlYW46ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxycyxlKX0sd3JpdGVQYWNrZWRGbG9hdDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGVzLGUpfSx3cml0ZVBhY2tlZERvdWJsZTpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LG5zLGUpfSx3cml0ZVBhY2tlZEZpeGVkMzI6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxpcyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LG9zLGUpfSx3cml0ZVBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxzcyxlKX0sd3JpdGVQYWNrZWRTRml4ZWQ2NDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LGFzLGUpfSx3cml0ZUJ5dGVzRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsVy5CeXRlcyksdGhpcy53cml0ZUJ5dGVzKGUpfSx3cml0ZUZpeGVkMzJGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLkZpeGVkMzIpLHRoaXMud3JpdGVGaXhlZDMyKGUpfSx3cml0ZVNGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsVy5GaXhlZDMyKSx0aGlzLndyaXRlU0ZpeGVkMzIoZSl9LHdyaXRlRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LFcuRml4ZWQ2NCksdGhpcy53cml0ZUZpeGVkNjQoZSl9LHdyaXRlU0ZpeGVkNjRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLkZpeGVkNjQpLHRoaXMud3JpdGVTRml4ZWQ2NChlKX0sd3JpdGVWYXJpbnRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLlZhcmludCksdGhpcy53cml0ZVZhcmludChlKX0sd3JpdGVTVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsVy5WYXJpbnQpLHRoaXMud3JpdGVTVmFyaW50KGUpfSx3cml0ZVN0cmluZ0ZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LFcuQnl0ZXMpLHRoaXMud3JpdGVTdHJpbmcoZSl9LHdyaXRlRmxvYXRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLkZpeGVkMzIpLHRoaXMud3JpdGVGbG9hdChlKX0sd3JpdGVEb3VibGVGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxXLkZpeGVkNjQpLHRoaXMud3JpdGVEb3VibGUoZSl9LHdyaXRlQm9vbGVhbkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVZhcmludEZpZWxkKHQsQm9vbGVhbihlKSl9fTtmdW5jdGlvbiBZbyh0LGUsbil7dmFyIHI9bi5idWYsaSxvO2lmKG89cltuLnBvcysrXSxpPShvJjExMik+PjQsbzwxMjh8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MyxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MTAsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDE3LG88MTI4KXx8KG89cltuLnBvcysrXSxpfD0obyYxMjcpPDwyNCxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMSk8PDMxLG88MTI4KSlyZXR1cm4gUmUodCxpLGUpO3Rocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMiKX1mdW5jdGlvbiBYdCh0KXtyZXR1cm4gdC50eXBlPT09Vy5CeXRlcz90LnJlYWRWYXJpbnQoKSt0LnBvczp0LnBvcysxfWZ1bmN0aW9uIFJlKHQsZSxuKXtyZXR1cm4gbj9lKjQyOTQ5NjcyOTYrKHQ+Pj4wKTooZT4+PjApKjQyOTQ5NjcyOTYrKHQ+Pj4wKX1mdW5jdGlvbiBLbyh0LGUpe3ZhciBuLHI7aWYodD49MD8obj10JTQyOTQ5NjcyOTZ8MCxyPXQvNDI5NDk2NzI5NnwwKToobj1+KC10JTQyOTQ5NjcyOTYpLHI9figtdC80Mjk0OTY3Mjk2KSxuXjQyOTQ5NjcyOTU/bj1uKzF8MDoobj0wLHI9cisxfDApKSx0Pj0xODQ0Njc0NDA3MzcwOTU1MmUzfHx0PC0xODQ0Njc0NDA3MzcwOTU1MmUzKXRocm93IG5ldyBFcnJvcigiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXMiKTtlLnJlYWxsb2MoMTApLFpvKG4scixlKSxRbyhyLGUpfWZ1bmN0aW9uIFpvKHQsZSxuKXtuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zKytdPXQmMTI3fDEyOCx0Pj4+PTcsbi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zXT10JjEyN31mdW5jdGlvbiBRbyh0LGUpe3ZhciBuPSh0JjcpPDw0O2UuYnVmW2UucG9zKytdfD1ufCgodD4+Pj0zKT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3fCgodD4+Pj03KT8xMjg6MCksdCYmKGUuYnVmW2UucG9zKytdPXQmMTI3KSkpKSl9ZnVuY3Rpb24gTnIodCxlLG4pe3ZhciByPWU8PTE2MzgzPzE6ZTw9MjA5NzE1MT8yOmU8PTI2ODQzNTQ1NT8zOk1hdGguZmxvb3IoTWF0aC5sb2coZSkvKE1hdGguTE4yKjcpKTtuLnJlYWxsb2Mocik7Zm9yKHZhciBpPW4ucG9zLTE7aT49dDtpLS0pbi5idWZbaStyXT1uLmJ1ZltpXX1mdW5jdGlvbiBKbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVWYXJpbnQodFtuXSl9ZnVuY3Rpb24gdHModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU1ZhcmludCh0W25dKX1mdW5jdGlvbiBlcyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGbG9hdCh0W25dKX1mdW5jdGlvbiBucyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVEb3VibGUodFtuXSl9ZnVuY3Rpb24gcnModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlQm9vbGVhbih0W25dKX1mdW5jdGlvbiBpcyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIG9zKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNGaXhlZDMyKHRbbl0pfWZ1bmN0aW9uIHNzKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZUZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gYXModCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlU0ZpeGVkNjQodFtuXSl9ZnVuY3Rpb24gbm4odCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrdFtlKzNdKjE2Nzc3MjE2fWZ1bmN0aW9uIHhlKHQsZSxuKXt0W25dPWUsdFtuKzFdPWU+Pj44LHRbbisyXT1lPj4+MTYsdFtuKzNdPWU+Pj4yNH1mdW5jdGlvbiBNcih0LGUpe3JldHVybih0W2VdfHRbZSsxXTw8OHx0W2UrMl08PDE2KSsodFtlKzNdPDwyNCl9ZnVuY3Rpb24gdXModCxlLG4pe2Zvcih2YXIgcj0iIixpPWU7aTxuOyl7dmFyIG89dFtpXSxzPW51bGwsdT1vPjIzOT80Om8+MjIzPzM6bz4xOTE/MjoxO2lmKGkrdT5uKWJyZWFrO3ZhciBhLGwsZDt1PT09MT9vPDEyOCYmKHM9byk6dT09PTI/KGE9dFtpKzFdLChhJjE5Mik9PT0xMjgmJihzPShvJjMxKTw8NnxhJjYzLHM8PTEyNyYmKHM9bnVsbCkpKTp1PT09Mz8oYT10W2krMV0sbD10W2krMl0sKGEmMTkyKT09PTEyOCYmKGwmMTkyKT09PTEyOCYmKHM9KG8mMTUpPDwxMnwoYSY2Myk8PDZ8bCY2Mywoczw9MjA0N3x8cz49NTUyOTYmJnM8PTU3MzQzKSYmKHM9bnVsbCkpKTp1PT09NCYmKGE9dFtpKzFdLGw9dFtpKzJdLGQ9dFtpKzNdLChhJjE5Mik9PT0xMjgmJihsJjE5Mik9PT0xMjgmJihkJjE5Mik9PT0xMjgmJihzPShvJjE1KTw8MTh8KGEmNjMpPDwxMnwobCY2Myk8PDZ8ZCY2Mywoczw9NjU1MzV8fHM+PTExMTQxMTIpJiYocz1udWxsKSkpLHM9PT1udWxsPyhzPTY1NTMzLHU9MSk6cz42NTUzNSYmKHMtPTY1NTM2LHIrPVN0cmluZy5mcm9tQ2hhckNvZGUocz4+PjEwJjEwMjN8NTUyOTYpLHM9NTYzMjB8cyYxMDIzKSxyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpLGkrPXV9cmV0dXJuIHJ9ZnVuY3Rpb24gY3ModCxlLG4pe3JldHVybiBJci5kZWNvZGUodC5zdWJhcnJheShlLG4pKX1mdW5jdGlvbiBocyh0LGUsbil7Zm9yKHZhciByPTAsaSxvO3I8ZS5sZW5ndGg7cisrKXtpZihpPWUuY2hhckNvZGVBdChyKSxpPjU1Mjk1JiZpPDU3MzQ0KWlmKG8paWYoaTw1NjMyMCl7dFtuKytdPTIzOSx0W24rK109MTkxLHRbbisrXT0xODksbz1pO2NvbnRpbnVlfWVsc2UgaT1vLTU1Mjk2PDwxMHxpLTU2MzIwfDY1NTM2LG89bnVsbDtlbHNle2k+NTYzMTl8fHIrMT09PWUubGVuZ3RoPyh0W24rK109MjM5LHRbbisrXT0xOTEsdFtuKytdPTE4OSk6bz1pO2NvbnRpbnVlfWVsc2UgbyYmKHRbbisrXT0yMzksdFtuKytdPTE5MSx0W24rK109MTg5LG89bnVsbCk7aTwxMjg/dFtuKytdPWk6KGk8MjA0OD90W24rK109aT4+NnwxOTI6KGk8NjU1MzY/dFtuKytdPWk+PjEyfDIyNDoodFtuKytdPWk+PjE4fDI0MCx0W24rK109aT4+MTImNjN8MTI4KSx0W24rK109aT4+NiY2M3wxMjgpLHRbbisrXT1pJjYzfDEyOCl9cmV0dXJuIG59dmFyIGZzPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxDcj1mcyxscz10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGRzPUNyfHxsc3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxVdD1kcyxFcz1VdC5TeW1ib2wsanQ9RXMsdnI9T2JqZWN0LnByb3RvdHlwZSxfcz12ci5oYXNPd25Qcm9wZXJ0eSxwcz12ci50b1N0cmluZyx2ZT1qdD9qdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24geXModCl7dmFyIGU9X3MuY2FsbCh0LHZlKSxuPXRbdmVdO3RyeXt0W3ZlXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBpPXBzLmNhbGwodCk7cmV0dXJuIHImJihlP3RbdmVdPW46ZGVsZXRlIHRbdmVdKSxpfXZhciBBcz1PYmplY3QucHJvdG90eXBlLFRzPUFzLnRvU3RyaW5nO2Z1bmN0aW9uIFJzKHQpe3JldHVybiBUcy5jYWxsKHQpfXZhciB4cz0iW29iamVjdCBOdWxsXSIsT3M9IltvYmplY3QgVW5kZWZpbmVkXSIsRHI9anQ/anQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIE9lKHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/T3M6eHM6RHImJkRyIGluIE9iamVjdCh0KT95cyh0KTpScyh0KX1mdW5jdGlvbiBiZSh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBicz0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiB3bih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxiZSh0KSYmT2UodCk9PWJzfWZ1bmN0aW9uIGdzKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9QXJyYXkocik7KytuPHI7KWlbbl09ZSh0W25dLG4sdCk7cmV0dXJuIGl9dmFyIFNzPUFycmF5LmlzQXJyYXksS3Q9U3MsbXM9MS8wLExyPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsUHI9THI/THIudG9TdHJpbmc6dm9pZCAwO2Z1bmN0aW9uIEJyKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdDtpZihLdCh0KSlyZXR1cm4gZ3ModCxCcikrIiI7aWYod24odCkpcmV0dXJuIFByP1ByLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4gZT09IjAiJiYxL3Q9PS1tcz8iLTAiOmV9ZnVuY3Rpb24gaWUodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihlPT0ib2JqZWN0Inx8ZT09ImZ1bmN0aW9uIil9ZnVuY3Rpb24gRnModCl7cmV0dXJuIHR9dmFyIHdzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixJcz0iW29iamVjdCBGdW5jdGlvbl0iLE5zPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsTXM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBVcih0KXtpZighaWUodCkpcmV0dXJuITE7dmFyIGU9T2UodCk7cmV0dXJuIGU9PUlzfHxlPT1Oc3x8ZT09d3N8fGU9PU1zfXZhciBDcz1VdFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sSW49Q3MsanI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKEluJiZJbi5rZXlzJiZJbi5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIHZzKHQpe3JldHVybiEhanImJmpyIGluIHR9dmFyIERzPUZ1bmN0aW9uLnByb3RvdHlwZSxMcz1Ecy50b1N0cmluZztmdW5jdGlvbiBvZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIExzLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBQcz0vW1xcXiQuKis/KClbXF17fXxdL2csQnM9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sVXM9RnVuY3Rpb24ucHJvdG90eXBlLGpzPU9iamVjdC5wcm90b3R5cGUsR3M9VXMudG9TdHJpbmcsJHM9anMuaGFzT3duUHJvcGVydHksVnM9UmVnRXhwKCJeIitHcy5jYWxsKCRzKS5yZXBsYWNlKFBzLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIFdzKHQpe2lmKCFpZSh0KXx8dnModCkpcmV0dXJuITE7dmFyIGU9VXIodCk/VnM6QnM7cmV0dXJuIGUudGVzdChvZSh0KSl9ZnVuY3Rpb24genModCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBzZSh0LGUpe3ZhciBuPXpzKHQsZSk7cmV0dXJuIFdzKG4pP246dm9pZCAwfXZhciBYcz1zZShVdCwiV2Vha01hcCIpLE5uPVhzLEdyPU9iamVjdC5jcmVhdGUsSHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighaWUoZSkpcmV0dXJue307aWYoR3IpcmV0dXJuIEdyKGUpO3QucHJvdG90eXBlPWU7dmFyIG49bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxufX0oKSxrcz1IcztmdW5jdGlvbiBxcyh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIFlzKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9QXJyYXkocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9dmFyIEtzPTgwMCxacz0xNixRcz1EYXRlLm5vdztmdW5jdGlvbiBKcyh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1RcygpLGk9WnMtKHItbik7aWYobj1yLGk+MCl7aWYoKytlPj1LcylyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiB0YSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIGVhPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXNlKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpLHJuPWVhLG5hPXJuP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHJuKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6dGEoZSksd3JpdGFibGU6ITB9KX06RnMscmE9bmEsaWE9SnMocmEpLG9hPWlhO2Z1bmN0aW9uIHNhKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoOysrbjxyJiZlKHRbbl0sbix0KSE9PSExOyk7cmV0dXJuIHR9dmFyIGFhPTkwMDcxOTkyNTQ3NDA5OTEsdWE9L14oPzowfFsxLTldXGQqKSQvO2Z1bmN0aW9uIE1uKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuIGU9ZT8/YWEsISFlJiYobj09Im51bWJlciJ8fG4hPSJzeW1ib2wiJiZ1YS50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9ZnVuY3Rpb24gJHIodCxlLG4pe2U9PSJfX3Byb3RvX18iJiZybj9ybih0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gVnIodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgY2E9T2JqZWN0LnByb3RvdHlwZSxoYT1jYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBDbih0LGUsbil7dmFyIHI9dFtlXTsoIShoYS5jYWxsKHQsZSkmJlZyKHIsbikpfHxuPT09dm9pZCAwJiYhKGUgaW4gdCkpJiYkcih0LGUsbil9ZnVuY3Rpb24gb24odCxlLG4scil7dmFyIGk9IW47bnx8KG49e30pO2Zvcih2YXIgbz0tMSxzPWUubGVuZ3RoOysrbzxzOyl7dmFyIHU9ZVtvXSxhPXI/cihuW3VdLHRbdV0sdSxuLHQpOnZvaWQgMDthPT09dm9pZCAwJiYoYT10W3VdKSxpPyRyKG4sdSxhKTpDbihuLHUsYSl9cmV0dXJuIG59dmFyIFdyPU1hdGgubWF4O2Z1bmN0aW9uIGZhKHQsZSxuKXtyZXR1cm4gZT1XcihlPT09dm9pZCAwP3QubGVuZ3RoLTE6ZSwwKSxmdW5jdGlvbigpe2Zvcih2YXIgcj1hcmd1bWVudHMsaT0tMSxvPVdyKHIubGVuZ3RoLWUsMCkscz1BcnJheShvKTsrK2k8bzspc1tpXT1yW2UraV07aT0tMTtmb3IodmFyIHU9QXJyYXkoZSsxKTsrK2k8ZTspdVtpXT1yW2ldO3JldHVybiB1W2VdPW4ocykscXModCx0aGlzLHUpfX12YXIgbGE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiB2bih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PWxhfWZ1bmN0aW9uIHpyKHQpe3JldHVybiB0IT1udWxsJiZ2bih0Lmxlbmd0aCkmJiFVcih0KX12YXIgZGE9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiBEbih0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yLG49dHlwZW9mIGU9PSJmdW5jdGlvbiImJmUucHJvdG90eXBlfHxkYTtyZXR1cm4gdD09PW59ZnVuY3Rpb24gRWEodCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfXZhciBfYT0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBYcih0KXtyZXR1cm4gYmUodCkmJk9lKHQpPT1fYX12YXIgSHI9T2JqZWN0LnByb3RvdHlwZSxwYT1Ici5oYXNPd25Qcm9wZXJ0eSx5YT1Ici5wcm9wZXJ0eUlzRW51bWVyYWJsZSxBYT1YcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP1hyOmZ1bmN0aW9uKHQpe3JldHVybiBiZSh0KSYmcGEuY2FsbCh0LCJjYWxsZWUiKSYmIXlhLmNhbGwodCwiY2FsbGVlIil9LExuPUFhO2Z1bmN0aW9uIFRhKCl7cmV0dXJuITF9dmFyIGtyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMscXI9a3ImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxSYT1xciYmcXIuZXhwb3J0cz09PWtyLFlyPVJhP1V0LkJ1ZmZlcjp2b2lkIDAseGE9WXI/WXIuaXNCdWZmZXI6dm9pZCAwLE9hPXhhfHxUYSxLcj1PYSxiYT0iW29iamVjdCBBcmd1bWVudHNdIixnYT0iW29iamVjdCBBcnJheV0iLFNhPSJbb2JqZWN0IEJvb2xlYW5dIixtYT0iW29iamVjdCBEYXRlXSIsRmE9IltvYmplY3QgRXJyb3JdIix3YT0iW29iamVjdCBGdW5jdGlvbl0iLElhPSJbb2JqZWN0IE1hcF0iLE5hPSJbb2JqZWN0IE51bWJlcl0iLE1hPSJbb2JqZWN0IE9iamVjdF0iLENhPSJbb2JqZWN0IFJlZ0V4cF0iLHZhPSJbb2JqZWN0IFNldF0iLERhPSJbb2JqZWN0IFN0cmluZ10iLExhPSJbb2JqZWN0IFdlYWtNYXBdIixQYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEJhPSJbb2JqZWN0IERhdGFWaWV3XSIsVWE9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsamE9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsR2E9IltvYmplY3QgSW50OEFycmF5XSIsJGE9IltvYmplY3QgSW50MTZBcnJheV0iLFZhPSJbb2JqZWN0IEludDMyQXJyYXldIixXYT0iW29iamVjdCBVaW50OEFycmF5XSIsemE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixYYT0iW29iamVjdCBVaW50MTZBcnJheV0iLEhhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsUT17fTtRW1VhXT1RW2phXT1RW0dhXT1RWyRhXT1RW1ZhXT1RW1dhXT1RW3phXT1RW1hhXT1RW0hhXT0hMCxRW2JhXT1RW2dhXT1RW1BhXT1RW1NhXT1RW0JhXT1RW21hXT1RW0ZhXT1RW3dhXT1RW0lhXT1RW05hXT1RW01hXT1RW0NhXT1RW3ZhXT1RW0RhXT1RW0xhXT0hMTtmdW5jdGlvbiBrYSh0KXtyZXR1cm4gYmUodCkmJnZuKHQubGVuZ3RoKSYmISFRW09lKHQpXX1mdW5jdGlvbiBQbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fXZhciBacj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVpyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUscWE9RGUmJkRlLmV4cG9ydHM9PT1acixCbj1xYSYmQ3IucHJvY2VzcyxZYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxCbiYmQm4uYmluZGluZyYmQm4uYmluZGluZygidXRpbCIpfWNhdGNoe319KCksZ2U9WWEsUXI9Z2UmJmdlLmlzVHlwZWRBcnJheSxLYT1Rcj9QbihRcik6a2EsWmE9S2EsUWE9T2JqZWN0LnByb3RvdHlwZSxKYT1RYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBKcih0LGUpe3ZhciBuPUt0KHQpLHI9IW4mJkxuKHQpLGk9IW4mJiFyJiZLcih0KSxvPSFuJiYhciYmIWkmJlphKHQpLHM9bnx8cnx8aXx8byx1PXM/RWEodC5sZW5ndGgsU3RyaW5nKTpbXSxhPXUubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShlfHxKYS5jYWxsKHQsbCkpJiYhKHMmJihsPT0ibGVuZ3RoInx8aSYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fG8mJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxNbihsLGEpKSkmJnUucHVzaChsKTtyZXR1cm4gdX1mdW5jdGlvbiB0aSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19dmFyIHR1PXRpKE9iamVjdC5rZXlzLE9iamVjdCksZXU9dHUsbnU9T2JqZWN0LnByb3RvdHlwZSxydT1udS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBpdSh0KXtpZighRG4odCkpcmV0dXJuIGV1KHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpcnUuY2FsbCh0LG4pJiZuIT0iY29uc3RydWN0b3IiJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24gVW4odCl7cmV0dXJuIHpyKHQpP0pyKHQpOml1KHQpfWZ1bmN0aW9uIG91KHQpe3ZhciBlPVtdO2lmKHQhPW51bGwpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9dmFyIHN1PU9iamVjdC5wcm90b3R5cGUsYXU9c3UuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gdXUodCl7aWYoIWllKHQpKXJldHVybiBvdSh0KTt2YXIgZT1Ebih0KSxuPVtdO2Zvcih2YXIgciBpbiB0KXI9PSJjb25zdHJ1Y3RvciImJihlfHwhYXUuY2FsbCh0LHIpKXx8bi5wdXNoKHIpO3JldHVybiBufWZ1bmN0aW9uIGpuKHQpe3JldHVybiB6cih0KT9Kcih0LCEwKTp1dSh0KX12YXIgY3U9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8saHU9L15cdyokLztmdW5jdGlvbiBmdSh0LGUpe2lmKEt0KHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8d24odCk/ITA6aHUudGVzdCh0KXx8IWN1LnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBsdT1zZShPYmplY3QsImNyZWF0ZSIpLExlPWx1O2Z1bmN0aW9uIGR1KCl7dGhpcy5fX2RhdGFfXz1MZT9MZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBFdSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgX3U9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLHB1PU9iamVjdC5wcm90b3R5cGUseXU9cHUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gQXUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihMZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PV91P3ZvaWQgMDpufXJldHVybiB5dS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIFR1PU9iamVjdC5wcm90b3R5cGUsUnU9VHUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24geHUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gTGU/ZVt0XSE9PXZvaWQgMDpSdS5jYWxsKGUsdCl9dmFyIE91PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBidSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09TGUmJmU9PT12b2lkIDA/T3U6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1kdSxhZS5wcm90b3R5cGUuZGVsZXRlPUV1LGFlLnByb3RvdHlwZS5nZXQ9QXUsYWUucHJvdG90eXBlLmhhcz14dSxhZS5wcm90b3R5cGUuc2V0PWJ1O2Z1bmN0aW9uIGd1KCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBzbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFZyKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIFN1PUFycmF5LnByb3RvdHlwZSxtdT1TdS5zcGxpY2U7ZnVuY3Rpb24gRnUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPXNuKGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTptdS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiB3dSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49c24oZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIEl1KHQpe3JldHVybiBzbih0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIE51KHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPXNuKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gSHQodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19SHQucHJvdG90eXBlLmNsZWFyPWd1LEh0LnByb3RvdHlwZS5kZWxldGU9RnUsSHQucHJvdG90eXBlLmdldD13dSxIdC5wcm90b3R5cGUuaGFzPUl1LEh0LnByb3RvdHlwZS5zZXQ9TnU7dmFyIE11PXNlKFV0LCJNYXAiKSxQZT1NdTtmdW5jdGlvbiBDdSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoUGV8fEh0KSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiB2dSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBhbih0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIHZ1KGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gRHUodCl7dmFyIGU9YW4odGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBMdSh0KXtyZXR1cm4gYW4odGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gUHUodCl7cmV0dXJuIGFuKHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIEJ1KHQsZSl7dmFyIG49YW4odGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBadCh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1adC5wcm90b3R5cGUuY2xlYXI9Q3UsWnQucHJvdG90eXBlLmRlbGV0ZT1EdSxadC5wcm90b3R5cGUuZ2V0PUx1LFp0LnByb3RvdHlwZS5oYXM9UHUsWnQucHJvdG90eXBlLnNldD1CdTt2YXIgVXU9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIEduKHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoVXUpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiBuLmNhY2hlPW5ldyhHbi5DYWNoZXx8WnQpLG59R24uQ2FjaGU9WnQ7dmFyIGp1PTUwMDtmdW5jdGlvbiBHdSh0KXt2YXIgZT1Hbih0LGZ1bmN0aW9uKHIpe3JldHVybiBuLnNpemU9PT1qdSYmbi5jbGVhcigpLHJ9KSxuPWUuY2FjaGU7cmV0dXJuIGV9dmFyICR1PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLFZ1PS9cXChcXCk/L2csV3U9R3UoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHQuY2hhckNvZGVBdCgwKT09PTQ2JiZlLnB1c2goIiIpLHQucmVwbGFjZSgkdSxmdW5jdGlvbihuLHIsaSxvKXtlLnB1c2goaT9vLnJlcGxhY2UoVnUsIiQxIik6cnx8bil9KSxlfSksenU9V3U7ZnVuY3Rpb24gWHUodCl7cmV0dXJuIHQ9PW51bGw/IiI6QnIodCl9ZnVuY3Rpb24gdW4odCxlKXtyZXR1cm4gS3QodCk/dDpmdSh0LGUpP1t0XTp6dShYdSh0KSl9dmFyIEh1PTEvMDtmdW5jdGlvbiAkbih0KXtpZih0eXBlb2YgdD09InN0cmluZyJ8fHduKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIGU9PSIwIiYmMS90PT0tSHU/Ii0wIjplfWZ1bmN0aW9uIGt1KHQsZSl7ZT11bihlLHQpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7dCE9bnVsbCYmbjxyOyl0PXRbJG4oZVtuKytdKV07cmV0dXJuIG4mJm49PXI/dDp2b2lkIDB9ZnVuY3Rpb24gVm4odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH12YXIgZWk9anQ/anQuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMDtmdW5jdGlvbiBxdSh0KXtyZXR1cm4gS3QodCl8fExuKHQpfHwhIShlaSYmdCYmdFtlaV0pfWZ1bmN0aW9uIG5pKHQsZSxuLHIsaSl7dmFyIG89LTEscz10Lmxlbmd0aDtmb3Iobnx8KG49cXUpLGl8fChpPVtdKTsrK288czspe3ZhciB1PXRbb107ZT4wJiZuKHUpP2U+MT9uaSh1LGUtMSxuLHIsaSk6Vm4oaSx1KTpyfHwoaVtpLmxlbmd0aF09dSl9cmV0dXJuIGl9ZnVuY3Rpb24gWXUodCl7dmFyIGU9dD09bnVsbD8wOnQubGVuZ3RoO3JldHVybiBlP25pKHQsMSk6W119ZnVuY3Rpb24gS3UodCl7cmV0dXJuIG9hKGZhKHQsdm9pZCAwLFl1KSx0KyIiKX12YXIgWnU9dGkoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCkscmk9WnU7ZnVuY3Rpb24gUXUoKXt0aGlzLl9fZGF0YV9fPW5ldyBIdCx0aGlzLnNpemU9MH1mdW5jdGlvbiBKdSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn1mdW5jdGlvbiB0Yyh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gZWModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBuYz0yMDA7ZnVuY3Rpb24gcmModCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBIdCl7dmFyIHI9bi5fX2RhdGFfXztpZighUGV8fHIubGVuZ3RoPG5jLTEpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBadChyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9ZnVuY3Rpb24gU2UodCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgSHQodCk7dGhpcy5zaXplPWUuc2l6ZX1TZS5wcm90b3R5cGUuY2xlYXI9UXUsU2UucHJvdG90eXBlLmRlbGV0ZT1KdSxTZS5wcm90b3R5cGUuZ2V0PXRjLFNlLnByb3RvdHlwZS5oYXM9ZWMsU2UucHJvdG90eXBlLnNldD1yYztmdW5jdGlvbiBpYyh0LGUpe3JldHVybiB0JiZvbihlLFVuKGUpLHQpfWZ1bmN0aW9uIG9jKHQsZSl7cmV0dXJuIHQmJm9uKGUsam4oZSksdCl9dmFyIGlpPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsb2k9aWkmJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxzYz1vaSYmb2kuZXhwb3J0cz09PWlpLHNpPXNjP1V0LkJ1ZmZlcjp2b2lkIDAsYWk9c2k/c2kuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uIGFjKHQsZSl7aWYoZSlyZXR1cm4gdC5zbGljZSgpO3ZhciBuPXQubGVuZ3RoLHI9YWk/YWkobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfWZ1bmN0aW9uIHVjKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtlKHMsbix0KSYmKG9baSsrXT1zKX1yZXR1cm4gb31mdW5jdGlvbiB1aSgpe3JldHVybltdfXZhciBjYz1PYmplY3QucHJvdG90eXBlLGhjPWNjLnByb3BlcnR5SXNFbnVtZXJhYmxlLGNpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsZmM9Y2k/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLHVjKGNpKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBoYy5jYWxsKHQsZSl9KSl9OnVpLFduPWZjO2Z1bmN0aW9uIGxjKHQsZSl7cmV0dXJuIG9uKHQsV24odCksZSl9dmFyIGRjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsRWM9ZGM/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KVZuKGUsV24odCkpLHQ9cmkodCk7cmV0dXJuIGV9OnVpLGhpPUVjO2Z1bmN0aW9uIF9jKHQsZSl7cmV0dXJuIG9uKHQsaGkodCksZSl9ZnVuY3Rpb24gZmkodCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIEt0KHQpP3I6Vm4ocixuKHQpKX1mdW5jdGlvbiBwYyh0KXtyZXR1cm4gZmkodCxVbixXbil9ZnVuY3Rpb24geWModCl7cmV0dXJuIGZpKHQsam4saGkpfXZhciBBYz1zZShVdCwiRGF0YVZpZXciKSx6bj1BYyxUYz1zZShVdCwiUHJvbWlzZSIpLFhuPVRjLFJjPXNlKFV0LCJTZXQiKSxIbj1SYyxsaT0iW29iamVjdCBNYXBdIix4Yz0iW29iamVjdCBPYmplY3RdIixkaT0iW29iamVjdCBQcm9taXNlXSIsRWk9IltvYmplY3QgU2V0XSIsX2k9IltvYmplY3QgV2Vha01hcF0iLHBpPSJbb2JqZWN0IERhdGFWaWV3XSIsT2M9b2Uoem4pLGJjPW9lKFBlKSxnYz1vZShYbiksU2M9b2UoSG4pLG1jPW9lKE5uKSx1ZT1PZTsoem4mJnVlKG5ldyB6bihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9cGl8fFBlJiZ1ZShuZXcgUGUpIT1saXx8WG4mJnVlKFhuLnJlc29sdmUoKSkhPWRpfHxIbiYmdWUobmV3IEhuKSE9RWl8fE5uJiZ1ZShuZXcgTm4pIT1faSkmJih1ZT1mdW5jdGlvbih0KXt2YXIgZT1PZSh0KSxuPWU9PXhjP3QuY29uc3RydWN0b3I6dm9pZCAwLHI9bj9vZShuKToiIjtpZihyKXN3aXRjaChyKXtjYXNlIE9jOnJldHVybiBwaTtjYXNlIGJjOnJldHVybiBsaTtjYXNlIGdjOnJldHVybiBkaTtjYXNlIFNjOnJldHVybiBFaTtjYXNlIG1jOnJldHVybiBfaX1yZXR1cm4gZX0pO3ZhciBrbj11ZSxGYz1PYmplY3QucHJvdG90eXBlLHdjPUZjLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEljKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmd2MuY2FsbCh0LCJpbmRleCIpJiYobi5pbmRleD10LmluZGV4LG4uaW5wdXQ9dC5pbnB1dCksbn12YXIgTmM9VXQuVWludDhBcnJheSx5aT1OYztmdW5jdGlvbiBxbih0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgeWkoZSkuc2V0KG5ldyB5aSh0KSksZX1mdW5jdGlvbiBNYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfXZhciBDYz0vXHcqJC87ZnVuY3Rpb24gdmModCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2UsQ2MuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9dmFyIEFpPWp0P2p0LnByb3RvdHlwZTp2b2lkIDAsVGk9QWk/QWkudmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gRGModCl7cmV0dXJuIFRpP09iamVjdChUaS5jYWxsKHQpKTp7fX1mdW5jdGlvbiBMYyh0LGUpe3ZhciBuPWU/cW4odC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCl9dmFyIFBjPSJbb2JqZWN0IEJvb2xlYW5dIixCYz0iW29iamVjdCBEYXRlXSIsVWM9IltvYmplY3QgTWFwXSIsamM9IltvYmplY3QgTnVtYmVyXSIsR2M9IltvYmplY3QgUmVnRXhwXSIsJGM9IltvYmplY3QgU2V0XSIsVmM9IltvYmplY3QgU3RyaW5nXSIsV2M9IltvYmplY3QgU3ltYm9sXSIsemM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixYYz0iW29iamVjdCBEYXRhVmlld10iLEhjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLGtjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHFjPSJbb2JqZWN0IEludDhBcnJheV0iLFljPSJbb2JqZWN0IEludDE2QXJyYXldIixLYz0iW29iamVjdCBJbnQzMkFycmF5XSIsWmM9IltvYmplY3QgVWludDhBcnJheV0iLFFjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsSmM9IltvYmplY3QgVWludDE2QXJyYXldIix0aD0iW29iamVjdCBVaW50MzJBcnJheV0iO2Z1bmN0aW9uIGVoKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlIHpjOnJldHVybiBxbih0KTtjYXNlIFBjOmNhc2UgQmM6cmV0dXJuIG5ldyByKCt0KTtjYXNlIFhjOnJldHVybiBNYyh0LG4pO2Nhc2UgSGM6Y2FzZSBrYzpjYXNlIHFjOmNhc2UgWWM6Y2FzZSBLYzpjYXNlIFpjOmNhc2UgUWM6Y2FzZSBKYzpjYXNlIHRoOnJldHVybiBMYyh0LG4pO2Nhc2UgVWM6cmV0dXJuIG5ldyByO2Nhc2UgamM6Y2FzZSBWYzpyZXR1cm4gbmV3IHIodCk7Y2FzZSBHYzpyZXR1cm4gdmModCk7Y2FzZSAkYzpyZXR1cm4gbmV3IHI7Y2FzZSBXYzpyZXR1cm4gRGModCl9fWZ1bmN0aW9uIG5oKHQpe3JldHVybiB0eXBlb2YgdC5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIURuKHQpP2tzKHJpKHQpKTp7fX12YXIgcmg9IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gaWgodCl7cmV0dXJuIGJlKHQpJiZrbih0KT09cmh9dmFyIFJpPWdlJiZnZS5pc01hcCxvaD1SaT9QbihSaSk6aWgsc2g9b2gsYWg9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gdWgodCl7cmV0dXJuIGJlKHQpJiZrbih0KT09YWh9dmFyIHhpPWdlJiZnZS5pc1NldCxjaD14aT9Qbih4aSk6dWgsaGg9Y2gsZmg9MSxsaD0yLGRoPTQsT2k9IltvYmplY3QgQXJndW1lbnRzXSIsRWg9IltvYmplY3QgQXJyYXldIixfaD0iW29iamVjdCBCb29sZWFuXSIscGg9IltvYmplY3QgRGF0ZV0iLHloPSJbb2JqZWN0IEVycm9yXSIsYmk9IltvYmplY3QgRnVuY3Rpb25dIixBaD0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLFRoPSJbb2JqZWN0IE1hcF0iLFJoPSJbb2JqZWN0IE51bWJlcl0iLGdpPSJbb2JqZWN0IE9iamVjdF0iLHhoPSJbb2JqZWN0IFJlZ0V4cF0iLE9oPSJbb2JqZWN0IFNldF0iLGJoPSJbb2JqZWN0IFN0cmluZ10iLGdoPSJbb2JqZWN0IFN5bWJvbF0iLFNoPSJbb2JqZWN0IFdlYWtNYXBdIixtaD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEZoPSJbb2JqZWN0IERhdGFWaWV3XSIsd2g9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsSWg9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsTmg9IltvYmplY3QgSW50OEFycmF5XSIsTWg9IltvYmplY3QgSW50MTZBcnJheV0iLENoPSJbb2JqZWN0IEludDMyQXJyYXldIix2aD0iW29iamVjdCBVaW50OEFycmF5XSIsRGg9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixMaD0iW29iamVjdCBVaW50MTZBcnJheV0iLFBoPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWj17fTtaW09pXT1aW0VoXT1aW21oXT1aW0ZoXT1aW19oXT1aW3BoXT1aW3doXT1aW0loXT1aW05oXT1aW01oXT1aW0NoXT1aW1RoXT1aW1JoXT1aW2dpXT1aW3hoXT1aW09oXT1aW2JoXT1aW2doXT1aW3ZoXT1aW0RoXT1aW0xoXT1aW1BoXT0hMCxaW3loXT1aW2JpXT1aW1NoXT0hMTtmdW5jdGlvbiBjbih0LGUsbixyLGksbyl7dmFyIHMsdT1lJmZoLGE9ZSZsaCxsPWUmZGg7aWYobiYmKHM9aT9uKHQscixpLG8pOm4odCkpLHMhPT12b2lkIDApcmV0dXJuIHM7aWYoIWllKHQpKXJldHVybiB0O3ZhciBkPUt0KHQpO2lmKGQpe2lmKHM9SWModCksIXUpcmV0dXJuIFlzKHQscyl9ZWxzZXt2YXIgXz1rbih0KSxPPV89PWJpfHxfPT1BaDtpZihLcih0KSlyZXR1cm4gYWModCx1KTtpZihfPT1naXx8Xz09T2l8fE8mJiFpKXtpZihzPWF8fE8/e306bmgodCksIXUpcmV0dXJuIGE/X2ModCxvYyhzLHQpKTpsYyh0LGljKHMsdCkpfWVsc2V7aWYoIVpbX10pcmV0dXJuIGk/dDp7fTtzPWVoKHQsXyx1KX19b3x8KG89bmV3IFNlKTt2YXIgYj1vLmdldCh0KTtpZihiKXJldHVybiBiO28uc2V0KHQscyksaGgodCk/dC5mb3JFYWNoKGZ1bmN0aW9uKG0pe3MuYWRkKGNuKG0sZSxuLG0sdCxvKSl9KTpzaCh0KSYmdC5mb3JFYWNoKGZ1bmN0aW9uKG0sZyl7cy5zZXQoZyxjbihtLGUsbixnLHQsbykpfSk7dmFyIEk9bD9hP3ljOnBjOmE/am46VW4sUz1kP3ZvaWQgMDpJKHQpO3JldHVybiBzYShTfHx0LGZ1bmN0aW9uKG0sZyl7UyYmKGc9bSxtPXRbZ10pLENuKHMsZyxjbihtLGUsbixnLHQsbykpfSksc312YXIgQmg9MSxVaD00O2Z1bmN0aW9uIGpoKHQpe3JldHVybiBjbih0LEJofFVoKX1mdW5jdGlvbiBHaCh0LGUpe3JldHVybiB0IT1udWxsJiZlIGluIE9iamVjdCh0KX1mdW5jdGlvbiAkaCh0LGUsbil7ZT11bihlLHQpO2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89ITE7KytyPGk7KXt2YXIgcz0kbihlW3JdKTtpZighKG89dCE9bnVsbCYmbih0LHMpKSlicmVhazt0PXRbc119cmV0dXJuIG98fCsrciE9aT9vOihpPXQ9PW51bGw/MDp0Lmxlbmd0aCwhIWkmJnZuKGkpJiZNbihzLGkpJiYoS3QodCl8fExuKHQpKSl9ZnVuY3Rpb24gVmgodCxlKXtyZXR1cm4gdCE9bnVsbCYmJGgodCxlLEdoKX1mdW5jdGlvbiBXaCh0LGUsbixyKXtpZighaWUodCkpcmV0dXJuIHQ7ZT11bihlLHQpO2Zvcih2YXIgaT0tMSxvPWUubGVuZ3RoLHM9by0xLHU9dDt1IT1udWxsJiYrK2k8bzspe3ZhciBhPSRuKGVbaV0pLGw9bjtpZihhPT09Il9fcHJvdG9fXyJ8fGE9PT0iY29uc3RydWN0b3IifHxhPT09InByb3RvdHlwZSIpcmV0dXJuIHQ7aWYoaSE9cyl7dmFyIGQ9dVthXTtsPXI/cihkLGEsdSk6dm9pZCAwLGw9PT12b2lkIDAmJihsPWllKGQpP2Q6TW4oZVtpKzFdKT9bXTp7fSl9Q24odSxhLGwpLHU9dVthXX1yZXR1cm4gdH1mdW5jdGlvbiB6aCh0LGUsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBzPWVbcl0sdT1rdSh0LHMpO24odSxzKSYmV2gobyx1bihzLHQpLHUpfXJldHVybiBvfWZ1bmN0aW9uIFhoKHQsZSl7cmV0dXJuIHpoKHQsZSxmdW5jdGlvbihuLHIpe3JldHVybiBWaCh0LHIpfSl9dmFyIEhoPUt1KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306WGgodCxlKX0pLGtoPUhoO2Z1bmN0aW9uIHFoKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KX1mdW5jdGlvbiBkdCh0LGUpe3JldHVybiB0Pz9lfWNvbnN0IFloPW5ldyB0bigwLDApO2Z1bmN0aW9uIEtoKHQsZSxuKXtyZXR1cm4gdC5sZW5ndGg9PT0wfHx0WzBdLmxlbmd0aD09PTA/ITE6dFswXVswXS5kaXN0U3FyKGUpPD1uKioyfWZ1bmN0aW9uIFpoKHQsZSxuKXtpZih0Lmxlbmd0aD09PTApcmV0dXJuITE7Y29uc3Qgcj10WzBdLGk9bi8yO2ZvcihsZXQgbz0wO288ci5sZW5ndGgtMTtvKyspe2NvbnN0IHM9cltvXSx1PXJbbysxXTtpZihRaChzLHUsZSxpLFloKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBRaCh0LGUsbixyLGk9bmV3IHRuKDAsMCkpe2NvbnN0IG89dC5kaXN0U3FyKGUpO2lmKG89PT0wKXJldHVybiExO2NvbnN0IHM9KChuLngtdC54KSooZS54LXQueCkrKG4ueS10LnkpKihlLnktdC55KSkvbyx1PU1hdGgubWF4KDAsTWF0aC5taW4oMSxzKSksYT1pO3JldHVybiBhLng9dC54K3UqKGUueC10LngpLGEueT10LnkrdSooZS55LXQueSksbi5kaXN0U3FyKGEpPD1yKioyfWNvbnN0IEpoPXQ9PntsZXQgZT0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXQuY2hhckNvZGVBdChuKTtlPShlPDw1KS1lK3IsZSY9ZX1yZXR1cm4gZS50b1N0cmluZygxNil9LHRmPXFoKHttYXJrZXI6MSxwb2x5bGluZToxLHBvbHlnb246MSxlbGxpcHNvaWQ6MSxlbGxpcHNlOjEsbW9kZWw6MSwiM2R0aWxlcyI6MSxib3g6MSxwaG90b292ZXJsYXk6MSxyZXNvdXJjZToxLHJhc3RlcjoxLGhlYXRNYXA6MSxmcnVzdHVtOjEsdHJhbnNpdGlvbjoxfSk7dmFyIE09KHQ9Pih0W3QuVkFSSUFCTEU9MF09IlZBUklBQkxFIix0W3QuVU5BUlk9MV09IlVOQVJZIix0W3QuQklOQVJZPTJdPSJCSU5BUlkiLHRbdC5URVJOQVJZPTNdPSJURVJOQVJZIix0W3QuQ09ORElUSU9OQUw9NF09IkNPTkRJVElPTkFMIix0W3QuTUVNQkVSPTVdPSJNRU1CRVIiLHRbdC5GVU5DVElPTl9DQUxMPTZdPSJGVU5DVElPTl9DQUxMIix0W3QuQVJSQVk9N109IkFSUkFZIix0W3QuUkVHRVg9OF09IlJFR0VYIix0W3QuVkFSSUFCTEVfSU5fU1RSSU5HPTldPSJWQVJJQUJMRV9JTl9TVFJJTkciLHRbdC5MSVRFUkFMX05VTEw9MTBdPSJMSVRFUkFMX05VTEwiLHRbdC5MSVRFUkFMX0JPT0xFQU49MTFdPSJMSVRFUkFMX0JPT0xFQU4iLHRbdC5MSVRFUkFMX05VTUJFUj0xMl09IkxJVEVSQUxfTlVNQkVSIix0W3QuTElURVJBTF9TVFJJTkc9MTNdPSJMSVRFUkFMX1NUUklORyIsdFt0LkxJVEVSQUxfQ09MT1I9MTRdPSJMSVRFUkFMX0NPTE9SIix0W3QuTElURVJBTF9WRUNUT1I9MTVdPSJMSVRFUkFMX1ZFQ1RPUiIsdFt0LkxJVEVSQUxfUkVHRVg9MTZdPSJMSVRFUkFMX1JFR0VYIix0W3QuTElURVJBTF9VTkRFRklORUQ9MTddPSJMSVRFUkFMX1VOREVGSU5FRCIsdFt0LkJVSUxUSU5fVkFSSUFCTEU9MThdPSJCVUlMVElOX1ZBUklBQkxFIix0KSkoTXx8e30pO2NvbnN0IGVmPVsiISIsIi0iLCIrIl0sbmY9WyIrIiwiLSIsIioiLCIvIiwiJSIsIj09PSIsIiE9PSIsIj4iLCI+PSIsIjwiLCI8PSIsIiYmIiwifHwiLCIhfiIsIj1+IiwiPT0iLCIhPSJdLHJmPS9cXC9nLG9mPSJAIyUiLHNmPS9AIyUvZyxhZj0vXiMoWzAtOWEtZl0pKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pPyQvaSx1Zj0vXiMoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pPyQvaSxTaT17QUxJQ0VCTFVFOiIjRjBGOEZGIixBTlRJUVVFV0hJVEU6IiNGQUVCRDciLEFRVUE6IiMwMEZGRkYiLEFRVUFNQVJJTkU6IiM3RkZGRDQiLEFaVVJFOiIjRjBGRkZGIixCRUlHRToiI0Y1RjVEQyIsQklTUVVFOiIjRkZFNEM0IixCTEFDSzoiIzAwMDAwMCIsQkxBTkNIRURBTE1PTkQ6IiNGRkVCQ0QiLEJMVUU6IiMwMDAwRkYiLEJMVUVWSU9MRVQ6IiM4QTJCRTIiLEJST1dOOiIjQTUyQTJBIixCVVJMWVdPT0Q6IiNERUI4ODciLENBREVUQkxVRToiIzVGOUVBMCIsQ0hBUlRSRVVTRToiIzdGRkYwMCIsQ0hPQ09MQVRFOiIjRDI2OTFFIixDT1JBTDoiI0ZGN0Y1MCIsQ09STkZMT1dFUkJMVUU6IiM2NDk1RUQiLENPUk5TSUxLOiIjRkZGOERDIixDUklNU09OOiIjREMxNDNDIixDWUFOOiIjMDBGRkZGIixEQVJLQkxVRToiIzAwMDA4QiIsREFSS0NZQU46IiMwMDhCOEIiLERBUktHT0xERU5ST0Q6IiNCODg2MEIiLERBUktHUkFZOiIjQTlBOUE5IixEQVJLR1JFRU46IiMwMDY0MDAiLERBUktHUkVZOiIjQTlBOUE5IixEQVJLS0hBS0k6IiNCREI3NkIiLERBUktNQUdFTlRBOiIjOEIwMDhCIixEQVJLT0xJVkVHUkVFTjoiIzU1NkIyRiIsREFSS09SQU5HRToiI0ZGOEMwMCIsREFSS09SQ0hJRDoiIzk5MzJDQyIsREFSS1JFRDoiIzhCMDAwMCIsREFSS1NBTE1PTjoiI0U5OTY3QSIsREFSS1NFQUdSRUVOOiIjOEZCQzhGIixEQVJLU0xBVEVCTFVFOiIjNDgzRDhCIixEQVJLU0xBVEVHUkFZOiIjMkY0RjRGIixEQVJLU0xBVEVHUkVZOiIjMkY0RjRGIixEQVJLVFVSUVVPSVNFOiIjMDBDRUQxIixEQVJLVklPTEVUOiIjOTQwMEQzIixERUVQUElOSzoiI0ZGMTQ5MyIsREVFUFNLWUJMVUU6IiMwMEJGRkYiLERJTUdSQVk6IiM2OTY5NjkiLERJTUdSRVk6IiM2OTY5NjkiLERPREdFUkJMVUU6IiMxRTkwRkYiLEZJUkVCUklDSzoiI0IyMjIyMiIsRkxPUkFMV0hJVEU6IiNGRkZBRjAiLEZPUkVTVEdSRUVOOiIjMjI4QjIyIixGVUNIU0lBOiIjRkYwMEZGIixHQUlOU0JPUk86IiNEQ0RDREMiLEdIT1NUV0hJVEU6IiNGOEY4RkYiLEdPTEQ6IiNGRkQ3MDAiLEdPTERFTlJPRDoiI0RBQTUyMCIsR1JBWToiIzgwODA4MCIsR1JFRU46IiMwMDgwMDAiLEdSRUVOWUVMTE9XOiIjQURGRjJGIixHUkVZOiIjODA4MDgwIixIT05FWURFVzoiI0YwRkZGMCIsSE9UUElOSzoiI0ZGNjlCNCIsSU5ESUFOUkVEOiIjQ0Q1QzVDIixJTkRJR086IiM0QjAwODIiLElWT1JZOiIjRkZGRkYwIixLSEFLSToiI0YwRTY4QyIsTEFWRU5ERVI6IiNFNkU2RkEiLExBVkVOREFSX0JMVVNIOiIjRkZGMEY1IixMQVdOR1JFRU46IiM3Q0ZDMDAiLExFTU9OQ0hJRkZPTjoiI0ZGRkFDRCIsTElHSFRCTFVFOiIjQUREOEU2IixMSUdIVENPUkFMOiIjRjA4MDgwIixMSUdIVENZQU46IiNFMEZGRkYiLExJR0hUR09MREVOUk9EWUVMTE9XOiIjRkFGQUQyIixMSUdIVEdSQVk6IiNEM0QzRDMiLExJR0hUR1JFRU46IiM5MEVFOTAiLExJR0hUR1JFWToiI0QzRDNEMyIsTElHSFRQSU5LOiIjRkZCNkMxIixMSUdIVFNFQUdSRUVOOiIjMjBCMkFBIixMSUdIVFNLWUJMVUU6IiM4N0NFRkEiLExJR0hUU0xBVEVHUkFZOiIjNzc4ODk5IixMSUdIVFNMQVRFR1JFWToiIzc3ODg5OSIsTElHSFRTVEVFTEJMVUU6IiNCMEM0REUiLExJR0hUWUVMTE9XOiIjRkZGRkUwIixMSU1FOiIjMDBGRjAwIixMSU1FR1JFRU46IiMzMkNEMzIiLExJTkVOOiIjRkFGMEU2IixNQUdFTlRBOiIjRkYwMEZGIixNQVJPT046IiM4MDAwMDAiLE1FRElVTUFRVUFNQVJJTkU6IiM2NkNEQUEiLE1FRElVTUJMVUU6IiMwMDAwQ0QiLE1FRElVTU9SQ0hJRDoiI0JBNTVEMyIsTUVESVVNUFVSUExFOiIjOTM3MERCIixNRURJVU1TRUFHUkVFTjoiIzNDQjM3MSIsTUVESVVNU0xBVEVCTFVFOiIjN0I2OEVFIixNRURJVU1TUFJJTkdHUkVFTjoiIzAwRkE5QSIsTUVESVVNVFVSUVVPSVNFOiIjNDhEMUNDIixNRURJVU1WSU9MRVRSRUQ6IiNDNzE1ODUiLE1JRE5JR0hUQkxVRToiIzE5MTk3MCIsTUlOVENSRUFNOiIjRjVGRkZBIixNSVNUWVJPU0U6IiNGRkU0RTEiLE1PQ0NBU0lOOiIjRkZFNEI1IixOQVZBSk9XSElURToiI0ZGREVBRCIsTkFWWToiIzAwMDA4MCIsT0xETEFDRToiI0ZERjVFNiIsT0xJVkU6IiM4MDgwMDAiLE9MSVZFRFJBQjoiIzZCOEUyMyIsT1JBTkdFOiIjRkZBNTAwIixPUkFOR0VSRUQ6IiNGRjQ1MDAiLE9SQ0hJRDoiI0RBNzBENiIsUEFMRUdPTERFTlJPRDoiI0VFRThBQSIsUEFMRUdSRUVOOiIjOThGQjk4IixQQUxFVFVSUVVPSVNFOiIjQUZFRUVFIixQQUxFVklPTEVUUkVEOiIjREI3MDkzIixQQVBBWUFXSElQOiIjRkZFRkQ1IixQRUFDSFBVRkY6IiNGRkRBQjkiLFBFUlU6IiNDRDg1M0YiLFBJTks6IiNGRkMwQ0IiLFBMVU06IiNEREEwREQiLFBPV0RFUkJMVUU6IiNCMEUwRTYiLFBVUlBMRToiIzgwMDA4MCIsUkVEOiIjRkYwMDAwIixST1NZQlJPV046IiNCQzhGOEYiLFJPWUFMQkxVRToiIzQxNjlFMSIsU0FERExFQlJPV046IiM4QjQ1MTMiLFNBTE1PTjoiI0ZBODA3MiIsU0FORFlCUk9XTjoiI0Y0QTQ2MCIsU0VBR1JFRU46IiMyRThCNTciLFNFQVNIRUxMOiIjRkZGNUVFIixTSUVOTkE6IiNBMDUyMkQiLFNJTFZFUjoiI0MwQzBDMCIsU0tZQkxVRToiIzg3Q0VFQiIsU0xBVEVCTFVFOiIjNkE1QUNEIixTTEFURUdSQVk6IiM3MDgwOTAiLFNMQVRFR1JFWToiIzcwODA5MCIsU05PVzoiI0ZGRkFGQSIsU1BSSU5HR1JFRU46IiMwMEZGN0YiLFNURUVMQkxVRToiIzQ2ODJCNCIsVEFOOiIjRDJCNDhDIixURUFMOiIjMDA4MDgwIixUSElTVExFOiIjRDhCRkQ4IixUT01BVE86IiNGRjYzNDciLFRVUlFVT0lTRToiIzQwRTBEMCIsVklPTEVUOiIjRUU4MkVFIixXSEVBVDoiI0Y1REVCMyIsV0hJVEU6IiNGRkZGRkYiLFdISVRFU01PS0U6IiNGNUY1RjUiLFlFTExPVzoiI0ZGRkYwMCIsWUVMTE9XR1JFRU46IiM5QUNEMzIifTtmdW5jdGlvbiBjZih0KXtjb25zdCBlPVluW3RdO3JldHVybiBmdW5jdGlvbihuKXtjb25zdCByPXRoaXMuX2xlZnQuZXZhbHVhdGUobiksaT10aGlzLl9yaWdodC5ldmFsdWF0ZShuKTtyZXR1cm4gZSh0LHIsaSl9fWNvbnN0IFluPXthdGFuMjpCZShNYXRoLmF0YW4yLCExKSxwb3c6QmUoTWF0aC5wb3csITEpLG1pbjpCZShNYXRoLm1pbiwhMCksbWF4OkJlKE1hdGgubWF4LCEwKSxzdGFydHNXaXRoOkJlKGhmLCExKX07ZnVuY3Rpb24gQmUodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyLGkpe2lmKGUmJnR5cGVvZiBpPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIifHx0eXBlb2Ygcj09Im51bWJlciImJnR5cGVvZiBpPT0ibnVtYmVyInx8dHlwZW9mIHI9PSJzdHJpbmciJiZ0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHQocixpKTt0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uICIke259IiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcy4gQXJndW1lbnRzIGFyZSAke3J9IGFuZCAke2l9LmApfX1mdW5jdGlvbiBoZih0LGUpe3JldHVybiB0LnN0YXJ0c1dpdGgoZSl9ZnVuY3Rpb24gZmYodCl7Y29uc3QgZT1Lblt0XTtyZXR1cm4gZnVuY3Rpb24obil7Y29uc3Qgcj10aGlzLl9sZWZ0LmV2YWx1YXRlKG4pO3JldHVybiBlKHQscil9fWNvbnN0IEtuPXthYnM6Y3QoTWF0aC5hYnMpLHNxcnQ6Y3QoTWF0aC5zcXJ0KSxjb3M6Y3QoTWF0aC5jb3MpLHNpbjpjdChNYXRoLnNpbiksdGFuOmN0KE1hdGgudGFuKSxhY29zOmN0KE1hdGguYWNvcyksYXNpbjpjdChNYXRoLmFzaW4pLGF0YW46Y3QoTWF0aC5hdGFuKSxyYWRpYW5zOmN0KFIudG9SYWRpYW5zKSxkZWdyZWVzOmN0KFIudG9EZWdyZWVzKSxzaWduOmN0KFIuc2lnbiksZmxvb3I6Y3QoTWF0aC5mbG9vciksY2VpbDpjdChNYXRoLmNlaWwpLHJvdW5kOmN0KE1hdGgucm91bmQpLGV4cDI6Y3QoZGYpLGxvZzpjdChNYXRoLmxvZyksbG9nMjpjdChFZiksZnJhY3Q6Y3QobGYpfTtmdW5jdGlvbiBjdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuIHQobik7dGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiAiJHtlfSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfX1mdW5jdGlvbiBsZih0KXtyZXR1cm4gdC1NYXRoLmZsb29yKHQpfWZ1bmN0aW9uIGRmKHQpe3JldHVybiBNYXRoLnBvdygyLHQpfWZ1bmN0aW9uIEVmKHQpe3JldHVybiBSLmxvZzIodCl9Y29uc3QgX2Y9L15yZ2JhP1woXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPylccyosXHMqKFswLTkuXSslPykoPzpccyosXHMqKFswLTkuXSspKT9ccypcKSQvaSxwZj0vXmhzbGE/XChccyooWzAtOS5dKylccyosXHMqKFswLTkuXSslKVxzKixccyooWzAtOS5dKyUpKD86XHMqLFxzKihbMC05Ll0rKSk/XHMqXCkkL2k7Y2xhc3MgSntjb25zdHJ1Y3RvcihlLG4scixpKXtDKHRoaXMsInJlZCIpO0ModGhpcywiZ3JlZW4iKTtDKHRoaXMsImJsdWUiKTtDKHRoaXMsImFscGhhIik7dGhpcy5yZWQ9ZHQoZSwxKSx0aGlzLmdyZWVuPWR0KG4sMSksdGhpcy5ibHVlPWR0KHIsMSksdGhpcy5hbHBoYT1kdChpLDEpfXN0YXRpYyBieXRlVG9GbG9hdChlKXtyZXR1cm4gZS8yNTV9c3RhdGljIGZsb2F0VG9CeXRlKGUpe3JldHVybiBlPT09MT8yNTU6ZSoyNTZ8MH1zdGF0aWMgZnJvbUNzc0NvbG9yU3RyaW5nKGUpe2U9ZS5yZXBsYWNlKC9ccy9nLCIiKTtjb25zdCBuPXlmKGUpO2lmKHR5cGVvZiBuPCJ1IilyZXR1cm4gbjtsZXQgcj1hZi5leGVjKGUpO2lmKHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8xNSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzE1LGkuYmx1ZT1wYXJzZUludChyWzNdLDE2KS8xNSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImYiKSwxNikvMTUsaX1pZihyPXVmLmV4ZWMoZSksciE9PW51bGwpe2NvbnN0IGk9bmV3IEo7cmV0dXJuIGkucmVkPXBhcnNlSW50KHJbMV0sMTYpLzI1NSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzI1NSxpLmJsdWU9cGFyc2VJbnQoclszXSwxNikvMjU1LGkuYWxwaGE9cGFyc2VJbnQoZHQocls0XSwiZmYiKSwxNikvMjU1LGl9aWYocj1fZi5leGVjKGUpLHIhPT1udWxsKXtjb25zdCBpPW5ldyBKO3JldHVybiBpLnJlZD1wYXJzZUZsb2F0KHJbMV0pLyhyWzFdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ncmVlbj1wYXJzZUZsb2F0KHJbMl0pLyhyWzJdLnN1YnN0cigtMSk9PT0iJSI/MTAwOjI1NSksaS5ibHVlPXBhcnNlRmxvYXQoclszXSkvKHJbM10uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmFscGhhPXBhcnNlRmxvYXQoZHQocls0XSwiMS4wIikpLGl9aWYocj1wZi5leGVjKGUpLHIhPT1udWxsKXJldHVybiBKLmZyb21Ic2wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAscGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSkpfXN0YXRpYyBmcm9tSHNsKGUsbixyLGkpe2lmKGU9ZHQoZSwwKSUxLG49ZHQobiwwKSxyPWR0KHIsMCksaT1kdChpLDEpLGUmJm4mJnImJmkpe2xldCBvPXIscz1yLHU9cjtjb25zdCBhPW5ldyBKO2lmKG4hPT0wKXtsZXQgbDtyPC41P2w9ciooMStuKTpsPXIrbi1yKm47Y29uc3QgZD0yKnItbDtvPVpuKGQsbCxlKzEvMykscz1abihkLGwsZSksdT1abihkLGwsZS0xLzMpfXJldHVybiB0eXBlb2YgYT4idSI/bmV3IEoobyxzLHUsaSk6KGEucmVkPW8sYS5ncmVlbj1zLGEuYmx1ZT11LGEuYWxwaGE9aSxhKX19dG9Dc3NIZXhTdHJpbmcoKXtsZXQgZT1KLmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7ZS5sZW5ndGg8MiYmKGU9YDAke2V9YCk7bGV0IG49Si5mbG9hdFRvQnl0ZSh0aGlzLmdyZWVuKS50b1N0cmluZygxNik7bi5sZW5ndGg8MiYmKG49YDAke259YCk7bGV0IHI9Si5mbG9hdFRvQnl0ZSh0aGlzLmJsdWUpLnRvU3RyaW5nKDE2KTtpZihyLmxlbmd0aDwyJiYocj1gMCR7cn1gKSx0aGlzLmFscGhhPDEpe2xldCBpPUouZmxvYXRUb0J5dGUodGhpcy5hbHBoYSkudG9TdHJpbmcoMTYpO3JldHVybiBpLmxlbmd0aDwyJiYoaT1gMCR7aX1gKSxgIyR7ZX0ke259JHtyfSR7aX1gfXJldHVybmAjJHtlfSR7bn0ke3J9YC50b1VwcGVyQ2FzZSgpfXN0YXRpYyBmcm9tQnl0ZXMoZSxuLHIsaSl7cmV0dXJuIGU9dGhpcy5ieXRlVG9GbG9hdChkdChlLDI1NSkpLG49Si5ieXRlVG9GbG9hdChkdChuLDI1NSkpLHI9Si5ieXRlVG9GbG9hdChkdChyLDI1NSkpLGk9Si5ieXRlVG9GbG9hdChkdChpLDI1NSkpLG5ldyBKKGUsbixyLGkpfX1mdW5jdGlvbiB5Zih0KXtpZih0PXQudG9VcHBlckNhc2UoKSxTaVt0XSlyZXR1cm4gSi5mcm9tQ3NzQ29sb3JTdHJpbmcoU2lbdF0pO3N3aXRjaCh0KXtjYXNlIlRSQU5TUEFSRU5UIjpyZXR1cm4gbmV3IEooMCwwLDAsMCk7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIFpuKHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbio2PDE/dCsoZS10KSo2Km46bioyPDE/ZTpuKjM8Mj90KyhlLXQpKigyLzMtbikqNjp0fWNsYXNzIFB7Y29uc3RydWN0b3IoZSxuLHIsaSxvKXtDKHRoaXMsIl90eXBlIik7Qyh0aGlzLCJfdmFsdWUiKTtDKHRoaXMsIl9sZWZ0Iik7Qyh0aGlzLCJfcmlnaHQiKTtDKHRoaXMsIl90ZXN0Iik7Qyh0aGlzLCJldmFsdWF0ZSIpO3RoaXMuX3R5cGU9ZSx0aGlzLl92YWx1ZT1uLHRoaXMuX2xlZnQ9cix0aGlzLl9yaWdodD1pLHRoaXMuX3Rlc3Q9byx0aGlzLnNldEV2YWx1YXRlRnVuY3Rpb24oKX1zZXRFdmFsdWF0ZUZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLl90eXBlLG49dGhpcy5fdmFsdWU7c3dpdGNoKGUpe2Nhc2UgTS5DT05ESVRJT05BTDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uYWw7YnJlYWs7Y2FzZSBNLkZVTkNUSU9OX0NBTEw6c3dpdGNoKG4pe2Nhc2UidG9TdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVUb1N0cmluZzticmVha31icmVhaztjYXNlIE0uVU5BUlk6c3dpdGNoKG4pe2Nhc2UiISI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdDticmVhaztjYXNlIi0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOZWdhdGl2ZTticmVhaztjYXNlIisiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVQb3NpdGl2ZTticmVhaztjYXNlImlzTmFOIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTmFOO2JyZWFrO2Nhc2UiaXNGaW5pdGUiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVJc0Zpbml0ZTticmVhaztjYXNlIkJvb2xlYW4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVCb29sZWFuQ29udmVyc2lvbjticmVhaztjYXNlIk51bWJlciI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb247YnJlYWs7Y2FzZSJTdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVTdHJpbmdDb252ZXJzaW9uO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIEtuW25dPCJ1IiYmKHRoaXMuZXZhbHVhdGU9ZmYobikpO2JyZWFrfWJyZWFrO2Nhc2UgTS5CSU5BUlk6c3dpdGNoKG4pe2Nhc2UiKyI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZVBsdXM7YnJlYWs7Y2FzZSItIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWludXM7YnJlYWs7Y2FzZSIqIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVGltZXM7YnJlYWs7Y2FzZSIvIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRGl2aWRlO2JyZWFrO2Nhc2UiJSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1vZDticmVhaztjYXNlIj09PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUVxdWFsc1N0cmljdDticmVhaztjYXNlIiE9PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdEVxdWFsc1N0cmljdDticmVhaztjYXNlIjwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVMZXNzVGhhbjticmVhaztjYXNlIjw9Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGVzc1RoYW5PckVxdWFsczticmVhaztjYXNlIj4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVHcmVhdGVyVGhhbjticmVhaztjYXNlIj49Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlR3JlYXRlclRoYW5PckVxdWFsczticmVhaztjYXNlIiYmIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQW5kO2JyZWFrO2Nhc2UifHwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVPcjticmVhaztjYXNlIj09Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRXF1YWxzO2JyZWFrO2Nhc2UiIT0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOb3RFcXVhbHM7YnJlYWs7ZGVmYXVsdDp0eXBlb2YgWW5bbl08InUiJiYodGhpcy5ldmFsdWF0ZT1jZihuKSk7YnJlYWt9YnJlYWs7Y2FzZSBNLk1FTUJFUjpuPT09ImJyYWNrZXRzIj90aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWVtYmVyQnJhY2tldHM6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1lbWJlckRvdDticmVhaztjYXNlIE0uQVJSQVk6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUFycmF5O2JyZWFrO2Nhc2UgTS5WQVJJQUJMRTp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGU7YnJlYWs7Y2FzZSBNLlZBUklBQkxFX0lOX1NUUklORzp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGVTdHJpbmc7YnJlYWs7Y2FzZSBNLkxJVEVSQUxfQ09MT1I6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxDb2xvcjticmVhaztjYXNlIE0uTElURVJBTF9TVFJJTkc6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxTdHJpbmc7YnJlYWs7ZGVmYXVsdDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGl0ZXJhbDticmVha319X2V2YWx1YXRlTGl0ZXJhbCgpe3JldHVybiB0aGlzLl92YWx1ZX1fZXZhbHVhdGVMaXRlcmFsU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfV9ldmFsdWF0ZVZhcmlhYmxlU3RyaW5nKGUpe2NvbnN0IG49L1wkeyguKj8pfS9nO2xldCByPXRoaXMuX3ZhbHVlLGk9bi5leGVjKHIpO2Zvcig7aSE9PW51bGw7KXtjb25zdCBvPWlbMF0scz1pWzFdO2xldCB1PWU9PW51bGw/dm9pZCAwOmUucHJvcGVydGllc1tzXTt0eXBlb2YgdT4idSImJih1PSIiKSxyPXIucmVwbGFjZShvLHUpLGk9bi5leGVjKHIpfXJldHVybiByfV9ldmFsdWF0ZVZhcmlhYmxlKGUpe2xldCBuO3JldHVybiBlJiZTdHJpbmcodGhpcy5fdmFsdWUpaW4gZS5wcm9wZXJ0aWVzP249ZS5wcm9wZXJ0aWVzW1N0cmluZyh0aGlzLl92YWx1ZSldOlN0cmluZyh0aGlzLl92YWx1ZSk9PT0iaWQiP249ZT09bnVsbD92b2lkIDA6ZS5pZDplJiZTdHJpbmcodGhpcy5fdmFsdWUpPT09InJvb3RQcm9wZXJ0aWVzIiYmKG49ZS5wcm9wZXJ0aWVzKSx0eXBlb2Ygbj4idSImJihuPSIiKSxufV9ldmFsdWF0ZU1lbWJlckRvdChlKXtpZihtaSh0aGlzLl9sZWZ0KSlyZXR1cm4gZT09bnVsbD92b2lkIDA6ZS5wcm9wZXJ0aWVzW3RoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpXTtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4+InUiKXJldHVybjtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuW3JdfV9ldmFsdWF0ZU1lbWJlckJyYWNrZXRzKGUpe2lmKG1pKHRoaXMuX2xlZnQpKXJldHVybiBlPT1udWxsP3ZvaWQgMDplLnByb3BlcnRpZXNbdGhpcy5fcmlnaHQuZXZhbHVhdGUoZSldO2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj4idSIpcmV0dXJuO2NvbnN0IHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG5bcl19X2V2YWx1YXRlQXJyYXkoZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX3ZhbHVlLmxlbmd0aDtyKyspbltyXT10aGlzLl92YWx1ZVtyXS5ldmFsdWF0ZShlKTtyZXR1cm4gbn1fZXZhbHVhdGVOb3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiISIgcmVxdWlyZXMgYSBib29sZWFuIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiFufV9ldmFsdWF0ZU5lZ2F0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuLW47dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfV9ldmFsdWF0ZVBvc2l0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiKyIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiBufV9ldmFsdWF0ZUxlc3NUaGFuKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPCIgcmVxdWlyZXMgbnVtYmVyIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApLCExKTpuPHJ9X2V2YWx1YXRlTGVzc1RoYW5PckVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIG4hPSJudW1iZXIifHx0eXBlb2YgciE9Im51bWJlciI/KGNvbnNvbGUud2FybihgT3BlcmF0b3IgIjw9IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm48PXJ9X2V2YWx1YXRlR3JlYXRlclRoYW4oZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHR5cGVvZiBuIT0ibnVtYmVyInx8dHlwZW9mIHIhPSJudW1iZXIiPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICI+IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm4+cn1fZXZhbHVhdGVHcmVhdGVyVGhhbk9yRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPj0iIHJlcXVpcmVzIG51bWJlciBhcmd1bWVudHMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKSwhMSk6bj49cn1fZXZhbHVhdGVPcihlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4hPSJib29sZWFuIilyZXR1cm4gY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyAke259LmApLCExO2lmKG4pcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIHIhPSJib29sZWFuIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBTZWNvbmQgYXJndW1lbnQgaXMgJHtyfS5gKSwhMSk6bnx8cn1fZXZhbHVhdGVBbmQoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpcmV0dXJuIGNvbnNvbGUud2FybihgT3BlcmF0b3IgIiYmIiByZXF1aXJlcyBib29sZWFuIGFyZ3VtZW50cy4gRmlyc3QgYXJndW1lbnQgaXMgJHtufS5gKSwhMTtpZighbilyZXR1cm4hMTtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgciE9ImJvb2xlYW4iPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICImJiIgcmVxdWlyZXMgYm9vbGVhbiBhcmd1bWVudHMuIFNlY29uZCBhcmd1bWVudCBpcyAke3J9LmApLCExKTpuJiZyfV9ldmFsdWF0ZVBsdXMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4rcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIrIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYXQgbGVhc3Qgb25lIHN0cmluZyBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1pbnVzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIiKXJldHVybiBuLXI7dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVUaW1lcyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbipyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIioiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgdmVjdG9ycyB0aGV5IG11c3QgYmUgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVEaXZpZGUoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4vcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIvIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYSBudW1iZXIgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1vZChlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbiVyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIiUiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzIG9mIG1hdGNoaW5nIHR5cGVzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCl9X2V2YWx1YXRlRXF1YWxzU3RyaWN0KGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuPT09cn1fZXZhbHVhdGVOb3RFcXVhbHNTdHJpY3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG4hPT1yfV9ldmFsdWF0ZUNvbmRpdGlvbmFsKGUpe2NvbnN0IG49dGhpcy5fdGVzdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcihgQ29uZGl0aW9uYWwgYXJndW1lbnQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGEgYm9vbGVhbi4gQXJndW1lbnQgaXMgJHtufS5gKTtyZXR1cm4gbj90aGlzLl9sZWZ0LmV2YWx1YXRlKGUpOnRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpfV9ldmFsdWF0ZU5hTihlKXtyZXR1cm4gaXNOYU4odGhpcy5fbGVmdC5ldmFsdWF0ZShlKSl9X2V2YWx1YXRlSXNGaW5pdGUoZSl7cmV0dXJuIGlzRmluaXRlKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZUJvb2xlYW5Db252ZXJzaW9uKGUpe3JldHVybiBCb29sZWFuKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb24oZSl7Y29uc3Qgbj1BZih0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKTtyZXR1cm4gTnVtYmVyKG4pfV9ldmFsdWF0ZVN0cmluZ0NvbnZlcnNpb24oZSl7cmV0dXJuIFN0cmluZyh0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKX1fZXZhbHVhdGVUb1N0cmluZyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYobiBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gU3RyaW5nKG4pO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke3RoaXMuX3ZhbHVlfSIuYCl9X2V2YWx1YXRlTGl0ZXJhbENvbG9yKGUpe2NvbnN0IG49dGhpcy5fbGVmdDtsZXQgcj1uZXcgSjtpZih0aGlzLl92YWx1ZT09PSJjb2xvciIpaWYodHlwZW9mIG4+InUiKXI9Si5mcm9tQnl0ZXMoMjU1LDI1NSwyNTUsMjU1KTtlbHNlIGlmKG4ubGVuZ3RoPjEpe2NvbnN0IGk9Si5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCk7ci5hbHBoYT1uWzFdLmV2YWx1YXRlKGUpfWVsc2V7Y29uc3QgaT1KLmZyb21Dc3NDb2xvclN0cmluZyhuWzBdLmV2YWx1YXRlKGUpKTtpZihpKXI9aTtlbHNlIHRocm93IG5ldyBFcnJvcihgd3JvbmcgbGl0ZXJhbENvbG9yIGNhbGwgIiR7dGhpcy5fdmFsdWV9LCAke259fSJgKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09InJnYiIpcj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSwyNTUpO2Vsc2UgaWYodGhpcy5fdmFsdWU9PT0icmdiYSIpe2NvbnN0IGk9blszXS5ldmFsdWF0ZShlKSoyNTU7cj1KLmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSxpKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbCIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLDEpO2kmJihyPWkpfWVsc2UgaWYodGhpcy5fdmFsdWU9PT0iaHNsYSIpe2NvbnN0IGk9Si5mcm9tSHNsKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLG5bM10uZXZhbHVhdGUoZSkpO2kmJihyPWkpfXJldHVybiByLnRvQ3NzSGV4U3RyaW5nKCl9X2V2YWx1YXRlRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBGdChuKSYmIUZ0KHIpP24uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT9yLmluY2x1ZGVzKG4pOihGdChyKSYmRnQobikmJmNvbnNvbGUuZXJyb3IoIkVxdWFscyBsZWZ0IGFuZCByaWdodCBib3RoIGNhbid0IGJlIGFycmF5IGF0IHRoZSBzYW1lIHRpbWUiKSxuPT1yKX1fZXZhbHVhdGVOb3RFcXVhbHMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIEZ0KG4pJiYhRnQocik/IW4uaW5jbHVkZXMocik6RnQocikmJiFGdChuKT8hci5pbmNsdWRlcyhuKTooRnQocikmJkZ0KG4pJiZjb25zb2xlLmVycm9yKCJOb3RFcXVhbHMgbGVmdCBhbmQgcmlnaHQgYm90aCBjYW4ndCBiZSBhcnJheSBhdCB0aGUgc2FtZSB0aW1lIiksbiE9cil9fWZ1bmN0aW9uIEFmKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDtjb25zdCBlPVsiJSJdO2Zvcihjb25zdCBuIG9mIGUpaWYodC5lbmRzV2l0aChuKSlyZXR1cm4gdC5zbGljZSgwLC1uLmxlbmd0aCkudHJpbSgpO3JldHVybiB0LnRyaW0oKX1mdW5jdGlvbiBtaSh0KXtyZXR1cm4gdC5fdmFsdWU9PT0iZmVhdHVyZSJ9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gVGYodCxlLG4pe3JldHVybiBlPVVlKGUpLFNmKHQsUW4oKT9SZWZsZWN0LmNvbnN0cnVjdChlLG58fFtdLFVlKHQpLmNvbnN0cnVjdG9yKTplLmFwcGx5KHQsbikpfWZ1bmN0aW9uIEZpKHQsZSxuKXtpZihRbigpKXJldHVybiBSZWZsZWN0LmNvbnN0cnVjdC5hcHBseShudWxsLGFyZ3VtZW50cyk7dmFyIHI9W251bGxdO3IucHVzaC5hcHBseShyLGUpO3ZhciBpPW5ldyh0LmJpbmQuYXBwbHkodCxyKSk7cmV0dXJuIG4mJmplKGksbi5wcm90b3R5cGUpLGl9ZnVuY3Rpb24gUW4oKXt0cnl7dmFyIHQ9IUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpfWNhdGNoe31yZXR1cm4oUW49ZnVuY3Rpb24oKXtyZXR1cm4hIXR9KSgpfWZ1bmN0aW9uIFJmKHQsZSl7aWYodHlwZW9mIHQhPSJvYmplY3QifHwhdClyZXR1cm4gdDt2YXIgbj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZih0eXBlb2YgciE9Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oZT09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKHQpfWZ1bmN0aW9uIHhmKHQpe3ZhciBlPVJmKHQsInN0cmluZyIpO3JldHVybiB0eXBlb2YgZT09InN5bWJvbCI/ZTpTdHJpbmcoZSl9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIEd0PXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxHdCh0KX1mdW5jdGlvbiB3aSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIElpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCx4ZihyLmtleSkscil9fWZ1bmN0aW9uIE5pKHQsZSxuKXtyZXR1cm4gZSYmSWkodC5wcm90b3R5cGUsZSksbiYmSWkodCxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0fWZ1bmN0aW9uIE9mKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGUmJmplKHQsZSl9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIFVlPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKG4pe3JldHVybiBuLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pfSxVZSh0KX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBqZT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLGkpe3JldHVybiByLl9fcHJvdG9fXz1pLHJ9LGplKHQsZSl9ZnVuY3Rpb24gYmYodCl7dHJ5e3JldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKSE9PS0xfWNhdGNoe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIn19ZnVuY3Rpb24gSm4odCl7dmFyIGU9dHlwZW9mIE1hcD09ImZ1bmN0aW9uIj9uZXcgTWFwOnZvaWQgMDtyZXR1cm4gSm49ZnVuY3Rpb24ocil7aWYocj09PW51bGx8fCFiZihyKSlyZXR1cm4gcjtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2lmKHR5cGVvZiBlPCJ1Iil7aWYoZS5oYXMocikpcmV0dXJuIGUuZ2V0KHIpO2Uuc2V0KHIsaSl9ZnVuY3Rpb24gaSgpe3JldHVybiBGaShyLGFyZ3VtZW50cyxVZSh0aGlzKS5jb25zdHJ1Y3Rvcil9cmV0dXJuIGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTppLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGplKGkscil9LEpuKHQpfWZ1bmN0aW9uIGdmKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBTZih0LGUpe2lmKGUmJih0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKSlyZXR1cm4gZTtpZihlIT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIGdmKHQpfWZ1bmN0aW9uIG1mKHQpe3JldHVybiBGZih0KXx8d2YodCl8fE1pKHQpfHxJZigpfWZ1bmN0aW9uIEZmKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHRyKHQpfWZ1bmN0aW9uIHdmKHQpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZ0W1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fHRbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbSh0KX1mdW5jdGlvbiBNaSh0LGUpe2lmKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdHIodCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKHQpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIHRyKHQsZSl9fWZ1bmN0aW9uIHRyKHQsZSl7KGU9PW51bGx8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gSWYoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIE5mKHQsZSl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj1NaSh0KSl8fGUmJnQmJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciIpe24mJih0PW4pO3ZhciByPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIG89ITAscz0hMSx1O3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwodCl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gbz1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtzPSEwLHU9YX0sZjpmdW5jdGlvbigpe3RyeXshbyYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IHV9fX19dmFyIFR0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUXQodCxlKXtyZXR1cm4gdD10LnNsaWNlKCksdC5wdXNoKGUpLHR9ZnVuY3Rpb24gZXIodCxlKXtyZXR1cm4gZT1lLnNsaWNlKCksZS51bnNoaWZ0KHQpLGV9dmFyIE1mPWZ1bmN0aW9uKHQpe09mKGUsdCk7ZnVuY3Rpb24gZShuKXt2YXIgcjtyZXR1cm4gd2kodGhpcyxlKSxyPVRmKHRoaXMsZSxbJ0pTT05QYXRoIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggIm5ldyIgKGl0IHByZXZlbnRzIHJldHVybiBvZiAodW53cmFwcGVkKSBzY2FsYXIgdmFsdWVzKSddKSxyLmF2b2lkTmV3PSEwLHIudmFsdWU9bixyLm5hbWU9Ik5ld0Vycm9yIixyfXJldHVybiBOaShlKX0oSm4oRXJyb3IpKTtmdW5jdGlvbiBrKHQsZSxuLHIsaSl7aWYoISh0aGlzIGluc3RhbmNlb2YgaykpdHJ5e3JldHVybiBuZXcgayh0LGUsbixyLGkpfWNhdGNoKGEpe2lmKCFhLmF2b2lkTmV3KXRocm93IGE7cmV0dXJuIGEudmFsdWV9dHlwZW9mIHQ9PSJzdHJpbmciJiYoaT1yLHI9bixuPWUsZT10LHQ9bnVsbCk7dmFyIG89dCYmR3QodCk9PT0ib2JqZWN0IjtpZih0PXR8fHt9LHRoaXMuanNvbj10Lmpzb258fG4sdGhpcy5wYXRoPXQucGF0aHx8ZSx0aGlzLnJlc3VsdFR5cGU9dC5yZXN1bHRUeXBlfHwidmFsdWUiLHRoaXMuZmxhdHRlbj10LmZsYXR0ZW58fCExLHRoaXMud3JhcD1UdC5jYWxsKHQsIndyYXAiKT90LndyYXA6ITAsdGhpcy5zYW5kYm94PXQuc2FuZGJveHx8e30sdGhpcy5wcmV2ZW50RXZhbD10LnByZXZlbnRFdmFsfHwhMSx0aGlzLnBhcmVudD10LnBhcmVudHx8bnVsbCx0aGlzLnBhcmVudFByb3BlcnR5PXQucGFyZW50UHJvcGVydHl8fG51bGwsdGhpcy5jYWxsYmFjaz10LmNhbGxiYWNrfHxyfHxudWxsLHRoaXMub3RoZXJUeXBlQ2FsbGJhY2s9dC5vdGhlclR5cGVDYWxsYmFja3x8aXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBzdXBwbHkgYW4gb3RoZXJUeXBlQ2FsbGJhY2sgY2FsbGJhY2sgb3B0aW9uIHdpdGggdGhlIEBvdGhlcigpIG9wZXJhdG9yLiIpfSx0LmF1dG9zdGFydCE9PSExKXt2YXIgcz17cGF0aDpvP3QucGF0aDplfTtvPyJqc29uImluIHQmJihzLmpzb249dC5qc29uKTpzLmpzb249bjt2YXIgdT10aGlzLmV2YWx1YXRlKHMpO2lmKCF1fHxHdCh1KSE9PSJvYmplY3QiKXRocm93IG5ldyBNZih1KTtyZXR1cm4gdX19ay5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXRoaXMucGFyZW50LHM9dGhpcy5wYXJlbnRQcm9wZXJ0eSx1PXRoaXMuZmxhdHRlbixhPXRoaXMud3JhcDtpZih0aGlzLmN1cnJSZXN1bHRUeXBlPXRoaXMucmVzdWx0VHlwZSx0aGlzLmN1cnJQcmV2ZW50RXZhbD10aGlzLnByZXZlbnRFdmFsLHRoaXMuY3VyclNhbmRib3g9dGhpcy5zYW5kYm94LG49bnx8dGhpcy5jYWxsYmFjayx0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjaz1yfHx0aGlzLm90aGVyVHlwZUNhbGxiYWNrLGU9ZXx8dGhpcy5qc29uLHQ9dHx8dGhpcy5wYXRoLHQmJkd0KHQpPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KHQpKXtpZighdC5wYXRoJiZ0LnBhdGghPT0iIil0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSAicGF0aCIgcHJvcGVydHkgd2hlbiBwcm92aWRpbmcgYW4gb2JqZWN0IGFyZ3VtZW50IHRvIEpTT05QYXRoLmV2YWx1YXRlKCkuJyk7aWYoIVR0LmNhbGwodCwianNvbiIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHN1cHBseSBhICJqc29uIiBwcm9wZXJ0eSB3aGVuIHByb3ZpZGluZyBhbiBvYmplY3QgYXJndW1lbnQgdG8gSlNPTlBhdGguZXZhbHVhdGUoKS4nKTt2YXIgbD10O2U9bC5qc29uLHU9VHQuY2FsbCh0LCJmbGF0dGVuIik/dC5mbGF0dGVuOnUsdGhpcy5jdXJyUmVzdWx0VHlwZT1UdC5jYWxsKHQsInJlc3VsdFR5cGUiKT90LnJlc3VsdFR5cGU6dGhpcy5jdXJyUmVzdWx0VHlwZSx0aGlzLmN1cnJTYW5kYm94PVR0LmNhbGwodCwic2FuZGJveCIpP3Quc2FuZGJveDp0aGlzLmN1cnJTYW5kYm94LGE9VHQuY2FsbCh0LCJ3cmFwIik/dC53cmFwOmEsdGhpcy5jdXJyUHJldmVudEV2YWw9VHQuY2FsbCh0LCJwcmV2ZW50RXZhbCIpP3QucHJldmVudEV2YWw6dGhpcy5jdXJyUHJldmVudEV2YWwsbj1UdC5jYWxsKHQsImNhbGxiYWNrIik/dC5jYWxsYmFjazpuLHRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrPVR0LmNhbGwodCwib3RoZXJUeXBlQ2FsbGJhY2siKT90Lm90aGVyVHlwZUNhbGxiYWNrOnRoaXMuY3Vyck90aGVyVHlwZUNhbGxiYWNrLG89VHQuY2FsbCh0LCJwYXJlbnQiKT90LnBhcmVudDpvLHM9VHQuY2FsbCh0LCJwYXJlbnRQcm9wZXJ0eSIpP3QucGFyZW50UHJvcGVydHk6cyx0PXQucGF0aH1pZihvPW98fG51bGwscz1zfHxudWxsLEFycmF5LmlzQXJyYXkodCkmJih0PWsudG9QYXRoU3RyaW5nKHQpKSwhKCF0JiZ0IT09IiJ8fCFlKSl7dmFyIGQ9ay50b1BhdGhBcnJheSh0KTtkWzBdPT09IiQiJiZkLmxlbmd0aD4xJiZkLnNoaWZ0KCksdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9bnVsbDt2YXIgXz10aGlzLl90cmFjZShkLGUsWyIkIl0sbyxzLG4pLmZpbHRlcihmdW5jdGlvbihPKXtyZXR1cm4gTyYmIU8uaXNQYXJlbnRTZWxlY3Rvcn0pO3JldHVybiBfLmxlbmd0aD8hYSYmXy5sZW5ndGg9PT0xJiYhX1swXS5oYXNBcnJFeHByP3RoaXMuX2dldFByZWZlcnJlZE91dHB1dChfWzBdKTpfLnJlZHVjZShmdW5jdGlvbihPLGIpe3ZhciBJPWkuX2dldFByZWZlcnJlZE91dHB1dChiKTtyZXR1cm4gdSYmQXJyYXkuaXNBcnJheShJKT9PPU8uY29uY2F0KEkpOk8ucHVzaChJKSxPfSxbXSk6YT9bXTp2b2lkIDB9fSxrLnByb3RvdHlwZS5fZ2V0UHJlZmVycmVkT3V0cHV0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY3VyclJlc3VsdFR5cGU7c3dpdGNoKGUpe2Nhc2UiYWxsIjp7dmFyIG49QXJyYXkuaXNBcnJheSh0LnBhdGgpP3QucGF0aDprLnRvUGF0aEFycmF5KHQucGF0aCk7cmV0dXJuIHQucG9pbnRlcj1rLnRvUG9pbnRlcihuKSx0LnBhdGg9dHlwZW9mIHQucGF0aD09InN0cmluZyI/dC5wYXRoOmsudG9QYXRoU3RyaW5nKHQucGF0aCksdH1jYXNlInZhbHVlIjpjYXNlInBhcmVudCI6Y2FzZSJwYXJlbnRQcm9wZXJ0eSI6cmV0dXJuIHRbZV07Y2FzZSJwYXRoIjpyZXR1cm4gay50b1BhdGhTdHJpbmcodFtlXSk7Y2FzZSJwb2ludGVyIjpyZXR1cm4gay50b1BvaW50ZXIodC5wYXRoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gcmVzdWx0IHR5cGUiKX19LGsucHJvdG90eXBlLl9oYW5kbGVDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7aWYoZSl7dmFyIHI9dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KHQpO3QucGF0aD10eXBlb2YgdC5wYXRoPT0ic3RyaW5nIj90LnBhdGg6ay50b1BhdGhTdHJpbmcodC5wYXRoKSxlKHIsbix0KX19LGsucHJvdG90eXBlLl90cmFjZT1mdW5jdGlvbih0LGUsbixyLGksbyxzLHUpe3ZhciBhPXRoaXMsbDtpZighdC5sZW5ndGgpcmV0dXJuIGw9e3BhdGg6bix2YWx1ZTplLHBhcmVudDpyLHBhcmVudFByb3BlcnR5OmksaGFzQXJyRXhwcjpzfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInZhbHVlIiksbDt2YXIgZD10WzBdLF89dC5zbGljZSgxKSxPPVtdO2Z1bmN0aW9uIGIoRCl7QXJyYXkuaXNBcnJheShEKT9ELmZvckVhY2goZnVuY3Rpb24oeXQpe08ucHVzaCh5dCl9KTpPLnB1c2goRCl9aWYoKHR5cGVvZiBkIT0ic3RyaW5nInx8dSkmJmUmJlR0LmNhbGwoZSxkKSliKHRoaXMuX3RyYWNlKF8sZVtkXSxRdChuLGQpLGUsZCxvLHMpKTtlbHNlIGlmKGQ9PT0iKiIpdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2IoYS5fdHJhY2UoXyxlW0RdLFF0KG4sRCksZSxELG8sITAsITApKX0pO2Vsc2UgaWYoZD09PSIuLiIpYih0aGlzLl90cmFjZShfLGUsbixyLGksbyxzKSksdGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe0d0KGVbRF0pPT09Im9iamVjdCImJmIoYS5fdHJhY2UodC5zbGljZSgpLGVbRF0sUXQobixEKSxlLEQsbywhMCkpfSk7ZWxzZXtpZihkPT09Il4iKXJldHVybiB0aGlzLl9oYXNQYXJlbnRTZWxlY3Rvcj0hMCx7cGF0aDpuLnNsaWNlKDAsLTEpLGV4cHI6Xyxpc1BhcmVudFNlbGVjdG9yOiEwfTtpZihkPT09In4iKXJldHVybiBsPXtwYXRoOlF0KG4sZCksdmFsdWU6aSxwYXJlbnQ6cixwYXJlbnRQcm9wZXJ0eTpudWxsfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhsLG8sInByb3BlcnR5IiksbDtpZihkPT09IiQiKWIodGhpcy5fdHJhY2UoXyxlLG4sbnVsbCxudWxsLG8scykpO2Vsc2UgaWYoL14oXHgyRD9bMC05XSopOihceDJEP1swLTldKik6PyhbMC05XSopJC8udGVzdChkKSliKHRoaXMuX3NsaWNlKGQsXyxlLG4scixpLG8pKTtlbHNlIGlmKGQuaW5kZXhPZigiPygiKT09PTApe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbPyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7dmFyIEk9ZC5yZXBsYWNlKC9eXD9cKCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/KVwpJC8sIiQxIiksUz0vQCg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pPygoPzpbXDAtPkAtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsnXFtdKFw/P1woKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1wpKSg/ISg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pXClcXSlbJ1xdXS9nLmV4ZWMoSSk7Uz90aGlzLl93YWxrKGUsZnVuY3Rpb24oRCl7dmFyIHl0PVtTWzJdXSxvdD1TWzFdP2VbRF1bU1sxXV06ZVtEXSxndD1hLl90cmFjZSh5dCxvdCxuLHIsaSxvLCEwKTtndC5sZW5ndGg+MCYmYihhLl90cmFjZShfLGVbRF0sUXQobixEKSxlLEQsbywhMCkpfSk6dGhpcy5fd2FsayhlLGZ1bmN0aW9uKEQpe2EuX2V2YWwoSSxlW0RdLEQsbixyLGkpJiZiKGEuX3RyYWNlKF8sZVtEXSxRdChuLEQpLGUsRCxvLCEwKSl9KX1lbHNlIGlmKGRbMF09PT0iKCIpe2lmKHRoaXMuY3VyclByZXZlbnRFdmFsKXRocm93IG5ldyBFcnJvcigiRXZhbCBbKGV4cHIpXSBwcmV2ZW50ZWQgaW4gSlNPTlBhdGggZXhwcmVzc2lvbi4iKTtiKHRoaXMuX3RyYWNlKGVyKHRoaXMuX2V2YWwoZCxlLG5bbi5sZW5ndGgtMV0sbi5zbGljZSgwLC0xKSxyLGkpLF8pLGUsbixyLGksbyxzKSl9ZWxzZSBpZihkWzBdPT09IkAiKXt2YXIgbT0hMSxnPWQuc2xpY2UoMSwtMik7c3dpdGNoKGcpe2Nhc2Uic2NhbGFyIjooIWV8fCFbIm9iamVjdCIsImZ1bmN0aW9uIl0uaW5jbHVkZXMoR3QoZSkpKSYmKG09ITApO2JyZWFrO2Nhc2UiYm9vbGVhbiI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpjYXNlImZ1bmN0aW9uIjpHdChlKT09PWcmJihtPSEwKTticmVhaztjYXNlImludGVnZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmIShlJTEpJiYobT0hMCk7YnJlYWs7Y2FzZSJudW1iZXIiOk51bWJlci5pc0Zpbml0ZShlKSYmKG09ITApO2JyZWFrO2Nhc2Uibm9uRmluaXRlIjp0eXBlb2YgZT09Im51bWJlciImJiFOdW1iZXIuaXNGaW5pdGUoZSkmJihtPSEwKTticmVhaztjYXNlIm9iamVjdCI6ZSYmR3QoZSk9PT1nJiYobT0hMCk7YnJlYWs7Y2FzZSJhcnJheSI6QXJyYXkuaXNBcnJheShlKSYmKG09ITApO2JyZWFrO2Nhc2Uib3RoZXIiOm09dGhpcy5jdXJyT3RoZXJUeXBlQ2FsbGJhY2soZSxuLHIsaSk7YnJlYWs7Y2FzZSJudWxsIjplPT09bnVsbCYmKG09ITApO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biB2YWx1ZSB0eXBlICIrZyl9aWYobSlyZXR1cm4gbD17cGF0aDpuLHZhbHVlOmUscGFyZW50OnIscGFyZW50UHJvcGVydHk6aX0sdGhpcy5faGFuZGxlQ2FsbGJhY2sobCxvLCJ2YWx1ZSIpLGx9ZWxzZSBpZihkWzBdPT09ImAiJiZlJiZUdC5jYWxsKGUsZC5zbGljZSgxKSkpe3ZhciBHPWQuc2xpY2UoMSk7Yih0aGlzLl90cmFjZShfLGVbR10sUXQobixHKSxlLEcsbyxzLCEwKSl9ZWxzZSBpZihkLmluY2x1ZGVzKCIsIikpe3ZhciBxPWQuc3BsaXQoIiwiKSwkPU5mKHEpLG50O3RyeXtmb3IoJC5zKCk7IShudD0kLm4oKSkuZG9uZTspe3ZhciBsdD1udC52YWx1ZTtiKHRoaXMuX3RyYWNlKGVyKGx0LF8pLGUsbixyLGksbywhMCkpfX1jYXRjaChEKXskLmUoRCl9ZmluYWxseXskLmYoKX19ZWxzZSF1JiZlJiZUdC5jYWxsKGUsZCkmJmIodGhpcy5fdHJhY2UoXyxlW2RdLFF0KG4sZCksZSxkLG8scywhMCkpfWlmKHRoaXMuX2hhc1BhcmVudFNlbGVjdG9yKWZvcih2YXIgaXQ9MDtpdDxPLmxlbmd0aDtpdCsrKXt2YXIgQnQ9T1tpdF07aWYoQnQmJkJ0LmlzUGFyZW50U2VsZWN0b3Ipe3ZhciBUPXRoaXMuX3RyYWNlKEJ0LmV4cHIsZSxCdC5wYXRoLHIsaSxvLHMpO2lmKEFycmF5LmlzQXJyYXkoVCkpe09baXRdPVRbMF07Zm9yKHZhciBCPVQubGVuZ3RoLFY9MTtWPEI7VisrKWl0KyssTy5zcGxpY2UoaXQsMCxUW1ZdKX1lbHNlIE9baXRdPVR9fXJldHVybiBPfSxrLnByb3RvdHlwZS5fd2Fsaz1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBuPXQubGVuZ3RoLHI9MDtyPG47cisrKWUocik7ZWxzZSB0JiZHdCh0KT09PSJvYmplY3QiJiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2UoaSl9KX0say5wcm90b3R5cGUuX3NsaWNlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciB1PW4ubGVuZ3RoLGE9dC5zcGxpdCgiOiIpLGw9YVsyXSYmTnVtYmVyLnBhcnNlSW50KGFbMl0pfHwxLGQ9YVswXSYmTnVtYmVyLnBhcnNlSW50KGFbMF0pfHwwLF89YVsxXSYmTnVtYmVyLnBhcnNlSW50KGFbMV0pfHx1O2Q9ZDwwP01hdGgubWF4KDAsZCt1KTpNYXRoLm1pbih1LGQpLF89XzwwP01hdGgubWF4KDAsXyt1KTpNYXRoLm1pbih1LF8pO2Zvcih2YXIgTz1bXSxiPWQ7YjxfO2IrPWwpe3ZhciBJPXRoaXMuX3RyYWNlKGVyKGIsZSksbixyLGksbyxzLCEwKTtJLmZvckVhY2goZnVuY3Rpb24oUyl7Ty5wdXNoKFMpfSl9cmV0dXJuIE99fSxrLnByb3RvdHlwZS5fZXZhbD1mdW5jdGlvbih0LGUsbixyLGksbyl7dGhpcy5jdXJyU2FuZGJveC5fJF9wYXJlbnRQcm9wZXJ0eT1vLHRoaXMuY3VyclNhbmRib3guXyRfcGFyZW50PWksdGhpcy5jdXJyU2FuZGJveC5fJF9wcm9wZXJ0eT1uLHRoaXMuY3VyclNhbmRib3guXyRfcm9vdD10aGlzLmpzb24sdGhpcy5jdXJyU2FuZGJveC5fJF92PWU7dmFyIHM9dC5pbmNsdWRlcygiQHBhdGgiKTtzJiYodGhpcy5jdXJyU2FuZGJveC5fJF9wYXRoPWsudG9QYXRoU3RyaW5nKHIuY29uY2F0KFtuXSkpKTt2YXIgdT0ic2NyaXB0OiIrdDtpZighay5jYWNoZVt1XSl7dmFyIGE9dC5yZXBsYWNlKC9AcGFyZW50UHJvcGVydHkvZywiXyRfcGFyZW50UHJvcGVydHkiKS5yZXBsYWNlKC9AcGFyZW50L2csIl8kX3BhcmVudCIpLnJlcGxhY2UoL0Bwcm9wZXJ0eS9nLCJfJF9wcm9wZXJ0eSIpLnJlcGxhY2UoL0Byb290L2csIl8kX3Jvb3QiKS5yZXBsYWNlKC9AKFtcdC1cciBcKVwuXFtceEEwXHUxNjgwXHUyMDAwLVx1MjAwQVx1MjAyOFx1MjAyOVx1MjAyRlx1MjA1Rlx1MzAwMFx1RkVGRl0pL2csIl8kX3YkMSIpO3MmJihhPWEucmVwbGFjZSgvQHBhdGgvZywiXyRfcGF0aCIpKSxrLmNhY2hlW3VdPW5ldyB0aGlzLnZtLlNjcmlwdChhKX10cnl7cmV0dXJuIGsuY2FjaGVbdV0ucnVuSW5OZXdDb250ZXh0KHRoaXMuY3VyclNhbmRib3gpfWNhdGNoKGwpe3Rocm93IG5ldyBFcnJvcigianNvblBhdGg6ICIrbC5tZXNzYWdlKyI6ICIrdCl9fSxrLmNhY2hlPXt9LGsudG9QYXRoU3RyaW5nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iJCIsaT0xO2k8bjtpKyspL14ofnxcXnxAKD86W1wwLVx0XHgwQlxmXHgwRS1cdTIwMjdcdTIwMkEtXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqP1woXCkpJC8udGVzdChlW2ldKXx8KHIrPS9eW1wqMC05XSskLy50ZXN0KGVbaV0pPyJbIitlW2ldKyJdIjoiWyciK2VbaV0rIiddIik7cmV0dXJuIHJ9LGsudG9Qb2ludGVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LG49ZS5sZW5ndGgscj0iIixpPTE7aTxuO2krKykvXih+fFxefEAoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XChcKSkkLy50ZXN0KGVbaV0pfHwocis9Ii8iK2VbaV0udG9TdHJpbmcoKS5yZXBsYWNlKC9+L2csIn4wIikucmVwbGFjZSgvXC8vZywifjEiKSk7cmV0dXJuIHJ9LGsudG9QYXRoQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9ay5jYWNoZTtpZihlW3RdKXJldHVybiBlW3RdLmNvbmNhdCgpO3ZhciBuPVtdLHI9dC5yZXBsYWNlKC9AKD86bnVsbHxib29sZWFufG51bWJlcnxzdHJpbmd8aW50ZWdlcnx1bmRlZmluZWR8bm9uRmluaXRlfHNjYWxhcnxhcnJheXxvYmplY3R8ZnVuY3Rpb258b3RoZXIpXChcKS9nLCI7JCY7IikucmVwbGFjZSgvWydcW10oXD8/XCgoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSo/XCkpWydcXV0oPyEoPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKVxdKS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsjIisobi5wdXNoKHMpLTEpKyJdIn0pLnJlcGxhY2UoL1xbWyInXSgoPzpbXDAtJlwoLVxcXF4tXHVEN0ZGXHVFMDAwLVx1RkZGRl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdfFtcdUQ4MDAtXHVEQkZGXSg/IVtcdURDMDAtXHVERkZGXSl8KD86W15cdUQ4MDAtXHVEQkZGXXxeKVtcdURDMDAtXHVERkZGXSkqKVsiJ11cXS9nLGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsnIitzLnJlcGxhY2UoL1wuL2csIiVAJSIpLnJlcGxhY2UoL34vZywiJSVAQCUlIikrIiddIn0pLnJlcGxhY2UoL34vZywiO347IikucmVwbGFjZSgvWyInXT9cLlsiJ10/KD8hKD86W1wwLVpcXC1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSpcXSl8XFtbIiddPy9nLCI7IikucmVwbGFjZSgvJUAlL2csIi4iKS5yZXBsYWNlKC8lJUBAJSUvZywifiIpLnJlcGxhY2UoLyg/OjspPyhcXispKD86Oyk/L2csZnVuY3Rpb24obyxzKXtyZXR1cm4iOyIrcy5zcGxpdCgiIikuam9pbigiOyIpKyI7In0pLnJlcGxhY2UoLzs7O3w7Oy9nLCI7Li47IikucmVwbGFjZSgvOyR8Jz9cXXwnJC9nLCIiKSxpPXIuc3BsaXQoIjsiKS5tYXAoZnVuY3Rpb24obyl7dmFyIHM9by5tYXRjaCgvIyhbMC05XSspLyk7cmV0dXJuIXN8fCFzWzFdP286bltzWzFdXX0pO3JldHVybiBlW3RdPWksZVt0XS5jb25jYXQoKX07dmFyIENmPWZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz0wO288aTtvKyspe3ZhciBzPWVbb107cihzKSYmbi5wdXNoKGUuc3BsaWNlKG8tLSwxKVswXSl9fSx2Zj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7d2kodGhpcyx0KSx0aGlzLmNvZGU9ZX1yZXR1cm4gTmkodCxbe2tleToicnVuSW5OZXdDb250ZXh0Iix2YWx1ZTpmdW5jdGlvbihuKXt2YXIgcj10aGlzLmNvZGUsaT1PYmplY3Qua2V5cyhuKSxvPVtdO0NmKGksbyxmdW5jdGlvbihkKXtyZXR1cm4gdHlwZW9mIG5bZF09PSJmdW5jdGlvbiJ9KTt2YXIgcz1pLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gbltkXX0pLHU9by5yZWR1Y2UoZnVuY3Rpb24oZCxfKXt2YXIgTz1uW19dLnRvU3RyaW5nKCk7cmV0dXJuL2Z1bmN0aW9uLy50ZXN0KE8pfHwoTz0iZnVuY3Rpb24gIitPKSwidmFyICIrXysiPSIrTysiOyIrZH0sIiIpO3I9dStyLCEvKFsiJ10pdXNlIHN0cmljdFwxLy50ZXN0KHIpJiYhaS5pbmNsdWRlcygiYXJndW1lbnRzIikmJihyPSJ2YXIgYXJndW1lbnRzID0gdW5kZWZpbmVkOyIrcikscj1yLnJlcGxhY2UoLztbXHQtXHIgXHhBMFx1MTY4MFx1MjAwMC1cdTIwMEFcdTIwMjhcdTIwMjlcdTIwMkZcdTIwNUZcdTMwMDBcdUZFRkZdKiQvLCIiKTt2YXIgYT1yLmxhc3RJbmRleE9mKCI7IiksbD1hPi0xP3Iuc2xpY2UoMCxhKzEpKyIgcmV0dXJuICIrci5zbGljZShhKzEpOiIgcmV0dXJuICIrcjtyZXR1cm4gRmkoRnVuY3Rpb24saS5jb25jYXQoW2xdKSkuYXBwbHkodm9pZCAwLG1mKHMpKX19XSksdH0oKTtrLnByb3RvdHlwZS52bT17U2NyaXB0OnZmfTtjb25zdCBEZj0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiLExmPXQ9PkFycmF5LmZyb20od2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkodCkpKS5tYXAoZT0+RGZbZSV0XSkuam9pbigiIikudG9Mb3dlckNhc2UoKSxDaT10PT57aWYodHlwZW9mIHQhPSJvYmplY3QifHx0PT09bnVsbClyZXR1cm4gdDtmb3IoY29uc3QgZSBpbiB0KWlmKHR5cGVvZiB0W2VdPT0ic3RyaW5nIil0cnl7dFtlXS5zdGFydHNXaXRoKCJ7IikmJnRbZV0uZW5kc1dpdGgoIn0iKSYmKHRbZV09SlNPTi5wYXJzZSh0W2VdKSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiSW52YWxpZCBKU09OOiIsdFtlXSl9ZWxzZSB0eXBlb2YgdFtlXT09Im9iamVjdCImJih0W2VdPUNpKHRbZV0pKTtyZXR1cm4gdH0sbnI9ImN6bV8iO2Z1bmN0aW9uIFBmKHQsZSl7bGV0IG49dCxyPSIiO2NvbnN0IGk9W107bGV0IG89bi5pbmRleE9mKCIkeyIpO2NvbnN0IHM9dHlwZW9mIGU8InUiLHU9e30sYT0vXlwkLi87Zm9yKDtvPj0wOylpZihCZihuLG8pKXtjb25zdCBsPVVmKG4sbyk7cis9bi5zbGljZSgwLGwrMSksbj1uLnNsaWNlKGwrMSksbz1uLmluZGV4T2YoIiR7Iil9ZWxzZXtyKz1uLnNsaWNlKDAsbyk7Y29uc3QgbD1qZihuLG8pLGQ9bi5zbGljZShvKzIsbCk7aWYoYS50ZXN0KGQpKXtpZighcylyZXR1cm5bcixbXV07bGV0IF89dVtkXTtpZighXyl0cnl7Xz1rKHtqc29uOmUscGF0aDpkfSksdVtkXT1ffWNhdGNoe3JldHVybltyLFtdXX1pZihfLmxlbmd0aCE9PTApe2NvbnN0IE89TGYoMTApO2kucHVzaCh7bGl0ZXJhbE5hbWU6TyxsaXRlcmFsVmFsdWU6X1swXX0pLHIrPU99ZWxzZSByZXR1cm5bImZhbHNlIixbXV19ZWxzZXtjb25zdCBfPUdmKGQpO3IrPWAke25yfSR7X31gfW49bi5zbGljZShsKzEpLG89bi5pbmRleE9mKCIkeyIpfXJldHVybiByKz1uLFtyLGldfWZ1bmN0aW9uIEJmKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoIiciKSxyPXQuaW5kZXhPZignIicpO3JldHVybiBuPj0wJiZuPGU/dC5pbmRleE9mKCInIixuKzEpPj1lOnI+PTAmJnI8ZT90LmluZGV4T2YoJyInLHIrMSk+PWU6ITF9ZnVuY3Rpb24gVWYodCxlKXtjb25zdCBuPXQuaW5kZXhPZigiJyIpLHI9dC5pbmRleE9mKCciJyk7cmV0dXJuIG4+PTAmJm48ZT90LmluZGV4T2YoIiciLG4rMSk6cj49MCYmcjxlP3QuaW5kZXhPZignIicscisxKTotMX1mdW5jdGlvbiBqZih0LGUpe2NvbnN0IG49dC5pbmRleE9mKCJ9IixlKTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJyZXBsYWNlVmFyaWFibGU6IFVubWF0Y2hlZCB7LiIpO3JldHVybiBufWNvbnN0IGNlPXQ9PmAkcmVlYXJ0aF8ke3R9XyRgLHJyPXsiWyI6Y2UoIm9wZW5lZF9zcXVhcmVfYnJhY2tldCIpLCJdIjpjZSgiY2xvc2VkX3NxdWFyZV9icmFja2V0IiksInsiOmNlKCJvcGVuZWRfY3VybHlfYnJhY2tldCIpLCJ9IjpjZSgiY2xvc2VkX2N1cmx5X2JyYWNrZXQiKSwiKCI6Y2UoIm9wZW5lZF9wYXJlbnRoZXNlcyIpLCIpIjpjZSgiY2xvc2VkX3BhcmVudGhlc2VzIiksIi0iOmNlKCJoeXBoZW4iKX0sR2Y9dD0+e2NvbnN0IGU9dC5yZXBsYWNlKC8tL2cscnJbIi0iXSk7cmV0dXJuLyhcXXxcKXxcfSlbXlsuXSskLy50ZXN0KGUpP09iamVjdC5lbnRyaWVzKHJyKS5yZWR1Y2UoKG4sW3IsaV0pPT5uLnJlcGxhY2VBbGwocixpKSxlKTplfSwkZj10PT5PYmplY3QuZW50cmllcyhycikucmVkdWNlKChlLFtuLHJdKT0+ZS5yZXBsYWNlQWxsKHIsbiksdCksVmY9bmV3IFNldChlZiksdmk9bmV3IFNldChuZik7ZnVuY3Rpb24geih0LGUpe2xldCBuPW5ldyBFcnJvcigiZmFpbGVkIHRvIHBhcnNlIik7Y29uc3Qgcj1lLnR5cGU7aWYocj09PSJMaXRlcmFsIiluPVdmKGUpO2Vsc2UgaWYocj09PSJDYWxsRXhwcmVzc2lvbiIpbj1YZih0LGUpO2Vsc2UgaWYocj09PSJJZGVudGlmaWVyIiluPUhmKGUpO2Vsc2UgaWYocj09PSJVbmFyeUV4cHJlc3Npb24iKXtjb25zdCBpPWUub3BlcmF0b3Isbz16KHQsZS5hcmd1bWVudCk7aWYoVmYuaGFzKGkpKW49bmV3IFAoTS5VTkFSWSxpLG8pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdG9yICIke2l9Ii5gKX1lbHNlIGlmKHI9PT0iQmluYXJ5RXhwcmVzc2lvbiIpe2NvbnN0IGk9ZS5vcGVyYXRvcixvPXoodCxlLmxlZnQpLHM9eih0LGUucmlnaHQpO2lmKHZpLmhhcyhpKSluPW5ldyBQKE0uQklOQVJZLGksbyxzKTtlbHNlIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcGVyYXRvciAiJHtpfSIuYCl9ZWxzZSBpZihyPT09IkxvZ2ljYWxFeHByZXNzaW9uIil7Y29uc3QgaT1lLm9wZXJhdG9yLG89eih0LGUubGVmdCkscz16KHQsZS5yaWdodCk7dmkuaGFzKGkpJiYobj1uZXcgUChNLkJJTkFSWSxpLG8scykpfWVsc2UgaWYocj09PSJDb25kaXRpb25hbEV4cHJlc3Npb24iKXtjb25zdCBpPXoodCxlLnRlc3QpLG89eih0LGUuY29uc2VxdWVudCkscz16KHQsZS5hbHRlcm5hdGUpO249bmV3IFAoTS5DT05ESVRJT05BTCwiPyIsbyxzLGkpfWVsc2UgaWYocj09PSJNZW1iZXJFeHByZXNzaW9uIiluPVlmKHQsZSk7ZWxzZSBpZihyPT09IkFycmF5RXhwcmVzc2lvbiIpe2NvbnN0IGk9W107Zm9yKGxldCBvPTA7bzxlLmVsZW1lbnRzLmxlbmd0aDtvKyspaVtvXT16KHQsZS5lbGVtZW50c1tvXSk7bj1uZXcgUChNLkFSUkFZLGkpfWVsc2UgdGhyb3cgcj09PSJDb21wb3VuZCI/bmV3IEVycm9yKCJQcm92aWRlIGV4YWN0bHkgb25lIGV4cHJlc3Npb24uIik6bmV3IEVycm9yKCJDYW5ub3QgcGFyc2UgZXhwcmVzc2lvbi4iKTtyZXR1cm4gbn1mdW5jdGlvbiBXZih0KXtjb25zdCBlPXR5cGVvZiB0LnZhbHVlO2lmKHQudmFsdWU9PT1udWxsKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVMTCxudWxsKTtpZihlPT09ImJvb2xlYW4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfQk9PTEVBTix0LnZhbHVlKTtpZihlPT09Im51bWJlciIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsdC52YWx1ZSk7aWYoZT09PSJzdHJpbmciKXJldHVybiB0LnZhbHVlLmluZGV4T2YoIiR7Iik+PTA/bmV3IFAoTS5WQVJJQUJMRV9JTl9TVFJJTkcsdC52YWx1ZSk6bmV3IFAoTS5MSVRFUkFMX1NUUklORyx6Zih0LnZhbHVlKSk7dGhyb3cgbmV3IEVycm9yKGAke3R9IGlzIG5vdCBhIGZ1bmN0aW9uLmApfWZ1bmN0aW9uIHpmKHQpe3JldHVybiB0LnJlcGxhY2Uoc2YsIlxcIil9ZnVuY3Rpb24gWGYodCxlKXtjb25zdCBuPWUuYXJndW1lbnRzLHI9bi5sZW5ndGg7aWYoZS5jYWxsZWUudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIil7Y29uc3Qgbz1lLmNhbGxlZS5wcm9wZXJ0eS5uYW1lLHM9ZS5jYWxsZWUub2JqZWN0O2lmKG89PT0idGVzdCJ8fG89PT0iZXhlYyIpe2lmKHMuY2FsbGVlLm5hbWUhPT0icmVnRXhwIil0aHJvdyBuZXcgRXJyb3IoYCR7b30gaXMgbm90IGEgZnVuY3Rpb24uYCk7aWYocj09PTApcmV0dXJuIG89PT0idGVzdCI/bmV3IFAoTS5MSVRFUkFMX0JPT0xFQU4sITEpOm5ldyBQKE0uTElURVJBTF9OVUxMLG51bGwpO2NvbnN0IHU9eih0LHMpLGE9eih0LG5bMF0pO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1LGEpfWVsc2UgaWYobz09PSJ0b1N0cmluZyIpe2NvbnN0IHU9eih0LHMpO3JldHVybiBuZXcgUChNLkZVTkNUSU9OX0NBTEwsbyx1KX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtvfSIuYCl9Y29uc3QgaT1lLmNhbGxlZS5uYW1lO2lmKGk9PT0iY29sb3IiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGkpO2NvbnN0IG89eih0LG5bMF0pO2lmKHR5cGVvZiBuWzFdPCJ1Iil7Y29uc3Qgcz16KHQsblsxXSk7cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLFtvLHNdKX1yZXR1cm4gbmV3IFAoTS5MSVRFUkFMX0NPTE9SLGksW29dKX1lbHNlIGlmKGk9PT0icmdiInx8aT09PSJoc2wiKXtpZihyPDMpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIHRocmVlIGFyZ3VtZW50cy5gKTtjb25zdCBvPVt6KHQsblswXSkseih0LG5bMV0pLHoodCxuWzJdKV07cmV0dXJuIG5ldyBQKE0uTElURVJBTF9DT0xPUixpLG8pfWVsc2UgaWYoaT09PSJyZ2JhInx8aT09PSJoc2xhIil7aWYocjw0KXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBmb3VyIGFyZ3VtZW50cy5gKTtjb25zdCBvPVt6KHQsblswXSkseih0LG5bMV0pLHoodCxuWzJdKSx6KHQsblszXSldO3JldHVybiBuZXcgUChNLkxJVEVSQUxfQ09MT1IsaSxvKX1lbHNlIGlmKGk9PT0iaXNOYU4ifHxpPT09ImlzRmluaXRlIil7aWYocj09PTApcmV0dXJuIGk9PT0iaXNOYU4iP25ldyBQKE0uTElURVJBTF9CT09MRUFOLCEwKTpuZXcgUChNLkxJVEVSQUxfQk9PTEVBTiwhMSk7Y29uc3Qgbz16KHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX1lbHNlIGlmKHR5cGVvZiBLbltpXTwidSIpe2lmKHIhPT0xKXRocm93IG5ldyBFcnJvcihgJHtpfSByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudC5gKTtjb25zdCBvPXoodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYodHlwZW9mIFluW2ldPCJ1Iil7aWYociE9PTIpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cy5gKTtjb25zdCBvPXoodCxuWzBdKSxzPXoodCxuWzFdKTtyZXR1cm4gbmV3IFAoTS5CSU5BUlksaSxvLHMpfWVsc2UgaWYoaT09PSJCb29sZWFuIil7aWYocj09PTApcmV0dXJuIG5ldyBQKE0uTElURVJBTF9CT09MRUFOLCExKTtjb25zdCBvPXoodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJOdW1iZXIiKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUiwwKTtjb25zdCBvPXoodCxuWzBdKTtyZXR1cm4gbmV3IFAoTS5VTkFSWSxpLG8pfWVsc2UgaWYoaT09PSJTdHJpbmciKXtpZihyPT09MClyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX1NUUklORywiIik7Y29uc3Qgbz16KHQsblswXSk7cmV0dXJuIG5ldyBQKE0uVU5BUlksaSxvKX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZnVuY3Rpb24gY2FsbCAiJHtpfSIuYCl9ZnVuY3Rpb24gSGYodCl7Y29uc3QgZT10Lm5hbWU7aWYoS2YoZSkpe2NvbnN0IG49WmYoZSk7cmV0dXJuIG4uc3Vic3RyaW5nKDAsOCk9PT0idGlsZXMzZF8iP25ldyBQKE0uQlVJTFRJTl9WQVJJQUJMRSxuKTpuZXcgUChNLlZBUklBQkxFLG4pfWVsc2V7aWYoZT09PSJOYU4iKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE5hTik7aWYoZT09PSJJbmZpbml0eSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsMS8wKTtpZihlPT09InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9VTkRFRklORUQsdm9pZCAwKX10aHJvdyBuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IGRlZmluZWQuYCl9ZnVuY3Rpb24ga2YodCl7Y29uc3QgZT10LnByb3BlcnR5Lm5hbWU7aWYoZT09PSJQSSIpcmV0dXJuIG5ldyBQKE0uTElURVJBTF9OVU1CRVIsTWF0aC5QSSk7aWYoZT09PSJFIilyZXR1cm4gbmV3IFAoTS5MSVRFUkFMX05VTUJFUixNYXRoLkUpO3Rocm93IG5ldyBFcnJvcihgJHtlfSBNYXRoIENvbnN0YW50IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudGApfWZ1bmN0aW9uIHFmKHQpe2NvbnN0IGU9dC5wcm9wZXJ0eS5uYW1lO2lmKGU9PT0iUE9TSVRJVkVfSU5GSU5JVFkiKXJldHVybiBuZXcgUChNLkxJVEVSQUxfTlVNQkVSLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dGhyb3cgbmV3IEVycm9yKGAke2V9IE51bWJlciBDb25zdGFudCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnRgKX1mdW5jdGlvbiBZZih0LGUpe2lmKGUub2JqZWN0Lm5hbWU9PT0iTWF0aCIpcmV0dXJuIGtmKGUpO2lmKGUub2JqZWN0Lm5hbWU9PT0iTnVtYmVyIilyZXR1cm4gcWYoZSk7bGV0IG47Y29uc3Qgcj16KHQsZS5vYmplY3QpO3JldHVybiBlLmNvbXB1dGVkPyhuPXoodCxlLnByb3BlcnR5KSxuZXcgUChNLk1FTUJFUiwiYnJhY2tldHMiLHIsbikpOihuPW5ldyBQKE0uTElURVJBTF9TVFJJTkcsZS5wcm9wZXJ0eS5uYW1lKSxuZXcgUChNLk1FTUJFUiwiZG90IixyLG4pKX1mdW5jdGlvbiBLZih0KXtyZXR1cm4gdC5zdWJzdHJpbmcoMCw0KT09PW5yfWZ1bmN0aW9uIFpmKHQpe3JldHVybiAkZih0KS5zdWJzdHJpbmcoNCl9Y29uc3QgRGk9bmV3IE1hcCxMaT1uZXcgTWFwLFBpPW5ldyBNYXAsQmk9bmV3IE1hcDtjbGFzcyBobntjb25zdHJ1Y3RvcihlLG4scil7Qyh0aGlzLCJfcnVudGltZUFzdCIpO0ModGhpcywiX2ZlYXR1cmUiKTt2YXIgdTt0aGlzLl9mZWF0dXJlPW47bGV0IGk9W107ZT1RZihlLHIpO2NvbnN0IG89TGkuZ2V0KGUpO2lmKG8pW2UsaV09bztlbHNle2NvbnN0IGE9ZTtbZSxpXT1QZihKZihlKSwodT10aGlzLl9mZWF0dXJlKT09bnVsbD92b2lkIDA6dS5wcm9wZXJ0aWVzKSxlLmluY2x1ZGVzKG5yKSYmTGkuc2V0KGEsW2UsaV0pfWNvbnN0IHM9RGkuZ2V0KGUpO2lmKHMpdGhpcy5fcnVudGltZUFzdD1zO2Vsc2V7aWYoaS5sZW5ndGghPT0wKWZvcihjb25zdCBsIG9mIGkpcXQuYWRkTGl0ZXJhbChsLmxpdGVyYWxOYW1lLGwubGl0ZXJhbFZhbHVlKTtxdC5hZGRCaW5hcnlPcCgiPX4iLDApLHF0LmFkZEJpbmFyeU9wKCIhfiIsMCk7bGV0IGE7dHJ5e2E9cXQoZSl9Y2F0Y2gobCl7dGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gZ2VuZXJhdGUgYXN0OiAke2x9YCl9dGhpcy5fcnVudGltZUFzdD16KHRoaXMsYSksRGkuc2V0KGUsdGhpcy5fcnVudGltZUFzdCl9fWV2YWx1YXRlKCl7cmV0dXJuIHRoaXMuX3J1bnRpbWVBc3QuZXZhbHVhdGUodGhpcy5fZmVhdHVyZSl9fWZ1bmN0aW9uIFFmKHQsZSl7aWYodHlwZW9mIGU+InUiKXJldHVybiB0O2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmVudHJpZXMoZSkuc29ydCgpKSxyPXQrbixpPUJpLmdldChyKTtpZihpKXJldHVybiBpO2xldCBvPVBpLmdldCh0KTtvfHwobz1uZXcgUmVnRXhwKGBcXCRcXHsoJHtPYmplY3Qua2V5cyhlKS5qb2luKCJ8Iil9KVxcfWAsImciKSxQaS5zZXQodCxvKSk7Y29uc3Qgcz10LnJlcGxhY2UobywodSxhKT0+dHlwZW9mIGVbYV08InUiP2AoJHtlW2FdfSlgOiIiKTtyZXR1cm4gQmkuc2V0KHIscyksc31mdW5jdGlvbiBKZih0KXtyZXR1cm4gdC5yZXBsYWNlKHJmLG9mKX1jbGFzcyB0MHtjb25zdHJ1Y3RvcihlLG4scil7Qyh0aGlzLCJfY29uZGl0aW9ucyIpO0ModGhpcywiX3J1bnRpbWVDb25kaXRpb25zIik7Qyh0aGlzLCJfZmVhdHVyZSIpO0ModGhpcywiX21lbW9pemVkUmVzdWx0Iik7dGhpcy5fY29uZGl0aW9ucz1lLmNvbmRpdGlvbnMsdGhpcy5fcnVudGltZUNvbmRpdGlvbnM9W10sdGhpcy5fZmVhdHVyZT1uLHRoaXMuX21lbW9pemVkUmVzdWx0PXZvaWQgMCx0aGlzLnNldFJ1bnRpbWUocil9c2V0UnVudGltZShlKXt2YXIgcjtjb25zdCBuPShyPXRoaXMuX2NvbmRpdGlvbnMpPT1udWxsP3ZvaWQgMDpyLm1hcChpPT57Y29uc3Qgbz1TdHJpbmcoaVswXSkscz1TdHJpbmcoaVsxXSk7cmV0dXJuIG5ldyBlMChuZXcgaG4obyx0aGlzLl9mZWF0dXJlLGUpLG5ldyBobihzLHRoaXMuX2ZlYXR1cmUsZSkpfSk7dGhpcy5fcnVudGltZUNvbmRpdGlvbnM9bj8/W10sdGhpcy5fbWVtb2l6ZWRSZXN1bHQ9dm9pZCAwfWV2YWx1YXRlKCl7aWYodHlwZW9mIHRoaXMuX21lbW9pemVkUmVzdWx0PCJ1IilyZXR1cm4gdGhpcy5fbWVtb2l6ZWRSZXN1bHQ7Y29uc3QgZT10aGlzLl9ydW50aW1lQ29uZGl0aW9ucyxuPWUubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjtpKyspe2NvbnN0IG89ZVtpXTtpZihvLmNvbmRpdGlvbi5ldmFsdWF0ZSgpKXtjb25zdCBzPW8uZXhwcmVzc2lvbi5ldmFsdWF0ZSgpO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1zLHN9fWNvbnN0IHI9dm9pZCAwO3JldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdD1yLHJ9fWNsYXNzIGUwe2NvbnN0cnVjdG9yKGUsbil7Qyh0aGlzLCJjb25kaXRpb24iKTtDKHRoaXMsImV4cHJlc3Npb24iKTt0aGlzLmNvbmRpdGlvbj1lLHRoaXMuZXhwcmVzc2lvbj1ufX1jb25zdCBuMD0odCxlLG4pPT57Y29uc3Qgcj1raCh0LHRmKSxpPWEwKHQsZSk7cmV0dXJuey4uLmksLi4ucjAocix0LGkpLHR5cGU6ImNvbXB1dGVkRmVhdHVyZSIsaW50ZXJ2YWw6bn19O2Z1bmN0aW9uIHIwKHQsZSxuKXtpZighbil7aWYoIWUuaWQpdGhyb3cgbmV3IEVycm9yKCJsYXllciBpZCBpcyByZXF1aXJlZCIpO249e3R5cGU6ImZlYXR1cmUiLGlkOmUuaWQscHJvcGVydGllczplLnByb3BlcnRpZXN8fHt9fX1yZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoW3IsaV0pPT5pP1tyLFVpKGksZSxuKV06dm9pZCAwKS5maWx0ZXIocj0+ISFyKSl9ZnVuY3Rpb24gVWkodCxlLG4pe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKChbcixpXSk9Pm8wKGkpP1tyLFVpKGksZSxuKV06W3IsczAoaSxlLG4pXSkpfWZ1bmN0aW9uIGkwKHQpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQmJiJleHByZXNzaW9uImluIHR9ZnVuY3Rpb24gbzAodCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0IiYmdCYmISgiZXhwcmVzc2lvbiJpbiB0KSYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gczAodCxlLG4pe3RyeXtpZihpMCh0KSl7Y29uc3Qgcj10LmV4cHJlc3Npb24saT1DaShqaChuKSk7cmV0dXJuIHR5cGVvZiByPiJ1Ij92b2lkIDA6dHlwZW9mIHI9PSJvYmplY3QiJiZyLmNvbmRpdGlvbnM/bmV3IHQwKHIsaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJib29sZWFuInx8dHlwZW9mIHI9PSJudW1iZXIiP25ldyBobihTdHJpbmcociksaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6dHlwZW9mIHI9PSJzdHJpbmciP25ldyBobihyLGksZS5kZWZpbmVzKS5ldmFsdWF0ZSgpOnJ9cmV0dXJuIHR9Y2F0Y2gocil7Y29uc29sZS5lcnJvcihyKTtyZXR1cm59fWZ1bmN0aW9uIGEwKHQsZSl7dmFyIGk7Y29uc3Qgbj0oaT10LmRhdGEpPT1udWxsP3ZvaWQgMDppLmpzb25Qcm9wZXJ0aWVzO2lmKCFlLnByb3BlcnRpZXN8fCFufHwhbi5sZW5ndGgpcmV0dXJuIGU7Y29uc3Qgcj17Li4uZSwuLi5lIT1udWxsJiZlLnByb3BlcnRpZXM/e3Byb3BlcnRpZXM6ey4uLmUucHJvcGVydGllc319Ont9fTtyZXR1cm4gbi5mb3JFYWNoKG89PntyLnByb3BlcnRpZXNbb109KCgpPT57Y29uc3Qgcz1yLnByb3BlcnRpZXNbb107dHJ5e3JldHVybiBKU09OLnBhcnNlKHMpfWNhdGNoe3JldHVybiBzfX0pKCl9KSxyfWZ1bmN0aW9uIGZuKHQsZSl7aWYodC50eXBlPT09InNpbXBsZSIpcmV0dXJuIG4wKHQsZSl9Y29uc3QgdTA9KHQsZSxuKT0+e2lmKCFuKXJldHVybjtjb25zdCByPSgoKT0+e3N3aXRjaCh6dC50eXBlc1t0LnR5cGVdKXtjYXNlIlBvbHlnb24iOnJldHVybiJwb2x5Z29uIjtjYXNlIkxpbmVTdHJpbmciOnJldHVybiJwb2x5bGluZSI7Y2FzZSJQb2ludCI6cmV0dXJuIm1hcmtlciI7ZGVmYXVsdDpyZXR1cm59fSkoKTtpZighcilyZXR1cm47Y29uc3QgaT10LmlkP1N0cmluZyh0LmlkKTpjMCh0LmxvYWRHZW9tZXRyeSgpLGUpLG89Zm4obixoMChpLHQsZSxyKSkscz1uZXcgU247cmV0dXJuIHMuZGF0YT17bGF5ZXJJZDpuPT1udWxsP3ZvaWQgMDpuLmlkLGZlYXR1cmVJZDppLGZlYXR1cmU6byxhcHBlYXJhbmNlVHlwZTp6dC50eXBlc1t0LnR5cGVdLnRvTG93ZXJDYXNlKCl9LHN9LGMwPSh0LGUpPT57Y29uc3Qgbj1bZS54LGUueSxlLmxldmVsLC4uLnQuZmxhdE1hcChyPT5yLm1hcChpPT5baS54LGkueV0pKV0uam9pbigiOiIpO3JldHVybiBKaChuKX0saDA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fSxtZT10eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZwZXJmb3JtYW5jZSYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj9wZXJmb3JtYW5jZTpEYXRlLGppPW5ldyBTZXQsaXI9dHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZwcm9jZXNzP3Byb2Nlc3M6e30sR2k9KHQsZSxuLHIpPT57dHlwZW9mIGlyLmVtaXRXYXJuaW5nPT0iZnVuY3Rpb24iP2lyLmVtaXRXYXJuaW5nKHQsZSxuLHIpOmNvbnNvbGUuZXJyb3IoYFske259XSAke2V9OiAke3R9YCl9O2xldCBsbj1nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciwkaT1nbG9iYWxUaGlzLkFib3J0U2lnbmFsO2lmKHR5cGVvZiBsbj4idSIpeyRpPWNsYXNze2NvbnN0cnVjdG9yKCl7Qyh0aGlzLCJvbmFib3J0Iik7Qyh0aGlzLCJfb25hYm9ydCIsW10pO0ModGhpcywicmVhc29uIik7Qyh0aGlzLCJhYm9ydGVkIiwhMSl9YWRkRXZlbnRMaXN0ZW5lcihyLGkpe3RoaXMuX29uYWJvcnQucHVzaChpKX19LGxuPWNsYXNze2NvbnN0cnVjdG9yKCl7Qyh0aGlzLCJzaWduYWwiLG5ldyAkaSk7ZSgpfWFib3J0KHIpe3ZhciBpLG87aWYoIXRoaXMuc2lnbmFsLmFib3J0ZWQpe3RoaXMuc2lnbmFsLnJlYXNvbj1yLHRoaXMuc2lnbmFsLmFib3J0ZWQ9ITA7Zm9yKGNvbnN0IHMgb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpcyhyKTsobz0oaT10aGlzLnNpZ25hbCkub25hYm9ydCk9PW51bGx8fG8uY2FsbChpLHIpfX19O2xldCB0PSgoa2k9aXIuZW52KT09bnVsbD92b2lkIDA6a2kuTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HKSE9PSIxIjtjb25zdCBlPSgpPT57dCYmKHQ9ITEsR2koIkFib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluIG5vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlIGBub2RlLWFib3J0LWNvbnRyb2xsZXJgIHBhY2thZ2UuIEEgbWluaW1hbCBwb2x5ZmlsbCBpcyBwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgdXNlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMpLiBZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuIiwiTk9fQUJPUlRfQ09OVFJPTExFUiIsIkVOT1RTVVAiLGUpKX19Y29uc3QgZjA9dD0+IWppLmhhcyh0KSxKdD10PT50JiZ0PT09TWF0aC5mbG9vcih0KSYmdD4wJiZpc0Zpbml0ZSh0KSxWaT10PT5KdCh0KT90PD1NYXRoLnBvdygyLDgpP1VpbnQ4QXJyYXk6dDw9TWF0aC5wb3coMiwxNik/VWludDE2QXJyYXk6dDw9TWF0aC5wb3coMiwzMik/VWludDMyQXJyYXk6dDw9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI/ZG46bnVsbDpudWxsO2NsYXNzIGRuIGV4dGVuZHMgQXJyYXl7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5maWxsKDApfX1jb25zdCB3ZT1jbGFzc3tjb25zdHJ1Y3RvcihlLG4pe0ModGhpcywiaGVhcCIpO0ModGhpcywibGVuZ3RoIik7aWYoIWMod2UsRmUpKXRocm93IG5ldyBUeXBlRXJyb3IoImluc3RhbnRpYXRlIFN0YWNrIHVzaW5nIFN0YWNrLmNyZWF0ZShuKSIpO3RoaXMuaGVhcD1uZXcgbihlKSx0aGlzLmxlbmd0aD0wfXN0YXRpYyBjcmVhdGUoZSl7Y29uc3Qgbj1WaShlKTtpZighbilyZXR1cm5bXTt2KHdlLEZlLCEwKTtjb25zdCByPW5ldyB3ZShlLG4pO3JldHVybiB2KHdlLEZlLCExKSxyfXB1c2goZSl7dGhpcy5oZWFwW3RoaXMubGVuZ3RoKytdPWV9cG9wKCl7cmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXX19O2xldCBFbj13ZTtGZT1uZXcgV2Vha01hcCxVKEVuLEZlLCExKTtjb25zdCBzcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXtVKHRoaXMsJGUpO1UodGhpcyxfbik7VSh0aGlzLCR0KTtVKHRoaXMsVnQpO1UodGhpcyx6ZSk7VSh0aGlzLE1lKTtVKHRoaXMsQ2UpO1UodGhpcyxLKTtVKHRoaXMsWGUpO1UodGhpcyxsZSk7VSh0aGlzLEl0LHZvaWQgMCk7VSh0aGlzLFJ0LHZvaWQgMCk7VSh0aGlzLE50LHZvaWQgMCk7VSh0aGlzLE10LHZvaWQgMCk7VSh0aGlzLEllLHZvaWQgMCk7Qyh0aGlzLCJ0dGwiKTtDKHRoaXMsInR0bFJlc29sdXRpb24iKTtDKHRoaXMsInR0bEF1dG9wdXJnZSIpO0ModGhpcywidXBkYXRlQWdlT25HZXQiKTtDKHRoaXMsInVwZGF0ZUFnZU9uSGFzIik7Qyh0aGlzLCJhbGxvd1N0YWxlIik7Qyh0aGlzLCJub0Rpc3Bvc2VPblNldCIpO0ModGhpcywibm9VcGRhdGVUVEwiKTtDKHRoaXMsIm1heEVudHJ5U2l6ZSIpO0ModGhpcywic2l6ZUNhbGN1bGF0aW9uIik7Qyh0aGlzLCJub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24iKTtDKHRoaXMsIm5vRGVsZXRlT25TdGFsZUdldCIpO0ModGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCIpO0ModGhpcywiYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24iKTtDKHRoaXMsImlnbm9yZUZldGNoQWJvcnQiKTtVKHRoaXMsdXQsdm9pZCAwKTtVKHRoaXMsQ3Qsdm9pZCAwKTtVKHRoaXMsYXQsdm9pZCAwKTtVKHRoaXMsdHQsdm9pZCAwKTtVKHRoaXMsTCx2b2lkIDApO1UodGhpcyxfdCx2b2lkIDApO1UodGhpcyx4dCx2b2lkIDApO1UodGhpcyxFdCx2b2lkIDApO1UodGhpcyxodCx2b2lkIDApO1UodGhpcyx2dCx2b2lkIDApO1UodGhpcyxmdCx2b2lkIDApO1UodGhpcyxEdCx2b2lkIDApO1UodGhpcyxMdCx2b2lkIDApO1UodGhpcyxPdCx2b2lkIDApO1UodGhpcyxQdCx2b2lkIDApO1UodGhpcyx0ZSx2b2lkIDApO1UodGhpcyxwdCx2b2lkIDApO1UodGhpcyxoZSwoKT0+e30pO1UodGhpcyxrdCwoKT0+e30pO1UodGhpcyxWZSwoKT0+e30pO1UodGhpcyxidCwoKT0+ITEpO1UodGhpcyxmZSxlPT57fSk7VSh0aGlzLE5lLChlLG4scik9Pnt9KTtVKHRoaXMsV2UsKGUsbixyLGkpPT57aWYocnx8aSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlIik7cmV0dXJuIDB9KTtDKHRoaXMsRjAsIkxSVUNhY2hlIik7Y29uc3R7bWF4Om49MCx0dGw6cix0dGxSZXNvbHV0aW9uOmk9MSx0dGxBdXRvcHVyZ2U6byx1cGRhdGVBZ2VPbkdldDpzLHVwZGF0ZUFnZU9uSGFzOnUsYWxsb3dTdGFsZTphLGRpc3Bvc2U6bCxkaXNwb3NlQWZ0ZXI6ZCxub0Rpc3Bvc2VPblNldDpfLG5vVXBkYXRlVFRMOk8sbWF4U2l6ZTpiPTAsbWF4RW50cnlTaXplOkk9MCxzaXplQ2FsY3VsYXRpb246UyxmZXRjaE1ldGhvZDptLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpnLG5vRGVsZXRlT25TdGFsZUdldDpHLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOnEsYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDokLGlnbm9yZUZldGNoQWJvcnQ6bnR9PWU7aWYobiE9PTAmJiFKdChuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXggb3B0aW9uIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIik7Y29uc3QgbHQ9bj9WaShuKTpBcnJheTtpZighbHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG1heCB2YWx1ZTogIituKTtpZih2KHRoaXMsSXQsbiksdih0aGlzLFJ0LGIpLHRoaXMubWF4RW50cnlTaXplPUl8fGModGhpcyxSdCksdGhpcy5zaXplQ2FsY3VsYXRpb249Uyx0aGlzLnNpemVDYWxjdWxhdGlvbil7aWYoIWModGhpcyxSdCkmJiF0aGlzLm1heEVudHJ5U2l6ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUiKTtpZih0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24iKX1pZihtIT09dm9pZCAwJiZ0eXBlb2YgbSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkIik7aWYodih0aGlzLEllLG0pLHYodGhpcyx0ZSwhIW0pLHYodGhpcyxhdCxuZXcgTWFwKSx2KHRoaXMsdHQsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksdih0aGlzLEwsbmV3IEFycmF5KG4pLmZpbGwodm9pZCAwKSksdih0aGlzLF90LG5ldyBsdChuKSksdih0aGlzLHh0LG5ldyBsdChuKSksdih0aGlzLEV0LDApLHYodGhpcyxodCwwKSx2KHRoaXMsdnQsRW4uY3JlYXRlKG4pKSx2KHRoaXMsdXQsMCksdih0aGlzLEN0LDApLHR5cGVvZiBsPT0iZnVuY3Rpb24iJiZ2KHRoaXMsTnQsbCksdHlwZW9mIGQ9PSJmdW5jdGlvbiI/KHYodGhpcyxNdCxkKSx2KHRoaXMsZnQsW10pKToodih0aGlzLE10LHZvaWQgMCksdih0aGlzLGZ0LHZvaWQgMCkpLHYodGhpcyxQdCwhIWModGhpcyxOdCkpLHYodGhpcyxwdCwhIWModGhpcyxNdCkpLHRoaXMubm9EaXNwb3NlT25TZXQ9ISFfLHRoaXMubm9VcGRhdGVUVEw9ISFPLHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uPSEhZyx0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uPSEhcSx0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQ9ISEkLHRoaXMuaWdub3JlRmV0Y2hBYm9ydD0hIW50LHRoaXMubWF4RW50cnlTaXplIT09MCl7aWYoYyh0aGlzLFJ0KSE9PTAmJiFKdChjKHRoaXMsUnQpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO2lmKCFKdCh0aGlzLm1heEVudHJ5U2l6ZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCIpO3codGhpcyxfbixxaSkuY2FsbCh0aGlzKX1pZih0aGlzLmFsbG93U3RhbGU9ISFhLHRoaXMubm9EZWxldGVPblN0YWxlR2V0PSEhRyx0aGlzLnVwZGF0ZUFnZU9uR2V0PSEhcyx0aGlzLnVwZGF0ZUFnZU9uSGFzPSEhdSx0aGlzLnR0bFJlc29sdXRpb249SnQoaSl8fGk9PT0wP2k6MSx0aGlzLnR0bEF1dG9wdXJnZT0hIW8sdGhpcy50dGw9cnx8MCx0aGlzLnR0bCl7aWYoIUp0KHRoaXMudHRsKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0dGwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7dyh0aGlzLCRlLGNyKS5jYWxsKHRoaXMpfWlmKGModGhpcyxJdCk9PT0wJiZ0aGlzLnR0bD09PTAmJmModGhpcyxSdCk9PT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkF0IGxlYXN0IG9uZSBvZiBtYXgsIG1heFNpemUsIG9yIHR0bCBpcyByZXF1aXJlZCIpO2lmKCF0aGlzLnR0bEF1dG9wdXJnZSYmIWModGhpcyxJdCkmJiFjKHRoaXMsUnQpKXtjb25zdCBpdD0iTFJVX0NBQ0hFX1VOQk9VTkRFRCI7ZjAoaXQpJiYoamkuYWRkKGl0KSxHaSgiVFRMIGNhY2hpbmcgd2l0aG91dCB0dGxBdXRvcHVyZ2UsIG1heCwgb3IgbWF4U2l6ZSBjYW4gcmVzdWx0IGluIHVuYm91bmRlZCBtZW1vcnkgY29uc3VtcHRpb24uIiwiVW5ib3VuZGVkQ2FjaGVXYXJuaW5nIixpdCxzcikpfX1zdGF0aWMgdW5zYWZlRXhwb3NlSW50ZXJuYWxzKGUpe3JldHVybntzdGFydHM6YyhlLEx0KSx0dGxzOmMoZSxPdCksc2l6ZXM6YyhlLER0KSxrZXlNYXA6YyhlLGF0KSxrZXlMaXN0OmMoZSx0dCksdmFsTGlzdDpjKGUsTCksbmV4dDpjKGUsX3QpLHByZXY6YyhlLHh0KSxnZXQgaGVhZCgpe3JldHVybiBjKGUsRXQpfSxnZXQgdGFpbCgpe3JldHVybiBjKGUsaHQpfSxmcmVlOmMoZSx2dCksaXNCYWNrZ3JvdW5kRmV0Y2g6bj0+e3ZhciByO3JldHVybiB3KHI9ZSxLLGV0KS5jYWxsKHIsbil9LGJhY2tncm91bmRGZXRjaDoobixyLGksbyk9Pnt2YXIgcztyZXR1cm4gdyhzPWUsQ2UsUm4pLmNhbGwocyxuLHIsaSxvKX0sbW92ZVRvVGFpbDpuPT57dmFyIHI7cmV0dXJuIHcocj1lLGxlLGtlKS5jYWxsKHIsbil9LGluZGV4ZXM6bj0+e3ZhciByO3JldHVybiB3KHI9ZSwkdCxlZSkuY2FsbChyLG4pfSxyaW5kZXhlczpuPT57dmFyIHI7cmV0dXJuIHcocj1lLFZ0LG5lKS5jYWxsKHIsbil9LGlzU3RhbGU6bj0+e3ZhciByO3JldHVybiBjKHI9ZSxidCkuY2FsbChyLG4pfX19Z2V0IG1heCgpe3JldHVybiBjKHRoaXMsSXQpfWdldCBtYXhTaXplKCl7cmV0dXJuIGModGhpcyxSdCl9Z2V0IGNhbGN1bGF0ZWRTaXplKCl7cmV0dXJuIGModGhpcyxDdCl9Z2V0IHNpemUoKXtyZXR1cm4gYyh0aGlzLHV0KX1nZXQgZmV0Y2hNZXRob2QoKXtyZXR1cm4gYyh0aGlzLEllKX1nZXQgZGlzcG9zZSgpe3JldHVybiBjKHRoaXMsTnQpfWdldCBkaXNwb3NlQWZ0ZXIoKXtyZXR1cm4gYyh0aGlzLE10KX1nZXRSZW1haW5pbmdUVEwoZSl7cmV0dXJuIGModGhpcyxhdCkuaGFzKGUpPzEvMDowfSplbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLCR0LGVlKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KnJlbnRyaWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LG5lKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmYyh0aGlzLHR0KVtlXSE9PXZvaWQgMCYmIXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkW2ModGhpcyx0dClbZV0sYyh0aGlzLEwpW2VdXSl9KmtleXMoKXtmb3IoY29uc3QgZSBvZiB3KHRoaXMsJHQsZWUpLmNhbGwodGhpcykpe2NvbnN0IG49Yyh0aGlzLHR0KVtlXTtuIT09dm9pZCAwJiYhdyh0aGlzLEssZXQpLmNhbGwodGhpcyxjKHRoaXMsTClbZV0pJiYoeWllbGQgbil9fSpya2V5cygpe2Zvcihjb25zdCBlIG9mIHcodGhpcyxWdCxuZSkuY2FsbCh0aGlzKSl7Y29uc3Qgbj1jKHRoaXMsdHQpW2VdO24hPT12b2lkIDAmJiF3KHRoaXMsSyxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBuKX19KnZhbHVlcygpe2Zvcihjb25zdCBlIG9mIHcodGhpcywkdCxlZSkuY2FsbCh0aGlzKSljKHRoaXMsTClbZV0hPT12b2lkIDAmJiF3KHRoaXMsSyxldCkuY2FsbCh0aGlzLGModGhpcyxMKVtlXSkmJih5aWVsZCBjKHRoaXMsTClbZV0pfSpydmFsdWVzKCl7Zm9yKGNvbnN0IGUgb2Ygdyh0aGlzLFZ0LG5lKS5jYWxsKHRoaXMpKWModGhpcyxMKVtlXSE9PXZvaWQgMCYmIXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsYyh0aGlzLEwpW2VdKSYmKHlpZWxkIGModGhpcyxMKVtlXSl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9ZmluZChlLG49e30pe2Zvcihjb25zdCByIG9mIHcodGhpcywkdCxlZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsSyxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtpZihvIT09dm9pZCAwJiZlKG8sYyh0aGlzLHR0KVtyXSx0aGlzKSlyZXR1cm4gdGhpcy5nZXQoYyh0aGlzLHR0KVtyXSxuKX19Zm9yRWFjaChlLG49dGhpcyl7Zm9yKGNvbnN0IHIgb2Ygdyh0aGlzLCR0LGVlKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyxMKVtyXSxvPXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO28hPT12b2lkIDAmJmUuY2FsbChuLG8sYyh0aGlzLHR0KVtyXSx0aGlzKX19cmZvckVhY2goZSxuPXRoaXMpe2Zvcihjb25zdCByIG9mIHcodGhpcyxWdCxuZSkuY2FsbCh0aGlzKSl7Y29uc3QgaT1jKHRoaXMsTClbcl0sbz13KHRoaXMsSyxldCkuY2FsbCh0aGlzLGkpP2kuX19zdGFsZVdoaWxlRmV0Y2hpbmc6aTtvIT09dm9pZCAwJiZlLmNhbGwobixvLGModGhpcyx0dClbcl0sdGhpcyl9fXB1cmdlU3RhbGUoKXtsZXQgZT0hMTtmb3IoY29uc3QgbiBvZiB3KHRoaXMsVnQsbmUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKWModGhpcyxidCkuY2FsbCh0aGlzLG4pJiYodGhpcy5kZWxldGUoYyh0aGlzLHR0KVtuXSksZT0hMCk7cmV0dXJuIGV9aW5mbyhlKXtjb25zdCBuPWModGhpcyxhdCkuZ2V0KGUpO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHI9Yyh0aGlzLEwpW25dLGk9dyh0aGlzLEssZXQpLmNhbGwodGhpcyxyKT9yLl9fc3RhbGVXaGlsZUZldGNoaW5nOnI7aWYoaT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbz17dmFsdWU6aX07aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7Y29uc3Qgcz1jKHRoaXMsT3QpW25dLHU9Yyh0aGlzLEx0KVtuXTtpZihzJiZ1KXtjb25zdCBhPXMtKG1lLm5vdygpLXUpO28udHRsPWEsby5zdGFydD1EYXRlLm5vdygpfX1yZXR1cm4gYyh0aGlzLER0KSYmKG8uc2l6ZT1jKHRoaXMsRHQpW25dKSxvfWR1bXAoKXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHcodGhpcywkdCxlZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpe2NvbnN0IHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXSxvPXcodGhpcyxLLGV0KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO2lmKG89PT12b2lkIDB8fHI9PT12b2lkIDApY29udGludWU7Y29uc3Qgcz17dmFsdWU6b307aWYoYyh0aGlzLE90KSYmYyh0aGlzLEx0KSl7cy50dGw9Yyh0aGlzLE90KVtuXTtjb25zdCB1PW1lLm5vdygpLWModGhpcyxMdClbbl07cy5zdGFydD1NYXRoLmZsb29yKERhdGUubm93KCktdSl9Yyh0aGlzLER0KSYmKHMuc2l6ZT1jKHRoaXMsRHQpW25dKSxlLnVuc2hpZnQoW3Isc10pfXJldHVybiBlfWxvYWQoZSl7dGhpcy5jbGVhcigpO2Zvcihjb25zdFtuLHJdb2YgZSl7aWYoci5zdGFydCl7Y29uc3QgaT1EYXRlLm5vdygpLXIuc3RhcnQ7ci5zdGFydD1tZS5ub3coKS1pfXRoaXMuc2V0KG4sci52YWx1ZSxyKX19c2V0KGUsbixyPXt9KXt2YXIgTyxiLEksUyxtO2lmKG49PT12b2lkIDApcmV0dXJuIHRoaXMuZGVsZXRlKGUpLHRoaXM7Y29uc3R7dHRsOmk9dGhpcy50dGwsc3RhcnQ6byxub0Rpc3Bvc2VPblNldDpzPXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZUNhbGN1bGF0aW9uOnU9dGhpcy5zaXplQ2FsY3VsYXRpb24sc3RhdHVzOmF9PXI7bGV0e25vVXBkYXRlVFRMOmw9dGhpcy5ub1VwZGF0ZVRUTH09cjtjb25zdCBkPWModGhpcyxXZSkuY2FsbCh0aGlzLGUsbixyLnNpemV8fDAsdSk7aWYodGhpcy5tYXhFbnRyeVNpemUmJmQ+dGhpcy5tYXhFbnRyeVNpemUpcmV0dXJuIGEmJihhLnNldD0ibWlzcyIsYS5tYXhFbnRyeVNpemVFeGNlZWRlZD0hMCksdGhpcy5kZWxldGUoZSksdGhpcztsZXQgXz1jKHRoaXMsdXQpPT09MD92b2lkIDA6Yyh0aGlzLGF0KS5nZXQoZSk7aWYoXz09PXZvaWQgMClfPWModGhpcyx1dCk9PT0wP2ModGhpcyxodCk6Yyh0aGlzLHZ0KS5sZW5ndGghPT0wP2ModGhpcyx2dCkucG9wKCk6Yyh0aGlzLHV0KT09PWModGhpcyxJdCk/dyh0aGlzLE1lLFRuKS5jYWxsKHRoaXMsITEpOmModGhpcyx1dCksYyh0aGlzLHR0KVtfXT1lLGModGhpcyxMKVtfXT1uLGModGhpcyxhdCkuc2V0KGUsXyksYyh0aGlzLF90KVtjKHRoaXMsaHQpXT1fLGModGhpcyx4dClbX109Yyh0aGlzLGh0KSx2KHRoaXMsaHQsXyksQW4odGhpcyx1dCkuXysrLGModGhpcyxOZSkuY2FsbCh0aGlzLF8sZCxhKSxhJiYoYS5zZXQ9ImFkZCIpLGw9ITE7ZWxzZXt3KHRoaXMsbGUsa2UpLmNhbGwodGhpcyxfKTtjb25zdCBnPWModGhpcyxMKVtfXTtpZihuIT09Zyl7aWYoYyh0aGlzLHRlKSYmdyh0aGlzLEssZXQpLmNhbGwodGhpcyxnKSl7Zy5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoInJlcGxhY2VkIikpO2NvbnN0e19fc3RhbGVXaGlsZUZldGNoaW5nOkd9PWc7RyE9PXZvaWQgMCYmIXMmJihjKHRoaXMsUHQpJiYoKE89Yyh0aGlzLE50KSk9PW51bGx8fE8uY2FsbCh0aGlzLEcsZSwic2V0IikpLGModGhpcyxwdCkmJigoYj1jKHRoaXMsZnQpKT09bnVsbHx8Yi5wdXNoKFtHLGUsInNldCJdKSkpfWVsc2Ugc3x8KGModGhpcyxQdCkmJigoST1jKHRoaXMsTnQpKT09bnVsbHx8SS5jYWxsKHRoaXMsZyxlLCJzZXQiKSksYyh0aGlzLHB0KSYmKChTPWModGhpcyxmdCkpPT1udWxsfHxTLnB1c2goW2csZSwic2V0Il0pKSk7aWYoYyh0aGlzLGZlKS5jYWxsKHRoaXMsXyksYyh0aGlzLE5lKS5jYWxsKHRoaXMsXyxkLGEpLGModGhpcyxMKVtfXT1uLGEpe2Euc2V0PSJyZXBsYWNlIjtjb25zdCBHPWcmJncodGhpcyxLLGV0KS5jYWxsKHRoaXMsZyk/Zy5fX3N0YWxlV2hpbGVGZXRjaGluZzpnO0chPT12b2lkIDAmJihhLm9sZFZhbHVlPUcpfX1lbHNlIGEmJihhLnNldD0idXBkYXRlIil9aWYoaSE9PTAmJiFjKHRoaXMsT3QpJiZ3KHRoaXMsJGUsY3IpLmNhbGwodGhpcyksYyh0aGlzLE90KSYmKGx8fGModGhpcyxWZSkuY2FsbCh0aGlzLF8saSxvKSxhJiZjKHRoaXMsa3QpLmNhbGwodGhpcyxhLF8pKSwhcyYmYyh0aGlzLHB0KSYmYyh0aGlzLGZ0KSl7Y29uc3QgZz1jKHRoaXMsZnQpO2xldCBHO2Zvcig7Rz1nPT1udWxsP3ZvaWQgMDpnLnNoaWZ0KCk7KShtPWModGhpcyxNdCkpPT1udWxsfHxtLmNhbGwodGhpcywuLi5HKX1yZXR1cm4gdGhpc31wb3AoKXt2YXIgZTt0cnl7Zm9yKDtjKHRoaXMsdXQpOyl7Y29uc3Qgbj1jKHRoaXMsTClbYyh0aGlzLEV0KV07aWYodyh0aGlzLE1lLFRuKS5jYWxsKHRoaXMsITApLHcodGhpcyxLLGV0KS5jYWxsKHRoaXMsbikpe2lmKG4uX19zdGFsZVdoaWxlRmV0Y2hpbmcpcmV0dXJuIG4uX19zdGFsZVdoaWxlRmV0Y2hpbmd9ZWxzZSBpZihuIT09dm9pZCAwKXJldHVybiBufX1maW5hbGx5e2lmKGModGhpcyxwdCkmJmModGhpcyxmdCkpe2NvbnN0IG49Yyh0aGlzLGZ0KTtsZXQgcjtmb3IoO3I9bj09bnVsbD92b2lkIDA6bi5zaGlmdCgpOykoZT1jKHRoaXMsTXQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsLi4ucil9fX1oYXMoZSxuPXt9KXtjb25zdHt1cGRhdGVBZ2VPbkhhczpyPXRoaXMudXBkYXRlQWdlT25IYXMsc3RhdHVzOml9PW4sbz1jKHRoaXMsYXQpLmdldChlKTtpZihvIT09dm9pZCAwKXtjb25zdCBzPWModGhpcyxMKVtvXTtpZih3KHRoaXMsSyxldCkuY2FsbCh0aGlzLHMpJiZzLl9fc3RhbGVXaGlsZUZldGNoaW5nPT09dm9pZCAwKXJldHVybiExO2lmKGModGhpcyxidCkuY2FsbCh0aGlzLG8pKWkmJihpLmhhcz0ic3RhbGUiLGModGhpcyxrdCkuY2FsbCh0aGlzLGksbykpO2Vsc2UgcmV0dXJuIHImJmModGhpcyxoZSkuY2FsbCh0aGlzLG8pLGkmJihpLmhhcz0iaGl0IixjKHRoaXMsa3QpLmNhbGwodGhpcyxpLG8pKSwhMH1lbHNlIGkmJihpLmhhcz0ibWlzcyIpO3JldHVybiExfXBlZWsoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlfT1uLGk9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoaT09PXZvaWQgMHx8IXImJmModGhpcyxidCkuY2FsbCh0aGlzLGkpKXJldHVybjtjb25zdCBvPWModGhpcyxMKVtpXTtyZXR1cm4gdyh0aGlzLEssZXQpLmNhbGwodGhpcyxvKT9vLl9fc3RhbGVXaGlsZUZldGNoaW5nOm99YXN5bmMgZmV0Y2goZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCx0dGw6cz10aGlzLnR0bCxub0Rpc3Bvc2VPblNldDp1PXRoaXMubm9EaXNwb3NlT25TZXQsc2l6ZTphPTAsc2l6ZUNhbGN1bGF0aW9uOmw9dGhpcy5zaXplQ2FsY3VsYXRpb24sbm9VcGRhdGVUVEw6ZD10aGlzLm5vVXBkYXRlVFRMLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfPXRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk89dGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixpZ25vcmVGZXRjaEFib3J0OmI9dGhpcy5pZ25vcmVGZXRjaEFib3J0LGFsbG93U3RhbGVPbkZldGNoQWJvcnQ6ST10aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsY29udGV4dDpTLGZvcmNlUmVmcmVzaDptPSExLHN0YXR1czpnLHNpZ25hbDpHfT1uO2lmKCFjKHRoaXMsdGUpKXJldHVybiBnJiYoZy5mZXRjaD0iZ2V0IiksdGhpcy5nZXQoZSx7YWxsb3dTdGFsZTpyLHVwZGF0ZUFnZU9uR2V0Omksbm9EZWxldGVPblN0YWxlR2V0Om8sc3RhdHVzOmd9KTtjb25zdCBxPXthbGxvd1N0YWxlOnIsdXBkYXRlQWdlT25HZXQ6aSxub0RlbGV0ZU9uU3RhbGVHZXQ6byx0dGw6cyxub0Rpc3Bvc2VPblNldDp1LHNpemU6YSxzaXplQ2FsY3VsYXRpb246bCxub1VwZGF0ZVRUTDpkLG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjpfLGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uOk8sYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDpJLGlnbm9yZUZldGNoQWJvcnQ6YixzdGF0dXM6ZyxzaWduYWw6R307bGV0ICQ9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoJD09PXZvaWQgMCl7ZyYmKGcuZmV0Y2g9Im1pc3MiKTtjb25zdCBudD13KHRoaXMsQ2UsUm4pLmNhbGwodGhpcyxlLCQscSxTKTtyZXR1cm4gbnQuX19yZXR1cm5lZD1udH1lbHNle2NvbnN0IG50PWModGhpcyxMKVskXTtpZih3KHRoaXMsSyxldCkuY2FsbCh0aGlzLG50KSl7Y29uc3QgQj1yJiZudC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMDtyZXR1cm4gZyYmKGcuZmV0Y2g9ImluZmxpZ2h0IixCJiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksQj9udC5fX3N0YWxlV2hpbGVGZXRjaGluZzpudC5fX3JldHVybmVkPW50fWNvbnN0IGx0PWModGhpcyxidCkuY2FsbCh0aGlzLCQpO2lmKCFtJiYhbHQpcmV0dXJuIGcmJihnLmZldGNoPSJoaXQiKSx3KHRoaXMsbGUsa2UpLmNhbGwodGhpcywkKSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcywkKSxnJiZjKHRoaXMsa3QpLmNhbGwodGhpcyxnLCQpLG50O2NvbnN0IGl0PXcodGhpcyxDZSxSbikuY2FsbCh0aGlzLGUsJCxxLFMpLFQ9aXQuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJnI7cmV0dXJuIGcmJihnLmZldGNoPWx0PyJzdGFsZSI6InJlZnJlc2giLFQmJmx0JiYoZy5yZXR1cm5lZFN0YWxlPSEwKSksVD9pdC5fX3N0YWxlV2hpbGVGZXRjaGluZzppdC5fX3JldHVybmVkPWl0fX1nZXQoZSxuPXt9KXtjb25zdHthbGxvd1N0YWxlOnI9dGhpcy5hbGxvd1N0YWxlLHVwZGF0ZUFnZU9uR2V0Omk9dGhpcy51cGRhdGVBZ2VPbkdldCxub0RlbGV0ZU9uU3RhbGVHZXQ6bz10aGlzLm5vRGVsZXRlT25TdGFsZUdldCxzdGF0dXM6c309bix1PWModGhpcyxhdCkuZ2V0KGUpO2lmKHUhPT12b2lkIDApe2NvbnN0IGE9Yyh0aGlzLEwpW3VdLGw9dyh0aGlzLEssZXQpLmNhbGwodGhpcyxhKTtyZXR1cm4gcyYmYyh0aGlzLGt0KS5jYWxsKHRoaXMscyx1KSxjKHRoaXMsYnQpLmNhbGwodGhpcyx1KT8ocyYmKHMuZ2V0PSJzdGFsZSIpLGw/KHMmJnImJmEuX19zdGFsZVdoaWxlRmV0Y2hpbmchPT12b2lkIDAmJihzLnJldHVybmVkU3RhbGU9ITApLHI/YS5fX3N0YWxlV2hpbGVGZXRjaGluZzp2b2lkIDApOihvfHx0aGlzLmRlbGV0ZShlKSxzJiZyJiYocy5yZXR1cm5lZFN0YWxlPSEwKSxyP2E6dm9pZCAwKSk6KHMmJihzLmdldD0iaGl0IiksbD9hLl9fc3RhbGVXaGlsZUZldGNoaW5nOih3KHRoaXMsbGUsa2UpLmNhbGwodGhpcyx1KSxpJiZjKHRoaXMsaGUpLmNhbGwodGhpcyx1KSxhKSl9ZWxzZSBzJiYocy5nZXQ9Im1pc3MiKX1kZWxldGUoZSl7dmFyIHIsaSxvLHM7bGV0IG49ITE7aWYoYyh0aGlzLHV0KSE9PTApe2NvbnN0IHU9Yyh0aGlzLGF0KS5nZXQoZSk7aWYodSE9PXZvaWQgMClpZihuPSEwLGModGhpcyx1dCk9PT0xKXRoaXMuY2xlYXIoKTtlbHNle2ModGhpcyxmZSkuY2FsbCh0aGlzLHUpO2NvbnN0IGE9Yyh0aGlzLEwpW3VdO2lmKHcodGhpcyxLLGV0KS5jYWxsKHRoaXMsYSk/YS5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoImRlbGV0ZWQiKSk6KGModGhpcyxQdCl8fGModGhpcyxwdCkpJiYoYyh0aGlzLFB0KSYmKChyPWModGhpcyxOdCkpPT1udWxsfHxyLmNhbGwodGhpcyxhLGUsImRlbGV0ZSIpKSxjKHRoaXMscHQpJiYoKGk9Yyh0aGlzLGZ0KSk9PW51bGx8fGkucHVzaChbYSxlLCJkZWxldGUiXSkpKSxjKHRoaXMsYXQpLmRlbGV0ZShlKSxjKHRoaXMsdHQpW3VdPXZvaWQgMCxjKHRoaXMsTClbdV09dm9pZCAwLHU9PT1jKHRoaXMsaHQpKXYodGhpcyxodCxjKHRoaXMseHQpW3VdKTtlbHNlIGlmKHU9PT1jKHRoaXMsRXQpKXYodGhpcyxFdCxjKHRoaXMsX3QpW3VdKTtlbHNle2NvbnN0IGw9Yyh0aGlzLHh0KVt1XTtjKHRoaXMsX3QpW2xdPWModGhpcyxfdClbdV07Y29uc3QgZD1jKHRoaXMsX3QpW3VdO2ModGhpcyx4dClbZF09Yyh0aGlzLHh0KVt1XX1Bbih0aGlzLHV0KS5fLS0sYyh0aGlzLHZ0KS5wdXNoKHUpfX1pZihjKHRoaXMscHQpJiYoKG89Yyh0aGlzLGZ0KSkhPW51bGwmJm8ubGVuZ3RoKSl7Y29uc3QgdT1jKHRoaXMsZnQpO2xldCBhO2Zvcig7YT11PT1udWxsP3ZvaWQgMDp1LnNoaWZ0KCk7KShzPWModGhpcyxNdCkpPT1udWxsfHxzLmNhbGwodGhpcywuLi5hKX1yZXR1cm4gbn1jbGVhcigpe3ZhciBlLG4scjtmb3IoY29uc3QgaSBvZiB3KHRoaXMsVnQsbmUpLmNhbGwodGhpcyx7YWxsb3dTdGFsZTohMH0pKXtjb25zdCBvPWModGhpcyxMKVtpXTtpZih3KHRoaXMsSyxldCkuY2FsbCh0aGlzLG8pKW8uX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCJkZWxldGVkIikpO2Vsc2V7Y29uc3Qgcz1jKHRoaXMsdHQpW2ldO2ModGhpcyxQdCkmJigoZT1jKHRoaXMsTnQpKT09bnVsbHx8ZS5jYWxsKHRoaXMsbyxzLCJkZWxldGUiKSksYyh0aGlzLHB0KSYmKChuPWModGhpcyxmdCkpPT1udWxsfHxuLnB1c2goW28scywiZGVsZXRlIl0pKX19aWYoYyh0aGlzLGF0KS5jbGVhcigpLGModGhpcyxMKS5maWxsKHZvaWQgMCksYyh0aGlzLHR0KS5maWxsKHZvaWQgMCksYyh0aGlzLE90KSYmYyh0aGlzLEx0KSYmKGModGhpcyxPdCkuZmlsbCgwKSxjKHRoaXMsTHQpLmZpbGwoMCkpLGModGhpcyxEdCkmJmModGhpcyxEdCkuZmlsbCgwKSx2KHRoaXMsRXQsMCksdih0aGlzLGh0LDApLGModGhpcyx2dCkubGVuZ3RoPTAsdih0aGlzLEN0LDApLHYodGhpcyx1dCwwKSxjKHRoaXMscHQpJiZjKHRoaXMsZnQpKXtjb25zdCBpPWModGhpcyxmdCk7bGV0IG87Zm9yKDtvPWk9PW51bGw/dm9pZCAwOmkuc2hpZnQoKTspKHI9Yyh0aGlzLE10KSk9PW51bGx8fHIuY2FsbCh0aGlzLC4uLm8pfX19O2xldCBvcj1zcjtGMD1TeW1ib2wudG9TdHJpbmdUYWcsSXQ9bmV3IFdlYWtNYXAsUnQ9bmV3IFdlYWtNYXAsTnQ9bmV3IFdlYWtNYXAsTXQ9bmV3IFdlYWtNYXAsSWU9bmV3IFdlYWtNYXAsdXQ9bmV3IFdlYWtNYXAsQ3Q9bmV3IFdlYWtNYXAsYXQ9bmV3IFdlYWtNYXAsdHQ9bmV3IFdlYWtNYXAsTD1uZXcgV2Vha01hcCxfdD1uZXcgV2Vha01hcCx4dD1uZXcgV2Vha01hcCxFdD1uZXcgV2Vha01hcCxodD1uZXcgV2Vha01hcCx2dD1uZXcgV2Vha01hcCxmdD1uZXcgV2Vha01hcCxEdD1uZXcgV2Vha01hcCxMdD1uZXcgV2Vha01hcCxPdD1uZXcgV2Vha01hcCxQdD1uZXcgV2Vha01hcCx0ZT1uZXcgV2Vha01hcCxwdD1uZXcgV2Vha01hcCwkZT1uZXcgV2Vha1NldCxjcj1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGRuKGModGhpcyxJdCkpLG49bmV3IGRuKGModGhpcyxJdCkpO3YodGhpcyxPdCxlKSx2KHRoaXMsTHQsbiksdih0aGlzLFZlLChvLHMsdT1tZS5ub3coKSk9PntpZihuW29dPXMhPT0wP3U6MCxlW29dPXMscyE9PTAmJnRoaXMudHRsQXV0b3B1cmdlKXtjb25zdCBhPXNldFRpbWVvdXQoKCk9PntjKHRoaXMsYnQpLmNhbGwodGhpcyxvKSYmdGhpcy5kZWxldGUoYyh0aGlzLHR0KVtvXSl9LHMrMSk7YS51bnJlZiYmYS51bnJlZigpfX0pLHYodGhpcyxoZSxvPT57bltvXT1lW29dIT09MD9tZS5ub3coKTowfSksdih0aGlzLGt0LChvLHMpPT57aWYoZVtzXSl7Y29uc3QgdT1lW3NdLGE9bltzXTtpZighdXx8IWEpcmV0dXJuO28udHRsPXUsby5zdGFydD1hLG8ubm93PXJ8fGkoKTtjb25zdCBsPW8ubm93LWE7by5yZW1haW5pbmdUVEw9dS1sfX0pO2xldCByPTA7Y29uc3QgaT0oKT0+e2NvbnN0IG89bWUubm93KCk7aWYodGhpcy50dGxSZXNvbHV0aW9uPjApe3I9bztjb25zdCBzPXNldFRpbWVvdXQoKCk9PnI9MCx0aGlzLnR0bFJlc29sdXRpb24pO3MudW5yZWYmJnMudW5yZWYoKX1yZXR1cm4gb307dGhpcy5nZXRSZW1haW5pbmdUVEw9bz0+e2NvbnN0IHM9Yyh0aGlzLGF0KS5nZXQobyk7aWYocz09PXZvaWQgMClyZXR1cm4gMDtjb25zdCB1PWVbc10sYT1uW3NdO2lmKCF1fHwhYSlyZXR1cm4gMS8wO2NvbnN0IGw9KHJ8fGkoKSktYTtyZXR1cm4gdS1sfSx2KHRoaXMsYnQsbz0+e2NvbnN0IHM9bltvXSx1PWVbb107cmV0dXJuISF1JiYhIXMmJihyfHxpKCkpLXM+dX0pfSxoZT1uZXcgV2Vha01hcCxrdD1uZXcgV2Vha01hcCxWZT1uZXcgV2Vha01hcCxidD1uZXcgV2Vha01hcCxfbj1uZXcgV2Vha1NldCxxaT1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IGRuKGModGhpcyxJdCkpO3YodGhpcyxDdCwwKSx2KHRoaXMsRHQsZSksdih0aGlzLGZlLG49Pnt2KHRoaXMsQ3QsYyh0aGlzLEN0KS1lW25dKSxlW25dPTB9KSx2KHRoaXMsV2UsKG4scixpLG8pPT57aWYodyh0aGlzLEssZXQpLmNhbGwodGhpcyxyKSlyZXR1cm4gMDtpZighSnQoaSkpaWYobyl7aWYodHlwZW9mIG8hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZUNhbGN1bGF0aW9uIG11c3QgYmUgYSBmdW5jdGlvbiIpO2lmKGk9byhyLG4pLCFKdChpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSIpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiBXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiBvciBzaXplIG11c3QgYmUgc2V0LiIpO3JldHVybiBpfSksdih0aGlzLE5lLChuLHIsaSk9PntpZihlW25dPXIsYyh0aGlzLFJ0KSl7Y29uc3Qgbz1jKHRoaXMsUnQpLWVbbl07Zm9yKDtjKHRoaXMsQ3QpPm87KXcodGhpcyxNZSxUbikuY2FsbCh0aGlzLCEwKX12KHRoaXMsQ3QsYyh0aGlzLEN0KStlW25dKSxpJiYoaS5lbnRyeVNpemU9cixpLnRvdGFsQ2FsY3VsYXRlZFNpemU9Yyh0aGlzLEN0KSl9KX0sZmU9bmV3IFdlYWtNYXAsTmU9bmV3IFdlYWtNYXAsV2U9bmV3IFdlYWtNYXAsJHQ9bmV3IFdlYWtTZXQsZWU9ZnVuY3Rpb24qKHthbGxvd1N0YWxlOmU9dGhpcy5hbGxvd1N0YWxlfT17fSl7aWYoYyh0aGlzLHV0KSlmb3IobGV0IG49Yyh0aGlzLGh0KTshKCF3KHRoaXMsemUsaHIpLmNhbGwodGhpcyxuKXx8KChlfHwhYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbikpJiYoeWllbGQgbiksbj09PWModGhpcyxFdCkpKTspbj1jKHRoaXMseHQpW25dfSxWdD1uZXcgV2Vha1NldCxuZT1mdW5jdGlvbiooe2FsbG93U3RhbGU6ZT10aGlzLmFsbG93U3RhbGV9PXt9KXtpZihjKHRoaXMsdXQpKWZvcihsZXQgbj1jKHRoaXMsRXQpOyEoIXcodGhpcyx6ZSxocikuY2FsbCh0aGlzLG4pfHwoKGV8fCFjKHRoaXMsYnQpLmNhbGwodGhpcyxuKSkmJih5aWVsZCBuKSxuPT09Yyh0aGlzLGh0KSkpOyluPWModGhpcyxfdClbbl19LHplPW5ldyBXZWFrU2V0LGhyPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZjKHRoaXMsYXQpLmdldChjKHRoaXMsdHQpW2VdKT09PWV9LE1lPW5ldyBXZWFrU2V0LFRuPWZ1bmN0aW9uKGUpe3ZhciBvLHM7Y29uc3Qgbj1jKHRoaXMsRXQpLHI9Yyh0aGlzLHR0KVtuXSxpPWModGhpcyxMKVtuXTtyZXR1cm4gYyh0aGlzLHRlKSYmdyh0aGlzLEssZXQpLmNhbGwodGhpcyxpKT9pLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigiZXZpY3RlZCIpKTooYyh0aGlzLFB0KXx8Yyh0aGlzLHB0KSkmJihjKHRoaXMsUHQpJiYoKG89Yyh0aGlzLE50KSk9PW51bGx8fG8uY2FsbCh0aGlzLGksciwiZXZpY3QiKSksYyh0aGlzLHB0KSYmKChzPWModGhpcyxmdCkpPT1udWxsfHxzLnB1c2goW2ksciwiZXZpY3QiXSkpKSxjKHRoaXMsZmUpLmNhbGwodGhpcyxuKSxlJiYoYyh0aGlzLHR0KVtuXT12b2lkIDAsYyh0aGlzLEwpW25dPXZvaWQgMCxjKHRoaXMsdnQpLnB1c2gobikpLGModGhpcyx1dCk9PT0xPyh2KHRoaXMsRXQsdih0aGlzLGh0LDApKSxjKHRoaXMsdnQpLmxlbmd0aD0wKTp2KHRoaXMsRXQsYyh0aGlzLF90KVtuXSksYyh0aGlzLGF0KS5kZWxldGUociksQW4odGhpcyx1dCkuXy0tLG59LENlPW5ldyBXZWFrU2V0LFJuPWZ1bmN0aW9uKGUsbixyLGkpe2NvbnN0IG89bj09PXZvaWQgMD92b2lkIDA6Yyh0aGlzLEwpW25dO2lmKHcodGhpcyxLLGV0KS5jYWxsKHRoaXMsbykpcmV0dXJuIG87Y29uc3Qgcz1uZXcgbG4se3NpZ25hbDp1fT1yO3U9PW51bGx8fHUuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLCgpPT5zLmFib3J0KHUucmVhc29uKSx7c2lnbmFsOnMuc2lnbmFsfSk7Y29uc3QgYT17c2lnbmFsOnMuc2lnbmFsLG9wdGlvbnM6cixjb250ZXh0Oml9LGw9KFMsbT0hMSk9Pntjb25zdHthYm9ydGVkOmd9PXMuc2lnbmFsLEc9ci5pZ25vcmVGZXRjaEFib3J0JiZTIT09dm9pZCAwO2lmKHIuc3RhdHVzJiYoZyYmIW0/KHIuc3RhdHVzLmZldGNoQWJvcnRlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPXMuc2lnbmFsLnJlYXNvbixHJiYoci5zdGF0dXMuZmV0Y2hBYm9ydElnbm9yZWQ9ITApKTpyLnN0YXR1cy5mZXRjaFJlc29sdmVkPSEwKSxnJiYhRyYmIW0pcmV0dXJuIF8ocy5zaWduYWwucmVhc29uKTtjb25zdCBxPWI7cmV0dXJuIGModGhpcyxMKVtuXT09PWImJihTPT09dm9pZCAwP3EuX19zdGFsZVdoaWxlRmV0Y2hpbmc/Yyh0aGlzLEwpW25dPXEuX19zdGFsZVdoaWxlRmV0Y2hpbmc6dGhpcy5kZWxldGUoZSk6KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hVcGRhdGVkPSEwKSx0aGlzLnNldChlLFMsYS5vcHRpb25zKSkpLFN9LGQ9Uz0+KHIuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hSZWplY3RlZD0hMCxyLnN0YXR1cy5mZXRjaEVycm9yPVMpLF8oUykpLF89Uz0+e2NvbnN0e2Fib3J0ZWQ6bX09cy5zaWduYWwsZz1tJiZyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsRz1nfHxyLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLHE9R3x8ci5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sJD1iO2lmKGModGhpcyxMKVtuXT09PWImJighcXx8JC5fX3N0YWxlV2hpbGVGZXRjaGluZz09PXZvaWQgMD90aGlzLmRlbGV0ZShlKTpnfHwoYyh0aGlzLEwpW25dPSQuX19zdGFsZVdoaWxlRmV0Y2hpbmcpKSxHKXJldHVybiByLnN0YXR1cyYmJC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmKHIuc3RhdHVzLnJldHVybmVkU3RhbGU9ITApLCQuX19zdGFsZVdoaWxlRmV0Y2hpbmc7aWYoJC5fX3JldHVybmVkPT09JCl0aHJvdyBTfSxPPShTLG0pPT57dmFyIEc7Y29uc3QgZz0oRz1jKHRoaXMsSWUpKT09bnVsbD92b2lkIDA6Ry5jYWxsKHRoaXMsZSxvLGEpO2cmJmcgaW5zdGFuY2VvZiBQcm9taXNlJiZnLnRoZW4ocT0+UyhxPT09dm9pZCAwP3ZvaWQgMDpxKSxtKSxzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PnsoIXIuaWdub3JlRmV0Y2hBYm9ydHx8ci5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSYmKFModm9pZCAwKSxyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQmJihTPXE9PmwocSwhMCkpKX0pfTtyLnN0YXR1cyYmKHIuc3RhdHVzLmZldGNoRGlzcGF0Y2hlZD0hMCk7Y29uc3QgYj1uZXcgUHJvbWlzZShPKS50aGVuKGwsZCksST1PYmplY3QuYXNzaWduKGIse19fYWJvcnRDb250cm9sbGVyOnMsX19zdGFsZVdoaWxlRmV0Y2hpbmc6byxfX3JldHVybmVkOnZvaWQgMH0pO3JldHVybiBuPT09dm9pZCAwPyh0aGlzLnNldChlLEksey4uLmEub3B0aW9ucyxzdGF0dXM6dm9pZCAwfSksbj1jKHRoaXMsYXQpLmdldChlKSk6Yyh0aGlzLEwpW25dPUksSX0sSz1uZXcgV2Vha1NldCxldD1mdW5jdGlvbihlKXtpZighYyh0aGlzLHRlKSlyZXR1cm4hMTtjb25zdCBuPWU7cmV0dXJuISFuJiZuIGluc3RhbmNlb2YgUHJvbWlzZSYmbi5oYXNPd25Qcm9wZXJ0eSgiX19zdGFsZVdoaWxlRmV0Y2hpbmciKSYmbi5fX2Fib3J0Q29udHJvbGxlciBpbnN0YW5jZW9mIGxufSxYZT1uZXcgV2Vha1NldCxmcj1mdW5jdGlvbihlLG4pe2ModGhpcyx4dClbbl09ZSxjKHRoaXMsX3QpW2VdPW59LGxlPW5ldyBXZWFrU2V0LGtlPWZ1bmN0aW9uKGUpe2UhPT1jKHRoaXMsaHQpJiYoZT09PWModGhpcyxFdCk/dih0aGlzLEV0LGModGhpcyxfdClbZV0pOncodGhpcyxYZSxmcikuY2FsbCh0aGlzLGModGhpcyx4dClbZV0sYyh0aGlzLF90KVtlXSksdyh0aGlzLFhlLGZyKS5jYWxsKHRoaXMsYyh0aGlzLGh0KSxlKSx2KHRoaXMsaHQsZSkpfTtjb25zdCBXaT1uZXcgb3Ioe21heDoxZTN9KSxsMD0odCxlLG4pPT57Y29uc3Qgcj1KU09OLnN0cmluZ2lmeSh0LnByb3BlcnRpZXMpLGk9V2kuZ2V0KHIpO2lmKGkpcmV0dXJuIGk7Y29uc3Qgbz0oKCk9Pntzd2l0Y2goenQudHlwZXNbdC50eXBlXSl7Y2FzZSJQb2x5Z29uIjpyZXR1cm4icG9seWdvbiI7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4icG9seWxpbmUiO2Nhc2UiUG9pbnQiOnJldHVybiJtYXJrZXIiO2RlZmF1bHQ6cmV0dXJufX0pKCkscz0oKCk9PntpZigobj09bnVsbD92b2lkIDA6bi50eXBlKSE9PSJzaW1wbGUifHwhbylyZXR1cm47Y29uc3QgYT1kMCgiIix0LGUsbyk7aWYoYSlyZXR1cm4gZm49PW51bGw/dm9pZCAwOmZuKG4sYSl9KSgpLHU9KCgpPT57aWYobz09PSJwb2x5Z29uIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlnb247cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEuZmlsbCk/PyEwKSYmKChhPT1udWxsP3ZvaWQgMDphLnNob3cpPz8hMCk/YT09bnVsbD92b2lkIDA6YS5maWxsQ29sb3I6InJnYmEoMCwwLDAsMCkiLHN0cm9rZVN0eWxlOmEhPW51bGwmJmEuc3Ryb2tlJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aCxsaW5lSm9pbjphPT1udWxsP3ZvaWQgMDphLmxpbmVKb2lufX1pZihvPT09InBvbHlsaW5lIil7Y29uc3QgYT1zPT1udWxsP3ZvaWQgMDpzLnBvbHlsaW5lO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yKT8/ITApJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixzdHJva2VTdHlsZTphIT1udWxsJiZhLnN0cm9rZUNvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnN0cm9rZUNvbG9yOiJyZ2JhKDAsMCwwLDApIixsaW5lV2lkdGg6YT09bnVsbD92b2lkIDA6YS5zdHJva2VXaWR0aH19aWYobz09PSJtYXJrZXIiKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMubWFya2VyO3JldHVybntmaWxsU3R5bGU6KChhPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3IpPz8hMCkmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcjoicmdiYSgwLDAsMCwwKSIsc3Ryb2tlU3R5bGU6YSE9bnVsbCYmYS5wb2ludENvbG9yJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLnBvaW50Q29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnBvaW50U2l6ZX19fSkoKTtyZXR1cm4gV2kuc2V0KHIsdSksdX0sZDA9KHQsZSxuLHIpPT57Y29uc3QgaT1lLmxvYWRHZW9tZXRyeSgpLFtvLHNdPSgoKT0+e2lmKHI9PT0icG9seWdvbiIpcmV0dXJuWyJQb2x5Z29uIixpLm1hcCh1PT51Lm1hcChhPT5bYS54LGEueV0pKV07aWYocj09PSJwb2x5bGluZSIpcmV0dXJuWyJMaW5lU3RyaW5nIixpWzBdLm1hcCh1PT5bdS54LHUueV0pXTtpZihyPT09Im1hcmtlciIpcmV0dXJuWyJQb2ludCIsW2lbMF1bMF0ueCxpWzBdWzBdLnldXTt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXBwZWFyYW5jZSAke3J9YCl9KSgpO3JldHVybnt0eXBlOiJmZWF0dXJlIixpZDp0LGdlb21ldHJ5Ont0eXBlOm8sY29vcmRpbmF0ZXM6c30scHJvcGVydGllczplLnByb3BlcnRpZXMscmFuZ2U6e3g6bi54LHk6bi55LHo6bi5sZXZlbH19fTtmdW5jdGlvbiBFMCh0KXtyZXR1cm4gcDAodCk9PT1nbi5DT1VOVEVSX0NMT0NLV0lTRX1mdW5jdGlvbiB6aSh0LGUpe2NvbnN0IG49dC54LHI9dC55O2xldCBpPSExO2ZvcihsZXQgbz0wLHM9ZS5sZW5ndGgtMTtvPGUubGVuZ3RoO3M9bysrKXtjb25zdCB1PWVbb10ueCxhPWVbb10ueSxsPWVbc10ueCxkPWVbc10ueTthPnIhPWQ+ciYmbjwobC11KSooci1hKS8oZC1hKSt1JiYoaT0haSl9cmV0dXJuIGl9ZnVuY3Rpb24gXzAodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZih6aShlLHRbbl0pKXtsZXQgcj0hMTtmb3IoO24rMTx0Lmxlbmd0aCYmIUUwKHRbbisxXSk7KW4rKywhciYmemkoZSx0W25dKSYmKHI9ITApO2lmKCFyKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHAwKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49dFtlLTFdLngqKHRbMF0ueS10W2UtMl0ueSkrdFswXS54Kih0WzFdLnktdFtlLTFdLnkpO2ZvcihsZXQgcj0xO3I8PWUtMjtyKyspbis9dFtyXS54Kih0W3IrMV0ueS10W3ItMV0ueSk7aWYoaXNOYU4obikpdGhyb3cgbmV3IEVycm9yO3JldHVybiBuPjA/Z24uQ09VTlRFUl9DTE9DS1dJU0U6Z24uQ0xPQ0tXSVNFfWNvbnN0IEdlPTI1NjtjbGFzcyB5MHtjb25zdHJ1Y3RvcihlKXtDKHRoaXMsIl91cmxUZW1wbGF0ZSIpO0ModGhpcywiX3BhcnNlVGlsZSIpO0ModGhpcywiX3RpbGluZ1NjaGVtZSIpO0ModGhpcywiX2xheWVyTmFtZXMiKTtDKHRoaXMsIl90aWxlV2lkdGgiKTtDKHRoaXMsIl90aWxlSGVpZ2h0Iik7Qyh0aGlzLCJfcGlja1BvaW50UmFkaXVzIik7Qyh0aGlzLCJfcGlja0xpbmVXaWR0aCIpO0ModGhpcywiX3RpbGVDYWNoZXMiKTt0aGlzLl9wYXJzZVRpbGU9QTAsdGhpcy5fdXJsVGVtcGxhdGU9ZS51cmxUZW1wbGF0ZSx0aGlzLl90aWxlV2lkdGg9R2UsdGhpcy5fdGlsZUhlaWdodD1HZSx0aGlzLl9sYXllck5hbWVzPWUubGF5ZXJOYW1lcyx0aGlzLl90aWxpbmdTY2hlbWU9bmV3IFl0LHRoaXMuX3BpY2tQb2ludFJhZGl1cz1lLnBpY2tQb2ludFJhZGl1cz8/VDAsdGhpcy5fcGlja0xpbmVXaWR0aD1lLnBpY2tMaW5lV2lkdGg/P1IwfWFzeW5jIHJlbmRlcihlLG4scixpKXtjb25zdCBvPVhpKHRoaXMuX3VybFRlbXBsYXRlLG4pO2F3YWl0IFByb21pc2UuYWxsKHRoaXMuX2xheWVyTmFtZXMubWFwKHM9PnRoaXMuX3JlbmRlckNhbnZhcyhvLGUsbixzLHIsaSkpKX1hc3luYyBfcmVuZGVyQ2FudmFzKGUsbixyLGksbyxzKXtpZighZSlyZXR1cm47Y29uc3QgdT1hd2FpdCB0aGlzLl9jYWNoZWRUaWxlKGUpLGw9aS5zcGxpdCgvLCAqLykuZmlsdGVyKEJvb2xlYW4pLm1hcChkPT51PT1udWxsP3ZvaWQgMDp1LmxheWVyc1tkXSk7bCYmKG4uc3Ryb2tlU3R5bGU9ImJsYWNrIixuLmZpbGxTdHlsZT0iYmxhY2siLG4ubGluZVdpZHRoPTEsbi5taXRlckxpbWl0PTIsbi5zZXRUcmFuc2Zvcm0odGhpcy5fdGlsZVdpZHRoKm8vR2UsMCwwLHRoaXMuX3RpbGVIZWlnaHQqby9HZSwwLDApLGwuZm9yRWFjaChkPT57aWYoIWQpcmV0dXJuO2NvbnN0IF89R2UvZC5leHRlbnQ7Zm9yKGxldCBPPTA7TzxkLmxlbmd0aDtPKyspe2NvbnN0IGI9ZC5mZWF0dXJlKE8pLEk9bDAoYixyLHMpO2lmKCFJKWNvbnRpbnVlO24uZmlsbFN0eWxlPUkuZmlsbFN0eWxlPz9uLmZpbGxTdHlsZSxuLnN0cm9rZVN0eWxlPUkuc3Ryb2tlU3R5bGU/P24uc3Ryb2tlU3R5bGUsbi5saW5lV2lkdGg9SS5saW5lV2lkdGg/P24ubGluZVdpZHRoLG4ubGluZUpvaW49SS5saW5lSm9pbj8/bi5saW5lSm9pbjtjb25zdCBTPWIubG9hZEdlb21ldHJ5KCk7enQudHlwZXNbYi50eXBlXT09PSJQb2x5Z29uIj90aGlzLl9yZW5kZXJQb2x5Z29uKG4sUyxfLChJLmxpbmVXaWR0aD8/MSk+MCk6enQudHlwZXNbYi50eXBlXT09PSJQb2ludCI/dGhpcy5fcmVuZGVyUG9pbnQobixTLF8pOnp0LnR5cGVzW2IudHlwZV09PT0iTGluZVN0cmluZyI/dGhpcy5fcmVuZGVyTGluZVN0cmluZyhuLFMsXyk6Y29uc29sZS5lcnJvcihgVW5leHBlY3RlZCBnZW9tZXRyeSB0eXBlOiAke2IudHlwZX0gaW4gcmVnaW9uIG1hcCBvbiB0aWxlICR7W3IubGV2ZWwsci54LHIueV0uam9pbigiLyIpfWApfX0pKX1fcmVuZGVyUG9seWdvbihlLG4scixpKXtlLmJlZ2luUGF0aCgpO2NvbnN0IG89KCk9PntpJiZlLnN0cm9rZSgpLGUuZmlsbCgpfTtsZXQgcz0wO2ZvcihsZXQgdT0wO3U8bi5sZW5ndGg7dSsrKXtjb25zdCBhPW5bdV07cythLmxlbmd0aD41NDAwJiYobygpLHM9MCxlLmJlZ2luUGF0aCgpKTtsZXQgbD1hWzBdO2UubW92ZVRvKGwueCpyLGwueSpyKTtmb3IobGV0IGQ9MTtkPGEubGVuZ3RoO2QrKylsPWFbZF0sZS5saW5lVG8obC54KnIsbC55KnIpO3MrPWEubGVuZ3RofXM+MCYmbygpfV9yZW5kZXJQb2ludChlLG4scil7ZS5iZWdpblBhdGgoKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyl7Y29uc3Qgbz1uW2ldWzBdLFtzLHVdPVtvLngqcixvLnkqcl0sYT1lLmxpbmVXaWR0aDtlLmJlZ2luUGF0aCgpLGUuYXJjKHMsdSxhLDAsMipNYXRoLlBJKSxlLmZpbGwoKX19X3JlbmRlckxpbmVTdHJpbmcoZSxuLHIpe2UuYmVnaW5QYXRoKCk7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspe2xldCBvPW5baV1bMF07ZS5tb3ZlVG8oby54KnIsby55KnIpO2ZvcihsZXQgcz0xO3M8bltpXS5sZW5ndGg7cysrKW89bltpXVtzXSxlLmxpbmVUbyhvLngqcixvLnkqcil9ZS5zdHJva2UoKX1waWNrRmVhdHVyZXMoZSxuLHIsaSl7Y29uc3Qgbz1YaSh0aGlzLl91cmxUZW1wbGF0ZSxlKTtyZXR1cm4gdGhpcy5fcGlja0ZlYXR1cmVzRnJvbUxheWVyKG8sZSxuLHIsaSl9YXN5bmMgX3BpY2tGZWF0dXJlc0Zyb21MYXllcihlLG4scixpLG8pe3RyeXtjb25zdCBzPWF3YWl0IHRoaXMuX2NhY2hlZFRpbGUoZSk7cmV0dXJuIHM/KGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX2xheWVyTmFtZXMubWFwKGFzeW5jIGE9Pntjb25zdCBsPXMubGF5ZXJzW2FdO2lmKCFsKXJldHVybltdO2NvbnN0IGQ9YXdhaXQgdGhpcy5fcGlja0ZlYXR1cmVzKG4scixpLGwsbyk7cmV0dXJuIGR8fFtdfSkpKS5mbGF0KCk6W119Y2F0Y2h7cmV0dXJuW119fWFzeW5jIF9waWNrRmVhdHVyZXMoZSxuLHIsaSxvKXtjb25zdCBzPXRoaXMuX3RpbGluZ1NjaGVtZS50aWxlWFlUb05hdGl2ZVJlY3RhbmdsZShlLngsZS55LGUubGV2ZWwpLHU9W3Mud2VzdCxzLmVhc3RdLGE9W3Mubm9ydGgscy5zb3V0aF0sbD1mdW5jdGlvbihTLG0sZyxHLHEpe2NvbnN0ICQ9bmV3IEE7QS5zdWJ0cmFjdChTLG5ldyBBKG1bMF0sZ1swXSksJCk7Y29uc3QgbnQ9bmV3IEEoKEdbMV0tR1swXSkvKG1bMV0tbVswXSksKHFbMV0tcVswXSkvKGdbMV0tZ1swXSkpO3JldHVybiBBLmFkZChBLm11bHRpcGx5Q29tcG9uZW50cygkLG50LG5ldyBBKSxuZXcgQShHWzBdLHFbMF0pLG5ldyBBKX0sZD1bXSxfPVswLGkuZXh0ZW50LTFdLE89KF9bMV0tX1swXSkvdGhpcy5fdGlsZVdpZHRoLGI9bChBLmZyb21DYXJ0ZXNpYW4zKHRoaXMuX3RpbGluZ1NjaGVtZS5wcm9qZWN0aW9uLnByb2plY3QobmV3IEgobixyKSkpLHUsYSxfLF8pLEk9bmV3IHRuKGIueCxiLnkpO2ZvcihsZXQgUz0wO1M8aS5sZW5ndGg7UysrKXtjb25zdCBtPWkuZmVhdHVyZShTKTtpZih6dC50eXBlc1ttLnR5cGVdPT09IlBvbHlnb24iJiZfMChtLmxvYWRHZW9tZXRyeSgpLEkpfHx6dC50eXBlc1ttLnR5cGVdPT09IkxpbmVTdHJpbmciJiZaaChtLmxvYWRHZW9tZXRyeSgpLEksSGkodGhpcy5fcGlja0xpbmVXaWR0aCxtLGUpKk8pfHx6dC50eXBlc1ttLnR5cGVdPT09IlBvaW50IiYmS2gobS5sb2FkR2VvbWV0cnkoKSxJLEhpKHRoaXMuX3BpY2tQb2ludFJhZGl1cyxtLGUpKk8pKXtjb25zdCBnPXUwKG0sZSxvKTtnJiZkLnB1c2goZyl9fXJldHVybiBkfWFzeW5jIF9jYWNoZWRUaWxlKGUpe3ZhciBuLHI7aWYoZSl7aWYoKG49dGhpcy5fdGlsZUNhY2hlcykhPW51bGwmJm4uaGFzKGUpKXJldHVybiB0aGlzLl90aWxlQ2FjaGVzLmdldChlKTt0cnl7Y29uc3QgaT1iMChhd2FpdCB0aGlzLl9wYXJzZVRpbGUoZSkpO3JldHVybiBpJiYoKHI9dGhpcy5fdGlsZUNhY2hlcyk9PW51bGx8fHIuc2V0KGUsaSkpLGl9Y2F0Y2h7cmV0dXJufX19Y2xlYXJDYWNoZSgpe3ZhciBlOyhlPXRoaXMuX3RpbGVDYWNoZXMpPT1udWxsfHxlLmNsZWFyKCl9fWNvbnN0IEEwPWFzeW5jIHQ9Pnt0cnl7Y29uc3QgZT1hd2FpdCBPMCh0KTtyZXR1cm4gZT94MChlKTp2b2lkIDB9Y2F0Y2h7cmV0dXJufX0sVDA9NSxSMD01LHgwPXQ9Pm5ldyBIbyhuZXcga28odCkpLE8wPWFzeW5jIHQ9PntpZighdCl7Y29uc29sZS5lcnJvcigiZmV0Y2ggcmVxdWVzdCBmYWlsZWQgYmVjYXVzZSByZXF1ZXN0IHVybCBpcyB1bmRlZmluZWQiKTtyZXR1cm59dHJ5e2NvbnN0IGU9YXdhaXQgZmV0Y2godCk7cmV0dXJuIGUub2s/YXdhaXQgZS5hcnJheUJ1ZmZlcigpOnZvaWQgMH1jYXRjaHtyZXR1cm59fSxiMD10PT57dmFyIG47aWYoIXQpcmV0dXJuO2NvbnN0IGU9e307Zm9yKGNvbnN0W3IsaV1vZiBPYmplY3QuZW50cmllcyh0LmxheWVycykpe2NvbnN0IG89W10scz1pO2ZvcihsZXQgdT0wO3U8cy5sZW5ndGg7dSsrKXtjb25zdCBhPXMuZmVhdHVyZSh1KTtsZXQgbDtjb25zdCBkPShuPWEuYmJveCk9PW51bGw/dm9pZCAwOm4uY2FsbChhKSxfPXsuLi5hLGlkOmEuaWQsbG9hZEdlb21ldHJ5OigpPT4obHx8KGw9YS5sb2FkR2VvbWV0cnkoKSksbCksYmJveDpkPygpPT5kOnZvaWQgMCx0b0dlb0pTT046YS50b0dlb0pTT059O28ucHVzaChfKX1lW3JdPXsuLi5zLGZlYXR1cmU6dT0+b1t1XX19cmV0dXJue2xheWVyczplfX0sWGk9KHQsZSk9PmRlY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKCJ7en0iLFN0cmluZyhlLmxldmVsKSkucmVwbGFjZSgie3h9IixTdHJpbmcoZS54KSkucmVwbGFjZSgie3l9IixTdHJpbmcoZS55KSk7ZnVuY3Rpb24gSGkodCxlLG4pe3JldHVybiB0eXBlb2YgdD09Im51bWJlciI/dDp0KGUsbil9Y29uc3QgZzA9bmV3IE1hcDtmdW5jdGlvbiBTMCh7dXJsVGVtcGxhdGU6dCxtYXhpbXVtTGV2ZWw6ZX0pe3JldHVybmAke3R9OiR7ZX1gfWFzeW5jIGZ1bmN0aW9uIG0wKHQpe2NvbnN0IGU9UzAodCk7bGV0IG47cmV0dXJuIG49PW51bGwmJihuPW5ldyB5MCh0KSxnMC5zZXQoZSxuKSksbn1zbyh7cmVuZGVyVGlsZTphc3luYyh7cmVxdWVzdGVkVGlsZTp0LGNhbnZhczplLHNjYWxlRmFjdG9yOm4sLi4ucn0pPT57Y29uc3QgaT1lLmdldENvbnRleHQoIjJkIik7aWYoIWkpcmV0dXJuO2NvbnN0IG89YXdhaXQgbTAocik7YXdhaXQgby5yZW5kZXIoaSx0LG4sci5jdXJyZW50TGF5ZXIpLG8uY2xlYXJDYWNoZSgpLGF3YWl0IG5ldyBQcm9taXNlKHM9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUocyl9KX19KX0pKCk7Cg==",dc=typeof window<"u"&&window.Blob&&new Blob([atob(hd)],{type:"text/javascript;charset=utf-8"});function zm(){const t=dc&&(window.URL||window.webkitURL).createObjectURL(dc);try{return t?new Worker(t):new Worker("data:application/javascript;base64,"+hd)}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}const xe=[];function Qm(t){let n=xe.find(o=>o.layerId===t);return n==null&&(n=km(async()=>await Mm(new zm),{size:Math.ceil(navigator.hardwareConcurrency/4)}),n.layerId=t,xe.push(n)),n}function Pm(t,n){return Qm(n).queue(o=>t(o,n))}function Em(t,n){const o=xe.find(s=>s.layerId===t);return o==null||o.taskQueue.length<n}async function wm(t){const n=xe.findIndex(o=>o.layerId===t);n!==-1&&(await xe[n].terminate(!0),xe.splice(n,1))}async function vm(t){var n;const{canvas:o,...s}=t,c=o.transferControlToOffscreen();await Pm(async d=>{await d.renderTile(Hm({canvas:c,...s},[c]))},(n=t.currentLayer)==null?void 0:n.id)}let Be;const Hi=class{constructor(t){U(this,"taskCount",0),U(this,"tileCache"),U(this,"_minimumLevel"),U(this,"_maximumLevel"),U(this,"_credit"),U(this,"_resolution"),U(this,"_tilingScheme"),U(this,"_tileWidth"),U(this,"_tileHeight"),U(this,"_rectangle"),U(this,"_ready"),U(this,"_readyPromise",Promise.resolve(!0)),U(this,"_errorEvent",new Cesium$1.Event),U(this,"_currentLayer"),U(this,"_useWorker"),U(this,"_urlTemplate"),U(this,"_layerNames"),U(this,"_pickPointRadius"),U(this,"_pickLineWidth"),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=re,this._tileHeight=re,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,this._pickPointRadius=t.pickPointRadius,this._pickLineWidth=t.pickLineWidth}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&&!I0(Be,d)&&Be.id===d.id&&wm(Be.id),Be=d,this._useWorker&&(this.taskCount>=Hi.maximumTasksPerImagery||!Em(d==null?void 0:d.id,Hi.maximumTasks))))return;const h=`${t}/${n}/${o}`;if(((c=this.tileCache)==null?void 0:c.has(h))===!0){const N=this.tileCache.get(h);return Promise.resolve(N)}const p=document.createElement("canvas"),y={x:t,y:n,level:o},S=(o>=this.maximumLevel?this._resolution:void 0)??1;p.width=this._tileWidth*S,p.height=this._tileHeight*S;const P=this._urlTemplate,L=this._layerNames,F=this._maximumLevel;return++this.taskCount,vm({canvas:p,requestedTile:y,scaleFactor:S,urlTemplate:P,layerNames:L,maximumLevel:F,currentLayer:d,pickPointRadius:this._pickPointRadius,pickLineWidth:this._pickLineWidth}).then(()=>{var N;return(N=this.tileCache)==null||N.set(h,p),p}).catch(N=>{if(N instanceof Error&&N.message.startsWith("Unimplemented type"))return p;throw N}).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 sb({urlTemplate:p,layerNames:y}).pickFeatures(d,s,c,h)??[]}};let Gi=Hi;U(Gi,"maximumTasks",50),U(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:S}=useData$1(o),P=extractSimpleLayer(o)||void 0,L=React.useMemo(()=>{if(!(!t||!s||!y||!S||p!=="mvt"))return new Gi({minimumLevel:c,maximumLevel:d,credit:h,urlTemplate:normalizeUrl(y,"mvt"),layerName:S,layer:P,worker:!0})},[t,s,y,S,p,c,d,h,P]);useImageryProvider(L,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),S=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(S,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),[S,P]=React.useState();React.useEffect(()=>{if(!t||!s||!y||p!=="tms")return;(async()=>{P(await Cesium$1.TileMapServiceImageryProvider.fromUrl(y,{minimumLevel:c,maximumLevel:d,credit:h}))})()},[t,s,y,p,c,d,h]),useImageryProvider(S,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:S,parameters:P}=useData$1(o),L=React.useMemo(()=>{if(!(!t||!s||!y||!S||p!=="wms"))return new Cesium$1.WebMapServiceImageryProvider({url:y,layers:S,minimumLevel:c,maximumLevel:d,credit:h,parameters:P})},[t,s,y,S,p,c,d,h,P]);useImageryProvider(L,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(P=>[(P==null?void 0:P.x)??0,(P==null?void 0:P.y)??0,(P==null?void 0:P.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(P=>[(P==null?void 0:P.x)??0,(P==null?void 0:P.y)??0,(P==null?void 0:P.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),S=((p==null?void 0:p.originalProperties)||{})[c];let P=!1;Object.entries(s).forEach(([L,F])=>{var Pe;const N=F.name,z=F.type;let W=F.override??((Pe=n==null?void 0:n[c])==null?void 0:Pe[N]);const nt=W==null&&!!F.default;if(W=W??F.default,!((W==null||nt)&&!S)){switch(P=!0,z){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][L]&&(t[d][L]=W??h[L])}}),overrideOriginalProperties(t,p,c,P)}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,S,P,L,F,N,z;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),nt=getGeometryFromEntity(s,t),Pe={type:"feature",id:makeFeatureId$1(t),geometry:nt,properties:convertEntityProperties(s,t),metaData:{description:convertEntityDescription(s,t)},range:{x:W[0],y:W[1],z:W[2]}},se=o(n.layer,Pe);return se?(c&&(((p=se==null?void 0:se.marker)==null?void 0:p.style)==="point"&&!t.point&&(t.point=new Cesium$1.PointGraphics,t.billboard=void 0),attachProperties(t,se,["marker","point"],{show:{name:"show",...(y=se==null?void 0:se.marker)!=null&&y.style?{override:((S=se==null?void 0:se.marker)==null?void 0:S.style)==="point"&&((se==null?void 0:se.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&&(((P=se==null?void 0:se.marker)==null?void 0:P.style)==="image"&&!t.billboard&&(t.billboard=new Cesium$1.BillboardGraphics,t.point=void 0),attachProperties(t,se,["marker","billboard"],{show:{name:"show",...(L=se==null?void 0:se.marker)!=null&&L.style?{override:((F=se==null?void 0:se.marker)==null?void 0:F.style)==="image"&&((se==null?void 0:se.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,se,["marker","label"],{show:{name:"show",default:!0},text:{name:"labelText"},backgroundColor:{name:"labelBackground",type:"color"},heightReference:{name:"heightReference",type:"heightReference"}})),[Pe,se]):void 0}if(t.polyline){const W=(N=t.position)==null?void 0:N.getValue(s),nt=getGeometryFromEntity(s,t),Pe={type:"feature",id:makeFeatureId$1(t),geometry:nt,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}},se=o(n.layer,Pe);return se?(hasAppearance(n,t,["polyline","polyline"])&&attachProperties(t,se,["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"}}),[Pe,se]):void 0}if(t.polygon){const W=(z=t.position)==null?void 0:z.getValue(s),nt=getGeometryFromEntity(s,t),Pe={type:"feature",id:makeFeatureId$1(t),geometry:nt,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}},se=o(n.layer,Pe);return se?(hasAppearance(n,t,["polygon","polygon"])&&attachProperties(t,se,["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"}}),[Pe,se]):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 lt,pi,ba,Sc,ms,Xs;const{show:d=!0,clampToGround:h,stroke:p,strokeWidth:y,markerColor:S,markerSize:P,fill:L,hideIndicator:F}=n??{},[N,z,W]=React.useMemo(()=>{var Ru;const Nl=extractSimpleLayerData(o),pu=n==null?void 0:n.type,yu=n==null?void 0:n.url;return[pu??(Nl==null?void 0:Nl.type),yu??(Nl==null?void 0:Nl.url),((Ru=Nl==null?void 0:Nl.time)==null?void 0:Ru.updateClockOnLoad)??!0]},[n,o]),{viewer:nt}=$e$1(),Pe=React.useRef([]),se=React.useRef(new Set),mt=React.useMemo(()=>!N||N==="auto"?guessType(z):void 0,[N,z]),kt=mt?types[mt]:N!=="auto"?N:void 0,mn=kt?comps[kt]:void 0,{requestRender:_i,timelineManagerRef:zi}=useContext(),Sa=React.useCallback(Nl=>{if(!nt)return;const pu=[],yu=[];Nl.entities.values.forEach(Ru=>{var ff;const Vd=attachStyle(Ru,o,evalFeature,nt.clock.currentTime),[Gd,uf]=Vd||[];attachTag(Ru,{layerId:o==null?void 0:o.id,featureId:Gd==null?void 0:Gd.id,hideIndicator:(ff=uf==null?void 0:uf.resource)==null?void 0:ff.hideIndicator}),Gd&&!se.current.has(Gd.id)&&(pu.push(Gd),Pe.current.push({feature:Gd,raw:Ru}),se.current.add(Gd.id)),uf&&yu.push(uf)}),N!=="geojson"&&(s==null||s(pu,yu)),_i==null||_i()},[o,nt,s,N,_i]),fa=React.useRef({start:(pi=(lt=zi==null?void 0:zi.current)==null?void 0:lt.timeline)==null?void 0:pi.start,stop:(Sc=(ba=zi==null?void 0:zi.current)==null?void 0:ba.timeline)==null?void 0:Sc.stop,current:(Xs=(ms=zi==null?void 0:zi.current)==null?void 0:ms.timeline)==null?void 0:Xs.current}),La=React.useCallback(Nl=>{var pu,yu;if(Nl.entities.values.forEach(Ru=>requestAnimationFrame(()=>{const Vd=getTag(Ru);attachTag(Ru,{layerId:o==null?void 0:o.id,featureId:makeFeatureId$1(Ru),hideIndicator:F??(Vd==null?void 0:Vd.hideIndicator)})})),!W){fa.current.current&&fa.current.start&&fa.current.stop&&((pu=zi==null?void 0:zi.current)==null||pu.commit({cmd:"SET_TIME",payload:{start:fa.current.start,stop:fa.current.stop,current:fa.current.current},committer:{source:"featureResource",id:o==null?void 0:o.id}}));return}Nl.clock&&((yu=zi==null?void 0:zi.current)==null||yu.commit({cmd:"SET_TIME",payload:{start:Cesium$1.JulianDate.toDate(Nl.clock.startTime),stop:Cesium$1.JulianDate.toDate(Nl.clock.stopTime),current:Cesium$1.JulianDate.toDate(Nl.clock.currentTime)},committer:{source:"featureResource",id:o==null?void 0:o.id}})),_i==null||_i()},[W,zi,o==null?void 0:o.id,_i,F]),Ra=React.useMemo(()=>p?Cesium$1.Color.fromCssColorString(p):void 0,[p]),ma=React.useMemo(()=>L?Cesium$1.Color.fromCssColorString(L):void 0,[L]),yt=React.useMemo(()=>S?Cesium$1.Color.fromCssColorString(S):void 0,[S]);return React.useEffect(()=>{nt&&Pe.current.forEach(Nl=>{attachStyle(Nl.raw,o,evalFeature,nt.clock.currentTime)})},[o,nt]),React.useEffect(()=>()=>{requestIdleCallbackWithRequiredWork(()=>{c==null||c(Array.from(se.current.values()))})},[]),!t||!d||!mn||!z?null:jsxRuntimeExports.jsx(mn,{data:z,show:!0,clampToGround:h,onChange:Sa,onLoad:La,stroke:Ra,fill:ma,strokeWidth:y,markerSize:P,markerColor:yt})}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(){Rf(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:S,pitch:P,roll:L,disabledSelection:F}=t||{},{viewer:N}=$e$1(),z=React.useRef(!1),W=React.useRef(!1),nt=React.useRef(),[Pe,se]=React.useState(d);React.useEffect(()=>{o&&!Pe&&se(d)},[Pe,d,o]);const[mt,kt]=React.useState({width:h,height:p,length:y,heading:S,pitch:P,roll:L});React.useEffect(()=>{o&&!mt&&kt({width:h,height:p,length:y,heading:S,pitch:P,roll:L})},[mt,h,p,y,S,P,L,o]);const[mn,_i]=React.useState({activeBox:!1,activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1,cursor:"default"}),zi=React.useCallback(Nl=>{_i(pu=>({...pu,...Nl}))},[]),Sa=React.useCallback(Nl=>{if(!N||!F)return;const pu=N.scene.pick(Nl.position),yu=getLayerId$1(pu);if(yu!=null&&yu.startsWith(`${n}-scale-point`)){const Ru=Number(yu.split("-").slice(-1)[0]);zi({cursor:"nesw-resize",activeScalePointIndex:Ru,isScalePointClicked:!0})}if(yu!=null&&yu.startsWith(`${n}-edge-draggable`)){const Ru=Number(yu.split("-").slice(-1)[0]);zi({cursor:"grabbing",activeEdgeIndex:Ru,isEdgeClicked:!0})}if(yu!=null&&yu.startsWith(`${n}-plane`)&&(z.current=!0,W.current=yu.endsWith("top")||yu.endsWith("bottom")),z.current){const Ru=getCamera(N);nt.current=Ru,updateMapController(N,!1),(!mn.isScalePointClicked||!mn.isEdgeClicked)&&zi({cursor:"grabbing",activeBox:!0})}},[n,mn,zi,N,F]),fa=React.useCallback(()=>{!N||!F||((mn.activeScalePointIndex||mn.activeEdgeIndex)&&zi({cursor:"default",activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1}),z.current&&(updateMapController(N,!0),nt.current=void 0,z.current=!1,W.current=!1,mn.activeBox=!1,mn.cursor="default",zi({activeBox:!1,cursor:"default"})))},[mn,zi,N,F]),La=React.useRef(0),Ra=React.useCallback(async Nl=>{if(!z.current||!N||!F)return;const pu=Cesium$1.Cartesian3.fromDegrees((Pe==null?void 0:Pe[0])||0,(Pe==null?void 0:Pe[1])||0,Pe==null?void 0:Pe[2]);if(W.current){const yu=(Pe==null?void 0:Pe[2])||0,Ru=(()=>{if(!c){const of=yu-((mt==null?void 0:mt.height)||0)/2,gf=La.current;if(of<gf)return yu+(gf-of)}})(),Vd=new Cesium$1.Cartesian2(Nl.startPosition.x,Nl.startPosition.y),Gd=new Cesium$1.Cartesian2(Nl.endPosition.x,Nl.endPosition.y),uf=Cesium$1.Cartesian2.subtract(Gd,Vd,new Cesium$1.Cartesian2),ff=new Cesium$1.Cartesian3(0,0,uf.y<0?-1:1),{moveAmount:pf}=computeMoveAmount(N.scene,{startPosition:Vd,endPosition:Gd},pu,ff),hf=Cesium$1.Cartesian3.multiplyByScalar(ff,pf,new Cesium$1.Cartesian3);se(of=>[(of==null?void 0:of[0])||0,(of==null?void 0:of[1])||0,(Ru||(of==null?void 0:of[2])||0)+hf.z])}else{const yu=Nl.endPosition?getLocationFromScreen(N.scene,Nl.endPosition.x,Nl.endPosition.y,!c):void 0;se(Ru=>[(yu==null?void 0:yu.lng)||0,(yu==null?void 0:yu.lat)||0,(c?Ru==null?void 0:Ru[2]:yu==null?void 0:yu.height)||0]),sampleTerrainHeight(N.scene,(Pe==null?void 0:Pe[0])||0,(Pe==null?void 0:Pe[1])||0).then(Ru=>{La.current=Ru||0})}},[c,Pe,mt==null?void 0:mt.height,N,F]),ma=React.useCallback(({layerId:Nl}={})=>{const pu=!mn.isScalePointClicked&&!mn.isEdgeClicked&&!z.current;if(Nl!=null&&Nl.startsWith(`${n}-scale-point`)&&pu){const yu=Number(Nl.split("-").slice(-1)[0]);zi({cursor:"nesw-resize",activeScalePointIndex:yu})}if(Nl!=null&&Nl.startsWith(`${n}-edge-draggable`)&&pu){const yu=Number(Nl.split("-").slice(-1)[0]);zi({cursor:"grab",activeEdgeIndex:yu})}Nl!=null&&Nl.startsWith(`${n}-plane`)&&pu&&zi({cursor:"grab",activeBox:!0})},[n,mn.isEdgeClicked,mn.isScalePointClicked,zi]),yt=React.useCallback(({layerId:Nl}={})=>{const pu=!mn.isScalePointClicked&&!mn.isEdgeClicked&&!z.current;Nl!=null&&Nl.startsWith(`${n}-scale-point`)&&pu&&zi({cursor:"default",activeScalePointIndex:void 0}),Nl!=null&&Nl.startsWith(`${n}-edge-draggable`)&&pu&&zi({cursor:"default",activeEdgeIndex:void 0}),Nl!=null&&Nl.startsWith(`${n}-plane`)&&pu&&zi({cursor:"default",activeBox:!1})},[n,mn.isEdgeClicked,mn.isScalePointClicked,zi]),lt=React.useRef(),pi=React.useCallback(Nl=>{const pu=N==null?void 0:N.scene.pick(Nl.endPosition);if(lt.current!==pu){if(lt.current){const yu=getLayerId$1(lt.current);yt({layerId:yu}),yt()}if(pu){const yu=getLayerId$1(pu);ma({layerId:yu}),ma()}}Ra(Nl),lt.current=pu},[ma,yt,Ra,N==null?void 0:N.scene]),ba=React.useCallback(Nl=>{var pu,yu;if((pu=Nl.layerId)!=null&&pu.startsWith(`${n}-scale-point`)&&Nl.scale){const Ru=Nl.scale;kt(Vd=>({...Vd,width:Ru.width,height:Ru.height,length:Ru.length})),se([Ru.location.lng,Ru.location.lat,Ru.location.height])}if((yu=Nl.layerId)!=null&&yu.startsWith(`${n}-edge-draggable`)&&Nl.rotate){const Ru=Nl.rotate;kt(Vd=>({...Vd,heading:Ru.heading,pitch:Ru.pitch,roll:Ru.roll}))}},[n]),Sc=React.useMemo(()=>new Cesium$1.ScreenSpaceEventHandler(N==null?void 0:N.scene.canvas),[N]);React.useEffect(()=>{Sc.setInputAction(Sa,Cesium$1.ScreenSpaceEventType.LEFT_DOWN),Sc.setInputAction(pi,Cesium$1.ScreenSpaceEventType.MOUSE_MOVE),Sc.setInputAction(fa,Cesium$1.ScreenSpaceEventType.LEFT_UP)},[Sc,Sa,pi,fa]),React.useEffect(()=>()=>{requestAnimationFrame(()=>{Sc.isDestroyed()||Sc.destroy()})},[Sc]);const ms=React.useMemo(()=>({...mn,...mt,allowEnterGround:c}),[mn,mt,c]),Xs=React.useMemo(()=>o?{visible:s,handleLayerEdit:ba,geometry:{type:"Point",coordinates:Pe||d||[0,0,0]},property:ms}:void 0,[ms,d,Pe,ba,o,s]);return{...t,planes:o?BUILTIN_BOX_SIDE_PLANES:t==null?void 0:t.planes,width:o?mt==null?void 0:mt.width:t==null?void 0:t.width,height:o?mt==null?void 0:mt.height:t==null?void 0:t.height,length:o?mt==null?void 0:mt.length:t==null?void 0:t.length,heading:o?mt==null?void 0:mt.heading:t==null?void 0:t.heading,pitch:o?mt==null?void 0:mt.pitch:t==null?void 0:t.pitch,roll:o?mt==null?void 0:mt.roll:t==null?void 0:t.roll,coordinates:o?Pe:t==null?void 0:t.coordinates,builtinBoxProps:Xs}};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:S,isTilesetReady:P})=>{const[L,F]=React.useState(0),N=React.useMemo(()=>s??100,[s]),z=React.useMemo(()=>c??10,[c]),[W,nt]=React.useState(!1),{requestRender:Pe}=useContext();React.useEffect(()=>{(async()=>{if(!(p!=null&&p.current)||!P)return;if(!t||!n||(n==null?void 0:n.length)<2){S.removeAll(),F(0),Pe==null||Pe();return}S.modelMatrix=Cesium$1.Matrix4.IDENTITY.clone(),nt(!1);const kt=polygon([n.map(fa=>[fa.lng,fa.lat])]),mn=centroid(kt),_i=y!=null&&y.scene?await sampleTerrainHeight(y==null?void 0:y.scene,mn.geometry.coordinates[0],mn.geometry.coordinates[1])??0:0;F(_i);const zi=Cesium$1.Matrix4.inverse(Cesium$1.Transforms.eastNorthUpToFixedFrame(p.current.boundingSphere.center),new Cesium$1.Matrix4);let Sa=0;for(let fa=0;fa<n.length;fa++){const La=n[fa],Ra=n[(fa+1)%n.length];Sa+=(Ra.lng-La.lng)*(Ra.lat+La.lat)}Sa>0&&n.reverse(),S.removeAll();for(let fa=0;fa<n.length-1;fa++){const La=n[fa],Ra=n[fa+1];S.add(createSidePlane(La,Ra,zi,o))}S.add(createHorizontalPlane(n[0],_i+N,zi,o==="inside"?1:-1)),S.add(createHorizontalPlane(n[0],_i-z,zi,o==="inside"?-1:1)),nt(!0)})()},[n,p,S,N,z,t,o,y,P,Pe]),React.useEffect(()=>{S.unionClippingRegions=o==="outside"},[S,o,t]);const se=React.useMemo(()=>({coordiantes:(n==null?void 0:n.map(mt=>[mt.lng,mt.lat]))??[],top:L+N,bottom:L-z,visible:d,style:h,ready:W}),[n,L,N,z,d,h,W]);return{drawClippingEnabled:t,drawClippingEdgeProps:se}},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),S=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),P=Cesium$1.Plane.fromPointNormal(c,S);return Cesium$1.ClippingPlane.fromPlane(P)},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:S,isTilesetReady:P})=>{const L=React.useRef([]),F=React.useRef(s),N=React.useRef(new Set),z=(s==null?void 0:s.id)||t,W=useRefValue(z),nt=React.useCallback(async yt=>{var pi;const lt=(pi=F==null?void 0:F.current)==null?void 0:pi.layer;if((lt==null?void 0:lt.type)==="simple"&&(yt!=null&&yt.feature)){const ba=yt.raw,Sc=getTag(ba),ms=c&&!(ba instanceof Cesium$1.Model)?convertCesium3DTileFeatureProperties(ba):{},Xs=S?h.current.includes((Sc==null?void 0:Sc.featureId)??""):Sc==null?void 0:Sc.isFeatureSelected,Nl=p(lt,{...yt==null?void 0:yt.feature,properties:ms}),pu=Nl==null?void 0:Nl["3dtiles"];return COMMON_STYLE_PROPERTIES.forEach(({name:yu,convert:Ru})=>{var Gd,uf;const Vd=convertStyle(pu==null?void 0:pu[yu],Ru);yu==="color"?(ba.color=DEFAULT_FEATURE_COLOR,Vd!==void 0&&(ba.color=Vd),Xs&&typeof((Gd=lt["3dtiles"])==null?void 0:Gd.selectedFeatureColor)=="string"&&(ba.color=toColor((uf=lt["3dtiles"])==null?void 0:uf.selectedFeatureColor)??Vd)):Vd!==void 0&&(ba[yu]=Vd)}),ba instanceof Cesium$1.Cesium3DTilePointFeature&&POINT_STYLE_PROPERTIES.forEach(({name:yu,convert:Ru})=>{const Vd=convertStyle(pu==null?void 0:pu[yu],Ru);Vd!==void 0&&(ba[yu]=Vd)}),"style"in ba&&(ba.style=new Cesium$1.Cesium3DTileStyle(MODEL_STYLE_PROPERTIES.reduce((yu,{name:Ru,convert:Vd})=>{const Gd=convertStyle(pu==null?void 0:pu[Ru],Vd);return Gd===void 0?yu:{...yu,[Ru]:Gd}},{}))),attachTag(yt.raw,{layerId:z,featureId:yt.feature.id,computedFeature:Nl,isFeatureSelected:Sc==null?void 0:Sc.isFeatureSelected}),Nl}},[p,z,c,S,h]),Pe=React.useCallback(async yt=>{if(yt.tileset.isDestroyed())return;const lt=new Set;await lookupFeatures(yt.content,async(pi,ba,Sc)=>{const ms={feature:makeFeatureFrom3DTile(pi,ba,o),raw:pi};attachTag(ms.raw,{layerId:W.current,featureId:ms.feature.id}),Sc!=null&&S&&d.addFeature(ba,Sc,ms.feature.id),await nt(ms),L.current.push(ms),N.current.add(ms.feature.id),lt.add(pick(ms.feature,["id","type","range"]))}),y==null||y(Array.from(lt.values()),[])},[L,nt,y,o,d,S,W]),se=React.useRef(Pe);se.current=Pe,React.useEffect(()=>{var yt;return(yt=n.current)==null?void 0:yt.tileLoad.addEventListener(lt=>se.current(lt))},[n,P]);const mt=React.useCallback(async yt=>{yt.tileset.isDestroyed()||!S||await lookupFeatures(yt.content,async(lt,pi)=>{d.deleteFeature(makeFeatureId(lt,pi,o))})},[o,d,S]),kt=React.useRef(mt);kt.current=mt,React.useEffect(()=>{var yt;return(yt=n.current)==null?void 0:yt.tileUnload.addEventListener(lt=>kt.current(lt))},[n,P]),React.useEffect(()=>{F.current=s},[s]);const mn=React.useMemo(()=>{var yt;return(yt=extractSimpleLayer(s))==null?void 0:yt["3dtiles"]},[s]),_i=usePick(mn,TILESET_APPEARANCE_FIELDS),zi=S?0:s==null?void 0:s.layer._updateStyle,Sa=React.useRef(zi),fa=React.useRef();React.useEffect(()=>{fa.current=Date.now()},[_i,zi]);const La=React.useCallback(async(yt,lt)=>new Promise(pi=>requestAnimationFrame(()=>{if(fa.current&&fa.current>lt){pi(void 0);return}(_i||zi)&&nt(yt),pi(void 0)})),[_i,nt,zi]),Ra=React.useCallback(async yt=>{const lt=[];let pi=!1;for(const ba of L.current){if(fa.current&&fa.current>yt){pi=!0;break}lt.push(La(ba,yt)),lt.length>MAX_NUMBER_OF_CONCURRENT_COMPUTING_FEATURES&&(await Promise.all(lt),lt.length=0)}pi||await Promise.all(lt),Sa.current=zi,lt.length=0},[La,zi]),{requestRender:ma}=useContext();React.useEffect(()=>{(async()=>{const lt=Date.now();await Ra(lt),ma==null||ma()})()},[Ra,ma,zi])},useHooks$2=({id:t,boxId:n,isVisible:o,property:s,viewerProperty:c,layer:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:S})=>{var Af,Hf,_f,wf,Yf,Nf;const{viewer:P}=$e$1(),L=React.useRef(),{onLayerLoad:F,updateCredits:N}=useContext(),z=React.useRef(d==null?void 0:d.id);z.current=d==null?void 0:d.id;const{tileset:W,styleUrl:nt,edgeColor:Pe,edgeWidth:se,experimental_clipping:mt,selectedFeatureColor:kt,disableIndexingFeature:mn}=s??{},{width:_i,height:zi,length:Sa,location:fa,coordinates:La,heading:Ra,roll:ma,pitch:yt,planes:lt,visible:pi=!0,direction:ba="inside",builtinBoxProps:Sc,allowEnterGround:ms}=useClippingBox({clipping:mt,boxId:n}),[Xs,Nl]=React.useState(),{url:pu,type:yu,idProperty:Ru,googleMapApiKey:Vd}=useData(d),Gd=!mn&&!!Ru,[uf,ff]=React.useState(!1),pf=React.useRef(lt),hf=React.useMemo(()=>{var vf,Ff;return(!((vf=pf.current)!=null&&vf.length)||!((Ff=pf.current)!=null&&Ff.every((Xf,Wf)=>{var Qf,_m,Bf,$m,qf,qm;return((Qf=Xf.normal)==null?void 0:Qf.x)===((_m=lt==null?void 0:lt[Wf].normal)==null?void 0:_m.x)&&((Bf=Xf.normal)==null?void 0:Bf.y)===(($m=lt==null?void 0:lt[Wf].normal)==null?void 0:$m.y)&&((qf=Xf.normal)==null?void 0:qf.z)===((qm=lt==null?void 0:lt[Wf].normal)==null?void 0:qm.z)&&Xf.distance===(lt==null?void 0:lt[Wf].distance)})))&&(pf.current=lt),pf.current},[lt]),of=ba==="inside"?-1:1,[gf,Ef]=React.useState(()=>new Cesium$1.ClippingPlaneCollection({planes:hf==null?void 0:hf.map(vf=>{var Ff,Xf,Wf;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Ff=vf.normal)==null?void 0:Ff.x,(Xf=vf.normal)==null?void 0:Xf.y,(Wf=vf.normal)==null?void 0:Wf.z),(vf.distance||0)*of)}),unionClippingRegions:ba==="outside",edgeWidth:se,edgeColor:toColor(Pe)}));React.useEffect(()=>()=>{Ef(new Cesium$1.ClippingPlaneCollection({planes:hf==null?void 0:hf.map(vf=>{var Ff,Xf,Wf;return new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Ff=vf.normal)==null?void 0:Ff.x,(Xf=vf.normal)==null?void 0:Xf.y,(Wf=vf.normal)==null?void 0:Wf.z),(vf.distance||0)*of)}),unionClippingRegions:ba==="outside",edgeWidth:se,edgeColor:toColor(Pe)}))},[]);const{drawClippingEnabled:xf,drawClippingEdgeProps:Wa}=useDrawClipping({...mt==null?void 0:mt.draw,tilesetRef:L,viewer:P,clippingPlanes:gf,isTilesetReady:uf}),[af]=React.useState(()=>new TilesetFeatureIndex),Xd=React.useCallback(vf=>{vf!=null&&vf.cesiumElement&&attachTag(vf.cesiumElement,{layerId:(d==null?void 0:d.id)||t,featureIndex:Gd?af:void 0,appearanceType:"3dtiles"}),d!=null&&d.id&&(vf!=null&&vf.cesiumElement)&&((vf==null?void 0:vf.cesiumElement)[layerIdField]=d.id),L.current=vf==null?void 0:vf.cesiumElement},[t,d==null?void 0:d.id,af,Gd]),gd=React.useRef([]),pd=React.useRef(kt);pd.current=kt;const[Zd]=React.useState(()=>new Map);React.useEffect(()=>{!L.current||!Gd||!uf||Object.assign(L.current,{onSelectFeature:vf=>{const Ff=getTag(vf);Ff!=null&&Ff.featureId&&(gd.current.push(Ff.featureId),Zd.set(Ff.featureId,vf.color)),pd.current&&(vf.color=toColor(pd.current)??vf.color)},onUnselectFeature:vf=>{const Ff=getTag(vf);Ff!=null&&Ff.featureId&&(gd.current=gd.current.filter(Xf=>Xf!==Ff.featureId)),vf.color=Zd.get((Ff==null?void 0:Ff.featureId)??"")??DEFAULT_FEATURE_COLOR}})},[Zd,af,Gd,uf]),useFeature({id:t,tileset:L,layer:d,idProperty:Ru,viewer:P,evalFeature:p,onComputedFeatureFetch:y,featureIndex:af,selectedFeatureIdsRef:gd,shouldUseFeatureIndex:Gd,isTilesetReady:uf});const[cf,sf]=React.useState(0),nf=React.useRef(!1),df=React.useCallback(vf=>{nf.current||!P||ms||(nf.current=!0,sampleTerrainHeightFromCartesian(P.scene,vf).then(Ff=>{sf(Ff??0),nf.current=!1}))},[ms,P]);React.useEffect(()=>{if(mt!=null&&mt.draw)return;const vf=La||(fa?[fa.lng,fa.lat,fa.height??0]:void 0),Ff=Cesium$1.Cartesian3.fromDegrees((vf==null?void 0:vf[0])||0,(vf==null?void 0:vf[1])||0,(vf==null?void 0:vf[2])||0);(async()=>{if(!L.current||!uf)return;const Wf=L.current.clippingPlanesOriginMatrix.clone(),Qf=new Cesium$1.Cartesian3(_i||100,Sa||100,zi||100);if(!ms){const qf=new Cesium$1.TranslationRotationScale(Ff,void 0,Qf);translationWithClamping(qf,!!ms,cf),Ff.x=qf.translation.x,Ff.y=qf.translation.y,Ff.z=qf.translation.z}const _m=Ra&&yt&&ma?new Cesium$1.HeadingPitchRoll(Ra,yt,ma):void 0,Bf=Cesium$1.Matrix4.multiply(_m?Cesium$1.Matrix4.fromRotationTranslation(Cesium$1.Matrix3.fromHeadingPitchRoll(_m),Ff):Cesium$1.Transforms.eastNorthUpToFixedFrame(Ff),Cesium$1.Matrix4.fromScale(Qf,new Cesium$1.Matrix4),new Cesium$1.Matrix4),$m=Cesium$1.Matrix4.inverse(Wf,new Cesium$1.Matrix4);Cesium$1.Matrix4.multiply($m,Bf,gf.modelMatrix)})(),ms||df(Ff)},[_i,Sa,zi,Ra,yt,ma,fa,La,gf.modelMatrix,df,ms,cf,mt==null?void 0:mt.draw,uf]),React.useEffect(()=>{mt!=null&&mt.draw||(gf.enabled=pi)},[gf,pi,mt==null?void 0:mt.draw]),React.useEffect(()=>{mt!=null&&mt.draw||(gf.unionClippingRegions=ba==="outside")},[gf,ba,mt==null?void 0:mt.draw]),React.useEffect(()=>{mt!=null&&mt.draw||(gf.removeAll(),hf==null||hf.forEach(vf=>{var Ff,Xf,Wf;return gf.add(new Cesium$1.ClippingPlane(new Cesium$1.Cartesian3((Ff=vf.normal)==null?void 0:Ff.x,(Xf=vf.normal)==null?void 0:Xf.y,(Wf=vf.normal)==null?void 0:Wf.z),(vf.distance||0)*of))}))},[hf,gf,of,mt==null?void 0:mt.draw]),React.useEffect(()=>{if(!nt){Nl(void 0);return}(async()=>{const vf=await fetch(nt);vf.ok&&Nl(new Cesium$1.Cesium3DTileStyle(await vf.json()))})()},[nt]);const Cf=React.useMemo(()=>yu!=="google-photorealistic"||!o?null:(async()=>{try{return Vd?(await Cesium$1.createGooglePhotorealistic3DTileset(Vd)).resource:Cesium$1.IonResource.fromAssetId(2275207,{accessToken:h==null?void 0:h.cesiumIonAccessToken})}catch(Ff){throw console.error(`Error loading Photorealistic 3D Tiles tileset: ${Ff}`),Ff}})(),[yu,o,Vd,h==null?void 0:h.cesiumIonAccessToken]),mf=React.useMemo(()=>yu==="osm-buildings"&&o?Cesium$1.IonResource.fromAssetId(96188,{accessToken:h==null?void 0:h.cesiumIonAccessToken}):Cf&&o?Cf:yu==="3dtiles"&&o?pu??W:null,[yu,o,h==null?void 0:h.cesiumIonAccessToken,Cf,pu,W]),Sf=React.useMemo(()=>{var Qf,_m,Bf,$m,qf,qm,ep,Tf,rf,bf;if(!(s!=null&&s.specularEnvironmentMaps)&&!(s!=null&&s.sphericalHarmonicCoefficients)&&!((_m=(Qf=c==null?void 0:c.scene)==null?void 0:Qf.imageBasedLighting)!=null&&_m.specularEnvironmentMaps)&&!(($m=(Bf=c==null?void 0:c.scene)==null?void 0:Bf.imageBasedLighting)!=null&&$m.sphericalHarmonicCoefficients))return;const vf=new Cesium$1.ImageBasedLighting,Ff=(s==null?void 0:s.specularEnvironmentMaps)??((qm=(qf=c==null?void 0:c.scene)==null?void 0:qf.imageBasedLighting)==null?void 0:qm.specularEnvironmentMaps),Xf=(s==null?void 0:s.imageBasedLightIntensity)??((Tf=(ep=c==null?void 0:c.scene)==null?void 0:ep.imageBasedLighting)==null?void 0:Tf.intensity),Wf=arrayToCartecian3((s==null?void 0:s.sphericalHarmonicCoefficients)??((bf=(rf=c==null?void 0:c.scene)==null?void 0:rf.imageBasedLighting)==null?void 0:bf.sphericalHarmonicCoefficients),Xf);return Ff&&(vf.specularEnvironmentMaps=Ff),Wf&&(vf.sphericalHarmonicCoefficients=Wf),vf},[s==null?void 0:s.specularEnvironmentMaps,s==null?void 0:s.sphericalHarmonicCoefficients,s==null?void 0:s.imageBasedLightIntensity,(Hf=(Af=c==null?void 0:c.scene)==null?void 0:Af.imageBasedLighting)==null?void 0:Hf.specularEnvironmentMaps,(wf=(_f=c==null?void 0:c.scene)==null?void 0:_f.imageBasedLighting)==null?void 0:wf.sphericalHarmonicCoefficients,(Nf=(Yf=c==null?void 0:c.scene)==null?void 0:Yf.imageBasedLighting)==null?void 0:Nf.intensity]),Pf=React.useCallback(vf=>{ff(!0),S==null||S({properties:vf.properties}),F==null||F({layerId:z.current})},[S,F]);return React.useEffect(()=>(N==null||N(),()=>{N==null||N()}),[yu,N]),{tilesetUrl:mf,ref:Xd,style:Xs,clippingPlanes:gf,drawClippingEnabled:xf,drawClippingEdgeProps:Wa,builtinBoxProps:Sc,imageBasedLighting:Sf,handleReady:Pf}};function Tileset({id:t,isVisible:n,property:o,layer:s,feature:c,viewerProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:S,...P}){const{shadows:L,colorBlendMode:F,pbr:N,showWireframe:z,showBoundingVolume:W,cacheBytes:nt}=o??{},Pe=`${s==null?void 0:s.id}_box`,{tilesetUrl:se,ref:mt,style:kt,clippingPlanes:mn,drawClippingEnabled:_i,drawClippingEdgeProps:zi,builtinBoxProps:Sa,imageBasedLighting:fa,handleReady:La}=useHooks$2({id:t,boxId:Pe,isVisible:n,layer:s,feature:c,property:o,viewerProperty:d,meta:h,evalFeature:p,onComputedFeatureFetch:y,onLayerFetch:S}),Ra=React.useMemo(()=>{var yt,lt;return{...((yt=s==null?void 0:s.layer)==null?void 0:yt.type)==="simple"?(lt=s==null?void 0:s.layer)==null?void 0:lt.box:{},...(Sa==null?void 0:Sa.property)||{}}},[s==null?void 0:s.layer,Sa==null?void 0:Sa.property]),ma=React.useMemo(()=>({...s,id:Pe}),[s,Pe]);return!n||!se?null:jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(Ds$1,{ref:mt,url:se,customShader:N===!1?NonPBRLightingShader:N==="withTexture"?NonPBRWithTextureLightingShader:void 0,cacheBytes:nt,style:kt,shadows:shadowMode(L),clippingPlanes:mn,colorBlendMode:colorBlendModeFor3DTile(F),imageBasedLighting:fa,onReady:La,debugWireframe:z,debugShowBoundingVolume:W}),Sa&&jsxRuntimeExports.jsx(Box,{...P,id:Pe,viewerProperty:d,property:Ra,geometry:Sa.geometry,feature:c,layer:ma,isVisible:Sa.visible,evalFeature:p,onLayerEdit:Sa.handleLayerEdit}),_i&&jsxRuntimeExports.jsx(DrawClippingPolygon,{...zi})]})}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 z,W,nt;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];(((z=t.features)==null?void 0:z.length)>FEATURE_DELEGATE_THRESHOLD||(W=c==null?void 0:c.geojson)!=null&&W.useAsResource)&&(h=["resource"]);const p=Array.isArray(h)&&h.every(Pe=>components[Pe][1].noFeature&&!components[Pe][1].noLayer),y=!!((nt=t==null?void 0:t.transition)!=null&&nt.useTransition),S=!(c!=null&&c.updateInterval)&&!y,P=React.useMemo(()=>c!=null&&c.url?generateIDWithMD5(c.url):"",[c==null?void 0:c.url]),{requestRender:L}=useContext();React.useEffect(()=>{setTimeout(()=>{L==null||L()},300)}),React.useEffect(()=>()=>L==null?void 0:L(),[L]);const F=(Pe,se)=>{var zi,Sa,fa,La,Ra,ma,yt;if(!isRenderableAppearance(Pe))return null;const mt=!!((fa=(Sa=(zi=s.viewerProperty)==null?void 0:zi.scene)==null?void 0:Sa.imageBasedLighting)!=null&&fa.sphericalHarmonicCoefficients),kt=!!((ma=(Ra=(La=s.viewerProperty)==null?void 0:La.scene)==null?void 0:Ra.imageBasedLighting)!=null&&ma.specularEnvironmentMaps),mn=t.layer.visible!==!1&&!n&&!((o==null?void 0:o.layerId)===t.id&&((yt=o==null?void 0:o.feature)==null?void 0:yt.id)===(se==null?void 0:se.id)),_i=P+generateIDWithMD5(`${t.id}_${(se==null?void 0:se.id)??""}_${Pe}_${mn}_${mt}_${kt}_${JSON.stringify(se==null?void 0:se[Pe])??""}_${JSON.stringify(t.transition)??""}_${JSON.stringify(se==null?void 0:se.geometry)??""}`);if(S){const lt=CACHED_COMPONENTS.get(_i);if(S&&lt)return lt}try{const[lt,pi]=components[Pe]??[];if(!lt||se&&!se[Pe]||pi.noLayer&&!se||pi.noFeature&&se||Array.isArray(h)&&!h.includes(Pe)||!Array.isArray(h)&&h!=="auto"||(c==null?void 0:c.type)==="geojson"&&h==="auto"&&Pe==="resource")return null;const ba=React.createElement(lt,{...s,key:y?void 0:_i,id:y?(se==null?void 0:se.id)??t.id:_i,property:se?se[Pe]:t[Pe]||pickProperty(Pe,t),geometry:se==null?void 0:se.geometry,feature:se,layer:t,isVisible:mn});return S&&CACHED_COMPONENTS.set(_i,ba),ba}catch(lt){return console.error(`Error rendering component ${_i}`,lt),null}},N=React.useMemo(()=>!p||!h||!Array.isArray(h)?null:jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:h.map(Pe=>{var fa,La,Ra,ma,yt,lt,pi,ba,Sc,ms,Xs,Nl;const[se]=components[Pe]??[],mt=t.layer.visible!==!1&&!n,kt=!!((Ra=(La=(fa=s.viewerProperty)==null?void 0:fa.scene)==null?void 0:La.imageBasedLighting)!=null&&Ra.sphericalHarmonicCoefficients),mn=!!((lt=(yt=(ma=s.viewerProperty)==null?void 0:ma.scene)==null?void 0:yt.imageBasedLighting)!=null&&lt.specularEnvironmentMaps),_i=((pi=t==null?void 0:t.layer)==null?void 0:pi.type)==="simple"&&!!((Sc=(ba=t==null?void 0:t.layer)==null?void 0:ba["3dtiles"])!=null&&Sc.sphericalHarmonicCoefficients),zi=((ms=t==null?void 0:t.layer)==null?void 0:ms.type)==="simple"&&!!((Nl=(Xs=t==null?void 0:t.layer)==null?void 0:Xs["3dtiles"])!=null&&Nl.specularEnvironmentMaps),Sa=P+generateIDWithMD5(`${(t==null?void 0:t.id)||""}_${Pe}_${mt}_${kt}_${mn}_${_i}}_${zi}`);return React.createElement(se,{...s,key:Sa,id:`${t.id}_${Pe}`,property:pickProperty(Pe,t)||t[Pe],layer:t,isVisible:mt})})}),[p,h,t,n,P,s]);return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:N||[void 0,...t.features].flatMap(Pe=>Object.keys(components).map(se=>F(se,Pe)))})}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 P,L;const S=(P=t.current)==null?void 0:P.cesiumElement;if(!(!S||S.isDestroyed()||!(o!=null&&o.enabled)||!((L=o.targetArea)!=null&&L.lng)||!o.targetArea.lat))return getGeodesic(S,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 S=typeof(o==null?void 0:o.targetWidth)=="number"?o.targetWidth:targetWidth,P=typeof(o==null?void 0:o.targetLength)=="number"?o.targetLength:targetLength,{cartesianArray:L,cartographicDimensions:F}=calcBoundaryBox(s,P/2,S/2);return{cartographicDimensions:F,cartesianArray:L}},[o==null?void 0:o.targetWidth,o==null?void 0:o.targetLength,s]),[d,h]=React.useState();return React.useEffect(()=>{var Pe;const S=(Pe=t.current)==null?void 0:Pe.cesiumElement;if(!S||S.isDestroyed()||!(o!=null&&o.targetArea)||!s)return;const P=new Cesium$1.Camera(S.scene);P.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:P.up}});const L=P.computeViewRectangle();if(!L)return;const F=Cesium$1.Rectangle.computeWidth(L)*Cesium$1.Math.PI*1e6,N=Cesium$1.Rectangle.computeHeight(L)*Cesium$1.Math.PI*1e6,{targetWidth:z=targetWidth,targetLength:W=targetLength}=o??{},{cartesianArray:nt}=calcBoundaryBox(s,W/2+N,z/2+F);h(nt)},[t,o,s]),React.useEffect(()=>{var L,F;const S=(L=t==null?void 0:t.current)==null?void 0:L.cesiumElement,P=getCamera((F=t==null?void 0:t.current)==null?void 0:F.cesiumElement);!S||S.isDestroyed()||!P||!(o!=null&&o.enabled)||!c||S.camera.setView({destination:getAllowedCameraDestination(P,c),orientation:{heading:S.camera.heading,pitch:S.camera.pitch,roll:S.camera.roll,up:S.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),S=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(y),s),P=new Cesium$1.EllipsoidGeodesic(d,Cesium$1.Cartographic.fromCartesian(p),s);return{vertical:S,horizontal:P}},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),S=new Cesium$1.Cartographic(d.longitude,c.latitude,0),P=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(P),Cesium$1.Cartographic.toCartesian(S),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 se,mt,kt;const p=React.useRef([]),y=React.useCallback(()=>{var zi;const mn=(zi=t==null?void 0:t.current)==null?void 0:zi.cesiumElement;if(!mn||mn.isDestroyed()||!h)return;const _i=getCamera(mn);_i&&!isEqual(_i,o)&&(p.current.push(_i),p.current.length>10&&p.current.shift(),h==null||h(_i))},[t,o,h]),S=React.useCallback(()=>{y()},[y]),P=React.useCallback(()=>{y()},[y]);React.useEffect(()=>{o&&!p.current.includes(o)&&(c.flyTo(o,{duration:0}),p.current=[])},[o,c]),React.useEffect(()=>{var fa;if(!((fa=t.current)!=null&&fa.cesiumElement))return;const mn=!!(s&FEATURE_FLAGS.CAMERA_MOVE),_i=!!(s&FEATURE_FLAGS.CAMERA_ZOOM),zi=!!(s&FEATURE_FLAGS.CAMERA_TILT),Sa=!!(s&FEATURE_FLAGS.CAMERA_LOOK);t.current.cesiumElement.scene.screenSpaceCameraController.enableTranslate=mn,t.current.cesiumElement.scene.screenSpaceCameraController.enableRotate=mn,t.current.cesiumElement.scene.screenSpaceCameraController.enableLook=Sa,t.current.cesiumElement.scene.screenSpaceCameraController.enableTilt=zi,t.current.cesiumElement.scene.screenSpaceCameraController.enableZoom=_i},[t,s]);const L=React.useRef(!1),F=useCustomCompareCallback(()=>{var mn,_i,zi,Sa,fa,La;L.current||(L.current=!0,(_i=(mn=n==null?void 0:n.camera)==null?void 0:mn.limiter)!=null&&_i.enabled&&((Sa=(zi=n==null?void 0:n.camera)==null?void 0:zi.limiter)!=null&&Sa.targetArea)?c.flyTo((La=(fa=n==null?void 0:n.camera)==null?void 0:fa.limiter)==null?void 0:La.targetArea,{duration:0}):o&&c.flyTo(o,{duration:0}))},[c,(mt=(se=n==null?void 0:n.camera)==null?void 0:se.limiter)==null?void 0:mt.enabled],(mn,_i)=>mn[0]===_i[0]&&mn[1]===_i[1]),N=React.useCallback(()=>{L.current=!1},[]),{cameraViewBoundaries:z,cameraViewOuterBoundaries:W,cameraViewBoundariesMaterial:nt}=useCameraLimiter(t,o,(kt=n==null?void 0:n.camera)==null?void 0:kt.limiter),Pe=React.useCallback(mn=>{!mn.camera||!d||Math.abs(Cesium$1.Math.negativePiToPi(mn.camera.roll))>Math.PI/86400&&mn.camera.setView({orientation:{heading:mn.camera.heading,pitch:mn.camera.pitch,roll:0}})},[d]);return React.useEffect(()=>{var _i;const mn=(_i=t.current)==null?void 0:_i.cesiumElement;if(mn)return mn.scene.preRender.addEventListener(Pe)},[t,Pe]),{cameraViewBoundaries:z,cameraViewOuterBoundaries:W,cameraViewBoundariesMaterial:nt,mountCamera:F,unmountCamera:N,handleCameraChange:S,handleCameraMoveEnd:P}},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),S=h.aspectRatio*y,P=n.x,L=n.y,F=2*(P-c.x)/c.width-1,N=2*(c.height-L-c.y)/c.height-1,z=F*p*S,W=N*p*y,nt=h.getPixelDimensions(c.width,c.height,p,getPixelRatio(t),pixelSizeScratch),Pe=nt.x*o/2,se=nt.y*s/2,mt=pickingFrustumScratch;return mt.top=W+se,mt.bottom=W-se,mt.right=z+Pe,mt.left=z-Pe,mt.near=p,mt.far=h.far,mt.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),S=getPixelRatio(t),P=o*S,L=s*S,F=t.frameState;F.cullingVolume=getPickCullingVolume(t,y,P,L,p),F.invertClassification=!1,F.passes.pick=!0,F.tilesetPassState=pickTilesetPassState,d.uniformState.update(F),t.updateEnvironment(),rectangleScratch.x=y.x-P/2,rectangleScratch.y=t.drawingBufferHeight-y.y-L/2,rectangleScratch.height=L,rectangleScratch.width=P;const N=getIntersection(rectangleScratch,h.viewport,rectangleScratch);invariant$1(N!=null);const z=h.pickFramebuffer.begin(N,h.viewport);t.updateAndExecuteCommands(z,zeroColor),t.resolveFramebuffers(z);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,S]=convertObjToComputedFeature(t.clock.currentTime,p)??[],P=S?{...S,layerId:y}:void 0;!P||c&&!c(P)||h.push(P)}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$1([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$1(t.map(L=>{const F=Cartographic.fromCartesian(L,n,cartographicScratch);return[CesiumMath.toDegrees(F.longitude),CesiumMath.toDegrees(F.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(P=>{const L=Cartographic.fromCartesian(P,n,cartographicScratch);return[CesiumMath.toDegrees(L.longitude),CesiumMath.toDegrees(L.latitude)]})]).geometry}catch(o){console.error(o)}}function createPolyline(t,n){if(!(t.length<2))try{return lineString$1(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$1(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 P;const S=(P=n.current)==null?void 0:P.cesiumElement;if(!(!S||S.isDestroyed()))return getLocationFromScreen(S.scene,h,p,y)},getCameraFovInfo:({withTerrain:h,calcViewSize:p})=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))try{let P,L,F;return h&&(L=getCameraTerrainIntersection(y.scene),L&&(P=cartesianToLatLngHeight(L,y.scene))),P||(L=new Cesium__namespace.Cartesian3,getCameraEllipsoidIntersection(y.scene,L),P=cartesianToLatLngHeight(L,y.scene)),p&&L&&y.scene.camera.frustum instanceof Cesium__namespace.PerspectiveFrustum&&(F=Cesium__namespace.Cartesian3.distance(y.scene.camera.positionWC,L)*Math.tan(y.scene.camera.frustum.fov/2)),{center:P,viewSize:F}}catch{return}},sampleTerrainHeight:async(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))return await sampleTerrainHeight(y.scene,h,p)},computeGlobeHeight:(h,p,y)=>{var P;const S=(P=n.current)==null?void 0:P.cesiumElement;if(!(!S||S.isDestroyed()))return S.scene.globe.getHeight(Cesium__namespace.Cartographic.fromDegrees(h,p,y))},getGlobeHeight:()=>{var S;const h=(S=n.current)==null?void 0:S.cesiumElement;if(!h||h.isDestroyed())return;const p=h.scene,{globeHeight:y}=p;if(!(!p||y==null))return y},toXYZ:(h,p,y,S)=>{var F;const P=(F=n.current)==null?void 0:F.cesiumElement;if(!P||P.isDestroyed())return;const L=Cesium__namespace.Cartesian3.fromDegrees(h,p,y,S!=null&&S.useGlobeEllipsoid?P.scene.globe.ellipsoid:void 0);return[L.x,L.y,L.z]},toLngLatHeight:(h,p,y,S)=>{var F;const P=(F=n.current)==null?void 0:F.cesiumElement;if(!P||P.isDestroyed())return;const L=Cesium__namespace.Cartographic.fromCartesian(Cesium__namespace.Cartesian3.fromElements(h,p,y),S!=null&&S.useGlobeEllipsoid?P.scene.globe.ellipsoid:void 0);return[Cesium$1.Math.toDegrees(L.longitude),Cesium$1.Math.toDegrees(L.latitude),L.height]},toWindowPosition:h=>{var S;const p=(S=n.current)==null?void 0:S.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 fa;const y=(fa=n.current)==null?void 0:fa.cesiumElement;if(!y||y.isDestroyed())return;const S=Cesium__namespace.Cartesian3.fromElements(...h),P=new Cesium__namespace.Cartesian3,L=new Cesium__namespace.Cartographic,F=new Cesium__namespace.Cartesian3,N=new Cesium__namespace.Ellipsoid,z=new Cesium__namespace.Ray,W=new Cesium__namespace.Cartesian3,nt=y.scene,Pe=nt.globe.ellipsoid;let se;try{se=Cesium__namespace.Cartographic.fromCartesian(S,Pe,L)}catch{return}F.x=Pe.radii.x+se.height,F.y=Pe.radii.y+se.height,F.z=Pe.radii.z+se.height;const mt=Cesium__namespace.Ellipsoid.fromCartesian3(F,N),kt=new Cesium__namespace.Cartesian2;try{[kt.x,kt.y]=d.toWindowPosition(h)??[0,0]}catch{return}kt.x+=p[0],kt.y+=p[1];const mn=nt.camera.getPickRay(kt,z);if(mn==null)return;const _i=Cesium__namespace.IntersectionTests.rayEllipsoid(mn,mt);if(_i==null)return;const zi=Cesium__namespace.Ray.getPoint(mn,_i.start,W),Sa=Cesium__namespace.Cartesian3.subtract(zi,S,P);return[Sa.x,Sa.y,Sa.z]},isPositionVisible:h=>{var S;const p=(S=n.current)==null?void 0:S.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 S;const p=(S=n.current)==null?void 0:S.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 P=Cesium__namespace.Cartesian3.fromDegrees(h.lng,h.lat,h.height);y.camera.position.x=P.x,y.camera.position.y=P.y,y.camera.position.z=P.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,y)=>{var P;const S=(P=n.current)==null?void 0:P.cesiumElement;if(!(!S||S.isDestroyed()))return getExtrudedHeight(S.scene,new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),new Cesium__namespace.Cartesian2(p[0],p[1]),y)},getExtrudedPoint:(h,p)=>{var N,z;if(!h||!p)return;const y=(N=n.current)==null?void 0:N.cesiumElement;if(!y||y.isDestroyed())return;const S=new Cesium__namespace.Cartesian3(h[0],h[1],h[2]),P=new Cesium__namespace.Cartesian3,L=(z=y.scene)==null?void 0:z.globe.ellipsoid.geodeticSurfaceNormal(S,P);if(!L)return;const F=Cesium__namespace.Cartesian3.add(S,Cesium__namespace.Cartesian3.multiplyByScalar(L,p,P),P);return[F.x,F.y,F.z]},getSurfaceDistance:(h,p)=>{var L;const y=(L=n.current)==null?void 0:L.cesiumElement;if(!y||y.isDestroyed())return;const S=y.scene,P=new Cesium__namespace.EllipsoidGeodesic(void 0,void 0,S.globe.ellipsoid);return P.setEndPoints(Cesium__namespace.Cartographic.fromCartesian(h,S.globe.ellipsoid,new Cesium__namespace.Cartographic),Cesium__namespace.Cartographic.fromCartesian(p,S.globe.ellipsoid,new Cesium__namespace.Cartographic)),P.surfaceDistance},equalsEpsilon2d:(h,p,y=0,S=0)=>Cesium__namespace.Cartesian2.equalsEpsilon(new Cesium__namespace.Cartesian2(h[0],h[1]),new Cesium__namespace.Cartesian2(p[0],p[1]),y,S),equalsEpsilon3d:(h,p,y=0,S=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,S),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,S,P,L,F;if(h&&typeof h=="object"){const N=(y=n.current)==null?void 0:y.cesiumElement;if(!N||N.isDestroyed())return;(S=o.current)==null||S.call(o),o.current=flyTo((P=N.scene)==null?void 0:P.camera,{...getCamera(N),...h},p)}if(h&&typeof h=="string"){const N=(L=n.current)==null?void 0:L.cesiumElement;if(!N||N.isDestroyed())return;const z=h,W=findEntity(N,z,z,!0),nt=getTag(W);if(W instanceof Cesium__namespace.Primitive){N.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(W.modelMatrix));return}if(W instanceof Cesium__namespace.GroundPrimitive){N.scene.camera.flyToBoundingSphere(nt==null?void 0:nt.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))N.flyTo(W,p);else{for(const mt of[N.dataSourceDisplay.dataSources,N.dataSources])for(let kt=0;kt<mt.length;kt++){const mn=mt.get(kt);if(mn.entities.values.find(Sa=>{var fa;return((fa=getTag(Sa))==null?void 0:fa.layerId)===z})){N.flyTo(mn,p);return}}const Pe=[];for(const mt of N.entities.values)((F=getTag(mt))==null?void 0:F.layerId)===z&&Pe.push(mt);if(Pe.length){N.flyTo(Pe,p);return}const se=findEntity(N,z);if(se instanceof Cesium__namespace.Primitive){N.scene.camera.flyToBoundingSphere(Cesium__namespace.BoundingSphere.fromTransformation(se.modelMatrix));return}se&&!(se instanceof Cesium__namespace.Cesium3DTileFeature||se instanceof Cesium__namespace.Cesium3DTilePointFeature||se instanceof Cesium__namespace.Model||se instanceof Cesium__namespace.Primitive||se instanceof Cesium__namespace.GroundPrimitive)&&N.flyTo(se,p)}}},flyToBBox:(h,p)=>{var L,F;const y=(L=n.current)==null?void 0:L.cesiumElement;if(!y||y.isDestroyed())return;(F=o.current)==null||F.call(o);const S=Cesium__namespace.BoundingSphere.fromRectangle3D(Cesium__namespace.Rectangle.fromDegrees(...h)),P=y.scene.camera;y.camera.flyToBoundingSphere(S,{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):P.pitch,range:(p==null?void 0:p.range)??0},duration:p==null?void 0:p.duration}),o.current=()=>{P==null||P.cancelFlight()}},rotateOnCenter:h=>{var P;const p=(P=n.current)==null?void 0:P.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,S=getCameraEllipsoidIntersection(y,new Cesium__namespace.Cartesian3);S&&y.camera.rotate(S,h)},overrideScreenSpaceController:h=>{var P,L;const p=(P=n.current)==null?void 0:P.cesiumElement;if(!p||p.isDestroyed())return;const y=(L=p.scene)==null?void 0:L.screenSpaceCameraController,S=getOverriddenScreenSpaceCameraOptions(h);Object.assign(y,S)},lookAt:(h,p)=>{var S,P,L;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed())){if(p!=null&&p.withoutAnimation)return lookAtWithoutAnimation(y.scene,{...getCamera(y),...h});(P=o.current)==null||P.call(o),o.current=lookAt((L=y.scene)==null?void 0:L.camera,{...getCamera(y),...h},p)}},lookAtLayer:h=>{var z,W;const p=(z=n.current)==null?void 0:z.cesiumElement;if(!p||p.isDestroyed())return;const y=p.entities.getById(h);if(!y)return;const S=(W=y.position)==null?void 0:W.getValue(p.clock.currentTime);if(!S)return;const P=p.camera.positionWC,L=Cesium__namespace.Cartesian3.distance(S,P);if(Math.round(L*1e3)/1e3===5e3)return;const F=getCamera(p),N=new Cesium__namespace.HeadingPitchRange((F==null?void 0:F.heading)??0,(F==null?void 0:F.pitch)??-90,5e3);p.zoomTo(y,N)},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 S;const y=(S=n.current)==null?void 0:S.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:1/h},p)},zoomOut:(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;!y||y.isDestroyed()||zoom({viewer:y,relativeAmount:h},p)},orbit:h=>{var nt;const p=(nt=n.current)==null?void 0:nt.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,S=y.camera,P=.02,L=h+Cesium$1.Math.PI_OVER_TWO,F=Math.cos(L)*P,N=Math.sin(L)*P,z=Cesium__namespace.Matrix4.clone(S.transform),W=getCenterCamera({camera:S,scene:y});if(W||S.positionWC){const Pe=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(W||S.positionWC,y.globe.ellipsoid);S.lookAtTransform(Pe)}p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?S.move(new Cesium__namespace.Cartesian3(F,N,0),Math.max(y.canvas.clientWidth,y.canvas.clientHeight)/100*S.positionCartographic.height*P):W?(S.rotateLeft(F),S.rotateUp(N)):(S.look(Cesium__namespace.Cartesian3.UNIT_Z,F),S.look(S.right,N)),S.lookAtTransform(z)},rotateRight:h=>{var F;const p=(F=n.current)==null?void 0:F.cesiumElement;if(!p||p.isDestroyed())return;const y=p.scene,S=y.camera,P=Cesium__namespace.Matrix4.clone(S.transform),L=Cesium__namespace.Transforms.eastNorthUpToFixedFrame(S.positionWC,y.globe.ellipsoid);p.scene.mode!==Cesium__namespace.SceneMode.SCENE3D?(S.twistRight(h- -S.heading),S.twistLeft(h- -S.heading)):(S.lookAtTransform(L),S.rotateRight(h- -S.heading),S.lookAtTransform(P))},changeSceneMode:(h,p=2)=>{var S,P,L,F;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()||!y.scene))switch(h){case"2d":(P=y==null?void 0:y.scene)==null||P.morphTo2D(p);break;case"columbus":(L=y==null?void 0:y.scene)==null||L.morphToColumbusView(p);break;case"3d":default:(F=y==null?void 0:y.scene)==null||F.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 S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))return y.scene.requestRender(),y.render(),y.canvas.toDataURL(h,p)},enableScreenSpaceCameraController:(h=!0)=>{var S;const p=(S=n.current)==null?void 0:S.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 P;const S=(P=n.current)==null?void 0:P.cesiumElement;!S||S.isDestroyed()||flyToGround(S,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 L;const y=(L=n.current)==null?void 0:L.cesiumElement;if(!y||y.isDestroyed())return;const S=findEntity(y,h,p),P=getTag(S);if(P!=null&&P.featureId){if(S instanceof Cesium__namespace.Entity)return{type:"feature",id:P.featureId,properties:convertEntityProperties(y.clock.currentTime,S),metaData:{description:convertEntityDescription(y.clock.currentTime,S)}};if(S instanceof Cesium__namespace.Cesium3DTileFeature||S instanceof Cesium__namespace.Cesium3DTilePointFeature)return{type:"feature",id:P.featureId,properties:convertCesium3DTileFeatureProperties(S)}}},findFeaturesByIds:(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,P=>{var F;const L=(F=convertObjToComputedFeature(y.clock.currentTime,P))==null?void 0:F[1];return L?{...L,type:"feature"}:void 0})},findComputedFeatureById:(h,p)=>{var L;const y=(L=n.current)==null?void 0:L.cesiumElement;if(!y||y.isDestroyed())return;const S=findEntity(y,h,p),P=getTag(S);if(P!=null&&P.featureId){if(S instanceof Cesium__namespace.Entity)return P.computedFeature??{type:"computedFeature",id:P.featureId,geometry:getGeometryFromEntity(y.clock.currentTime,S),properties:convertEntityProperties(y.clock.currentTime,S),metaData:{description:convertEntityDescription(y.clock.currentTime,S)}};if(S instanceof Cesium__namespace.Cesium3DTileFeature||S instanceof Cesium__namespace.Cesium3DTilePointFeature)return P.computedFeature??{type:"computedFeature",id:P.featureId,properties:convertCesium3DTileFeatureProperties(S)}}},findComputedFeaturesByIds:(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;if(!(!y||y.isDestroyed()))return findFeaturesFromLayer(y,h,p,P=>{var L;return(L=convertObjToComputedFeature(y.clock.currentTime,P))==null?void 0:L[1]})},bringToFront:h=>{var S;const p=(S=n.current)==null?void 0:S.cesiumElement;if(!p||p.isDestroyed())return;const y=findEntity(p,h);y&&"bringToFront"in y&&typeof y.bringToFront=="function"&&y.bringToFront()},sendToBack:h=>{var S;const p=(S=n.current)==null?void 0:S.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 S;const y=(S=n.current)==null?void 0:S.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(P,L)=>{L&&"onSelectFeature"in L&&typeof L.onSelectFeature=="function"&&L.onSelectFeature(P);const N={...getTag(P)??{},isFeatureSelected:!0};return attachTag(P,N),P})},unselectFeatures:(h,p)=>{var S;const y=(S=n.current)==null?void 0:S.cesiumElement;!y||y.isDestroyed()||findFeaturesFromLayer(y,h,p,(P,L)=>{L&&"onUnselectFeature"in L&&typeof L.onUnselectFeature=="function"&&L.onUnselectFeature(P);const F=getTag(P)??{};return F.isFeatureSelected=!1,attachTag(P,F),P})},pickManyFromViewport:(h,p,y,S)=>{var L;const P=(L=n.current)==null?void 0:L.cesiumElement;if(!(!P||P.isDestroyed()))return pickManyFromViewportAsFeature(P,new Cesium__namespace.Cartesian2(h[0],h[1]),p,y,S)},onTick:h=>{c.current.push(h)},removeTickEventListener:h=>{c.current=c.current.filter(p=>p!==h)||[]},tickEventCallback:c,calcRectangleControlPoint:(h,p,y)=>{const S=new Cesium__namespace.Cartesian3(...h),P=new Cesium__namespace.Cartesian3(...p),L=new Cesium__namespace.Cartesian3(...y),F=new Cesium__namespace.Cartesian3,N=new Cesium__namespace.Cartesian3,z=Cesium__namespace.Cartesian3.projectVector(Cesium__namespace.Cartesian3.subtract(L,S,F),Cesium__namespace.Cartesian3.subtract(P,S,N),F),W=Cesium__namespace.Cartesian3.subtract(L,Cesium__namespace.Cartesian3.add(S,z,F),N),nt=Cesium__namespace.Cartesian3.midpoint(S,P,F),Pe=Cesium__namespace.Cartesian3.add(nt,W,N),se=[Pe.x,Pe.y,Pe.z];return[h,p,se]},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 S;(S=h.current)==null||S.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,S;if(this._entity||this.viewer.isDestroyed())return;this._timeout=void 0,this._initialPosition=d.position,this._initialScreenPosition=s.position.clone();const P=(p=d.position)==null?void 0:p.getValue(this.viewer.clock.currentTime);if(P){const N=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(P).height;this._ellipsoid=CesiumDnD.enlargeEllipsoid(this.viewer.scene.globe.ellipsoid,N),this.viewer.scene.mode===Cesium$1.SceneMode.SCENE2D||this.viewer.scene.mode===Cesium$1.SceneMode.COLUMBUS_VIEW?this._initialHeight=N:this._initialHeight=void 0}const L=this._resetHeight(this._convertCartesian2ToPosition(s.position)),F=this._context(L,s.position);if(F&&((S=(y=this.options)==null?void 0:y.onDrag)==null?void 0:S.call(y,d,L,F))===!1){this._initialPosition=void 0,this._initialScreenPosition=void 0,this._ellipsoid=void 0;return}this._position=L,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,S)=>{var N,z;const P=(N=t.current)==null?void 0:N.cesiumElement;if(!P||P.isDestroyed()||!isSelectable(p)||!isDraggable(p))return!1;const L=convertCartesian3ToPosition((z=t.current)==null?void 0:z.cesiumElement,y);if(!L)return!1;const F=getTag(p);if(!F)return!1;o==null||o(F.layerId||"",F.featureId,L)},[t,o]),d=React.useCallback((p,y)=>{var F,N;const S=(F=t.current)==null?void 0:F.cesiumElement;if(!S||S.isDestroyed())return!1;const P=getTag(p),L=convertCartesian3ToPosition((N=t.current)==null?void 0:N.cesiumElement,y);return s==null||s((P==null?void 0:P.layerId)||"",(P==null?void 0:P.featureId)||"",L),!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 S;!p||p.isDestroyed()||(S=h.current)==null||S.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),S=React.useCallback((N,z)=>{var nt;if(p.current||y.current||o!==INTERACTION_MODES.selection||!((nt=t.current)!=null&&nt.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const W=makeMouseEventProps(t.current.cesiumElement,N)??{};h.current=[W.x??0,W.y??0],y.current=!0,p.current=!1,s==null||s({...W,pressedKey:z})},[s,t,o]),P=React.useCallback((N,z,W)=>{var _i;if(!y.current||!((_i=t.current)!=null&&_i.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const nt=makeMouseEventProps(t.current.cesiumElement,N)??{};let[Pe,se]=h.current,[mt,kt]=[nt.x??0,nt.y??0];if(mt-Pe===0&&kt-se===0)return nt;W||(p.current=!0),Pe>mt&&([mt,Pe]=[Pe,mt]),se>kt&&([kt,se]=[se,kt]);const mn={...nt,pressedKey:z,x:mt,y:kt,startX:Pe,startY:se,width:mt-Pe,height:kt-se};return c==null||c(mn),mn},[c,t]),L=React.useCallback((N,z)=>{var fa;if(!y.current||!((fa=t.current)!=null&&fa.cesiumElement)||t.current.cesiumElement.isDestroyed())return;const W=P(N,z,!0),{startX:nt=0,startY:Pe=0,x:se=0,y:mt=0,width:kt=0,height:mn=0}=W??{},[_i,zi]=[nt+kt/2,Pe+mn/2],Sa=p.current?n.pickManyFromViewport([_i,zi],kt,mn):n.pickManyFromViewport([se,mt],1,1);d==null||d({...W,pressedKey:z,features:Sa??[],isClick:!p.current}),p.current=!1,y.current=!1},[d,t,n,P]);return React.useMemo(()=>Object.fromEntries(Object.entries({start:{handler:S,keys:["shift"]},move:{handler:P,keys:["shift"]},end:{handler:L,keys:["shift"]}}).map(([z,W])=>[z,{handler:W.handler,...Object.fromEntries(W.keys.map(nt=>[nt,Pe=>W.handler(Pe,nt)]))}])),[L,P,S])},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(P,["color","frustumLength","blackPoint","whitePoint","gamma"]),globeDepthTexture:()=>(y==null?void 0:y())??F._depthTexture}});if(c){const N=createBilateralFilterStage({prefix:t,outputType:h,useGlobeDepth:p,getGlobeDepthTexture:y,uniforms:{textureScale:n,...pick(P,["frustumLength","normalExponent","depthExponent"])}}),z=new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion_generate_and_filter`,stages:[L,N]});return F.uniforms.ambientOcclusionTexture=z.name,new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion`,stages:[z,F],inputPreviousStageTexture:!1,uniforms:createUniforms([{stage:L,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:N,uniforms:["frustumLength","normalExponent","depthExponent"]},{stage:F,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}else return F.uniforms.ambientOcclusionTexture=L.name,new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion`,stages:[L,F],inputPreviousStageTexture:!1,uniforms:createUniforms([{stage:L,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:F,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:S}=$e$1(),P=S==null?void 0:S.scene,L=useInstance({owner:P==null?void 0:P.postProcessStages,keys:[n,s,o,c,d,h,p],create:()=>{const F=createAmbientOcclusionStage({textureScale:n,steps:s,directions:o,denoise:c,accurateNormalReconstruction:d,outputType:h,useGlobeDepth:p,getGlobeDepthTexture:()=>P.context.uniformState.globeDepthTexture,uniforms:y});return F.enabled=t,F},transferOwnership:(F,N)=>(N==null||N.add(F),()=>{N==null||N.remove(F)})});return L.enabled=t,Object.assign(L.uniforms,y),P==null||P.requestRender(),usePreRender(()=>{const F=P==null?void 0:P.camera.frustum;if(F instanceof Cesium$1.PerspectiveFrustum){const N=1/Math.tan(F.fovy/2);L.uniforms.focalLength.x=N*F.aspectRatio,L.uniforms.focalLength.y=N}}),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 S=useConstant$2(()=>new CallbackProperty((N,z)=>"getValue"in y.current?y.current.getValue(N,z):y.current,!1)),P=React.useMemo(()=>({position:S,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,S,d,s,c]),L=React.useCallback(()=>{p==null||p(o,!!h,"mousedown")},[o,h,p]),F=React.useCallback(()=>{p==null||p(o,!!h,"click")},[o,h,p]);return jsxRuntimeExports.jsx(Is$1,{...P,onMouseDown:L,onClick:F})};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,S=!1,P=!1)=>{const L=P&&c,F=L?n:o;return S&&h.add(y),F.add(y)&&L&&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 S=0;S<s;S++){const P=n.order[S];h.has(P)&&(p.schedule(P),t()),P(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((L,F)=>(L[F]=createRenderStep(()=>o=!0),L),{}),h=L=>{d[L].process(c)},p=()=>{const L=performance.now();o=!1,c.delta=s?1e3/60:Math.max(Math.min(L-c.timestamp,maxElapsed),1),c.timestamp=L,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((L,F)=>{const N=d[F];return L[F]=(z,W=!1,nt=!1)=>(o||y(),N.schedule(z,W,nt)),L},{}),cancel:L=>stepsOrder.forEach(F=>d[F].cancel(L)),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 S=y.current;React.useInsertionEffect(()=>{S&&S.update(o,h)});const P=React.useRef(!!(o[optimizedAppearDataAttribute]&&!window.HandoffComplete));return useIsomorphicLayoutEffect$1(()=>{S&&(microtask.postRender(S.render),P.current&&S.animationState&&S.animationState.animateChanges())}),React.useEffect(()=>{S&&(S.updateFeatures(),!P.current&&S.animationState&&S.animationState.animateChanges(),P.current&&(P.current=!1,window.HandoffComplete=!0))}),S}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 S;const P={...React.useContext(MotionConfigContext),...p,layoutId:useLayoutId(p)},{isStatic:L}=P,F=useCreateMotionContext(p),N=s(p,L);if(!L&&isBrowser){F.visualElement=useVisualElement(c,N,P,n);const z=React.useContext(SwitchLayoutGroupContext),W=React.useContext(LazyContext).strict;F.visualElement&&(S=F.visualElement.loadFeatures(P,W,t,z))}return React__namespace.createElement(MotionContext.Provider,{value:F},S&&F.visualElement?React__namespace.createElement(S,{visualElement:F.visualElement,...P}):null,o(c,p,useMotionRef(N,F.visualElement,y),N,L,F.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,S=!1,P=!0;for(const L in n){const F=n[L];if(isCSSVariableName(L)){d[L]=F;continue}const N=numberValueTypes[L],z=getValueAsType(F,N);if(transformProps.has(L)){if(y=!0,h[L]=z,!P)continue;F!==(N.default||0)&&(P=!1)}else L.startsWith("origin")?(S=!0,p[L]=z):c[L]=z}if(n.transform||(y||s?c.transform=buildTransform(t.transform,o,P,s):c.transform&&(c.transform="none")),S){const{originX:L="50%",originY:F="50%",originZ:N=0}=p;c.transformOrigin=`${L} ${F} ${N}`}}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,...S},P,L,F){if(buildHTMLStyles(t,S,P,F),L){t.style.viewBox&&(t.attrs.viewBox=t.style.viewBox);return}t.attrs=t.style,t.style={};const{attrs:N,style:z,dimensions:W}=t;N.transform&&(W&&(z.transform=N.transform),delete N.transform),W&&(c!==void 0||d!==void 0||z.transform)&&(z.transformOrigin=calcSVGTransformOrigin(W,c!==void 0?c:.5,d!==void 0?d:.5)),n!==void 0&&(N.x=n),o!==void 0&&(N.y=o),s!==void 0&&(N.scale=s),h!==void 0&&buildSVGPath(N,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),S=filterProps(s,typeof o=="string",t),P=o!==React.Fragment?{...S,...y,ref:c}:{},{children:L}=s,F=React.useMemo(()=>isMotionValue(L)?L.get():L,[L]);return React.createElement(o,{...P,children:F})}}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 F in d)c[F]=resolveMotionValue(d[F]);let{initial:h,animate:p}=t;const y=isControllingVariants(t),S=isVariantNode(t);n&&S&&!y&&t.inherit!==!1&&(h===void 0&&(h=n.initial),p===void 0&&(p=n.animate));let P=o?o.initial===!1:!1;P=P||h===!1;const L=P?p:h;return L&&typeof L!="boolean"&&!isAnimationControls(L)&&(Array.isArray(L)?L:[L]).forEach(N=>{const z=resolveVariantFromProps(t,N);if(!z)return;const{transitionEnd:W,transition:nt,...Pe}=z;for(const se in Pe){let mt=Pe[se];if(Array.isArray(mt)){const kt=P?mt.length-1:0;mt=mt[kt]}mt!==null&&(c[se]=mt)}for(const se in W)c[se]=W[se]}),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:S,onTapCancel:P,globalTapTarget:L}=this.node.getProps();!L&&!isNodeOrChild(this.node.current,p.target)?P&&P(p,y):S&&S(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,S)=>{const{onTap:P}=this.node.getProps();P&&P(y,S)})};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:S}=y;if(this.isInView===S||(this.isInView=S,d&&!S&&this.hasEnteredView))return;S&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",S);const{onViewportEnter:P,onViewportLeave:L}=this.node.getProps(),F=S?P:L;F&&F(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:S,...P}){return!!Object.keys(P).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 S=n[y];if(typeof S=="string"&&isCSSVariableToken(S)){const P=getVariableValue(S,o.current);P!==void 0&&(n[y]=P)}}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 S=n[y];typeof S=="string"&&(n[y]=parseFloat(S))}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,S])=>{o.getValue(y).set(S)}),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:S}=this.options;if(!S&&!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 P=this.initPlayback(n,o);P!==!1&&(this._resolved={keyframes:n,finalKeyframe:o,...P},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=S=>{const P=S*h,L=P*t,F=P-o,N=calcAngularFreq(S,h),z=Math.exp(-L);return safeMin-F/N*z},d=S=>{const L=S*h*t,F=L*o+o,N=Math.pow(h,2)*Math.pow(S,2)*t,z=Math.exp(-L),W=calcAngularFreq(Math.pow(S,2),h);return(-c(S)+safeMin>0?-1:1)*((F-N)*z)/W}):(c=S=>{const P=Math.exp(-S*t),L=(S-o)*t+1;return-.001+P*L},d=S=>{const P=Math.exp(-S*t),L=(o-S)*(t*t);return P*L});const p=5/t,y=approximateRoot(c,d,p);if(t=secondsToMilliseconds(t),isNaN(y))return{stiffness:100,damping:10,duration:t};{const S=Math.pow(y,2)*s;return{stiffness:S,damping:h*2*Math.sqrt(s*S),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:S,duration:P,velocity:L,isResolvedFromDuration:F}=getSpringOptions({...s,velocity:-millisecondsToSeconds(s.velocity||0)}),N=L||0,z=y/(2*Math.sqrt(p*S)),W=d-c,nt=millisecondsToSeconds(Math.sqrt(p/S)),Pe=Math.abs(W)<5;o||(o=Pe?.01:2),n||(n=Pe?.005:.5);let se;if(z<1){const mt=calcAngularFreq(nt,z);se=kt=>{const mn=Math.exp(-z*nt*kt);return d-mn*((N+z*nt*W)/mt*Math.sin(mt*kt)+W*Math.cos(mt*kt))}}else if(z===1)se=mt=>d-Math.exp(-nt*mt)*(W+(N+nt*W)*mt);else{const mt=nt*Math.sqrt(z*z-1);se=kt=>{const mn=Math.exp(-z*nt*kt),_i=Math.min(mt*kt,300);return d-mn*((N+z*nt*W)*Math.sinh(_i)+mt*W*Math.cosh(_i))/mt}}return{calculatedDuration:F&&P||null,next:mt=>{const kt=se(mt);if(F)h.done=mt>=P;else{let mn=N;mt!==0&&(z<1?mn=calcGeneratorVelocity(se,mt,kt):mn=0);const _i=Math.abs(mn)<=o,zi=Math.abs(d-kt)<=n;h.done=_i&&zi}return h.value=h.done?d:kt,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:S=.5,restSpeed:P}){const L=t[0],F={done:!1,value:L},N=Sa=>p!==void 0&&Sa<p||y!==void 0&&Sa>y,z=Sa=>p===void 0?y:y===void 0||Math.abs(p-Sa)<Math.abs(y-Sa)?p:y;let W=o*n;const nt=L+W,Pe=h===void 0?nt:h(nt);Pe!==nt&&(W=Pe-L);const se=Sa=>-W*Math.exp(-Sa/s),mt=Sa=>Pe+se(Sa),kt=Sa=>{const fa=se(Sa),La=mt(Sa);F.done=Math.abs(fa)<=S,F.value=F.done?Pe:La};let mn,_i;const zi=Sa=>{N(F.value)&&(mn=Sa,_i=spring({keyframes:[F.value,z(F.value)],velocity:calcGeneratorVelocity(mt,Sa,F.value),damping:c,stiffness:d,restDelta:S,restSpeed:P}))};return zi(0),{calculatedDuration:null,next:Sa=>{let fa=!1;return!_i&&mn===void 0&&(fa=!0,kt(Sa),zi(Sa)),mn!==void 0&&Sa>=mn?_i.next(Sa-mn):(!fa&&kt(Sa),F)}}}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=S=>{let P=0;if(p>1)for(;P<t.length-2&&!(S<t[P+1]);P++);const L=progress(t[P],t[P+1],S);return h[P](L)};return o?S=>y(clamp(t[0],t[d-1],S)):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,S;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 P=p({...this.options,keyframes:n});d==="mirror"&&(S=p({...this.options,keyframes:[...n].reverse(),velocity:-h})),P.calculatedDuration===null&&(P.calculatedDuration=calcGeneratorDuration(P));const{calculatedDuration:L}=P,F=L+c,N=F*(s+1)-c;return{generator:P,mirroredGenerator:S,mapPercentToKeyframes:y,calculatedDuration:L,resolvedDuration:F,totalDuration:N}}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:S,totalDuration:P,resolvedDuration:L}=s;if(this.startTime===null)return d.next(0);const{delay:F,repeat:N,repeatType:z,repeatDelay:W,onUpdate:nt}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,n):this.speed<0&&(this.startTime=Math.min(n-P/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 Pe=this.currentTime-F*(this.speed>=0?1:-1),se=this.speed>=0?Pe<0:Pe>P;this.currentTime=Math.max(Pe,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=P);let mt=this.currentTime,kt=d;if(N){const Sa=Math.min(this.currentTime,P)/L;let fa=Math.floor(Sa),La=Sa%1;!La&&Sa>=1&&(La=1),La===1&&fa--,fa=Math.min(fa,N+1),!!(fa%2)&&(z==="reverse"?(La=1-La,W&&(La-=W/L)):z==="mirror"&&(kt=h)),mt=clamp(0,1,La)*L}const mn=se?{done:!1,value:y[0]}:kt.next(mt);p&&(mn.value=p(mn.value));let{done:_i}=mn;!se&&S!==null&&(_i=this.speed>=0?this.currentTime>=P:this.currentTime<=0);const zi=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&_i);return zi&&c!==void 0&&(mn.value=getFinalKeyframe(y,this.options,c)),nt&&nt(mn.value),zi&&this.finish(),mn}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 S={[n]:o};y&&(S.offset=y);const P=mapEasingToNativeEasing(p);return Array.isArray(P)&&(S.easing=P),t.animate(S,{delay:s,duration:c,easing:Array.isArray(P)?"linear":P,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:S}=this.options;if(!(!((s=y.owner)===null||s===void 0)&&s.current))return!1;if(requiresPregeneratedKeyframes(this.options)){const{onComplete:L,onUpdate:F,motionValue:N,...z}=this.options,W=pregenerateKeyframes(n,z);n=W.keyframes,n.length===1&&(n[1]=n[0]),c=W.duration,d=W.times,h=W.ease,p="keyframes"}const P=animateStyle(y.owner.current,S,n,{...this.options,duration:c,times:d,ease:h});return P.startTime=time.now(),this.pendingTimeline?(P.timeline=this.pendingTimeline,this.pendingTimeline=void 0):P.onfinish=()=>{const{onComplete:L}=this.options;y.set(getFinalKeyframe(n,this.options,o)),L&&L(),this.cancel(),this.resolveFinishedPromise()},{animation:P,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:S,onComplete:P,...L}=this.options,F=new MainThreadAnimation({...L,keyframes:s,duration:c,type:d,ease:h,times:p,isGenerator:!0}),N=secondsToMilliseconds(this.time);y.setWithVelocity(F.sample(N-sampleDelta).value,F.sample(N).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:S=0}=s;S=S-secondsToMilliseconds(y);let P={keyframes:Array.isArray(o)?o:[null,o],ease:"easeOut",velocity:n.getVelocity(),...p,delay:-S,onUpdate:F=>{n.set(F),p.onUpdate&&p.onUpdate(F)},onComplete:()=>{h(),p.onComplete&&p.onComplete()},name:t,motionValue:n,element:d?void 0:c};isTransitionDefined(p)||(P={...P,...getDefaultTransition(t,P)}),P.duration&&(P.duration=secondsToMilliseconds(P.duration)),P.repeatDelay&&(P.repeatDelay=secondsToMilliseconds(P.repeatDelay)),P.from!==void 0&&(P.keyframes[0]=P.from);let L=!1;if((P.type===!1||P.duration===0&&!P.repeatDelay)&&(P.duration=0,P.delay===0&&(L=!0)),L&&!d&&n.get()!==void 0){const F=getFinalKeyframe(P.keyframes,p);if(F!==void 0){frame.update(()=>{P.onUpdate(F),P.onComplete()});return}}return!d&&AcceleratedAnimation.supports(P)?new AcceleratedAnimation(P):new MainThreadAnimation(P)};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 S=t.getValue("willChange");s&&(h=s);const P=[],L=c&&t.animationState&&t.animationState.getState()[c];for(const F in y){const N=t.getValue(F,(d=t.latestValues[F])!==null&&d!==void 0?d:null),z=y[F];if(z===void 0||L&&shouldBlockAnimation(L,F))continue;const W={delay:o,elapsed:0,...getValueTransition(h||{},F)};let nt=!1;if(window.HandoffAppearAnimations){const se=t.getProps()[optimizedAppearDataAttribute];if(se){const mt=window.HandoffAppearAnimations(se,F);mt!==null&&(W.elapsed=mt,nt=!0)}}N.start(animateMotionValue(F,N,z,t.shouldReduceMotion&&transformProps.has(F)?{type:!1}:W,t,nt));const Pe=N.animation;Pe&&(isWillChangeMotionValue(S)&&(S.add(F),Pe.then(()=>S.remove(F))),P.push(Pe))}return p&&Promise.all(P).then(()=>{frame.update(()=>{p&&setTarget(t,p)})}),P}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?(S=0)=>{const{delayChildren:P=0,staggerChildren:L,staggerDirection:F}=d;return animateChildren(t,n,P+S,L,F,o)}:()=>Promise.resolve(),{when:y}=d;if(y){const[S,P]=y==="beforeChildren"?[h,p]:[p,h];return S().then(()=>P())}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?(S=0)=>S*s:(S=0)=>p-S*s;return Array.from(t.variantChildren).sort(sortByTreeOrder).forEach((S,P)=>{S.notify("AnimationStart",n),h.push(animateVariant(S,n,{...d,delay:o+y(P)}).then(()=>S.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=>(S,P)=>{var L;const F=resolveVariant(t,P,y==="exit"?(L=t.presenceContext)===null||L===void 0?void 0:L.custom:void 0);if(F){const{transition:N,transitionEnd:z,...W}=F;S={...S,...W,...z}}return S};function d(y){n=y(t)}function h(y){const S=t.getProps(),P=t.getVariantContext(!0)||{},L=[],F=new Set;let N={},z=1/0;for(let nt=0;nt<numAnimationTypes;nt++){const Pe=reversePriorityOrder[nt],se=o[Pe],mt=S[Pe]!==void 0?S[Pe]:P[Pe],kt=isVariantLabel(mt),mn=Pe===y?se.isActive:null;mn===!1&&(z=nt);let _i=mt===P[Pe]&&mt!==S[Pe]&&kt;if(_i&&s&&t.manuallyAnimateOnMount&&(_i=!1),se.protectedKeys={...N},!se.isActive&&mn===null||!mt&&!se.prevProp||isAnimationControls(mt)||typeof mt=="boolean")continue;let Sa=checkVariantsDidChange(se.prevProp,mt)||Pe===y&&se.isActive&&!_i&&kt||nt>z&&kt,fa=!1;const La=Array.isArray(mt)?mt:[mt];let Ra=La.reduce(c(Pe),{});mn===!1&&(Ra={});const{prevResolvedValues:ma={}}=se,yt={...ma,...Ra},lt=pi=>{Sa=!0,F.has(pi)&&(fa=!0,F.delete(pi)),se.needsAnimating[pi]=!0;const ba=t.getValue(pi);ba&&(ba.liveStyle=!1)};for(const pi in yt){const ba=Ra[pi],Sc=ma[pi];if(N.hasOwnProperty(pi))continue;let ms=!1;isKeyframesTarget(ba)&&isKeyframesTarget(Sc)?ms=!shallowCompare(ba,Sc):ms=ba!==Sc,ms?ba!=null?lt(pi):F.add(pi):ba!==void 0&&F.has(pi)?lt(pi):se.protectedKeys[pi]=!0}se.prevProp=mt,se.prevResolvedValues=Ra,se.isActive&&(N={...N,...Ra}),s&&t.blockInitialAnimation&&(Sa=!1),Sa&&(!_i||fa)&&L.push(...La.map(pi=>({animation:pi,options:{type:Pe}})))}if(F.size){const nt={};F.forEach(Pe=>{const se=t.getBaseTarget(Pe),mt=t.getValue(Pe);mt&&(mt.liveStyle=!0),nt[Pe]=se===void 0?null:se}),L.push({animation:nt})}let W=!!L.length;return s&&(S.initial===!1||S.initial===S.animate)&&!t.manuallyAnimateOnMount&&(W=!1),s=!1,W?n(L):Promise.resolve()}function p(y,S){var P;if(o[y].isActive===S)return Promise.resolve();(P=t.variantChildren)===null||P===void 0||P.forEach(F=>{var N;return(N=F.animationState)===null||N===void 0?void 0:N.setActive(y,S)}),o[y].isActive=S;const L=h(y);for(const F in o)o[F].protectedKeys={};return L}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 L=getPanInfo(this.lastMoveEventInfo,this.history),F=this.startEvent!==null,N=distance2D(L.offset,{x:0,y:0})>=3;if(!F&&!N)return;const{point:z}=L,{timestamp:W}=frameData;this.history.push({...z,timestamp:W});const{onStart:nt,onMove:Pe}=this.handlers;F||(nt&&nt(this.lastMoveEvent,L),this.startEvent=this.lastMoveEvent),Pe&&Pe(this.lastMoveEvent,L)},this.handlePointerMove=(L,F)=>{this.lastMoveEvent=L,this.lastMoveEventInfo=transformPoint(F,this.transformPagePoint),frame.update(this.updatePoint,!0)},this.handlePointerUp=(L,F)=>{this.end();const{onEnd:N,onSessionEnd:z,resumeAnimation:W}=this.handlers;if(this.dragSnapToOrigin&&W&&W(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const nt=getPanInfo(L.type==="pointercancel"?this.lastMoveEventInfo:transformPoint(F,this.transformPagePoint),this.history);this.startEvent&&N&&N(L,nt),z&&z(L,nt)},!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:S}=frameData;this.history=[{...y,timestamp:S}];const{onSessionStart:P}=o;P&&P(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=P=>{const{dragSnapToOrigin:L}=this.getProps();L?this.pauseAnimation():this.stopAnimation(),o&&this.snapToCursor(extractEventInfo(P,"page").point)},d=(P,L)=>{const{drag:F,dragPropagation:N,onDragStart:z}=this.getProps();if(F&&!N&&(this.openGlobalLock&&this.openGlobalLock(),this.openGlobalLock=getGlobalLock(F),!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(nt=>{let Pe=this.getAxisMotionValue(nt).get()||0;if(percent.test(Pe)){const{projection:se}=this.visualElement;if(se&&se.layout){const mt=se.layout.layoutBox[nt];mt&&(Pe=calcLength(mt)*(parseFloat(Pe)/100))}}this.originPoint[nt]=Pe}),z&&z(P,L);const{animationState:W}=this.visualElement;W&&W.setActive("whileDrag",!0)},h=(P,L)=>{const{dragPropagation:F,dragDirectionLock:N,onDirectionLock:z,onDrag:W}=this.getProps();if(!F&&!this.openGlobalLock)return;const{offset:nt}=L;if(N&&this.currentDirection===null){this.currentDirection=getCurrentDirection(nt),this.currentDirection!==null&&z&&z(this.currentDirection);return}this.updateAxis("x",L.point,nt),this.updateAxis("y",L.point,nt),this.visualElement.render(),W&&W(P,L)},p=(P,L)=>this.stop(P,L),y=()=>eachAxis(P=>{var L;return this.getAnimationState(P)==="paused"&&((L=this.getAxisMotionValue(P).animation)===null||L===void 0?void 0:L.play())}),{dragSnapToOrigin:S}=this.getProps();this.panSession=new PanSession(n,{onSessionStart:c,onStart:d,onMove:h,onSessionEnd:p,resumeAnimation:y},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:S,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||{},S=eachAxis(P=>{if(!shouldDrag(P,o,this.currentDirection))return;let L=y[P]||{};h&&(L={min:0,max:0});const F=c?200:1e6,N=c?40:1e7,z={type:"inertia",velocity:s?n[P]:0,bounceStiffness:F,bounceDamping:N,timeConstant:750,restDelta:1,restSpeed:10,...d,...L};return this.startAxisValueAnimation(P,z)});return Promise.all(S).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:S}=this.constraints[h];p.set(mixNumber$1(y,S,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:S,dragListener:P=!0}=this.getProps();S&&P&&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:S})=>{this.isDragging&&S&&(eachAxis(P=>{const L=this.getAxisMotionValue(P);L&&(this.originPoint[P]+=y[P].translate,L.set(L.get()+y[P].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 S=mixNumber$1(p,y,.5);return typeof c[2+h]=="number"&&(c[2+h]/=S),typeof c[3+h]=="number"&&(c[3+h]/=S),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),S=getRadius(o,p);if(y===void 0&&S===void 0)continue;y||(y=0),S||(S=0),y===0||S===0||isPx(y)===isPx(S)?(t[p]=Math.max(mixNumber$1(asNumber(y),asNumber(S),s),0),(percent.test(S)||percent.test(y))&&(t[p]+="%")):t[p]=S}(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:S,rotate:P,rotateX:L,rotateY:F,skewX:N,skewY:z}=o;S&&(s=`perspective(${S}px) ${s}`),P&&(s+=`rotate(${P}deg) `),L&&(s+=`rotateX(${L}deg) `),F&&(s+=`rotateY(${F}deg) `),N&&(s+=`skewX(${N}deg) `),z&&(s+=`skewY(${z}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:S,visualElement:P}=this.options;if(P&&!P.current&&P.mount(h),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),p&&(S||y)&&(this.isLayoutDirty=!0),t){let L;const F=()=>this.root.updateBlockedByResize=!1;t(h,()=>{this.root.updateBlockedByResize=!0,L&&L(),L=delay(F,250),globalProjectionState.hasAnimatedSinceResize&&(globalProjectionState.hasAnimatedSinceResize=!1,this.nodes.forEach(finishAnimation))})}y&&this.root.registerSharedNode(y,this),this.options.animate!==!1&&P&&(y||S)&&this.addEventListener("didUpdate",({delta:L,hasLayoutChanged:F,hasRelativeTargetChanged:N,layout:z})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const W=this.options.transition||P.getDefaultTransition()||defaultLayoutTransition,{onLayoutAnimationStart:nt,onLayoutAnimationComplete:Pe}=P.getProps(),se=!this.targetLayout||!boxEqualsRounded(this.targetLayout,z)||N,mt=!F&&N;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||mt||F&&(se||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(L,mt);const kt={...getValueTransition(W,"layout"),onPlay:nt,onComplete:Pe};(P.shouldReduceMotion||this.options.layoutRoot)&&(kt.delay=0,kt.type=!1),this.startAnimation(kt)}else F||finishAnimation(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=z})}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 P=0;P<this.path.length;P++){const L=this.path[P];L.shouldResetTransform=!0,L.updateScroll("snapshot"),L.options.layoutRoot&&L.willUpdate(!1)}const{layoutId:p,layout:y}=this.options;if(p===void 0&&!y)return;const S=this.getTransformTemplate();this.prevTransformTemplateValue=S?S(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(),S=y?y(this.latestValues,""):void 0,P=S!==this.prevTransformTemplateValue;h&&(p||hasTransform(this.latestValues)||P)&&(c(this.instance,S),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 S=this.path[y],{scroll:P,options:L}=S;if(S!==this.root&&P&&L.layoutScroll){if(P.isRoot){copyBoxInto(p,h);const{scroll:F}=this.root;F&&(translateAxis(p.x,-F.offset.x),translateAxis(p.y,-F.offset.y))}translateAxis(p.x,P.offset.x),translateAxis(p.y,P.offset.y)}}return p}applyTransform(h,p=!1){const y=createBox();copyBoxInto(y,h);for(let S=0;S<this.path.length;S++){const P=this.path[S];!p&&P.options.layoutScroll&&P.scroll&&P!==P.root&&transformBox(y,{x:-P.scroll.offset.x,y:-P.scroll.offset.y}),hasTransform(P.latestValues)&&transformBox(y,P.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 S=this.path[y];if(!S.instance||!hasTransform(S.latestValues))continue;hasScale(S.latestValues)&&S.updateSnapshot();const P=createBox(),L=S.measurePageBox();copyBoxInto(P,L),removeBoxTransforms(p,S.latestValues,S.snapshot?S.snapshot.layoutBox:void 0,P)}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 S=!!this.resumingFrom||this!==y;if(!(h||S&&this.isSharedProjectionDirty||this.isProjectionDirty||!((p=this.parent)===null||p===void 0)&&p.isProjectionDirty||this.attemptToResolveRelativeTarget))return;const{layout:L,layoutId:F}=this.options;if(!(!this.layout||!(L||F))){if(this.resolvedRelativeTargetAt=frameData.timestamp,!this.targetDelta&&!this.relativeTarget){const N=this.getClosestProjectingParent();N&&N.layout&&this.animationProgress!==1?(this.relativeParent=N,this.forceRelativeParentToResolveTarget(),this.relativeTarget=createBox(),this.relativeTargetOrigin=createBox(),calcRelativePosition(this.relativeTargetOrigin,this.layout.layoutBox,N.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 N=this.getClosestProjectingParent();N&&!!N.resumingFrom==!!this.resumingFrom&&!N.options.layoutScroll&&N.target&&this.animationProgress!==1?(this.relativeParent=N,this.forceRelativeParentToResolveTarget(),this.relativeTarget=createBox(),this.relativeTargetOrigin=createBox(),calcRelativePosition(this.relativeTargetOrigin,this.target,N.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 S=!0;if((this.isProjectionDirty||!((h=this.parent)===null||h===void 0)&&h.isProjectionDirty)&&(S=!1),y&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(S=!1),this.resolvedRelativeTargetAt===frameData.timestamp&&(S=!1),S)return;const{layout:P,layoutId:L}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(P||L))return;copyBoxInto(this.layoutCorrected,this.layout.layoutBox);const F=this.treeScale.x,N=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:z}=p;if(!z){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,z,this.latestValues),this.projectionTransform=buildProjectionTransform(this.projectionDelta,this.treeScale),(this.projectionTransform!==W||this.treeScale.x!==F||this.treeScale.y!==N)&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",z)),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,S=y?y.latestValues:{},P={...this.latestValues},L=createDelta();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!p;const F=createBox(),N=y?y.source:void 0,z=this.layout?this.layout.source:void 0,W=N!==z,nt=this.getStack(),Pe=!nt||nt.members.length<=1,se=!!(W&&!Pe&&this.options.crossfade===!0&&!this.path.some(hasOpacityCrossfade));this.animationProgress=0;let mt;this.mixTargetDelta=kt=>{const mn=kt/1e3;mixAxisDelta(L.x,h.x,mn),mixAxisDelta(L.y,h.y,mn),this.setTargetDelta(L),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(calcRelativePosition(F,this.layout.layoutBox,this.relativeParent.layout.layoutBox),mixBox(this.relativeTarget,this.relativeTargetOrigin,F,mn),mt&&boxEquals(this.relativeTarget,mt)&&(this.isProjectionDirty=!1),mt||(mt=createBox()),copyBoxInto(mt,this.relativeTarget)),W&&(this.animationValues=P,mixValues(P,S,this.latestValues,mn,se,Pe)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=mn},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:S,latestValues:P}=h;if(!(!p||!y||!S)){if(this!==h&&this.layout&&S&&shouldAnimatePositionOnly(this.options.animationType,this.layout.layoutBox,S.layoutBox)){y=this.target||createBox();const L=calcLength(this.layout.layoutBox.x);y.x.min=h.target.x.min,y.x.max=y.x.min+L;const F=calcLength(this.layout.layoutBox.y);y.y.min=h.target.y.min,y.y.max=y.y.min+F}copyBoxInto(p,y),transformBox(p,P),calcBoxDelta(this.projectionDeltaWithTransform,this.layoutCorrected,p,P)}}registerSharedNode(h,p){this.sharedNodes.has(h)||this.sharedNodes.set(h,new NodeStack),this.sharedNodes.get(h).add(p);const S=p.options.initialPromotionConfig;p.promote({transition:S?S.transition:void 0,preserveFollowOpacity:S&&S.shouldPreserveFollowOpacity?S.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 S=this.getStack();S&&S.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 S={};y.z&&resetDistortingTransform("z",h,S,this.animationValues);for(let P=0;P<transformAxes.length;P++)resetDistortingTransform(`rotate${transformAxes[P]}`,h,S,this.animationValues),resetDistortingTransform(`skew${transformAxes[P]}`,h,S,this.animationValues);h.render();for(const P in S)h.setStaticValue(P,S[P]),this.animationValues&&(this.animationValues[P]=S[P]);h.scheduleRender()}getProjectionStyles(h){var p,y;if(!this.instance||this.isSVG)return;if(!this.isVisible)return hiddenVisibility;const S={visibility:""},P=this.getTransformTemplate();if(this.needsReset)return this.needsReset=!1,S.opacity="",S.pointerEvents=resolveMotionValue(h==null?void 0:h.pointerEvents)||"",S.transform=P?P(this.latestValues,""):"none",S;const L=this.getLead();if(!this.projectionDelta||!this.layout||!L.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=P?P({},""):"none",this.hasProjected=!1),W}const F=L.animationValues||L.latestValues;this.applyTransformsToTarget(),S.transform=buildProjectionTransform(this.projectionDeltaWithTransform,this.treeScale,F),P&&(S.transform=P(F,S.transform));const{x:N,y:z}=this.projectionDelta;S.transformOrigin=`${N.origin*100}% ${z.origin*100}% 0`,L.animationValues?S.opacity=L===this?(y=(p=F.opacity)!==null&&p!==void 0?p:this.latestValues.opacity)!==null&&y!==void 0?y:1:this.preserveOpacity?this.latestValues.opacity:F.opacityExit:S.opacity=L===this?F.opacity!==void 0?F.opacity:"":F.opacityExit!==void 0?F.opacityExit:0;for(const W in scaleCorrectors){if(F[W]===void 0)continue;const{correct:nt,applyTo:Pe}=scaleCorrectors[W],se=S.transform==="none"?F[W]:nt(F[W],L);if(Pe){const mt=Pe.length;for(let kt=0;kt<mt;kt++)S[Pe[kt]]=se}else S[W]=se}return this.options.layoutId&&(S.pointerEvents=L===this?resolveMotionValue(h==null?void 0:h.pointerEvents)||"":"none"),S}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(L=>{const F=h?o.measuredBox[L]:o.layoutBox[L],N=calcLength(F);F.min=s[L].min,F.max=F.min+N}):shouldAnimatePositionOnly(d,o.layoutBox,s)&&eachAxis(L=>{const F=h?o.measuredBox[L]:o.layoutBox[L],N=calcLength(s[L]);F.max=F.min+N,t.relativeTarget&&!t.currentAnimation&&(t.isProjectionDirty=!0,t.relativeTarget[L].max=t.relativeTarget[L].min+N)});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 S=!isDeltaZero(p);let P=!1;if(!t.resumeFrom){const L=t.getClosestProjectingParent();if(L&&!L.resumeFrom){const{snapshot:F,layout:N}=L;if(F&&N){const z=createBox();calcRelativePosition(z,o.layoutBox,F.layoutBox);const W=createBox();calcRelativePosition(W,s,N.layoutBox),boxEqualsRounded(z,W)||(P=!0),L.options.layoutRoot&&(t.relativeTarget=W,t.relativeTargetOrigin=z,t.relativeParent=L)}}}t.notifyListeners("didUpdate",{layout:s,snapshot:o,delta:y,layoutDelta:p,hasLayoutChanged:S,hasRelativeTargetChanged:P})}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=(F,N,z,W)=>new this.KeyframeResolver(F,N,z,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:S}=h;this.latestValues=y,this.baseTarget={...y},this.initialValues=o.initial?{...y}:{},this.renderState=S,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:P,...L}=this.scrapeMotionValuesFromProps(o,{},this);for(const F in L){const N=L[F];y[F]!==void 0&&isMotionValue(N)&&(N.set(y[F],!1),isWillChangeMotionValue(P)&&P.add(F))}}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 S=featureNames[y],{isEnabled:P,Feature:L,ProjectionNode:F,MeasureLayout:N}=featureDefinitions[S];F&&(h=F),P(o)&&(!this.features[S]&&L&&(this.features[S]=new L(this)),N&&(p=N))}if((this.type==="html"||this.type==="svg")&&!this.projection&&h){this.projection=new h(this.latestValues,getClosestProjectingNode(this.parent));const{layoutId:y,layout:S,drag:P,dragConstraints:L,layoutScroll:F,layoutRoot:N}=o;this.projection.setOptions({layoutId:y,layout:S,alwaysMeasureLayout:!!P||L&&isRefObject(L),visualElement:this,scheduleRender:()=>this.scheduleRender(),animationType:typeof S=="string"?S:"both",initialPromotionConfig:d,layoutScroll:F,layoutRoot:N})}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:S,isPositionVisible:P}=useContext(),L=React.useRef(null);usePreRender(()=>{if(L.current==null)return;let N;try{const se=p==null?void 0:p([c.x,c.y,c.z]);N=new Cartesian2(se==null?void 0:se[0],se==null?void 0:se[1])}catch{h.set("none");return}const z=y==null?void 0:y();if(!z)return;const W=S==null?void 0:S(z==null?void 0:z.lng,z==null?void 0:z.lat,z==null?void 0:z.height);if(!W)return;if(occluder.cameraPosition=new Cartesian3(W[0],W[1],W[2]),N==null||N.x<0||N.y<0||N.x>window.innerWidth||N.y>window.innerHeight||!(P!=null&&P([c.x,c.y,c.z]))){h.set("none");return}const nt=`calc(${N.x}px - 50%)`,Pe=`calc(${N.y}px - 50%)`;d.set(`translate(${nt}, ${Pe})`),h.set("block")});const F=useMergeRefs([L,s]);return jsxRuntimeExports.jsx(motion.div,{ref:F,...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:S})=>{const P=t[t.length-1],L=d?new Cartesian3(...d):void 0,F=h?new Cartesian3(...h):void 0,N=p?new Cartesian3(...p):void 0;return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[L&&jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:L,isEditing:c,isExtrudedControlPoint:!0,handleControlPointMouseEvent:S}),(!c||y)&&jsxRuntimeExports.jsx(ExtrudedMeasurement,{a:P,b:L,extrudedHeight:o,color:c?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):s,showLine:n!=="extrudedPolygon"})]}),F&&jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:F,isEditing:c,isExtrudedControlPoint:!0}),N&&jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:N,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)),S=React.useRef(o);S.current=o;const L=useConstant$2(()=>new CallbackProperty(()=>S.current,!1)),F=React.useMemo(()=>({polygon:{hierarchy:y,heightReference:HeightReference$1.RELATIVE_TO_TERRAIN,extrudedHeight:L,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}}),[L,c,y,s,d]),{requestRender:N}=useContext();return N==null||N(),jsxRuntimeExports.jsx(Entity,{id:t,...F})},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,S,P]=n,L=Cartesian3.midpoint(y,S,cartesianScratch1);p.push({points:[L,P],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,S,P]=n,L=Cartesian3.midpoint(y,S,cartesianScratch1);p.push({points:[L,P],showLine:!0})}break;default:p.push({points:n.slice(-2),showLine:t==="circle"});break}return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[n.map((y,S)=>jsxRuntimeExports.jsx(ControlPoint,{position:y,index:S,isSelected:d===S,clampToGround:!0,isEditing:s,handleControlPointMouseEvent:h},S)),p.map(({points:y,showLine:S},P)=>jsxRuntimeExports.jsx(SurfaceMeasurement,{a:y[0],b:y[1],color:s?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):o,showLine:S},P))]})});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:S,selectedControlPointIndex:P,handleControlPointMouseEvent:L,handleAddControlPoint:F})=>{const N=React.useMemo(()=>t?{...t,controlPoints:t==null?void 0:t.controlPoints.map(se=>new Cesium$1.Cartesian3(...se))}:null,[t]),z=React.useMemo(()=>N?createGeometry(N):null,[N]),{positionsArray:W,hierarchyArray:nt}=React.useMemo(()=>(z==null?void 0:z.type)==="Point"?{}:(z==null?void 0:z.type)==="LineString"?{positionsArray:convertGeometryToPositionsArray(z)}:z!=null?{positionsArray:convertGeometryToPositionsArray(z),hierarchyArray:convertPolygonToHierarchyArray(z)}:{},[z]),Pe=React.useMemo(()=>Color$1.fromCssColorString(s??DEFAULT_SKETCH_COLOR),[s]);return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[W==null?void 0:W.map((se,mt)=>jsxRuntimeExports.jsx(PolylineEntity,{dynamic:!0,positions:se,color:Pe,isEditing:c},mt)),nt==null?void 0:nt.map((se,mt)=>jsxRuntimeExports.jsx(PolygonEntity,{dynamic:!0,hierarchy:se,color:Pe},mt)),N!=null&&(!n||c)&&jsxRuntimeExports.jsx(SurfaceControlPoints,{geometryOptions:N,color:Pe,isEditing:c,catchedControlPointIndex:y,selectedControlPointIndex:P,handleControlPointMouseEvent:L}),N!=null&&c&&jsxRuntimeExports.jsx(SurfaceAddingPoints,{geometryOptions:N,isEditing:c,handleAddControlPoint:F}),N!=null&&n&&jsxRuntimeExports.jsx(ExtrudedControlPoints,{geometryOptions:N,extrudedHeight:n,extrudedPoint:d,centroidBasePoint:h,centroidExtrudedPoint:p,catchedExtrudedPoint:S,color:Pe,isEditing:c,handleControlPointMouseEvent:L}),n&&(nt==null?void 0:nt.map((se,mt)=>jsxRuntimeExports.jsx(ExtrudedPolygonEntity,{hierarchy:se,extrudedHeight:n,disableShadow:o,color:Pe,isEditing:c},mt)))]})});SketchComponent.displayName="SketchComponent";const Cesium=({className:t,style:n,property:o,time:s,camera:c,small:d,ready:h,children:p,selectedLayerId:y,isLayerDraggable:S,isLayerDragging:P,shouldRender:L,layerSelectionReason:F,meta:N,displayCredits:z,layersRef:W,featureFlags:nt,requestingRenderMode:Pe,timelineManagerRef:se,cameraForceHorizontalRoll:mt,onLayerSelect:kt,onCameraChange:mn,onLayerDrag:_i,onLayerDrop:zi,onLayerEdit:Sa,onLayerSelectWithRectStart:fa,onLayerSelectWithRectMove:La,onLayerSelectWithRectEnd:Ra,onMount:ma,onLayerVisibility:yt,onLayerLoad:lt,onCreditsUpdate:pi},ba)=>{var gd,pd,Zd,cf,sf,nf,df,Cf,mf,Sf,Pf,Af,Hf,_f,wf,Yf,Nf,vf,Ff,Xf,Wf,Qf,_m,Bf,$m,qf,qm,ep,Tf,rf,bf,If,Uf,jf,jm,sp,cp,fp,mp,al,tf,lf;const{cesium:Sc,mouseEventHandles:ms,cesiumIonAccessToken:Xs,context:Nl,layerSelectWithRectEventHandlers:pu,sceneLight:yu,sceneBackgroundColor:Ru,sceneMsaaSamples:Vd,sceneMode:Gd,cameraViewBoundaries:uf,cameraViewOuterBoundaries:ff,cameraViewBoundariesMaterial:pf,handleCameraChange:hf,handleCameraMoveEnd:of,handleUpdate:gf,handleClick:Ef,handleMount:xf,handleUnmount:Wa,handleTilesChange:af,handleTerrainProviderChange:Xd}=useHooks$1({ref:ba,property:o,time:s,selectedLayerId:y,selectionReason:F,meta:N,layersRef:W,featureFlags:nt,timelineManagerRef:se,isLayerDraggable:S,isLayerDragging:P,shouldRender:L,requestingRenderMode:Pe,camera:c,cameraForceHorizontalRoll:mt,onLayerDrag:_i,onLayerDrop:zi,onLayerSelect:kt,onLayerEdit:Sa,onLayerSelectWithRectStart:fa,onLayerSelectWithRectMove:La,onLayerSelectWithRectEnd:Ra,onLayerVisibility:yt,onLayerLoad:lt,onCameraChange:mn,onMount:ma,onCreditsUpdate:pi});return jsxRuntimeExports.jsxs(Aa$1,{ref:Sc,onUpdate:gf,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:z?void 0:creditContainer,style:{width:d?"300px":"auto",height:d?"300px":"100%",display:h?void 0:"none",cursor:P?"grab":void 0,...n},shadows:!!((pd=(gd=o==null?void 0:o.scene)==null?void 0:gd.shadow)!=null&&pd.enabled),onClick:Ef,onDoubleClick:ms.doubleClick,onMouseDown:ms.mouseDown,onMouseUp:ms.mouseUp,onRightClick:ms.rightClick,onRightDown:ms.rightDown,onRightUp:ms.rightUp,onMiddleClick:ms.middleClick,onMiddleDown:ms.middleDown,onMiddleUp:ms.middleUp,onMouseMove:ms.mouseMove,onMouseEnter:ms.mouseEnter,onMouseLeave:ms.mouseLeave,onWheel:ms.wheel,children:[jsxRuntimeExports.jsx(Event,{onMount:xf,onUnmount:Wa}),jsxRuntimeExports.jsx(ReearthClock,{timelineManagerRef:se}),jsxRuntimeExports.jsx(ImageryLayers,{tiles:o==null?void 0:o.tiles,cesiumIonAccessToken:Xs,onTilesChange:af}),jsxRuntimeExports.jsx(LabelImageryLayers,{tileLabels:o==null?void 0:o.tileLabels}),jsxRuntimeExports.jsx(Indicator,{property:o,timelineManagerRef:se}),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:pu.start.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_DOWN,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:pu.start.shift}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE,action:pu.move.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:pu.move.shift}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_UP,action:pu.end.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_UP,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:pu.end.shift})]}),jsxRuntimeExports.jsx(Ta$1,{maximumZoomDistance:(cf=(Zd=o==null?void 0:o.camera)==null?void 0:Zd.limiter)!=null&&cf.enabled?((df=(nf=(sf=o.camera)==null?void 0:sf.limiter)==null?void 0:nf.targetArea)==null?void 0:df.height)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,enableCollisionDetection:!((Cf=o==null?void 0:o.camera)!=null&&Cf.allowEnterGround)}),jsxRuntimeExports.jsx(Ps$1,{percentageChanged:.2,onChange:hf,onMoveEnd:of}),uf&&((Sf=(mf=o==null?void 0:o.camera)==null?void 0:mf.limiter)==null?void 0:Sf.showHelper)&&jsxRuntimeExports.jsx(Is$1,{children:jsxRuntimeExports.jsx(ua$1,{positions:uf,width:1,material:Cesium$1.Color.RED,arcType:Cesium$1.ArcType.RHUMB})}),ff&&((Af=(Pf=o==null?void 0:o.camera)==null?void 0:Pf.limiter)==null?void 0:Af.showHelper)&&jsxRuntimeExports.jsx(Is$1,{children:jsxRuntimeExports.jsx(ua$1,{positions:ff,width:1,material:pf,arcType:Cesium$1.ArcType.RHUMB})}),jsxRuntimeExports.jsx($a$1,{backgroundColor:Ru,light:yu,mode:Gd,msaaSamples:Vd,useDepthPicking:!1,useWebVR:!!((Hf=o==null?void 0:o.scene)!=null&&Hf.vr)||void 0,debugShowFramesPerSecond:!!((_f=o==null?void 0:o.debug)!=null&&_f.showFramesPerSecond),verticalExaggerationRelativeHeight:(wf=o==null?void 0:o.scene)==null?void 0:wf.verticalExaggerationRelativeHeight,verticalExaggeration:(Yf=o==null?void 0:o.scene)==null?void 0:Yf.verticalExaggeration}),jsxRuntimeExports.jsx(Oa$1,{show:((vf=(Nf=o==null?void 0:o.sky)==null?void 0:Nf.skyBox)==null?void 0:vf.show)??!0}),jsxRuntimeExports.jsx(Vs,{enabled:((Xf=(Ff=o==null?void 0:o.sky)==null?void 0:Ff.fog)==null?void 0:Xf.enabled)??!0,density:(Qf=(Wf=o==null?void 0:o.sky)==null?void 0:Wf.fog)==null?void 0:Qf.density}),jsxRuntimeExports.jsx(Ga$1,{show:((Bf=(_m=o==null?void 0:o.sky)==null?void 0:_m.sun)==null?void 0:Bf.show)??!0}),jsxRuntimeExports.jsx(ea,{show:((qf=($m=o==null?void 0:o.sky)==null?void 0:$m.moon)==null?void 0:qf.show)??!0}),jsxRuntimeExports.jsx(_a$2,{show:((ep=(qm=o==null?void 0:o.sky)==null?void 0:qm.skyAtmosphere)==null?void 0:ep.show)??!0,atmosphereLightIntensity:(rf=(Tf=o==null?void 0:o.sky)==null?void 0:Tf.skyAtmosphere)==null?void 0:rf.lightIntensity,saturationShift:(If=(bf=o==null?void 0:o.sky)==null?void 0:bf.skyAtmosphere)==null?void 0:If.saturationShift,brightnessShift:(jf=(Uf=o==null?void 0:o.sky)==null?void 0:Uf.skyAtmosphere)==null?void 0:jf.brightnessShift}),jsxRuntimeExports.jsx(Globe,{property:o,cesiumIonAccessToken:Xs,onTerrainProviderChange:Xd}),jsxRuntimeExports.jsx(context.Provider,{value:Nl,children:h?p:null}),jsxRuntimeExports.jsx(AmbientOcclusion,{...AMBIENT_OCCLUSION_QUALITY[((sp=(jm=o==null?void 0:o.render)==null?void 0:jm.ambientOcclusion)==null?void 0:sp.quality)||"low"],enabled:!!((fp=(cp=o==null?void 0:o.render)==null?void 0:cp.ambientOcclusion)!=null&&fp.enabled),intensity:((al=(mp=o==null?void 0:o.render)==null?void 0:mp.ambientOcclusion)==null?void 0:al.intensity)??100,outputType:(lf=(tf=o==null?void 0:o.render)==null?void 0:tf.ambientOcclusion)!=null&&lf.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.39",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 S,P;const[h]=d;let p,y;if(h.contentBoxSize){const L=Array.isArray(h.contentBoxSize)?h.contentBoxSize[0]:h.contentBoxSize;p=L.inlineSize,y=L.blockSize}else h.contentRect?(p=h.contentRect.width,y=h.contentRect.height):(p=(S=t.current)==null?void 0:S.clientWidth,y=(P=t.current)==null?void 0:P.clientHeight);s(L=>({width:p,height:y,isMobile:p?p<=viewportMobileMaxWidth:void 0,query:L.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:S},P){const L=React.useRef(null);React.useImperativeHandle(P,()=>L.current,[]);const F=React.useRef(null),N=useViewport({wrapperRef:F}),[z,W]=React.useState({}),[nt,Pe]=React.useState(),[se,mt]=React.useState(),kt=React.useCallback(async(_f,wf,Yf,Nf,vf)=>{var Qf,_m,Bf,$m,qf,qm,ep,Tf,rf,bf,If;const Ff=((Qf=z.layer)==null?void 0:Qf.layer.type)==="simple"&&(($m=(Bf=(_m=z.layer)==null?void 0:_m.layer)==null?void 0:Bf.data)==null?void 0:$m.isSketchLayer);if(z.layerId===_f&&z.featureId===wf&&!Ff)return;const Xf=await(Yf==null?void 0:Yf()),Wf=_f&&wf?(Ff?(qf=Xf==null?void 0:Xf.features)==null?void 0:qf.find(Uf=>Uf.id===wf):(Tf=(qm=L.current)==null?void 0:(ep=qm.engine).findComputedFeatureById)==null?void 0:Tf.call(ep,_f,wf))??(vf==null?void 0:vf.feature):void 0;Pe(_f&&wf?(If=(rf=L.current)==null?void 0:(bf=rf.engine).findFeatureById)==null?void 0:If.call(bf,_f,wf):void 0),mt(Wf),W(Uf=>Uf.layerId===_f&&Uf.featureId===wf?Uf:{layerId:_f,featureId:wf,layer:Xf,reason:Nf}),c==null||c(_f,Yf,Wf,Nf)},[z,c]),mn=React.useRef(),[_i,zi]=useValue(t,d),[Sa,fa]=React.useState(!1),La=React.useCallback(_f=>{fa(!!_f)},[]),[Ra,ma]=useValue(n||"default",h);React.useEffect(()=>{var _f,wf;Ra==="default"&&((wf=(_f=L==null?void 0:L.current)==null?void 0:_f.engine)==null||wf.setCursor("auto"))},[Ra]);const yt=INTERACTION_MODES[Ra??"default"],lt=React.useRef(),pi=React.useCallback(_f=>{lt.current=_f},[]),ba=React.useCallback(_f=>{var wf;(wf=lt.current)==null||wf.call(lt,_f)},[]),Sc=React.useRef(),ms=React.useCallback(_f=>{Sc.current=_f},[]),Xs=React.useCallback(_f=>{var wf;(wf=Sc.current)==null||wf.call(Sc,_f)},[]),Nl=React.useRef(),pu=React.useCallback(_f=>{Nl.current=_f},[]),yu=React.useCallback(_f=>{var wf;(wf=Nl.current)==null||wf.call(Nl,_f)},[]),Ru=React.useRef(),Vd=React.useCallback(_f=>{Ru.current=_f},[]),Gd=React.useCallback(_f=>{var wf;(wf=Ru.current)==null||wf.call(Ru,_f)},[]),uf=React.useRef(),ff=React.useCallback(_f=>{uf.current=_f},[]),pf=React.useCallback(_f=>{var wf;(wf=uf.current)==null||wf.call(uf,_f)},[]),hf=React.useRef(),of=React.useCallback(_f=>{hf.current=_f},[]),gf=React.useCallback(_f=>{var wf;(wf=hf.current)==null||wf.call(hf,_f)},[]),Ef=React.useRef([]),xf=React.useCallback(_f=>{Ef.current.push(_f)},[]),Wa=React.useCallback(_f=>{Ef.current.forEach(wf=>wf(_f))},[]),af=React.useRef([]),Xd=React.useCallback(_f=>{af.current.push(_f)},[]),gd=React.useCallback(_f=>{af.current.forEach(wf=>wf(_f))},[]),pd=React.useRef([]),Zd=React.useCallback(_f=>{pd.current.push(_f)},[]),cf=React.useCallback(_f=>{pd.current.forEach(wf=>wf(_f))},[]),sf=React.useRef([]),nf=React.useCallback(_f=>{sf.current.push(_f)},[]),df=React.useCallback((_f,wf)=>{sf.current.forEach(Yf=>Yf(_f)),S==null||S(_f,wf)},[S]);React.useEffect(()=>{var _f,wf;o&&((wf=(_f=L.current)==null?void 0:_f.engine)==null||wf.lookAtLayer(o),p==null||p(void 0))},[o,p]);const[Cf,mf]=React.useState(!1),Sf=React.useCallback(()=>{mf(!0)},[]),Pf=React.useCallback((_f,wf,Yf)=>{var Ff;mf(!1);const Nf=(Ff=L.current)==null?void 0:Ff.layers.findById(_f),vf=Nf!=null&&Nf.property.default.location?"default.location":Nf!=null&&Nf.property.default.position?"default.position":void 0;Yf&&Nf&&Nf.propertyId&&vf&&(y==null||y(Nf.propertyId,vf,Yf))},[y,L]),Af=React.useMemo(()=>({interactionMode:Ra,selectedLayer:z,selectedComputedFeature:se,viewport:N,handleCameraForceHorizontalRollChange:La,handleInteractionModeChange:ma,onSketchPluginFeatureCreate:xf,onSketchPluginFeatureUpdate:Xd,onSketchPluginFeatureDelete:Zd,onSketchTypeChange:nf,onLayerVisibility:ms,onLayerLoad:pu,onLayerEdit:pi,onLayerSelectWithRectStart:Vd,onLayerSelectWithRectMove:ff,onLayerSelectWithRectEnd:of}),[Ra,z,se,N,ma,La,pi,xf,Xd,Zd,nf,ms,pu,Vd,ff,of]),Hf=React.useMemo(()=>({position:"relative",width:"100%",height:"100%",overflow:"hidden"}),[]);return useCoreAPI({viewerProperty:s}),{mapRef:L,wrapperRef:F,selectedFeature:nt,camera:_i,featureFlags:yt,isLayerDragging:Cf,timelineManagerRef:mn,cameraForceHorizontalRoll:Sa,coreContextValue:Af,containerStyle:Hf,overriddenInteractionMode:Ra,handleLayerSelect:kt,handleLayerDrag:Sf,handleLayerDrop:Pf,handleLayerEdit:ba,handleCameraChange:zi,handleInteractionModeChange:ma,handleSketchPluginFeatureCreate:Wa,handleSketchPluginFeatureUpdate:gd,handleSketchPluginFeatureDelete:cf,handleSketchTypeChange:df,handleLayerVisibility:Xs,handleLayerLoad:yu,handleLayerSelectWithRectStart:Gd,handleLayerSelectWithRectMove:pf,handleLayerSelectWithRectEnd:gf}}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:S,time:P,interactionMode:L,shouldRender:F,meta:N,displayCredits:z=!0,style:W,zoomedLayerId:nt,children:Pe,onLayerDrop:se,onLayerSelect:mt,onCameraChange:kt,onZoomToLayer:mn,onInteractionModeChange:_i,onMount:zi,onSketchTypeChangeProp:Sa,onSketchFeatureCreate:fa,onSketchFeatureUpdate:La,onSketchFeatureDelete:Ra,onAPIReady:ma,onCreditsUpdate:yt},lt)=>{const{mapRef:pi,wrapperRef:ba,selectedFeature:Sc,camera:ms,featureFlags:Xs,isLayerDragging:Nl,timelineManagerRef:pu,cameraForceHorizontalRoll:yu,coreContextValue:Ru,containerStyle:Vd,overriddenInteractionMode:Gd,handleLayerSelect:uf,handleLayerDrag:ff,handleLayerDrop:pf,handleLayerEdit:hf,handleCameraChange:of,handleInteractionModeChange:gf,handleSketchPluginFeatureCreate:Ef,handleSketchPluginFeatureUpdate:xf,handleSketchPluginFeatureDelete:Wa,handleSketchTypeChange:af,handleLayerVisibility:Xd,handleLayerLoad:gd,handleLayerSelectWithRectStart:pd,handleLayerSelectWithRectMove:Zd,handleLayerSelectWithRectEnd:cf}=useHooks({camera:S,interactionMode:L,zoomedLayerId:nt,viewerProperty:s,onLayerSelect:mt,onCameraChange:kt,onZoomToLayer:mn,onLayerDrop:se,onInteractionModeChange:_i,onSketchTypeChangeProp:Sa},lt);return jsxRuntimeExports.jsx(ErrorBoundary,{FallbackComponent:Error$1,children:jsxRuntimeExports.jsx(VisualizerProvider,{mapRef:pi,children:jsxRuntimeExports.jsxs("div",{ref:ba,style:Vd,children:[jsxRuntimeExports.jsx(Map$1,{ref:pi,isBuilt:n,isEditable:o,engine:t,layers:c,engines,camera:ms,cameraForceHorizontalRoll:yu,clusters:d,hiddenLayers:y,isLayerDragging:Nl,isLayerDraggable:o,meta:N,displayCredits:z,style:W,featureFlags:Xs,shouldRender:F,property:s,time:P,small:h,ready:p,timelineManagerRef:pu,interactionMode:Gd,selectedFeature:Sc,onCameraChange:of,onLayerDrag:ff,onLayerDrop:pf,onLayerSelect:uf,onLayerEdit:hf,overrideInteractionMode:gf,onSketchFeatureCreate:fa,onSketchPluginFeatureCreate:Ef,onSketchFeatureUpdate:La,onSketchPluginFeatureUpdate:xf,onSketchFeatureDelete:Ra,onSketchPluginFeatureDelete:Wa,onSketchTypeChange:af,onMount:zi,onLayerVisibility:Xd,onLayerLoad:gd,onLayerSelectWithRectStart:pd,onLayerSelectWithRectMove:Zd,onLayerSelectWithRectEnd:cf,onAPIReady:ma,onCreditsUpdate:yt}),jsxRuntimeExports.jsx(coreContext.Provider,{value:Ru,children:Pe})]})})})}));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,S=y>>1,P=-7,L=o?c-1:0,F=o?-1:1,N=t[n+L];for(L+=F,d=N&(1<<-P)-1,N>>=-P,P+=p;P>0;d=d*256+t[n+L],L+=F,P-=8);for(h=d&(1<<-P)-1,d>>=-P,P+=s;P>0;h=h*256+t[n+L],L+=F,P-=8);if(d===0)d=1-S;else{if(d===y)return h?NaN:(N?-1:1)*(1/0);h=h+Math.pow(2,s),d=d-S}return(N?-1:1)*h*Math.pow(2,d-s)}function write(t,n,o,s,c,d){var h,p,y,S=d*8-c-1,P=(1<<S)-1,L=P>>1,F=c===23?Math.pow(2,-24)-Math.pow(2,-77):0,N=s?0:d-1,z=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=P):(h=Math.floor(Math.log(n)/Math.LN2),n*(y=Math.pow(2,-h))<1&&(h--,y*=2),h+L>=1?n+=F/y:n+=F*Math.pow(2,1-L),n*y>=2&&(h++,y/=2),h+L>=P?(p=0,h=P):h+L>=1?(p=(n*y-1)*Math.pow(2,c),h=h+L):(p=n*Math.pow(2,L-1)*Math.pow(2,c),h=0));c>=8;t[o+N]=p&255,N+=z,p/=256,c-=8);for(h=h<<c|p,S+=c;S>0;t[o+N]=h&255,N+=z,h/=256,S-=8);t[o+N-z]|=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),S=this.slice(c,d),P=n.slice(o,s),L=0;L<y;++L)if(S[L]!==P[L]){h=S[L],p=P[L];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(N,z){return d===1?N[z]:N.readUInt16BE(z*d)}var S;if(c){var P=-1;for(S=o;S<h;S++)if(y(t,S)===y(n,P===-1?0:S-P)){if(P===-1&&(P=S),S-P+1===p)return P*d}else P!==-1&&(S-=S-P),P=-1}else for(o+p>h&&(o=h-p),S=o;S>=0;S--){for(var L=!0,F=0;F<p;F++)if(y(t,S+F)!==y(n,F)){L=!1;break}if(L)return S}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,S,P,L;switch(p){case 1:d<128&&(h=d);break;case 2:y=t[c+1],(y&192)===128&&(L=(d&31)<<6|y&63,L>127&&(h=L));break;case 3:y=t[c+1],S=t[c+2],(y&192)===128&&(S&192)===128&&(L=(d&15)<<12|(y&63)<<6|S&63,L>2047&&(L<55296||L>57343)&&(h=L));break;case 4:y=t[c+1],S=t[c+2],P=t[c+3],(y&192)===128&&(S&192)===128&&(P&192)===128&&(L=(d&15)<<18|(y&63)<<12|(S&63)<<6|P&63,L>65535&&L<1114112&&(h=L))}}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,S=n==="error";if(p=this._events,p)S=S&&p.error==null;else if(!S)return!1;if(y=this.domain,S){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 P=new Error('Uncaught, unspecified "error" event. ('+o+")");throw P.context=o,P}return!1}if(s=p[n],!s)return!1;var L=typeof s=="function";switch(c=arguments.length,c){case 1:emitNone(s,L,this);break;case 2:emitOne(s,L,this,arguments[1]);break;case 3:emitTwo(s,L,this,arguments[1],arguments[2]);break;case 4:emitThree(s,L,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,L,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&&currentQueue[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="",S=!1,P=["{","}"];if(isArray(n)&&(S=!0,P=["[","]"]),isFunction(n)){var L=n.name?": "+n.name:"";y=" [Function"+L+"]"}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&&(!S||n.length==0))return P[0]+y+P[1];if(o<0)return isRegExp(n)?t.stylize(RegExp.prototype.toString.call(n),"regexp"):t.stylize("[Object]","special");t.seen.push(n);var F;return S?F=formatArray(t,n,o,h,d):F=d.map(function(N){return formatProperty(t,n,o,h,N,S)}),t.seen.pop(),reduceToSingleString(F,y,P)}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(P,["color","frustumLength","blackPoint","whitePoint","gamma"]),globeDepthTexture:()=>(y==null?void 0:y())??F._depthTexture}});if(c){const N=createBilateralFilterStage({prefix:t,outputType:h,useGlobeDepth:p,getGlobeDepthTexture:y,uniforms:{textureScale:n,...pick(P,["frustumLength","normalExponent","depthExponent"])}}),z=new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion_generate_and_filter`,stages:[L,N]});return F.uniforms.ambientOcclusionTexture=z.name,new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion`,stages:[z,F],inputPreviousStageTexture:!1,uniforms:createUniforms([{stage:L,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:N,uniforms:["frustumLength","normalExponent","depthExponent"]},{stage:F,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}else return F.uniforms.ambientOcclusionTexture=L.name,new Cesium$1.PostProcessStageComposite({name:`${t}_ambient_occlusion`,stages:[L,F],inputPreviousStageTexture:!1,uniforms:createUniforms([{stage:L,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:F,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:S}=$e$1(),P=S==null?void 0:S.scene,L=useInstance({owner:P==null?void 0:P.postProcessStages,keys:[n,s,o,c,d,h,p],create:()=>{const F=createAmbientOcclusionStage({textureScale:n,steps:s,directions:o,denoise:c,accurateNormalReconstruction:d,outputType:h,useGlobeDepth:p,getGlobeDepthTexture:()=>P.context.uniformState.globeDepthTexture,uniforms:y});return F.enabled=t,F},transferOwnership:(F,N)=>(N==null||N.add(F),()=>{N==null||N.remove(F)})});return L.enabled=t,Object.assign(L.uniforms,y),P==null||P.requestRender(),usePreRender(()=>{const F=P==null?void 0:P.camera.frustum;if(F instanceof Cesium$1.PerspectiveFrustum){const N=1/Math.tan(F.fovy/2);L.uniforms.focalLength.x=N*F.aspectRatio,L.uniforms.focalLength.y=N}}),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 S=useConstant$2(()=>new CallbackProperty((N,z)=>"getValue"in y.current?y.current.getValue(N,z):y.current,!1)),P=React.useMemo(()=>({position:S,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,S,d,s,c]),L=React.useCallback(()=>{p==null||p(o,!!h,"mousedown")},[o,h,p]),F=React.useCallback(()=>{p==null||p(o,!!h,"click")},[o,h,p]);return jsxRuntimeExports.jsx(Is$1,{...P,onMouseDown:L,onClick:F})};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,S=!1,P=!1)=>{const L=P&&c,F=L?n:o;return S&&h.add(y),F.add(y)&&L&&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 S=0;S<s;S++){const P=n.order[S];h.has(P)&&(p.schedule(P),t()),P(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((L,F)=>(L[F]=createRenderStep(()=>o=!0),L),{}),h=L=>{d[L].process(c)},p=()=>{const L=performance.now();o=!1,c.delta=s?1e3/60:Math.max(Math.min(L-c.timestamp,maxElapsed),1),c.timestamp=L,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((L,F)=>{const N=d[F];return L[F]=(z,W=!1,nt=!1)=>(o||y(),N.schedule(z,W,nt)),L},{}),cancel:L=>stepsOrder.forEach(F=>d[F].cancel(L)),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 S=y.current;React.useInsertionEffect(()=>{S&&S.update(o,h)});const P=React.useRef(!!(o[optimizedAppearDataAttribute]&&!window.HandoffComplete));return useIsomorphicLayoutEffect$1(()=>{S&&(microtask.postRender(S.render),P.current&&S.animationState&&S.animationState.animateChanges())}),React.useEffect(()=>{S&&(S.updateFeatures(),!P.current&&S.animationState&&S.animationState.animateChanges(),P.current&&(P.current=!1,window.HandoffComplete=!0))}),S}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 S;const P={...React.useContext(MotionConfigContext),...p,layoutId:useLayoutId(p)},{isStatic:L}=P,F=useCreateMotionContext(p),N=s(p,L);if(!L&&isBrowser){F.visualElement=useVisualElement(c,N,P,n);const z=React.useContext(SwitchLayoutGroupContext),W=React.useContext(LazyContext).strict;F.visualElement&&(S=F.visualElement.loadFeatures(P,W,t,z))}return React__namespace.createElement(MotionContext.Provider,{value:F},S&&F.visualElement?React__namespace.createElement(S,{visualElement:F.visualElement,...P}):null,o(c,p,useMotionRef(N,F.visualElement,y),N,L,F.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,S=!1,P=!0;for(const L in n){const F=n[L];if(isCSSVariableName(L)){d[L]=F;continue}const N=numberValueTypes[L],z=getValueAsType(F,N);if(transformProps.has(L)){if(y=!0,h[L]=z,!P)continue;F!==(N.default||0)&&(P=!1)}else L.startsWith("origin")?(S=!0,p[L]=z):c[L]=z}if(n.transform||(y||s?c.transform=buildTransform(t.transform,o,P,s):c.transform&&(c.transform="none")),S){const{originX:L="50%",originY:F="50%",originZ:N=0}=p;c.transformOrigin=`${L} ${F} ${N}`}}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,...S},P,L,F){if(buildHTMLStyles(t,S,P,F),L){t.style.viewBox&&(t.attrs.viewBox=t.style.viewBox);return}t.attrs=t.style,t.style={};const{attrs:N,style:z,dimensions:W}=t;N.transform&&(W&&(z.transform=N.transform),delete N.transform),W&&(c!==void 0||d!==void 0||z.transform)&&(z.transformOrigin=calcSVGTransformOrigin(W,c!==void 0?c:.5,d!==void 0?d:.5)),n!==void 0&&(N.x=n),o!==void 0&&(N.y=o),s!==void 0&&(N.scale=s),h!==void 0&&buildSVGPath(N,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),S=filterProps(s,typeof o=="string",t),P=o!==React.Fragment?{...S,...y,ref:c}:{},{children:L}=s,F=React.useMemo(()=>isMotionValue(L)?L.get():L,[L]);return React.createElement(o,{...P,children:F})}}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 F in d)c[F]=resolveMotionValue(d[F]);let{initial:h,animate:p}=t;const y=isControllingVariants(t),S=isVariantNode(t);n&&S&&!y&&t.inherit!==!1&&(h===void 0&&(h=n.initial),p===void 0&&(p=n.animate));let P=o?o.initial===!1:!1;P=P||h===!1;const L=P?p:h;return L&&typeof L!="boolean"&&!isAnimationControls(L)&&(Array.isArray(L)?L:[L]).forEach(N=>{const z=resolveVariantFromProps(t,N);if(!z)return;const{transitionEnd:W,transition:nt,...Pe}=z;for(const se in Pe){let mt=Pe[se];if(Array.isArray(mt)){const kt=P?mt.length-1:0;mt=mt[kt]}mt!==null&&(c[se]=mt)}for(const se in W)c[se]=W[se]}),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:S,onTapCancel:P,globalTapTarget:L}=this.node.getProps();!L&&!isNodeOrChild(this.node.current,p.target)?P&&P(p,y):S&&S(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,S)=>{const{onTap:P}=this.node.getProps();P&&P(y,S)})};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:S}=y;if(this.isInView===S||(this.isInView=S,d&&!S&&this.hasEnteredView))return;S&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",S);const{onViewportEnter:P,onViewportLeave:L}=this.node.getProps(),F=S?P:L;F&&F(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:S,...P}){return!!Object.keys(P).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 S=n[y];if(typeof S=="string"&&isCSSVariableToken(S)){const P=getVariableValue(S,o.current);P!==void 0&&(n[y]=P)}}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 S=n[y];typeof S=="string"&&(n[y]=parseFloat(S))}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,S])=>{o.getValue(y).set(S)}),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:S}=this.options;if(!S&&!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 P=this.initPlayback(n,o);P!==!1&&(this._resolved={keyframes:n,finalKeyframe:o,...P},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=S=>{const P=S*h,L=P*t,F=P-o,N=calcAngularFreq(S,h),z=Math.exp(-L);return safeMin-F/N*z},d=S=>{const L=S*h*t,F=L*o+o,N=Math.pow(h,2)*Math.pow(S,2)*t,z=Math.exp(-L),W=calcAngularFreq(Math.pow(S,2),h);return(-c(S)+safeMin>0?-1:1)*((F-N)*z)/W}):(c=S=>{const P=Math.exp(-S*t),L=(S-o)*t+1;return-.001+P*L},d=S=>{const P=Math.exp(-S*t),L=(o-S)*(t*t);return P*L});const p=5/t,y=approximateRoot(c,d,p);if(t=secondsToMilliseconds(t),isNaN(y))return{stiffness:100,damping:10,duration:t};{const S=Math.pow(y,2)*s;return{stiffness:S,damping:h*2*Math.sqrt(s*S),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:S,duration:P,velocity:L,isResolvedFromDuration:F}=getSpringOptions({...s,velocity:-millisecondsToSeconds(s.velocity||0)}),N=L||0,z=y/(2*Math.sqrt(p*S)),W=d-c,nt=millisecondsToSeconds(Math.sqrt(p/S)),Pe=Math.abs(W)<5;o||(o=Pe?.01:2),n||(n=Pe?.005:.5);let se;if(z<1){const mt=calcAngularFreq(nt,z);se=kt=>{const mn=Math.exp(-z*nt*kt);return d-mn*((N+z*nt*W)/mt*Math.sin(mt*kt)+W*Math.cos(mt*kt))}}else if(z===1)se=mt=>d-Math.exp(-nt*mt)*(W+(N+nt*W)*mt);else{const mt=nt*Math.sqrt(z*z-1);se=kt=>{const mn=Math.exp(-z*nt*kt),_i=Math.min(mt*kt,300);return d-mn*((N+z*nt*W)*Math.sinh(_i)+mt*W*Math.cosh(_i))/mt}}return{calculatedDuration:F&&P||null,next:mt=>{const kt=se(mt);if(F)h.done=mt>=P;else{let mn=N;mt!==0&&(z<1?mn=calcGeneratorVelocity(se,mt,kt):mn=0);const _i=Math.abs(mn)<=o,zi=Math.abs(d-kt)<=n;h.done=_i&&zi}return h.value=h.done?d:kt,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:S=.5,restSpeed:P}){const L=t[0],F={done:!1,value:L},N=Sa=>p!==void 0&&Sa<p||y!==void 0&&Sa>y,z=Sa=>p===void 0?y:y===void 0||Math.abs(p-Sa)<Math.abs(y-Sa)?p:y;let W=o*n;const nt=L+W,Pe=h===void 0?nt:h(nt);Pe!==nt&&(W=Pe-L);const se=Sa=>-W*Math.exp(-Sa/s),mt=Sa=>Pe+se(Sa),kt=Sa=>{const fa=se(Sa),La=mt(Sa);F.done=Math.abs(fa)<=S,F.value=F.done?Pe:La};let mn,_i;const zi=Sa=>{N(F.value)&&(mn=Sa,_i=spring({keyframes:[F.value,z(F.value)],velocity:calcGeneratorVelocity(mt,Sa,F.value),damping:c,stiffness:d,restDelta:S,restSpeed:P}))};return zi(0),{calculatedDuration:null,next:Sa=>{let fa=!1;return!_i&&mn===void 0&&(fa=!0,kt(Sa),zi(Sa)),mn!==void 0&&Sa>=mn?_i.next(Sa-mn):(!fa&&kt(Sa),F)}}}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=S=>{let P=0;if(p>1)for(;P<t.length-2&&!(S<t[P+1]);P++);const L=progress(t[P],t[P+1],S);return h[P](L)};return o?S=>y(clamp(t[0],t[d-1],S)):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,S;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 P=p({...this.options,keyframes:n});d==="mirror"&&(S=p({...this.options,keyframes:[...n].reverse(),velocity:-h})),P.calculatedDuration===null&&(P.calculatedDuration=calcGeneratorDuration(P));const{calculatedDuration:L}=P,F=L+c,N=F*(s+1)-c;return{generator:P,mirroredGenerator:S,mapPercentToKeyframes:y,calculatedDuration:L,resolvedDuration:F,totalDuration:N}}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:S,totalDuration:P,resolvedDuration:L}=s;if(this.startTime===null)return d.next(0);const{delay:F,repeat:N,repeatType:z,repeatDelay:W,onUpdate:nt}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,n):this.speed<0&&(this.startTime=Math.min(n-P/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 Pe=this.currentTime-F*(this.speed>=0?1:-1),se=this.speed>=0?Pe<0:Pe>P;this.currentTime=Math.max(Pe,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=P);let mt=this.currentTime,kt=d;if(N){const Sa=Math.min(this.currentTime,P)/L;let fa=Math.floor(Sa),La=Sa%1;!La&&Sa>=1&&(La=1),La===1&&fa--,fa=Math.min(fa,N+1),!!(fa%2)&&(z==="reverse"?(La=1-La,W&&(La-=W/L)):z==="mirror"&&(kt=h)),mt=clamp(0,1,La)*L}const mn=se?{done:!1,value:y[0]}:kt.next(mt);p&&(mn.value=p(mn.value));let{done:_i}=mn;!se&&S!==null&&(_i=this.speed>=0?this.currentTime>=P:this.currentTime<=0);const zi=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&_i);return zi&&c!==void 0&&(mn.value=getFinalKeyframe(y,this.options,c)),nt&&nt(mn.value),zi&&this.finish(),mn}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 S={[n]:o};y&&(S.offset=y);const P=mapEasingToNativeEasing(p);return Array.isArray(P)&&(S.easing=P),t.animate(S,{delay:s,duration:c,easing:Array.isArray(P)?"linear":P,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:S}=this.options;if(!(!((s=y.owner)===null||s===void 0)&&s.current))return!1;if(requiresPregeneratedKeyframes(this.options)){const{onComplete:L,onUpdate:F,motionValue:N,...z}=this.options,W=pregenerateKeyframes(n,z);n=W.keyframes,n.length===1&&(n[1]=n[0]),c=W.duration,d=W.times,h=W.ease,p="keyframes"}const P=animateStyle(y.owner.current,S,n,{...this.options,duration:c,times:d,ease:h});return P.startTime=time.now(),this.pendingTimeline?(P.timeline=this.pendingTimeline,this.pendingTimeline=void 0):P.onfinish=()=>{const{onComplete:L}=this.options;y.set(getFinalKeyframe(n,this.options,o)),L&&L(),this.cancel(),this.resolveFinishedPromise()},{animation:P,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:S,onComplete:P,...L}=this.options,F=new MainThreadAnimation({...L,keyframes:s,duration:c,type:d,ease:h,times:p,isGenerator:!0}),N=secondsToMilliseconds(this.time);y.setWithVelocity(F.sample(N-sampleDelta).value,F.sample(N).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:S=0}=s;S=S-secondsToMilliseconds(y);let P={keyframes:Array.isArray(o)?o:[null,o],ease:"easeOut",velocity:n.getVelocity(),...p,delay:-S,onUpdate:F=>{n.set(F),p.onUpdate&&p.onUpdate(F)},onComplete:()=>{h(),p.onComplete&&p.onComplete()},name:t,motionValue:n,element:d?void 0:c};isTransitionDefined(p)||(P={...P,...getDefaultTransition(t,P)}),P.duration&&(P.duration=secondsToMilliseconds(P.duration)),P.repeatDelay&&(P.repeatDelay=secondsToMilliseconds(P.repeatDelay)),P.from!==void 0&&(P.keyframes[0]=P.from);let L=!1;if((P.type===!1||P.duration===0&&!P.repeatDelay)&&(P.duration=0,P.delay===0&&(L=!0)),L&&!d&&n.get()!==void 0){const F=getFinalKeyframe(P.keyframes,p);if(F!==void 0){frame.update(()=>{P.onUpdate(F),P.onComplete()});return}}return!d&&AcceleratedAnimation.supports(P)?new AcceleratedAnimation(P):new MainThreadAnimation(P)};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 S=t.getValue("willChange");s&&(h=s);const P=[],L=c&&t.animationState&&t.animationState.getState()[c];for(const F in y){const N=t.getValue(F,(d=t.latestValues[F])!==null&&d!==void 0?d:null),z=y[F];if(z===void 0||L&&shouldBlockAnimation(L,F))continue;const W={delay:o,elapsed:0,...getValueTransition(h||{},F)};let nt=!1;if(window.HandoffAppearAnimations){const se=t.getProps()[optimizedAppearDataAttribute];if(se){const mt=window.HandoffAppearAnimations(se,F);mt!==null&&(W.elapsed=mt,nt=!0)}}N.start(animateMotionValue(F,N,z,t.shouldReduceMotion&&transformProps.has(F)?{type:!1}:W,t,nt));const Pe=N.animation;Pe&&(isWillChangeMotionValue(S)&&(S.add(F),Pe.then(()=>S.remove(F))),P.push(Pe))}return p&&Promise.all(P).then(()=>{frame.update(()=>{p&&setTarget(t,p)})}),P}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?(S=0)=>{const{delayChildren:P=0,staggerChildren:L,staggerDirection:F}=d;return animateChildren(t,n,P+S,L,F,o)}:()=>Promise.resolve(),{when:y}=d;if(y){const[S,P]=y==="beforeChildren"?[h,p]:[p,h];return S().then(()=>P())}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?(S=0)=>S*s:(S=0)=>p-S*s;return Array.from(t.variantChildren).sort(sortByTreeOrder).forEach((S,P)=>{S.notify("AnimationStart",n),h.push(animateVariant(S,n,{...d,delay:o+y(P)}).then(()=>S.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=>(S,P)=>{var L;const F=resolveVariant(t,P,y==="exit"?(L=t.presenceContext)===null||L===void 0?void 0:L.custom:void 0);if(F){const{transition:N,transitionEnd:z,...W}=F;S={...S,...W,...z}}return S};function d(y){n=y(t)}function h(y){const S=t.getProps(),P=t.getVariantContext(!0)||{},L=[],F=new Set;let N={},z=1/0;for(let nt=0;nt<numAnimationTypes;nt++){const Pe=reversePriorityOrder[nt],se=o[Pe],mt=S[Pe]!==void 0?S[Pe]:P[Pe],kt=isVariantLabel(mt),mn=Pe===y?se.isActive:null;mn===!1&&(z=nt);let _i=mt===P[Pe]&&mt!==S[Pe]&&kt;if(_i&&s&&t.manuallyAnimateOnMount&&(_i=!1),se.protectedKeys={...N},!se.isActive&&mn===null||!mt&&!se.prevProp||isAnimationControls(mt)||typeof mt=="boolean")continue;let Sa=checkVariantsDidChange(se.prevProp,mt)||Pe===y&&se.isActive&&!_i&&kt||nt>z&&kt,fa=!1;const La=Array.isArray(mt)?mt:[mt];let Ra=La.reduce(c(Pe),{});mn===!1&&(Ra={});const{prevResolvedValues:ma={}}=se,yt={...ma,...Ra},lt=pi=>{Sa=!0,F.has(pi)&&(fa=!0,F.delete(pi)),se.needsAnimating[pi]=!0;const ba=t.getValue(pi);ba&&(ba.liveStyle=!1)};for(const pi in yt){const ba=Ra[pi],Sc=ma[pi];if(N.hasOwnProperty(pi))continue;let ms=!1;isKeyframesTarget(ba)&&isKeyframesTarget(Sc)?ms=!shallowCompare(ba,Sc):ms=ba!==Sc,ms?ba!=null?lt(pi):F.add(pi):ba!==void 0&&F.has(pi)?lt(pi):se.protectedKeys[pi]=!0}se.prevProp=mt,se.prevResolvedValues=Ra,se.isActive&&(N={...N,...Ra}),s&&t.blockInitialAnimation&&(Sa=!1),Sa&&(!_i||fa)&&L.push(...La.map(pi=>({animation:pi,options:{type:Pe}})))}if(F.size){const nt={};F.forEach(Pe=>{const se=t.getBaseTarget(Pe),mt=t.getValue(Pe);mt&&(mt.liveStyle=!0),nt[Pe]=se===void 0?null:se}),L.push({animation:nt})}let W=!!L.length;return s&&(S.initial===!1||S.initial===S.animate)&&!t.manuallyAnimateOnMount&&(W=!1),s=!1,W?n(L):Promise.resolve()}function p(y,S){var P;if(o[y].isActive===S)return Promise.resolve();(P=t.variantChildren)===null||P===void 0||P.forEach(F=>{var N;return(N=F.animationState)===null||N===void 0?void 0:N.setActive(y,S)}),o[y].isActive=S;const L=h(y);for(const F in o)o[F].protectedKeys={};return L}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 L=getPanInfo(this.lastMoveEventInfo,this.history),F=this.startEvent!==null,N=distance2D(L.offset,{x:0,y:0})>=3;if(!F&&!N)return;const{point:z}=L,{timestamp:W}=frameData;this.history.push({...z,timestamp:W});const{onStart:nt,onMove:Pe}=this.handlers;F||(nt&&nt(this.lastMoveEvent,L),this.startEvent=this.lastMoveEvent),Pe&&Pe(this.lastMoveEvent,L)},this.handlePointerMove=(L,F)=>{this.lastMoveEvent=L,this.lastMoveEventInfo=transformPoint(F,this.transformPagePoint),frame.update(this.updatePoint,!0)},this.handlePointerUp=(L,F)=>{this.end();const{onEnd:N,onSessionEnd:z,resumeAnimation:W}=this.handlers;if(this.dragSnapToOrigin&&W&&W(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const nt=getPanInfo(L.type==="pointercancel"?this.lastMoveEventInfo:transformPoint(F,this.transformPagePoint),this.history);this.startEvent&&N&&N(L,nt),z&&z(L,nt)},!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:S}=frameData;this.history=[{...y,timestamp:S}];const{onSessionStart:P}=o;P&&P(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=P=>{const{dragSnapToOrigin:L}=this.getProps();L?this.pauseAnimation():this.stopAnimation(),o&&this.snapToCursor(extractEventInfo(P,"page").point)},d=(P,L)=>{const{drag:F,dragPropagation:N,onDragStart:z}=this.getProps();if(F&&!N&&(this.openGlobalLock&&this.openGlobalLock(),this.openGlobalLock=getGlobalLock(F),!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(nt=>{let Pe=this.getAxisMotionValue(nt).get()||0;if(percent.test(Pe)){const{projection:se}=this.visualElement;if(se&&se.layout){const mt=se.layout.layoutBox[nt];mt&&(Pe=calcLength(mt)*(parseFloat(Pe)/100))}}this.originPoint[nt]=Pe}),z&&z(P,L);const{animationState:W}=this.visualElement;W&&W.setActive("whileDrag",!0)},h=(P,L)=>{const{dragPropagation:F,dragDirectionLock:N,onDirectionLock:z,onDrag:W}=this.getProps();if(!F&&!this.openGlobalLock)return;const{offset:nt}=L;if(N&&this.currentDirection===null){this.currentDirection=getCurrentDirection(nt),this.currentDirection!==null&&z&&z(this.currentDirection);return}this.updateAxis("x",L.point,nt),this.updateAxis("y",L.point,nt),this.visualElement.render(),W&&W(P,L)},p=(P,L)=>this.stop(P,L),y=()=>eachAxis(P=>{var L;return this.getAnimationState(P)==="paused"&&((L=this.getAxisMotionValue(P).animation)===null||L===void 0?void 0:L.play())}),{dragSnapToOrigin:S}=this.getProps();this.panSession=new PanSession(n,{onSessionStart:c,onStart:d,onMove:h,onSessionEnd:p,resumeAnimation:y},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:S,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||{},S=eachAxis(P=>{if(!shouldDrag(P,o,this.currentDirection))return;let L=y[P]||{};h&&(L={min:0,max:0});const F=c?200:1e6,N=c?40:1e7,z={type:"inertia",velocity:s?n[P]:0,bounceStiffness:F,bounceDamping:N,timeConstant:750,restDelta:1,restSpeed:10,...d,...L};return this.startAxisValueAnimation(P,z)});return Promise.all(S).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:S}=this.constraints[h];p.set(mixNumber$1(y,S,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:S,dragListener:P=!0}=this.getProps();S&&P&&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:S})=>{this.isDragging&&S&&(eachAxis(P=>{const L=this.getAxisMotionValue(P);L&&(this.originPoint[P]+=y[P].translate,L.set(L.get()+y[P].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 S=mixNumber$1(p,y,.5);return typeof c[2+h]=="number"&&(c[2+h]/=S),typeof c[3+h]=="number"&&(c[3+h]/=S),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),S=getRadius(o,p);if(y===void 0&&S===void 0)continue;y||(y=0),S||(S=0),y===0||S===0||isPx(y)===isPx(S)?(t[p]=Math.max(mixNumber$1(asNumber(y),asNumber(S),s),0),(percent.test(S)||percent.test(y))&&(t[p]+="%")):t[p]=S}(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:S,rotate:P,rotateX:L,rotateY:F,skewX:N,skewY:z}=o;S&&(s=`perspective(${S}px) ${s}`),P&&(s+=`rotate(${P}deg) `),L&&(s+=`rotateX(${L}deg) `),F&&(s+=`rotateY(${F}deg) `),N&&(s+=`skewX(${N}deg) `),z&&(s+=`skewY(${z}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:S,visualElement:P}=this.options;if(P&&!P.current&&P.mount(h),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),p&&(S||y)&&(this.isLayoutDirty=!0),t){let L;const F=()=>this.root.updateBlockedByResize=!1;t(h,()=>{this.root.updateBlockedByResize=!0,L&&L(),L=delay(F,250),globalProjectionState.hasAnimatedSinceResize&&(globalProjectionState.hasAnimatedSinceResize=!1,this.nodes.forEach(finishAnimation))})}y&&this.root.registerSharedNode(y,this),this.options.animate!==!1&&P&&(y||S)&&this.addEventListener("didUpdate",({delta:L,hasLayoutChanged:F,hasRelativeTargetChanged:N,layout:z})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const W=this.options.transition||P.getDefaultTransition()||defaultLayoutTransition,{onLayoutAnimationStart:nt,onLayoutAnimationComplete:Pe}=P.getProps(),se=!this.targetLayout||!boxEqualsRounded(this.targetLayout,z)||N,mt=!F&&N;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||mt||F&&(se||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(L,mt);const kt={...getValueTransition(W,"layout"),onPlay:nt,onComplete:Pe};(P.shouldReduceMotion||this.options.layoutRoot)&&(kt.delay=0,kt.type=!1),this.startAnimation(kt)}else F||finishAnimation(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=z})}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 P=0;P<this.path.length;P++){const L=this.path[P];L.shouldResetTransform=!0,L.updateScroll("snapshot"),L.options.layoutRoot&&L.willUpdate(!1)}const{layoutId:p,layout:y}=this.options;if(p===void 0&&!y)return;const S=this.getTransformTemplate();this.prevTransformTemplateValue=S?S(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(),S=y?y(this.latestValues,""):void 0,P=S!==this.prevTransformTemplateValue;h&&(p||hasTransform(this.latestValues)||P)&&(c(this.instance,S),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 S=this.path[y],{scroll:P,options:L}=S;if(S!==this.root&&P&&L.layoutScroll){if(P.isRoot){copyBoxInto(p,h);const{scroll:F}=this.root;F&&(translateAxis(p.x,-F.offset.x),translateAxis(p.y,-F.offset.y))}translateAxis(p.x,P.offset.x),translateAxis(p.y,P.offset.y)}}return p}applyTransform(h,p=!1){const y=createBox();copyBoxInto(y,h);for(let S=0;S<this.path.length;S++){const P=this.path[S];!p&&P.options.layoutScroll&&P.scroll&&P!==P.root&&transformBox(y,{x:-P.scroll.offset.x,y:-P.scroll.offset.y}),hasTransform(P.latestValues)&&transformBox(y,P.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 S=this.path[y];if(!S.instance||!hasTransform(S.latestValues))continue;hasScale(S.latestValues)&&S.updateSnapshot();const P=createBox(),L=S.measurePageBox();copyBoxInto(P,L),removeBoxTransforms(p,S.latestValues,S.snapshot?S.snapshot.layoutBox:void 0,P)}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 S=!!this.resumingFrom||this!==y;if(!(h||S&&this.isSharedProjectionDirty||this.isProjectionDirty||!((p=this.parent)===null||p===void 0)&&p.isProjectionDirty||this.attemptToResolveRelativeTarget))return;const{layout:L,layoutId:F}=this.options;if(!(!this.layout||!(L||F))){if(this.resolvedRelativeTargetAt=frameData.timestamp,!this.targetDelta&&!this.relativeTarget){const N=this.getClosestProjectingParent();N&&N.layout&&this.animationProgress!==1?(this.relativeParent=N,this.forceRelativeParentToResolveTarget(),this.relativeTarget=createBox(),this.relativeTargetOrigin=createBox(),calcRelativePosition(this.relativeTargetOrigin,this.layout.layoutBox,N.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 N=this.getClosestProjectingParent();N&&!!N.resumingFrom==!!this.resumingFrom&&!N.options.layoutScroll&&N.target&&this.animationProgress!==1?(this.relativeParent=N,this.forceRelativeParentToResolveTarget(),this.relativeTarget=createBox(),this.relativeTargetOrigin=createBox(),calcRelativePosition(this.relativeTargetOrigin,this.target,N.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 S=!0;if((this.isProjectionDirty||!((h=this.parent)===null||h===void 0)&&h.isProjectionDirty)&&(S=!1),y&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(S=!1),this.resolvedRelativeTargetAt===frameData.timestamp&&(S=!1),S)return;const{layout:P,layoutId:L}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(P||L))return;copyBoxInto(this.layoutCorrected,this.layout.layoutBox);const F=this.treeScale.x,N=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:z}=p;if(!z){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,z,this.latestValues),this.projectionTransform=buildProjectionTransform(this.projectionDelta,this.treeScale),(this.projectionTransform!==W||this.treeScale.x!==F||this.treeScale.y!==N)&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",z)),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,S=y?y.latestValues:{},P={...this.latestValues},L=createDelta();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!p;const F=createBox(),N=y?y.source:void 0,z=this.layout?this.layout.source:void 0,W=N!==z,nt=this.getStack(),Pe=!nt||nt.members.length<=1,se=!!(W&&!Pe&&this.options.crossfade===!0&&!this.path.some(hasOpacityCrossfade));this.animationProgress=0;let mt;this.mixTargetDelta=kt=>{const mn=kt/1e3;mixAxisDelta(L.x,h.x,mn),mixAxisDelta(L.y,h.y,mn),this.setTargetDelta(L),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(calcRelativePosition(F,this.layout.layoutBox,this.relativeParent.layout.layoutBox),mixBox(this.relativeTarget,this.relativeTargetOrigin,F,mn),mt&&boxEquals(this.relativeTarget,mt)&&(this.isProjectionDirty=!1),mt||(mt=createBox()),copyBoxInto(mt,this.relativeTarget)),W&&(this.animationValues=P,mixValues(P,S,this.latestValues,mn,se,Pe)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=mn},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:S,latestValues:P}=h;if(!(!p||!y||!S)){if(this!==h&&this.layout&&S&&shouldAnimatePositionOnly(this.options.animationType,this.layout.layoutBox,S.layoutBox)){y=this.target||createBox();const L=calcLength(this.layout.layoutBox.x);y.x.min=h.target.x.min,y.x.max=y.x.min+L;const F=calcLength(this.layout.layoutBox.y);y.y.min=h.target.y.min,y.y.max=y.y.min+F}copyBoxInto(p,y),transformBox(p,P),calcBoxDelta(this.projectionDeltaWithTransform,this.layoutCorrected,p,P)}}registerSharedNode(h,p){this.sharedNodes.has(h)||this.sharedNodes.set(h,new NodeStack),this.sharedNodes.get(h).add(p);const S=p.options.initialPromotionConfig;p.promote({transition:S?S.transition:void 0,preserveFollowOpacity:S&&S.shouldPreserveFollowOpacity?S.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 S=this.getStack();S&&S.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 S={};y.z&&resetDistortingTransform("z",h,S,this.animationValues);for(let P=0;P<transformAxes.length;P++)resetDistortingTransform(`rotate${transformAxes[P]}`,h,S,this.animationValues),resetDistortingTransform(`skew${transformAxes[P]}`,h,S,this.animationValues);h.render();for(const P in S)h.setStaticValue(P,S[P]),this.animationValues&&(this.animationValues[P]=S[P]);h.scheduleRender()}getProjectionStyles(h){var p,y;if(!this.instance||this.isSVG)return;if(!this.isVisible)return hiddenVisibility;const S={visibility:""},P=this.getTransformTemplate();if(this.needsReset)return this.needsReset=!1,S.opacity="",S.pointerEvents=resolveMotionValue(h==null?void 0:h.pointerEvents)||"",S.transform=P?P(this.latestValues,""):"none",S;const L=this.getLead();if(!this.projectionDelta||!this.layout||!L.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=P?P({},""):"none",this.hasProjected=!1),W}const F=L.animationValues||L.latestValues;this.applyTransformsToTarget(),S.transform=buildProjectionTransform(this.projectionDeltaWithTransform,this.treeScale,F),P&&(S.transform=P(F,S.transform));const{x:N,y:z}=this.projectionDelta;S.transformOrigin=`${N.origin*100}% ${z.origin*100}% 0`,L.animationValues?S.opacity=L===this?(y=(p=F.opacity)!==null&&p!==void 0?p:this.latestValues.opacity)!==null&&y!==void 0?y:1:this.preserveOpacity?this.latestValues.opacity:F.opacityExit:S.opacity=L===this?F.opacity!==void 0?F.opacity:"":F.opacityExit!==void 0?F.opacityExit:0;for(const W in scaleCorrectors){if(F[W]===void 0)continue;const{correct:nt,applyTo:Pe}=scaleCorrectors[W],se=S.transform==="none"?F[W]:nt(F[W],L);if(Pe){const mt=Pe.length;for(let kt=0;kt<mt;kt++)S[Pe[kt]]=se}else S[W]=se}return this.options.layoutId&&(S.pointerEvents=L===this?resolveMotionValue(h==null?void 0:h.pointerEvents)||"":"none"),S}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(L=>{const F=h?o.measuredBox[L]:o.layoutBox[L],N=calcLength(F);F.min=s[L].min,F.max=F.min+N}):shouldAnimatePositionOnly(d,o.layoutBox,s)&&eachAxis(L=>{const F=h?o.measuredBox[L]:o.layoutBox[L],N=calcLength(s[L]);F.max=F.min+N,t.relativeTarget&&!t.currentAnimation&&(t.isProjectionDirty=!0,t.relativeTarget[L].max=t.relativeTarget[L].min+N)});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 S=!isDeltaZero(p);let P=!1;if(!t.resumeFrom){const L=t.getClosestProjectingParent();if(L&&!L.resumeFrom){const{snapshot:F,layout:N}=L;if(F&&N){const z=createBox();calcRelativePosition(z,o.layoutBox,F.layoutBox);const W=createBox();calcRelativePosition(W,s,N.layoutBox),boxEqualsRounded(z,W)||(P=!0),L.options.layoutRoot&&(t.relativeTarget=W,t.relativeTargetOrigin=z,t.relativeParent=L)}}}t.notifyListeners("didUpdate",{layout:s,snapshot:o,delta:y,layoutDelta:p,hasLayoutChanged:S,hasRelativeTargetChanged:P})}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=(F,N,z,W)=>new this.KeyframeResolver(F,N,z,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:S}=h;this.latestValues=y,this.baseTarget={...y},this.initialValues=o.initial?{...y}:{},this.renderState=S,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:P,...L}=this.scrapeMotionValuesFromProps(o,{},this);for(const F in L){const N=L[F];y[F]!==void 0&&isMotionValue(N)&&(N.set(y[F],!1),isWillChangeMotionValue(P)&&P.add(F))}}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 S=featureNames[y],{isEnabled:P,Feature:L,ProjectionNode:F,MeasureLayout:N}=featureDefinitions[S];F&&(h=F),P(o)&&(!this.features[S]&&L&&(this.features[S]=new L(this)),N&&(p=N))}if((this.type==="html"||this.type==="svg")&&!this.projection&&h){this.projection=new h(this.latestValues,getClosestProjectingNode(this.parent));const{layoutId:y,layout:S,drag:P,dragConstraints:L,layoutScroll:F,layoutRoot:N}=o;this.projection.setOptions({layoutId:y,layout:S,alwaysMeasureLayout:!!P||L&&isRefObject(L),visualElement:this,scheduleRender:()=>this.scheduleRender(),animationType:typeof S=="string"?S:"both",initialPromotionConfig:d,layoutScroll:F,layoutRoot:N})}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:S,isPositionVisible:P}=useContext(),L=React.useRef(null);usePreRender(()=>{if(L.current==null)return;let N;try{const se=p==null?void 0:p([c.x,c.y,c.z]);N=new Cartesian2(se==null?void 0:se[0],se==null?void 0:se[1])}catch{h.set("none");return}const z=y==null?void 0:y();if(!z)return;const W=S==null?void 0:S(z==null?void 0:z.lng,z==null?void 0:z.lat,z==null?void 0:z.height);if(!W)return;if(occluder.cameraPosition=new Cartesian3(W[0],W[1],W[2]),N==null||N.x<0||N.y<0||N.x>window.innerWidth||N.y>window.innerHeight||!(P!=null&&P([c.x,c.y,c.z]))){h.set("none");return}const nt=`calc(${N.x}px - 50%)`,Pe=`calc(${N.y}px - 50%)`;d.set(`translate(${nt}, ${Pe})`),h.set("block")});const F=useMergeRefs([L,s]);return jsxRuntimeExports.jsx(motion.div,{ref:F,...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:S})=>{const P=t[t.length-1],L=d?new Cartesian3(...d):void 0,F=h?new Cartesian3(...h):void 0,N=p?new Cartesian3(...p):void 0;return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[L&&jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:L,isEditing:c,isExtrudedControlPoint:!0,handleControlPointMouseEvent:S}),(!c||y)&&jsxRuntimeExports.jsx(ExtrudedMeasurement,{a:P,b:L,extrudedHeight:o,color:c?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):s,showLine:n!=="extrudedPolygon"})]}),F&&jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:F,isEditing:c,isExtrudedControlPoint:!0}),N&&jsxRuntimeExports.jsx(ControlPoint,{index:-1,position:N,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)),S=React.useRef(o);S.current=o;const L=useConstant$2(()=>new CallbackProperty(()=>S.current,!1)),F=React.useMemo(()=>({polygon:{hierarchy:y,heightReference:HeightReference$1.RELATIVE_TO_TERRAIN,extrudedHeight:L,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}}),[L,c,y,s,d]),{requestRender:N}=useContext();return N==null||N(),jsxRuntimeExports.jsx(Entity,{id:t,...F})},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,S,P]=n,L=Cartesian3.midpoint(y,S,cartesianScratch1);p.push({points:[L,P],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,S,P]=n,L=Cartesian3.midpoint(y,S,cartesianScratch1);p.push({points:[L,P],showLine:!0})}break;default:p.push({points:n.slice(-2),showLine:t==="circle"});break}return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[n.map((y,S)=>jsxRuntimeExports.jsx(ControlPoint,{position:y,index:S,isSelected:d===S,clampToGround:!0,isEditing:s,handleControlPointMouseEvent:h},S)),p.map(({points:y,showLine:S},P)=>jsxRuntimeExports.jsx(SurfaceMeasurement,{a:y[0],b:y[1],color:s?Color$1.fromCssColorString(DEFAULT_EDIT_COLOR):o,showLine:S},P))]})});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:S,selectedControlPointIndex:P,handleControlPointMouseEvent:L,handleAddControlPoint:F})=>{const N=React.useMemo(()=>t?{...t,controlPoints:t==null?void 0:t.controlPoints.map(se=>new Cesium$1.Cartesian3(...se))}:null,[t]),z=React.useMemo(()=>N?createGeometry(N):null,[N]),{positionsArray:W,hierarchyArray:nt}=React.useMemo(()=>(z==null?void 0:z.type)==="Point"?{}:(z==null?void 0:z.type)==="LineString"?{positionsArray:convertGeometryToPositionsArray(z)}:z!=null?{positionsArray:convertGeometryToPositionsArray(z),hierarchyArray:convertPolygonToHierarchyArray(z)}:{},[z]),Pe=React.useMemo(()=>Color$1.fromCssColorString(s??DEFAULT_SKETCH_COLOR),[s]);return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[W==null?void 0:W.map((se,mt)=>jsxRuntimeExports.jsx(PolylineEntity,{dynamic:!0,positions:se,color:Pe,isEditing:c},mt)),nt==null?void 0:nt.map((se,mt)=>jsxRuntimeExports.jsx(PolygonEntity,{dynamic:!0,hierarchy:se,color:Pe},mt)),N!=null&&(!n||c)&&jsxRuntimeExports.jsx(SurfaceControlPoints,{geometryOptions:N,color:Pe,isEditing:c,catchedControlPointIndex:y,selectedControlPointIndex:P,handleControlPointMouseEvent:L}),N!=null&&c&&jsxRuntimeExports.jsx(SurfaceAddingPoints,{geometryOptions:N,isEditing:c,handleAddControlPoint:F}),N!=null&&n&&jsxRuntimeExports.jsx(ExtrudedControlPoints,{geometryOptions:N,extrudedHeight:n,extrudedPoint:d,centroidBasePoint:h,centroidExtrudedPoint:p,catchedExtrudedPoint:S,color:Pe,isEditing:c,handleControlPointMouseEvent:L}),n&&(nt==null?void 0:nt.map((se,mt)=>jsxRuntimeExports.jsx(ExtrudedPolygonEntity,{hierarchy:se,extrudedHeight:n,disableShadow:o,color:Pe,isEditing:c},mt)))]})});SketchComponent.displayName="SketchComponent";const Cesium=({className:t,style:n,property:o,time:s,camera:c,small:d,ready:h,children:p,selectedLayerId:y,isLayerDraggable:S,isLayerDragging:P,shouldRender:L,layerSelectionReason:F,meta:N,displayCredits:z,layersRef:W,featureFlags:nt,requestingRenderMode:Pe,timelineManagerRef:se,cameraForceHorizontalRoll:mt,onLayerSelect:kt,onCameraChange:mn,onLayerDrag:_i,onLayerDrop:zi,onLayerEdit:Sa,onLayerSelectWithRectStart:fa,onLayerSelectWithRectMove:La,onLayerSelectWithRectEnd:Ra,onMount:ma,onLayerVisibility:yt,onLayerLoad:lt,onCreditsUpdate:pi},ba)=>{var gd,pd,Zd,cf,sf,nf,df,Cf,mf,Sf,Pf,Af,Hf,_f,wf,Yf,Nf,vf,Ff,Xf,Wf,Qf,_m,Bf,$m,qf,qm,ep,Tf,rf,bf,If,Uf,jf,jm,sp,cp,fp,mp,al,tf,lf;const{cesium:Sc,mouseEventHandles:ms,cesiumIonAccessToken:Xs,context:Nl,layerSelectWithRectEventHandlers:pu,sceneLight:yu,sceneBackgroundColor:Ru,sceneMsaaSamples:Vd,sceneMode:Gd,cameraViewBoundaries:uf,cameraViewOuterBoundaries:ff,cameraViewBoundariesMaterial:pf,handleCameraChange:hf,handleCameraMoveEnd:of,handleUpdate:gf,handleClick:Ef,handleMount:xf,handleUnmount:Wa,handleTilesChange:af,handleTerrainProviderChange:Xd}=useHooks$1({ref:ba,property:o,time:s,selectedLayerId:y,selectionReason:F,meta:N,layersRef:W,featureFlags:nt,timelineManagerRef:se,isLayerDraggable:S,isLayerDragging:P,shouldRender:L,requestingRenderMode:Pe,camera:c,cameraForceHorizontalRoll:mt,onLayerDrag:_i,onLayerDrop:zi,onLayerSelect:kt,onLayerEdit:Sa,onLayerSelectWithRectStart:fa,onLayerSelectWithRectMove:La,onLayerSelectWithRectEnd:Ra,onLayerVisibility:yt,onLayerLoad:lt,onCameraChange:mn,onMount:ma,onCreditsUpdate:pi});return jsxRuntimeExports.jsxs(Aa$1,{ref:Sc,onUpdate:gf,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:z?void 0:creditContainer,style:{width:d?"300px":"auto",height:d?"300px":"100%",display:h?void 0:"none",cursor:P?"grab":void 0,...n},shadows:!!((pd=(gd=o==null?void 0:o.scene)==null?void 0:gd.shadow)!=null&&pd.enabled),onClick:Ef,onDoubleClick:ms.doubleClick,onMouseDown:ms.mouseDown,onMouseUp:ms.mouseUp,onRightClick:ms.rightClick,onRightDown:ms.rightDown,onRightUp:ms.rightUp,onMiddleClick:ms.middleClick,onMiddleDown:ms.middleDown,onMiddleUp:ms.middleUp,onMouseMove:ms.mouseMove,onMouseEnter:ms.mouseEnter,onMouseLeave:ms.mouseLeave,onWheel:ms.wheel,children:[jsxRuntimeExports.jsx(Event,{onMount:xf,onUnmount:Wa}),jsxRuntimeExports.jsx(ReearthClock,{timelineManagerRef:se}),jsxRuntimeExports.jsx(ImageryLayers,{tiles:o==null?void 0:o.tiles,cesiumIonAccessToken:Xs,onTilesChange:af}),jsxRuntimeExports.jsx(LabelImageryLayers,{tileLabels:o==null?void 0:o.tileLabels}),jsxRuntimeExports.jsx(Indicator,{property:o,timelineManagerRef:se}),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:pu.start.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_DOWN,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:pu.start.shift}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE,action:pu.move.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.MOUSE_MOVE,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:pu.move.shift}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_UP,action:pu.end.handler}),jsxRuntimeExports.jsx(Ma$1,{type:Cesium$1.ScreenSpaceEventType.LEFT_UP,modifier:Cesium$1.KeyboardEventModifier.SHIFT,action:pu.end.shift})]}),jsxRuntimeExports.jsx(Ta$1,{maximumZoomDistance:(cf=(Zd=o==null?void 0:o.camera)==null?void 0:Zd.limiter)!=null&&cf.enabled?((df=(nf=(sf=o.camera)==null?void 0:sf.limiter)==null?void 0:nf.targetArea)==null?void 0:df.height)??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,enableCollisionDetection:!((Cf=o==null?void 0:o.camera)!=null&&Cf.allowEnterGround)}),jsxRuntimeExports.jsx(Ps$1,{percentageChanged:.2,onChange:hf,onMoveEnd:of}),uf&&((Sf=(mf=o==null?void 0:o.camera)==null?void 0:mf.limiter)==null?void 0:Sf.showHelper)&&jsxRuntimeExports.jsx(Is$1,{children:jsxRuntimeExports.jsx(ua$1,{positions:uf,width:1,material:Cesium$1.Color.RED,arcType:Cesium$1.ArcType.RHUMB})}),ff&&((Af=(Pf=o==null?void 0:o.camera)==null?void 0:Pf.limiter)==null?void 0:Af.showHelper)&&jsxRuntimeExports.jsx(Is$1,{children:jsxRuntimeExports.jsx(ua$1,{positions:ff,width:1,material:pf,arcType:Cesium$1.ArcType.RHUMB})}),jsxRuntimeExports.jsx($a$1,{backgroundColor:Ru,light:yu,mode:Gd,msaaSamples:Vd,useDepthPicking:!1,useWebVR:!!((Hf=o==null?void 0:o.scene)!=null&&Hf.vr)||void 0,debugShowFramesPerSecond:!!((_f=o==null?void 0:o.debug)!=null&&_f.showFramesPerSecond),verticalExaggerationRelativeHeight:(wf=o==null?void 0:o.scene)==null?void 0:wf.verticalExaggerationRelativeHeight,verticalExaggeration:(Yf=o==null?void 0:o.scene)==null?void 0:Yf.verticalExaggeration}),jsxRuntimeExports.jsx(Oa$1,{show:((vf=(Nf=o==null?void 0:o.sky)==null?void 0:Nf.skyBox)==null?void 0:vf.show)??!0}),jsxRuntimeExports.jsx(Vs,{enabled:((Xf=(Ff=o==null?void 0:o.sky)==null?void 0:Ff.fog)==null?void 0:Xf.enabled)??!0,density:(Qf=(Wf=o==null?void 0:o.sky)==null?void 0:Wf.fog)==null?void 0:Qf.density}),jsxRuntimeExports.jsx(Ga$1,{show:((Bf=(_m=o==null?void 0:o.sky)==null?void 0:_m.sun)==null?void 0:Bf.show)??!0}),jsxRuntimeExports.jsx(ea,{show:((qf=($m=o==null?void 0:o.sky)==null?void 0:$m.moon)==null?void 0:qf.show)??!0}),jsxRuntimeExports.jsx(_a$2,{show:((ep=(qm=o==null?void 0:o.sky)==null?void 0:qm.skyAtmosphere)==null?void 0:ep.show)??!0,atmosphereLightIntensity:(rf=(Tf=o==null?void 0:o.sky)==null?void 0:Tf.skyAtmosphere)==null?void 0:rf.lightIntensity,saturationShift:(If=(bf=o==null?void 0:o.sky)==null?void 0:bf.skyAtmosphere)==null?void 0:If.saturationShift,brightnessShift:(jf=(Uf=o==null?void 0:o.sky)==null?void 0:Uf.skyAtmosphere)==null?void 0:jf.brightnessShift}),jsxRuntimeExports.jsx(Globe,{property:o,cesiumIonAccessToken:Xs,onTerrainProviderChange:Xd}),jsxRuntimeExports.jsx(context.Provider,{value:Nl,children:h?p:null}),jsxRuntimeExports.jsx(AmbientOcclusion,{...AMBIENT_OCCLUSION_QUALITY[((sp=(jm=o==null?void 0:o.render)==null?void 0:jm.ambientOcclusion)==null?void 0:sp.quality)||"low"],enabled:!!((fp=(cp=o==null?void 0:o.render)==null?void 0:cp.ambientOcclusion)!=null&&fp.enabled),intensity:((al=(mp=o==null?void 0:o.render)==null?void 0:mp.ambientOcclusion)==null?void 0:al.intensity)??100,outputType:(lf=(tf=o==null?void 0:o.render)==null?void 0:tf.ambientOcclusion)!=null&&lf.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.40",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 S,P;const[h]=d;let p,y;if(h.contentBoxSize){const L=Array.isArray(h.contentBoxSize)?h.contentBoxSize[0]:h.contentBoxSize;p=L.inlineSize,y=L.blockSize}else h.contentRect?(p=h.contentRect.width,y=h.contentRect.height):(p=(S=t.current)==null?void 0:S.clientWidth,y=(P=t.current)==null?void 0:P.clientHeight);s(L=>({width:p,height:y,isMobile:p?p<=viewportMobileMaxWidth:void 0,query:L.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:S},P){const L=React.useRef(null);React.useImperativeHandle(P,()=>L.current,[]);const F=React.useRef(null),N=useViewport({wrapperRef:F}),[z,W]=React.useState({}),[nt,Pe]=React.useState(),[se,mt]=React.useState(),kt=React.useCallback(async(_f,wf,Yf,Nf,vf)=>{var Qf,_m,Bf,$m,qf,qm,ep,Tf,rf,bf,If;const Ff=((Qf=z.layer)==null?void 0:Qf.layer.type)==="simple"&&(($m=(Bf=(_m=z.layer)==null?void 0:_m.layer)==null?void 0:Bf.data)==null?void 0:$m.isSketchLayer);if(z.layerId===_f&&z.featureId===wf&&!Ff)return;const Xf=await(Yf==null?void 0:Yf()),Wf=_f&&wf?(Ff?(qf=Xf==null?void 0:Xf.features)==null?void 0:qf.find(Uf=>Uf.id===wf):(Tf=(qm=L.current)==null?void 0:(ep=qm.engine).findComputedFeatureById)==null?void 0:Tf.call(ep,_f,wf))??(vf==null?void 0:vf.feature):void 0;Pe(_f&&wf?(If=(rf=L.current)==null?void 0:(bf=rf.engine).findFeatureById)==null?void 0:If.call(bf,_f,wf):void 0),mt(Wf),W(Uf=>Uf.layerId===_f&&Uf.featureId===wf?Uf:{layerId:_f,featureId:wf,layer:Xf,reason:Nf}),c==null||c(_f,Yf,Wf,Nf)},[z,c]),mn=React.useRef(),[_i,zi]=useValue(t,d),[Sa,fa]=React.useState(!1),La=React.useCallback(_f=>{fa(!!_f)},[]),[Ra,ma]=useValue(n||"default",h);React.useEffect(()=>{var _f,wf;Ra==="default"&&((wf=(_f=L==null?void 0:L.current)==null?void 0:_f.engine)==null||wf.setCursor("auto"))},[Ra]);const yt=INTERACTION_MODES[Ra??"default"],lt=React.useRef(),pi=React.useCallback(_f=>{lt.current=_f},[]),ba=React.useCallback(_f=>{var wf;(wf=lt.current)==null||wf.call(lt,_f)},[]),Sc=React.useRef(),ms=React.useCallback(_f=>{Sc.current=_f},[]),Xs=React.useCallback(_f=>{var wf;(wf=Sc.current)==null||wf.call(Sc,_f)},[]),Nl=React.useRef(),pu=React.useCallback(_f=>{Nl.current=_f},[]),yu=React.useCallback(_f=>{var wf;(wf=Nl.current)==null||wf.call(Nl,_f)},[]),Ru=React.useRef(),Vd=React.useCallback(_f=>{Ru.current=_f},[]),Gd=React.useCallback(_f=>{var wf;(wf=Ru.current)==null||wf.call(Ru,_f)},[]),uf=React.useRef(),ff=React.useCallback(_f=>{uf.current=_f},[]),pf=React.useCallback(_f=>{var wf;(wf=uf.current)==null||wf.call(uf,_f)},[]),hf=React.useRef(),of=React.useCallback(_f=>{hf.current=_f},[]),gf=React.useCallback(_f=>{var wf;(wf=hf.current)==null||wf.call(hf,_f)},[]),Ef=React.useRef([]),xf=React.useCallback(_f=>{Ef.current.push(_f)},[]),Wa=React.useCallback(_f=>{Ef.current.forEach(wf=>wf(_f))},[]),af=React.useRef([]),Xd=React.useCallback(_f=>{af.current.push(_f)},[]),gd=React.useCallback(_f=>{af.current.forEach(wf=>wf(_f))},[]),pd=React.useRef([]),Zd=React.useCallback(_f=>{pd.current.push(_f)},[]),cf=React.useCallback(_f=>{pd.current.forEach(wf=>wf(_f))},[]),sf=React.useRef([]),nf=React.useCallback(_f=>{sf.current.push(_f)},[]),df=React.useCallback((_f,wf)=>{sf.current.forEach(Yf=>Yf(_f)),S==null||S(_f,wf)},[S]);React.useEffect(()=>{var _f,wf;o&&((wf=(_f=L.current)==null?void 0:_f.engine)==null||wf.lookAtLayer(o),p==null||p(void 0))},[o,p]);const[Cf,mf]=React.useState(!1),Sf=React.useCallback(()=>{mf(!0)},[]),Pf=React.useCallback((_f,wf,Yf)=>{var Ff;mf(!1);const Nf=(Ff=L.current)==null?void 0:Ff.layers.findById(_f),vf=Nf!=null&&Nf.property.default.location?"default.location":Nf!=null&&Nf.property.default.position?"default.position":void 0;Yf&&Nf&&Nf.propertyId&&vf&&(y==null||y(Nf.propertyId,vf,Yf))},[y,L]),Af=React.useMemo(()=>({interactionMode:Ra,selectedLayer:z,selectedComputedFeature:se,viewport:N,handleCameraForceHorizontalRollChange:La,handleInteractionModeChange:ma,onSketchPluginFeatureCreate:xf,onSketchPluginFeatureUpdate:Xd,onSketchPluginFeatureDelete:Zd,onSketchTypeChange:nf,onLayerVisibility:ms,onLayerLoad:pu,onLayerEdit:pi,onLayerSelectWithRectStart:Vd,onLayerSelectWithRectMove:ff,onLayerSelectWithRectEnd:of}),[Ra,z,se,N,ma,La,pi,xf,Xd,Zd,nf,ms,pu,Vd,ff,of]),Hf=React.useMemo(()=>({position:"relative",width:"100%",height:"100%",overflow:"hidden"}),[]);return useCoreAPI({viewerProperty:s}),{mapRef:L,wrapperRef:F,selectedFeature:nt,camera:_i,featureFlags:yt,isLayerDragging:Cf,timelineManagerRef:mn,cameraForceHorizontalRoll:Sa,coreContextValue:Af,containerStyle:Hf,overriddenInteractionMode:Ra,handleLayerSelect:kt,handleLayerDrag:Sf,handleLayerDrop:Pf,handleLayerEdit:ba,handleCameraChange:zi,handleInteractionModeChange:ma,handleSketchPluginFeatureCreate:Wa,handleSketchPluginFeatureUpdate:gd,handleSketchPluginFeatureDelete:cf,handleSketchTypeChange:df,handleLayerVisibility:Xs,handleLayerLoad:yu,handleLayerSelectWithRectStart:Gd,handleLayerSelectWithRectMove:pf,handleLayerSelectWithRectEnd:gf}}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:S,time:P,interactionMode:L,shouldRender:F,meta:N,displayCredits:z=!0,style:W,zoomedLayerId:nt,children:Pe,onLayerDrop:se,onLayerSelect:mt,onCameraChange:kt,onZoomToLayer:mn,onInteractionModeChange:_i,onMount:zi,onSketchTypeChangeProp:Sa,onSketchFeatureCreate:fa,onSketchFeatureUpdate:La,onSketchFeatureDelete:Ra,onAPIReady:ma,onCreditsUpdate:yt},lt)=>{const{mapRef:pi,wrapperRef:ba,selectedFeature:Sc,camera:ms,featureFlags:Xs,isLayerDragging:Nl,timelineManagerRef:pu,cameraForceHorizontalRoll:yu,coreContextValue:Ru,containerStyle:Vd,overriddenInteractionMode:Gd,handleLayerSelect:uf,handleLayerDrag:ff,handleLayerDrop:pf,handleLayerEdit:hf,handleCameraChange:of,handleInteractionModeChange:gf,handleSketchPluginFeatureCreate:Ef,handleSketchPluginFeatureUpdate:xf,handleSketchPluginFeatureDelete:Wa,handleSketchTypeChange:af,handleLayerVisibility:Xd,handleLayerLoad:gd,handleLayerSelectWithRectStart:pd,handleLayerSelectWithRectMove:Zd,handleLayerSelectWithRectEnd:cf}=useHooks({camera:S,interactionMode:L,zoomedLayerId:nt,viewerProperty:s,onLayerSelect:mt,onCameraChange:kt,onZoomToLayer:mn,onLayerDrop:se,onInteractionModeChange:_i,onSketchTypeChangeProp:Sa},lt);return jsxRuntimeExports.jsx(ErrorBoundary,{FallbackComponent:Error$1,children:jsxRuntimeExports.jsx(VisualizerProvider,{mapRef:pi,children:jsxRuntimeExports.jsxs("div",{ref:ba,style:Vd,children:[jsxRuntimeExports.jsx(Map$1,{ref:pi,isBuilt:n,isEditable:o,engine:t,layers:c,engines,camera:ms,cameraForceHorizontalRoll:yu,clusters:d,hiddenLayers:y,isLayerDragging:Nl,isLayerDraggable:o,meta:N,displayCredits:z,style:W,featureFlags:Xs,shouldRender:F,property:s,time:P,small:h,ready:p,timelineManagerRef:pu,interactionMode:Gd,selectedFeature:Sc,onCameraChange:of,onLayerDrag:ff,onLayerDrop:pf,onLayerSelect:uf,onLayerEdit:hf,overrideInteractionMode:gf,onSketchFeatureCreate:fa,onSketchPluginFeatureCreate:Ef,onSketchFeatureUpdate:La,onSketchPluginFeatureUpdate:xf,onSketchFeatureDelete:Ra,onSketchPluginFeatureDelete:Wa,onSketchTypeChange:af,onMount:zi,onLayerVisibility:Xd,onLayerLoad:gd,onLayerSelectWithRectStart:pd,onLayerSelectWithRectMove:Zd,onLayerSelectWithRectEnd:cf,onAPIReady:ma,onCreditsUpdate:yt}),jsxRuntimeExports.jsx(coreContext.Provider,{value:Ru,children:Pe})]})})})}));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,S=y>>1,P=-7,L=o?c-1:0,F=o?-1:1,N=t[n+L];for(L+=F,d=N&(1<<-P)-1,N>>=-P,P+=p;P>0;d=d*256+t[n+L],L+=F,P-=8);for(h=d&(1<<-P)-1,d>>=-P,P+=s;P>0;h=h*256+t[n+L],L+=F,P-=8);if(d===0)d=1-S;else{if(d===y)return h?NaN:(N?-1:1)*(1/0);h=h+Math.pow(2,s),d=d-S}return(N?-1:1)*h*Math.pow(2,d-s)}function write(t,n,o,s,c,d){var h,p,y,S=d*8-c-1,P=(1<<S)-1,L=P>>1,F=c===23?Math.pow(2,-24)-Math.pow(2,-77):0,N=s?0:d-1,z=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=P):(h=Math.floor(Math.log(n)/Math.LN2),n*(y=Math.pow(2,-h))<1&&(h--,y*=2),h+L>=1?n+=F/y:n+=F*Math.pow(2,1-L),n*y>=2&&(h++,y/=2),h+L>=P?(p=0,h=P):h+L>=1?(p=(n*y-1)*Math.pow(2,c),h=h+L):(p=n*Math.pow(2,L-1)*Math.pow(2,c),h=0));c>=8;t[o+N]=p&255,N+=z,p/=256,c-=8);for(h=h<<c|p,S+=c;S>0;t[o+N]=h&255,N+=z,h/=256,S-=8);t[o+N-z]|=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),S=this.slice(c,d),P=n.slice(o,s),L=0;L<y;++L)if(S[L]!==P[L]){h=S[L],p=P[L];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(N,z){return d===1?N[z]:N.readUInt16BE(z*d)}var S;if(c){var P=-1;for(S=o;S<h;S++)if(y(t,S)===y(n,P===-1?0:S-P)){if(P===-1&&(P=S),S-P+1===p)return P*d}else P!==-1&&(S-=S-P),P=-1}else for(o+p>h&&(o=h-p),S=o;S>=0;S--){for(var L=!0,F=0;F<p;F++)if(y(t,S+F)!==y(n,F)){L=!1;break}if(L)return S}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,S,P,L;switch(p){case 1:d<128&&(h=d);break;case 2:y=t[c+1],(y&192)===128&&(L=(d&31)<<6|y&63,L>127&&(h=L));break;case 3:y=t[c+1],S=t[c+2],(y&192)===128&&(S&192)===128&&(L=(d&15)<<12|(y&63)<<6|S&63,L>2047&&(L<55296||L>57343)&&(h=L));break;case 4:y=t[c+1],S=t[c+2],P=t[c+3],(y&192)===128&&(S&192)===128&&(P&192)===128&&(L=(d&15)<<18|(y&63)<<12|(S&63)<<6|P&63,L>65535&&L<1114112&&(h=L))}}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,S=n==="error";if(p=this._events,p)S=S&&p.error==null;else if(!S)return!1;if(y=this.domain,S){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 P=new Error('Uncaught, unspecified "error" event. ('+o+")");throw P.context=o,P}return!1}if(s=p[n],!s)return!1;var L=typeof s=="function";switch(c=arguments.length,c){case 1:emitNone(s,L,this);break;case 2:emitOne(s,L,this,arguments[1]);break;case 3:emitTwo(s,L,this,arguments[1],arguments[2]);break;case 4:emitThree(s,L,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,L,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&&currentQueue[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="",S=!1,P=["{","}"];if(isArray(n)&&(S=!0,P=["[","]"]),isFunction(n)){var L=n.name?": "+n.name:"";y=" [Function"+L+"]"}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&&(!S||n.length==0))return P[0]+y+P[1];if(o<0)return isRegExp(n)?t.stylize(RegExp.prototype.toString.call(n),"regexp"):t.stylize("[Object]","special");t.seen.push(n);var F;return S?F=formatArray(t,n,o,h,d):F=d.map(function(N){return formatProperty(t,n,o,h,N,S)}),t.seen.pop(),reduceToSingleString(F,y,P)}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(S){return" "+S}).join(`
6748
6748
  `).substr(2):p=`