@drincs/pixi-vn 1.5.13 → 1.5.18
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/README.md +8 -3
- package/dist/canvas.cjs +3 -2
- package/dist/canvas.d.cts +46 -105
- package/dist/canvas.d.ts +46 -105
- package/dist/canvas.mjs +3 -2
- package/dist/characters.cjs +2 -1
- package/dist/characters.mjs +2 -1
- package/dist/chunk-46QBDRUK.mjs +2 -0
- package/dist/chunk-52EK6LYW.mjs +2 -0
- package/dist/chunk-INJYRMJ3.mjs +2 -0
- package/dist/{chunk-TTRUPDAB.mjs → chunk-JJFD2BVW.mjs} +2 -1
- package/dist/chunk-JJFD2BVW.mjs.map +1 -0
- package/dist/chunk-OXRIVLY2.mjs +2 -0
- package/dist/chunk-SOFV7YZ5.mjs +2 -0
- package/dist/chunk-XZMYXKAY.mjs +2 -0
- package/dist/core.cjs +1 -0
- package/dist/core.d.cts +399 -0
- package/dist/core.d.ts +399 -0
- package/dist/core.mjs +1 -0
- package/dist/history.cjs +2 -1
- package/dist/history.d.cts +1 -1
- package/dist/history.d.ts +1 -1
- package/dist/history.mjs +2 -1
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +9 -10
- package/dist/index.d.ts +9 -10
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -0
- package/dist/motion.cjs +2 -0
- package/dist/motion.cjs.map +1 -0
- package/dist/motion.d.cts +96 -0
- package/dist/motion.d.ts +96 -0
- package/dist/motion.mjs +2 -0
- package/dist/motion.mjs.map +1 -0
- package/dist/narration.cjs +3 -2
- package/dist/narration.mjs +3 -2
- package/dist/pixi/browser.js +170 -167
- package/dist/sound.cjs +2 -1
- package/dist/sound.mjs +2 -1
- package/dist/storage.cjs +2 -1
- package/dist/storage.mjs +2 -1
- package/dist/vite-listener.cjs +2 -1
- package/dist/vite-listener.cjs.map +1 -0
- package/dist/vite-listener.mjs +2 -1
- package/dist/vite-listener.mjs.map +1 -0
- package/dist/vite.cjs +2 -1
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.mjs +2 -1
- package/dist/vite.mjs.map +1 -0
- package/package.json +27 -10
- package/dist/chunk-6GO4XVS7.mjs +0 -1
- package/dist/chunk-6IVCTY6P.mjs +0 -1
- package/dist/chunk-GNJIUFU2.mjs +0 -1
- package/dist/chunk-HVEJJGVC.mjs +0 -1
- package/dist/chunk-XDBHD3IV.mjs +0 -1
- package/dist/chunk-XSN6P5JL.mjs +0 -0
- package/dist/unifier.cjs +0 -1
- package/dist/unifier.mjs +0 -1
package/dist/history.cjs
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
'use strict';var unifier=require('@drincs/pixi-vn/unifier');var Xt=Object.defineProperty;var Vt=f=>{throw TypeError(f)};var Qt=(f,t,i)=>t in f?Xt(f,t,{enumerable:true,configurable:true,writable:true,value:i}):f[t]=i;var w=(f,t,i)=>Qt(f,typeof t!="symbol"?t+"":t,i),kt=(f,t,i)=>t.has(f)||Vt("Cannot "+i);var e=(f,t,i)=>(kt(f,t,"read from private field"),i?i.call(f):t.get(f)),S=(f,t,i)=>t.has(f)?Vt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(f):t.set(f,i),u=(f,t,i,s)=>(kt(f,t,"write to private field"),t.set(f,i),i),c=(f,t,i)=>(kt(f,t,"access private method"),i);var Tt=(f,t,i,s)=>({set _(r){u(f,t,r);},get _(){return e(f,t,s)}});var Zt={Date:true,RegExp:true,String:true,Number:true};function Dt(f,t,i={cyclesFix:true},s=[]){let r=[],n=Array.isArray(f);for(let a in f){let h=f[a],m=n?+a:a;if(!(a in t)){r.push({type:"REMOVE",path:[m],oldValue:f[a]});continue}let y=t[a],b=typeof h=="object"&&typeof y=="object"&&Array.isArray(h)===Array.isArray(y);h&&y&&b&&!Zt[Object.getPrototypeOf(h)?.constructor?.name]&&(!i.cyclesFix||!s.includes(h))?r.push.apply(r,Dt(h,y,i,i.cyclesFix?s.concat([h]):[]).map(v=>(v.path.unshift(m),v))):h!==y&&!(Number.isNaN(h)&&Number.isNaN(y))&&!(b&&(isNaN(h)?h+""==y+"":+h==+y))&&r.push({path:[m],type:"CHANGE",value:y,oldValue:h});}let o=Array.isArray(t);for(let a in t)a in f||r.push({type:"CREATE",path:[o?+a:a],value:t[a]});return r}var E;(r=>(r.log=(n,...o)=>console.log(`[Pixi\u2019VN] ${n}`,...o),r.warn=(n,...o)=>console.warn(`[Pixi\u2019VN] ${n}`,...o),r.error=(n,...o)=>console.error(`[Pixi\u2019VN] ${n}`,...o),r.info=(n,...o)=>console.info(`[Pixi\u2019VN] ${n}`,...o)))(E||(E={}));function et(f){try{if(typeof f>"u")return f;let t=JSON.stringify(f);return JSON.parse(t)}catch(t){throw E.error("Error creating exportable element",f,t),new Error("[Pixi\u2019VN] Error creating exportable element")}}function jt(f,t){let i=et(f);return t.length>1&&"type"in t[0]&&(t=t.reverse()),t.forEach(s=>{"type"in s?te(i,s):ee(i,s);}),i}function te(f,t){let i=f;t.path&&t.path.length>0?t.path.forEach((s,r)=>{if(t.path&&r===t.path.length-1)switch(t.type){case "CHANGE":case "REMOVE":i[s]=t.oldValue;break;case "CREATE":Array.isArray(i)&&typeof s=="number"?i.splice(s,1):delete i[s];break}else i=i[s];}):E.warn("No path found, skipping diff",t);}function ee(f,t){let i=f;t.path&&t.path.length>0?t.path.forEach((s,r)=>{if(t.path&&r===t.path.length-1){if(t.kind==="E"||t.kind==="D")i[s]=t.lhs;else if(t.kind==="N")Number.isInteger(s)?Array.isArray(i)&&i.splice(s,1):typeof s=="string"&&delete i[s];else if(t.kind==="A"){let n=t.index;t.item.kind==="N"?i[s].splice(n,1):t.item.kind==="E"||t.item.kind==="D"?i[s][n]=t.item.lhs:t.item.kind==="A"?E.warn("Nested array found, skipping diff",t):E.warn("No array found, skipping diff",t);}}else i=i[s];}):E.warn("No path found, skipping diff",t);}var ie=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,$t=new Set,Gt=typeof process=="object"&&process?process:{},Bt=(f,t,i,s)=>{typeof Gt.emitWarning=="function"?Gt.emitWarning(f,t,i,s):console.error(`[${i}] ${t}: ${f}`);},Nt=globalThis.AbortController,Ut=globalThis.AbortSignal;if(typeof Nt>"u"){Ut=class{constructor(){w(this,"onabort");w(this,"_onabort",[]);w(this,"reason");w(this,"aborted",false);}addEventListener(i,s){this._onabort.push(s);}},Nt=class{constructor(){w(this,"signal",new Ut);t();}abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=true;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i);}}};let f=Gt.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{f&&(f=false,Bt("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",t));};}var se=f=>!$t.has(f);var ot=f=>f&&f===Math.floor(f)&&f>0&&isFinite(f),qt=f=>ot(f)?f<=Math.pow(2,8)?Uint8Array:f<=Math.pow(2,16)?Uint16Array:f<=Math.pow(2,32)?Uint32Array:f<=Number.MAX_SAFE_INTEGER?Ct:null:null,Ct=class extends Array{constructor(f){super(f),this.fill(0);}},it,gt,re=(it=class{constructor(t,i){w(this,"heap");w(this,"length");if(!e(it,gt))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new i(t),this.length=0;}static create(t){let i=qt(t);if(!i)return [];u(it,gt,true);let s=new it(t,i);return u(it,gt,false),s}push(t){this.heap[this.length++]=t;}pop(){return this.heap[--this.length]}},gt=new WeakMap,S(it,gt,false),it),Kt,Pt,P,M,$,ct,B,St,bt,q,D,J,T,A,d,k,W,z,C,Y,F,X,Q,V,j,Z,lt,G,wt,l,Rt,ut,rt,Et,U,Yt,pt,vt,Ht,nt,at,Lt,Ft,zt,x,Mt,At,ht,Wt,_t,Jt=(_t=class{constructor(t){S(this,l);S(this,P);S(this,M);S(this,$);S(this,ct);S(this,B);S(this,St);S(this,bt);S(this,q);w(this,"ttl");w(this,"ttlResolution");w(this,"ttlAutopurge");w(this,"updateAgeOnGet");w(this,"updateAgeOnHas");w(this,"allowStale");w(this,"noDisposeOnSet");w(this,"noUpdateTTL");w(this,"maxEntrySize");w(this,"sizeCalculation");w(this,"noDeleteOnFetchRejection");w(this,"noDeleteOnStaleGet");w(this,"allowStaleOnFetchAbort");w(this,"allowStaleOnFetchRejection");w(this,"ignoreFetchAbort");S(this,D);S(this,J);S(this,T);S(this,A);S(this,d);S(this,k);S(this,W);S(this,z);S(this,C);S(this,Y);S(this,F);S(this,X);S(this,Q);S(this,V);S(this,j);S(this,Z);S(this,lt);S(this,G);S(this,wt);S(this,ut,()=>{});S(this,rt,()=>{});S(this,Et,()=>{});S(this,U,()=>false);S(this,pt,t=>{});S(this,vt,(t,i,s)=>{});S(this,Ht,(t,i,s,r)=>{if(s||r)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0});w(this,Kt,"LRUCache");let{max:i=0,ttl:s,ttlResolution:r=1,ttlAutopurge:n,updateAgeOnGet:o,updateAgeOnHas:a,allowStale:h,dispose:m,onInsert:y,disposeAfter:b,noDisposeOnSet:v,noUpdateTTL:K,maxSize:tt=0,maxEntrySize:H=0,sizeCalculation:_,fetchMethod:g,memoMethod:N,noDeleteOnFetchRejection:R,noDeleteOnStaleGet:I,allowStaleOnFetchRejection:O,allowStaleOnFetchAbort:xt,ignoreFetchAbort:dt,perf:mt}=t;if(mt!==void 0&&typeof mt?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(u(this,q,mt??ie),i!==0&&!ot(i))throw new TypeError("max option must be a nonnegative integer");let yt=i?qt(i):Array;if(!yt)throw new Error("invalid max value: "+i);if(u(this,P,i),u(this,M,tt),this.maxEntrySize=H||e(this,M),this.sizeCalculation=_,this.sizeCalculation){if(!e(this,M)&&!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(N!==void 0&&typeof N!="function")throw new TypeError("memoMethod must be a function if defined");if(u(this,bt,N),g!==void 0&&typeof g!="function")throw new TypeError("fetchMethod must be a function if specified");if(u(this,St,g),u(this,lt,!!g),u(this,T,new Map),u(this,A,new Array(i).fill(void 0)),u(this,d,new Array(i).fill(void 0)),u(this,k,new yt(i)),u(this,W,new yt(i)),u(this,z,0),u(this,C,0),u(this,Y,re.create(i)),u(this,D,0),u(this,J,0),typeof m=="function"&&u(this,$,m),typeof y=="function"&&u(this,ct,y),typeof b=="function"?(u(this,B,b),u(this,F,[])):(u(this,B,void 0),u(this,F,void 0)),u(this,Z,!!e(this,$)),u(this,wt,!!e(this,ct)),u(this,G,!!e(this,B)),this.noDisposeOnSet=!!v,this.noUpdateTTL=!!K,this.noDeleteOnFetchRejection=!!R,this.allowStaleOnFetchRejection=!!O,this.allowStaleOnFetchAbort=!!xt,this.ignoreFetchAbort=!!dt,this.maxEntrySize!==0){if(e(this,M)!==0&&!ot(e(this,M)))throw new TypeError("maxSize must be a positive integer if specified");if(!ot(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");c(this,l,Yt).call(this);}if(this.allowStale=!!h,this.noDeleteOnStaleGet=!!I,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!a,this.ttlResolution=ot(r)||r===0?r:1,this.ttlAutopurge=!!n,this.ttl=s||0,this.ttl){if(!ot(this.ttl))throw new TypeError("ttl must be a positive integer if specified");c(this,l,Rt).call(this);}if(e(this,P)===0&&this.ttl===0&&e(this,M)===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!e(this,P)&&!e(this,M)){let It="LRU_CACHE_UNBOUNDED";se(It)&&($t.add(It),Bt("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",It,_t));}}get perf(){return e(this,q)}static unsafeExposeInternals(t){return {starts:e(t,Q),ttls:e(t,V),autopurgeTimers:e(t,j),sizes:e(t,X),keyMap:e(t,T),keyList:e(t,A),valList:e(t,d),next:e(t,k),prev:e(t,W),get head(){return e(t,z)},get tail(){return e(t,C)},free:e(t,Y),isBackgroundFetch:i=>{var s;return c(s=t,l,x).call(s,i)},backgroundFetch:(i,s,r,n)=>{var o;return c(o=t,l,zt).call(o,i,s,r,n)},moveToTail:i=>{var s;return c(s=t,l,At).call(s,i)},indexes:i=>{var s;return c(s=t,l,nt).call(s,i)},rindexes:i=>{var s;return c(s=t,l,at).call(s,i)},isStale:i=>{var s;return e(s=t,U).call(s,i)}}}get max(){return e(this,P)}get maxSize(){return e(this,M)}get calculatedSize(){return e(this,J)}get size(){return e(this,D)}get fetchMethod(){return e(this,St)}get memoMethod(){return e(this,bt)}get dispose(){return e(this,$)}get onInsert(){return e(this,ct)}get disposeAfter(){return e(this,B)}getRemainingTTL(t){return e(this,T).has(t)?1/0:0}*entries(){for(let t of c(this,l,nt).call(this))e(this,d)[t]!==void 0&&e(this,A)[t]!==void 0&&!c(this,l,x).call(this,e(this,d)[t])&&(yield [e(this,A)[t],e(this,d)[t]]);}*rentries(){for(let t of c(this,l,at).call(this))e(this,d)[t]!==void 0&&e(this,A)[t]!==void 0&&!c(this,l,x).call(this,e(this,d)[t])&&(yield [e(this,A)[t],e(this,d)[t]]);}*keys(){for(let t of c(this,l,nt).call(this)){let i=e(this,A)[t];i!==void 0&&!c(this,l,x).call(this,e(this,d)[t])&&(yield i);}}*rkeys(){for(let t of c(this,l,at).call(this)){let i=e(this,A)[t];i!==void 0&&!c(this,l,x).call(this,e(this,d)[t])&&(yield i);}}*values(){for(let t of c(this,l,nt).call(this))e(this,d)[t]!==void 0&&!c(this,l,x).call(this,e(this,d)[t])&&(yield e(this,d)[t]);}*rvalues(){for(let t of c(this,l,at).call(this))e(this,d)[t]!==void 0&&!c(this,l,x).call(this,e(this,d)[t])&&(yield e(this,d)[t]);}[(Pt=Symbol.iterator,Kt=Symbol.toStringTag,Pt)](){return this.entries()}find(t,i={}){for(let s of c(this,l,nt).call(this)){let r=e(this,d)[s],n=c(this,l,x).call(this,r)?r.__staleWhileFetching:r;if(n!==void 0&&t(n,e(this,A)[s],this))return this.get(e(this,A)[s],i)}}forEach(t,i=this){for(let s of c(this,l,nt).call(this)){let r=e(this,d)[s],n=c(this,l,x).call(this,r)?r.__staleWhileFetching:r;n!==void 0&&t.call(i,n,e(this,A)[s],this);}}rforEach(t,i=this){for(let s of c(this,l,at).call(this)){let r=e(this,d)[s],n=c(this,l,x).call(this,r)?r.__staleWhileFetching:r;n!==void 0&&t.call(i,n,e(this,A)[s],this);}}purgeStale(){let t=false;for(let i of c(this,l,at).call(this,{allowStale:true}))e(this,U).call(this,i)&&(c(this,l,ht).call(this,e(this,A)[i],"expire"),t=true);return t}info(t){let i=e(this,T).get(t);if(i===void 0)return;let s=e(this,d)[i],r=c(this,l,x).call(this,s)?s.__staleWhileFetching:s;if(r===void 0)return;let n={value:r};if(e(this,V)&&e(this,Q)){let o=e(this,V)[i],a=e(this,Q)[i];if(o&&a){let h=o-(e(this,q).now()-a);n.ttl=h,n.start=Date.now();}}return e(this,X)&&(n.size=e(this,X)[i]),n}dump(){let t=[];for(let i of c(this,l,nt).call(this,{allowStale:true})){let s=e(this,A)[i],r=e(this,d)[i],n=c(this,l,x).call(this,r)?r.__staleWhileFetching:r;if(n===void 0||s===void 0)continue;let o={value:n};if(e(this,V)&&e(this,Q)){o.ttl=e(this,V)[i];let a=e(this,q).now()-e(this,Q)[i];o.start=Math.floor(Date.now()-a);}e(this,X)&&(o.size=e(this,X)[i]),t.unshift([s,o]);}return t}load(t){this.clear();for(let[i,s]of t){if(s.start){let r=Date.now()-s.start;s.start=e(this,q).now()-r;}this.set(i,s.value,s);}}set(t,i,s={}){var v,K,tt,H;if(i===void 0)return this.delete(t),this;let{ttl:r=this.ttl,start:n,noDisposeOnSet:o=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:h}=s,{noUpdateTTL:m=this.noUpdateTTL}=s,y=e(this,Ht).call(this,t,i,s.size||0,a);if(this.maxEntrySize&&y>this.maxEntrySize)return h&&(h.set="miss",h.maxEntrySizeExceeded=true),c(this,l,ht).call(this,t,"set"),this;let b=e(this,D)===0?void 0:e(this,T).get(t);if(b===void 0)b=e(this,D)===0?e(this,C):e(this,Y).length!==0?e(this,Y).pop():e(this,D)===e(this,P)?c(this,l,Ft).call(this,false):e(this,D),e(this,A)[b]=t,e(this,d)[b]=i,e(this,T).set(t,b),e(this,k)[e(this,C)]=b,e(this,W)[b]=e(this,C),u(this,C,b),Tt(this,D)._++,e(this,vt).call(this,b,y,h),h&&(h.set="add"),m=false,e(this,wt)&&((v=e(this,ct))==null||v.call(this,i,t,"add"));else {c(this,l,At).call(this,b);let _=e(this,d)[b];if(i!==_){if(e(this,lt)&&c(this,l,x).call(this,_)){_.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:g}=_;g!==void 0&&!o&&(e(this,Z)&&((K=e(this,$))==null||K.call(this,g,t,"set")),e(this,G)&&e(this,F)?.push([g,t,"set"]));}else o||(e(this,Z)&&((tt=e(this,$))==null||tt.call(this,_,t,"set")),e(this,G)&&e(this,F)?.push([_,t,"set"]));if(e(this,pt).call(this,b),e(this,vt).call(this,b,y,h),e(this,d)[b]=i,h){h.set="replace";let g=_&&c(this,l,x).call(this,_)?_.__staleWhileFetching:_;g!==void 0&&(h.oldValue=g);}}else h&&(h.set="update");e(this,wt)&&this.onInsert?.(i,t,i===_?"update":"replace");}if(r!==0&&!e(this,V)&&c(this,l,Rt).call(this),e(this,V)&&(m||e(this,Et).call(this,b,r,n),h&&e(this,rt).call(this,h,b)),!o&&e(this,G)&&e(this,F)){let _=e(this,F),g;for(;g=_?.shift();)(H=e(this,B))==null||H.call(this,...g);}return this}pop(){var t;try{for(;e(this,D);){let i=e(this,d)[e(this,z)];if(c(this,l,Ft).call(this,!0),c(this,l,x).call(this,i)){if(i.__staleWhileFetching)return i.__staleWhileFetching}else if(i!==void 0)return i}}finally{if(e(this,G)&&e(this,F)){let i=e(this,F),s;for(;s=i?.shift();)(t=e(this,B))==null||t.call(this,...s);}}}has(t,i={}){let{updateAgeOnHas:s=this.updateAgeOnHas,status:r}=i,n=e(this,T).get(t);if(n!==void 0){let o=e(this,d)[n];if(c(this,l,x).call(this,o)&&o.__staleWhileFetching===void 0)return false;if(e(this,U).call(this,n))r&&(r.has="stale",e(this,rt).call(this,r,n));else return s&&e(this,ut).call(this,n),r&&(r.has="hit",e(this,rt).call(this,r,n)),true}else r&&(r.has="miss");return false}peek(t,i={}){let{allowStale:s=this.allowStale}=i,r=e(this,T).get(t);if(r===void 0||!s&&e(this,U).call(this,r))return;let n=e(this,d)[r];return c(this,l,x).call(this,n)?n.__staleWhileFetching:n}async fetch(t,i={}){let{allowStale:s=this.allowStale,updateAgeOnGet:r=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,ttl:o=this.ttl,noDisposeOnSet:a=this.noDisposeOnSet,size:h=0,sizeCalculation:m=this.sizeCalculation,noUpdateTTL:y=this.noUpdateTTL,noDeleteOnFetchRejection:b=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:v=this.allowStaleOnFetchRejection,ignoreFetchAbort:K=this.ignoreFetchAbort,allowStaleOnFetchAbort:tt=this.allowStaleOnFetchAbort,context:H,forceRefresh:_=false,status:g,signal:N}=i;if(!e(this,lt))return g&&(g.fetch="get"),this.get(t,{allowStale:s,updateAgeOnGet:r,noDeleteOnStaleGet:n,status:g});let R={allowStale:s,updateAgeOnGet:r,noDeleteOnStaleGet:n,ttl:o,noDisposeOnSet:a,size:h,sizeCalculation:m,noUpdateTTL:y,noDeleteOnFetchRejection:b,allowStaleOnFetchRejection:v,allowStaleOnFetchAbort:tt,ignoreFetchAbort:K,status:g,signal:N},I=e(this,T).get(t);if(I===void 0){g&&(g.fetch="miss");let O=c(this,l,zt).call(this,t,I,R,H);return O.__returned=O}else {let O=e(this,d)[I];if(c(this,l,x).call(this,O)){let yt=s&&O.__staleWhileFetching!==void 0;return g&&(g.fetch="inflight",yt&&(g.returnedStale=true)),yt?O.__staleWhileFetching:O.__returned=O}let xt=e(this,U).call(this,I);if(!_&&!xt)return g&&(g.fetch="hit"),c(this,l,At).call(this,I),r&&e(this,ut).call(this,I),g&&e(this,rt).call(this,g,I),O;let dt=c(this,l,zt).call(this,t,I,R,H),mt=dt.__staleWhileFetching!==void 0&&s;return g&&(g.fetch=xt?"stale":"refresh",mt&&xt&&(g.returnedStale=true)),mt?dt.__staleWhileFetching:dt.__returned=dt}}async forceFetch(t,i={}){let s=await this.fetch(t,i);if(s===void 0)throw new Error("fetch() returned undefined");return s}memo(t,i={}){let s=e(this,bt);if(!s)throw new Error("no memoMethod provided to constructor");let{context:r,forceRefresh:n,...o}=i,a=this.get(t,o);if(!n&&a!==void 0)return a;let h=s(t,a,{options:o,context:r});return this.set(t,h,o),h}get(t,i={}){let{allowStale:s=this.allowStale,updateAgeOnGet:r=this.updateAgeOnGet,noDeleteOnStaleGet:n=this.noDeleteOnStaleGet,status:o}=i,a=e(this,T).get(t);if(a!==void 0){let h=e(this,d)[a],m=c(this,l,x).call(this,h);return o&&e(this,rt).call(this,o,a),e(this,U).call(this,a)?(o&&(o.get="stale"),m?(o&&s&&h.__staleWhileFetching!==void 0&&(o.returnedStale=true),s?h.__staleWhileFetching:void 0):(n||c(this,l,ht).call(this,t,"expire"),o&&s&&(o.returnedStale=true),s?h:void 0)):(o&&(o.get="hit"),m?h.__staleWhileFetching:(c(this,l,At).call(this,a),r&&e(this,ut).call(this,a),h))}else o&&(o.get="miss");}delete(t){return c(this,l,ht).call(this,t,"delete")}clear(){return c(this,l,Wt).call(this,"delete")}},P=new WeakMap,M=new WeakMap,$=new WeakMap,ct=new WeakMap,B=new WeakMap,St=new WeakMap,bt=new WeakMap,q=new WeakMap,D=new WeakMap,J=new WeakMap,T=new WeakMap,A=new WeakMap,d=new WeakMap,k=new WeakMap,W=new WeakMap,z=new WeakMap,C=new WeakMap,Y=new WeakMap,F=new WeakMap,X=new WeakMap,Q=new WeakMap,V=new WeakMap,j=new WeakMap,Z=new WeakMap,lt=new WeakMap,G=new WeakMap,wt=new WeakMap,l=new WeakSet,Rt=function(){let t=new Ct(e(this,P)),i=new Ct(e(this,P));u(this,V,t),u(this,Q,i);let s=this.ttlAutopurge?new Array(e(this,P)):void 0;u(this,j,s),u(this,Et,(o,a,h=e(this,q).now())=>{if(i[o]=a!==0?h:0,t[o]=a,s?.[o]&&(clearTimeout(s[o]),s[o]=void 0),a!==0&&s){let m=setTimeout(()=>{e(this,U).call(this,o)&&c(this,l,ht).call(this,e(this,A)[o],"expire");},a+1);m.unref&&m.unref(),s[o]=m;}}),u(this,ut,o=>{i[o]=t[o]!==0?e(this,q).now():0;}),u(this,rt,(o,a)=>{if(t[a]){let h=t[a],m=i[a];if(!h||!m)return;o.ttl=h,o.start=m,o.now=r||n();let y=o.now-m;o.remainingTTL=h-y;}});let r=0,n=()=>{let o=e(this,q).now();if(this.ttlResolution>0){r=o;let a=setTimeout(()=>r=0,this.ttlResolution);a.unref&&a.unref();}return o};this.getRemainingTTL=o=>{let a=e(this,T).get(o);if(a===void 0)return 0;let h=t[a],m=i[a];if(!h||!m)return 1/0;let y=(r||n())-m;return h-y},u(this,U,o=>{let a=i[o],h=t[o];return !!h&&!!a&&(r||n())-a>h});},ut=new WeakMap,rt=new WeakMap,Et=new WeakMap,U=new WeakMap,Yt=function(){let t=new Ct(e(this,P));u(this,J,0),u(this,X,t),u(this,pt,i=>{u(this,J,e(this,J)-t[i]),t[i]=0;}),u(this,Ht,(i,s,r,n)=>{if(c(this,l,x).call(this,s))return 0;if(!ot(r))if(n){if(typeof n!="function")throw new TypeError("sizeCalculation must be a function");if(r=n(s,i),!ot(r))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 r}),u(this,vt,(i,s,r)=>{if(t[i]=s,e(this,M)){let n=e(this,M)-t[i];for(;e(this,J)>n;)c(this,l,Ft).call(this,true);}u(this,J,e(this,J)+t[i]),r&&(r.entrySize=s,r.totalCalculatedSize=e(this,J));});},pt=new WeakMap,vt=new WeakMap,Ht=new WeakMap,nt=function*({allowStale:t=this.allowStale}={}){if(e(this,D))for(let i=e(this,C);!(!c(this,l,Lt).call(this,i)||((t||!e(this,U).call(this,i))&&(yield i),i===e(this,z)));)i=e(this,W)[i];},at=function*({allowStale:t=this.allowStale}={}){if(e(this,D))for(let i=e(this,z);!(!c(this,l,Lt).call(this,i)||((t||!e(this,U).call(this,i))&&(yield i),i===e(this,C)));)i=e(this,k)[i];},Lt=function(t){return t!==void 0&&e(this,T).get(e(this,A)[t])===t},Ft=function(t){var n;let i=e(this,z),s=e(this,A)[i],r=e(this,d)[i];return e(this,lt)&&c(this,l,x).call(this,r)?r.__abortController.abort(new Error("evicted")):(e(this,Z)||e(this,G))&&(e(this,Z)&&((n=e(this,$))==null||n.call(this,r,s,"evict")),e(this,G)&&e(this,F)?.push([r,s,"evict"])),e(this,pt).call(this,i),e(this,j)?.[i]&&(clearTimeout(e(this,j)[i]),e(this,j)[i]=void 0),t&&(e(this,A)[i]=void 0,e(this,d)[i]=void 0,e(this,Y).push(i)),e(this,D)===1?(u(this,z,u(this,C,0)),e(this,Y).length=0):u(this,z,e(this,k)[i]),e(this,T).delete(s),Tt(this,D)._--,i},zt=function(t,i,s,r){let n=i===void 0?void 0:e(this,d)[i];if(c(this,l,x).call(this,n))return n;let o=new Nt,{signal:a}=s;a?.addEventListener("abort",()=>o.abort(a.reason),{signal:o.signal});let h={signal:o.signal,options:s,context:r},m=(H,_=false)=>{let{aborted:g}=o.signal,N=s.ignoreFetchAbort&&H!==void 0,R=s.ignoreFetchAbort||!!(s.allowStaleOnFetchAbort&&H!==void 0);if(s.status&&(g&&!_?(s.status.fetchAborted=true,s.status.fetchError=o.signal.reason,N&&(s.status.fetchAbortIgnored=true)):s.status.fetchResolved=true),g&&!N&&!_)return b(o.signal.reason,R);let I=K,O=e(this,d)[i];return (O===K||N&&_&&O===void 0)&&(H===void 0?I.__staleWhileFetching!==void 0?e(this,d)[i]=I.__staleWhileFetching:c(this,l,ht).call(this,t,"fetch"):(s.status&&(s.status.fetchUpdated=true),this.set(t,H,h.options))),H},y=H=>(s.status&&(s.status.fetchRejected=true,s.status.fetchError=H),b(H,false)),b=(H,_)=>{let{aborted:g}=o.signal,N=g&&s.allowStaleOnFetchAbort,R=N||s.allowStaleOnFetchRejection,I=R||s.noDeleteOnFetchRejection,O=K;if(e(this,d)[i]===K&&(!I||!_&&O.__staleWhileFetching===void 0?c(this,l,ht).call(this,t,"fetch"):N||(e(this,d)[i]=O.__staleWhileFetching)),R)return s.status&&O.__staleWhileFetching!==void 0&&(s.status.returnedStale=true),O.__staleWhileFetching;if(O.__returned===O)throw H},v=(H,_)=>{var N;let g=(N=e(this,St))==null?void 0:N.call(this,t,n,h);g&&g instanceof Promise&&g.then(R=>H(R===void 0?void 0:R),_),o.signal.addEventListener("abort",()=>{(!s.ignoreFetchAbort||s.allowStaleOnFetchAbort)&&(H(void 0),s.allowStaleOnFetchAbort&&(H=R=>m(R,true)));});};s.status&&(s.status.fetchDispatched=true);let K=new Promise(v).then(m,y),tt=Object.assign(K,{__abortController:o,__staleWhileFetching:n,__returned:void 0});return i===void 0?(this.set(t,tt,{...h.options,status:void 0}),i=e(this,T).get(t)):e(this,d)[i]=tt,tt},x=function(t){if(!e(this,lt))return false;let i=t;return !!i&&i instanceof Promise&&i.hasOwnProperty("__staleWhileFetching")&&i.__abortController instanceof Nt},Mt=function(t,i){e(this,W)[i]=t,e(this,k)[t]=i;},At=function(t){t!==e(this,C)&&(t===e(this,z)?u(this,z,e(this,k)[t]):c(this,l,Mt).call(this,e(this,W)[t],e(this,k)[t]),c(this,l,Mt).call(this,e(this,C),t),u(this,C,t));},ht=function(t,i){var r,n;let s=false;if(e(this,D)!==0){let o=e(this,T).get(t);if(o!==void 0)if(e(this,j)?.[o]&&(clearTimeout(e(this,j)?.[o]),e(this,j)[o]=void 0),s=true,e(this,D)===1)c(this,l,Wt).call(this,i);else {e(this,pt).call(this,o);let a=e(this,d)[o];if(c(this,l,x).call(this,a)?a.__abortController.abort(new Error("deleted")):(e(this,Z)||e(this,G))&&(e(this,Z)&&((r=e(this,$))==null||r.call(this,a,t,i)),e(this,G)&&e(this,F)?.push([a,t,i])),e(this,T).delete(t),e(this,A)[o]=void 0,e(this,d)[o]=void 0,o===e(this,C))u(this,C,e(this,W)[o]);else if(o===e(this,z))u(this,z,e(this,k)[o]);else {let h=e(this,W)[o];e(this,k)[h]=e(this,k)[o];let m=e(this,k)[o];e(this,W)[m]=e(this,W)[o];}Tt(this,D)._--,e(this,Y).push(o);}}if(e(this,G)&&e(this,F)?.length){let o=e(this,F),a;for(;a=o?.shift();)(n=e(this,B))==null||n.call(this,...a);}return s},Wt=function(t){var i,s;for(let r of c(this,l,at).call(this,{allowStale:true})){let n=e(this,d)[r];if(c(this,l,x).call(this,n))n.__abortController.abort(new Error("deleted"));else {let o=e(this,A)[r];e(this,Z)&&((i=e(this,$))==null||i.call(this,n,o,t)),e(this,G)&&e(this,F)?.push([n,o,t]);}}if(e(this,T).clear(),e(this,d).fill(void 0),e(this,A).fill(void 0),e(this,V)&&e(this,Q)){e(this,V).fill(0),e(this,Q).fill(0);for(let r of e(this,j)??[])r!==void 0&&clearTimeout(r);e(this,j)?.fill(void 0);}if(e(this,X)&&e(this,X).fill(0),u(this,z,0),u(this,C,0),e(this,Y).length=0,u(this,J,0),u(this,D,0),e(this,G)&&e(this,F)){let r=e(this,F),n;for(;n=r?.shift();)(s=e(this,B))==null||s.call(this,...n);}},_t);var ft=class{constructor(t){w(this,"cache");w(this,"map",new Map);this.cache=new Jt({max:t.cacheSize}),this.map=new Map;}get[Symbol.iterator](){return this.map[Symbol.iterator]}get[Symbol.toStringTag](){return this.map[Symbol.toStringTag]}clear(){return this.cache.clear(),this.map.clear()}delete(t){let i=this.map.delete(t);return i&&this.cache.delete(t),i}get forEach(){return this.map.forEach}get(t){let i=this.cache.get(t);return i||this.map.get(t)}has(t){return this.map.has(t)}set(t,i){return this.map.set(t,i),this.cache.set(t,i),this}get size(){return this.map.size}entries(){return this.map.entries()}keys(){return this.map.keys()}values(){return this.map.values()}};var st=class st{static get originalStepData(){return st._originalStepData?et(st._originalStepData):{path:"",storage:{},canvas:{elementAliasesOrder:[],elements:{},stage:{},tickers:{},tickersSteps:{},tickersOnPause:{},tickersToCompleteOnStepEnd:{tikersIds:[],stepAlias:[]}},sound:{soundAliasesOrder:[],soundsPlaying:{},playInStepIndex:{},filters:void 0},labelIndex:-1,openedLabels:[]}}static set originalStepData(t){st._originalStepData=et(t);}};w(st,"_diffHistory",new ft({cacheSize:5})),w(st,"_stepsInfoHistory",new ft({cacheSize:5})),w(st,"_narrationHistory",new ft({cacheSize:50})),w(st,"stepLimitSaved",20),w(st,"_originalStepData");var p=st;var Ot=class{get stepsInfoMap(){return p._stepsInfoHistory}get diffMap(){return p._diffHistory}get narrationMap(){return p._narrationHistory}get size(){return p._stepsInfoHistory.size}get lastKey(){return this.size===0?null:Math.max(...Array.from(this.keys()))}keys(){return p._stepsInfoHistory.keys()}get(t){let i=p._narrationHistory.get(t);if(!(i&&Object.keys(i).length===1&&i.stepIndex!==void 0))return i}delete(t){p._stepsInfoHistory.delete(t),p._diffHistory.delete(t),p._narrationHistory.delete(t);}getOldGameState(t,i){if(t<=0||this.size==0)return i;let s=this.lastKey;if(typeof s!="number")return E.warn("You can't go back, there is no step to go back"),i;let r=p._diffHistory.get(s);if(r)try{let n=jt(i,r);return unifier.GameUnifier.stepCounter=s,this.delete(s),this.getOldGameState(t-1,n)}catch(n){return E.error("Error applying diff",n),i}else return E.warn("No diff found for the last step, cannot go back"),i}async back(t,i={}){let{steps:s=1}=i;if(!Number.isFinite(s)){E.warn(`[back] The parameter steps must be a valid finite number, received: ${s}`);return}if(s<=0){E.warn(`[back] The parameter steps must be greater than 0, received: ${s}`);return}if(unifier.GameUnifier.runningStepsCount>0){unifier.GameUnifier.increaseBackRequest(s);return}if(p._diffHistory.size<1){E.warn("You can't go back, there is no step to go back");return}unifier.GameUnifier.runningStepsCount++;try{let r=et(this.getOldGameState(s,p.originalStepData));if(r){await unifier.GameUnifier.restoreGameStepState(r,unifier.GameUnifier.navigate);let n=unifier.GameUnifier.stepCounter-1,o=p._narrationHistory.get(n);if(o&&Object.keys(o).length===1&&o.stepIndex!==void 0){let a=p._stepsInfoHistory.get(n);if(a){let h=this.itemMapper({step:a});p._narrationHistory.set(a.index,h);}}}else E.error("Error going back");p.originalStepData=r;}catch(r){E.error("Error going back",r);}finally{if(unifier.GameUnifier.runningStepsCount--,unifier.GameUnifier.runningStepsCount===0&&unifier.GameUnifier.backRequestsCount!==0)return await unifier.GameUnifier.processNavigationRequests(t)}}add(t,i={}){let s=p.originalStepData,{ignoreSameStep:r}=i,n=unifier.GameUnifier.currentGameStepState;if(!r&&this.isSameStep(s,n))return;let o=this.lastKey;(async()=>{try{let h,m;if(typeof o=="number"&&(h=p._stepsInfoHistory.get(o),m=p._narrationHistory.get(o)),p._stepsInfoHistory.set(t.index,t),t.index!==0){let v=Dt(s,n);v?p._diffHistory.set(t.index,v):E.warn("It was not possible to create the difference between the two steps");}let y={},b=this.itemMapper({step:t},y);if(p._narrationHistory.set(t.index,b),h&&m&&typeof o=="number"){let v=this.itemMapper({...y,step:h},{});p._narrationHistory.set(o,v);}}catch(h){E.error("Error adding history step",h);}})(),p.originalStepData=n;}itemMapper(t,i){let{step:s,choiceIndexMade:r,inputValue:n,removeDialogue:o}=t,a=s.dialogue||s.dialoge;i&&s.isGlued&&(i.removeDialogue=true),o&&(a=void 0);let h=s.choices;if(i&&s.currentLabel&&s.choiceIndexMade!==void 0&&(i.choiceIndexMade=s.choiceIndexMade),s.inputValue&&i&&(i.inputValue=s.inputValue),a||h||n){let m=h?.map((y,b)=>{let v=false;return y.oneTime&&s.alreadyMadeChoices&&s.alreadyMadeChoices.includes(b)&&(v=true),{text:y.text,type:y.type,isResponse:false,hidden:v}});if(m){if(m.every(y=>y.hidden)){let y=m.find(b=>b.hidden===false);y&&(y.hidden=false);}r!==void 0&&(m[r].isResponse=true);}return {dialogue:a?{...a,character:a.character?unifier.GameUnifier.getCharacter(a.character)||a.character:void 0}:void 0,playerMadeChoice:typeof r=="number",choices:m,stepIndex:s.index,inputValue:n}}return {stepIndex:s.index}}get narrativeHistory(){let t=[];return Array.from(this.keys()).sort((s,r)=>s-r).forEach(s=>{let r=this.get(s);r&&t.push(r);}),t}get currentLabelHistory(){let t=[],i=Array.from(this.keys()).sort((h,m)=>m-h);if(i.length===0)return t;let s=i[0];if(typeof s!="number")return t;let r=p._stepsInfoHistory.get(s);if(!r)return t;let n=r.openedLabels;if(!n||!Array.isArray(n)||n.length===0)return t;let o=n[0].currentStepIndex,a=n[0].label;return i.every((h,m)=>{let y=this.get(h);if(y){if(m===0)return t.push(y),true;let b=p._stepsInfoHistory.get(h);if(!b)return true;let v=b.openedLabels;if(!v||!Array.isArray(v)||v.length===0||v[0].label!==a||v[0].currentStepIndex>=o)return false;o=v[0].currentStepIndex,t.push(y);}return true}),t.reverse()}removeNarrativeHistory(t){if(t){let i=Array.from(this.keys()).sort((s,r)=>s-r);i=i.slice(0,t),i.forEach(s=>{p._narrationHistory.delete(s),p._stepsInfoHistory.delete(s),p._diffHistory.delete(s);});}else p._stepsInfoHistory.clear(),p._diffHistory.clear(),p._narrationHistory.clear();}get canGoBack(){let t=this.lastKey;return typeof t!="number"?false:p._diffHistory.has(t)}blockGoBack(){unifier.GameUnifier.runningStepsCount===0&&p._diffHistory.clear();}isSameStep(t,i){if(t.openedLabels.length===i.openedLabels.length)try{let s=JSON.stringify(t.openedLabels),r=JSON.stringify(i.openedLabels);if(s===r&&t.path===i.path&&t.labelIndex===i.labelIndex)return !0}catch(s){return E.error("Error comparing opened labels",s),true}return false}clear(){p._stepsInfoHistory.clear(),p._diffHistory.clear(),p._narrationHistory.clear(),p._originalStepData=void 0;}get stepLimitSaved(){return p.stepLimitSaved}set stepLimitSaved(t){p.stepLimitSaved=t;}export(){let t=Array.from(this.keys()).sort((s,r)=>s-r);t.length>this.stepLimitSaved&&(t=t.slice(t.length-this.stepLimitSaved));let i=[];return t.forEach(s=>{let r=p._stepsInfoHistory.get(s);if(r){let n=p._diffHistory.get(s);i.push({...r,diff:n});}}),{stepsHistory:et(i),originalStepData:et(p._originalStepData)}}restoreNarrativeHistory(){let t=Array.from(this.keys()).sort((s,r)=>s-r),i={};t.forEach(s=>{let r=p._stepsInfoHistory.get(s);if(r){let n={...i};i={};let o=this.itemMapper({step:r,choiceIndexMade:n.choiceIndexMade,inputValue:n.inputValue,removeDialogue:n.removeDialogue},i);o&&p._narrationHistory.set(s,o);}});}async restore(t){this.clear();try{t.hasOwnProperty("stepsHistory")?(t.stepsHistory.forEach(s=>{s.diff&&p._diffHistory.set(s.index,s.diff);let r={...s,diff:void 0};p._stepsInfoHistory.set(s.index,r);}),this.restoreNarrativeHistory()):E.warn("Could not import stepsHistory data, so will be ignored"),t.hasOwnProperty("originalStepData")?p._originalStepData=t.originalStepData:E.warn("Could not import originalStepData data, so will be ignored");}catch(i){E.error("Error importing data",i);}}};var Re=new Ot;exports.HistoryManagerStatic=p;exports.stepHistory=Re;
|
|
1
|
+
'use strict';var core=require('@drincs/pixi-vn/core');var Xt=Object.defineProperty;var jt=f=>{throw TypeError(f)};var Qt=(f,t,i)=>t in f?Xt(f,t,{enumerable:true,configurable:true,writable:true,value:i}):f[t]=i;var w=(f,t,i)=>Qt(f,typeof t!="symbol"?t+"":t,i),kt=(f,t,i)=>t.has(f)||jt("Cannot "+i);var e=(f,t,i)=>(kt(f,t,"read from private field"),i?i.call(f):t.get(f)),b=(f,t,i)=>t.has(f)?jt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(f):t.set(f,i),c=(f,t,i,s)=>(kt(f,t,"write to private field"),t.set(f,i),i),u=(f,t,i)=>(kt(f,t,"access private method"),i);var Tt=(f,t,i,s)=>({set _(r){c(f,t,r);},get _(){return e(f,t,s)}});var Zt={Date:true,RegExp:true,String:true,Number:true};function Dt(f,t,i={cyclesFix:true},s=[]){let r=[],o=Array.isArray(f);for(let a in f){let h=f[a],d=o?+a:a;if(!(a in t)){r.push({type:"REMOVE",path:[d],oldValue:f[a]});continue}let y=t[a],g=typeof h=="object"&&typeof y=="object"&&Array.isArray(h)===Array.isArray(y);h&&y&&g&&!Zt[Object.getPrototypeOf(h)?.constructor?.name]&&(!i.cyclesFix||!s.includes(h))?r.push.apply(r,Dt(h,y,i,i.cyclesFix?s.concat([h]):[]).map(v=>(v.path.unshift(d),v))):h!==y&&!(Number.isNaN(h)&&Number.isNaN(y))&&!(g&&(isNaN(h)?h+""==y+"":+h==+y))&&r.push({path:[d],type:"CHANGE",value:y,oldValue:h});}let n=Array.isArray(t);for(let a in t)a in f||r.push({type:"CREATE",path:[n?+a:a],value:t[a]});return r}var E;(r=>(r.log=(o,...n)=>console.log(`[Pixi\u2019VN] ${o}`,...n),r.warn=(o,...n)=>console.warn(`[Pixi\u2019VN] ${o}`,...n),r.error=(o,...n)=>console.error(`[Pixi\u2019VN] ${o}`,...n),r.info=(o,...n)=>console.info(`[Pixi\u2019VN] ${o}`,...n)))(E||(E={}));function et(f){try{if(typeof f>"u")return f;let t=JSON.stringify(f);return JSON.parse(t)}catch(t){throw E.error("Error creating exportable element",f,t),new core.PixiError("not_json_serializable","Error creating exportable element")}}function Vt(f,t){let i=et(f);return t.length>1&&"type"in t[0]&&(t=t.reverse()),t.forEach(s=>{"type"in s?ee(i,s):ie(i,s);}),i}function ee(f,t){let i=f;t.path&&t.path.length>0?t.path.forEach((s,r)=>{if(t.path&&r===t.path.length-1)switch(t.type){case "CHANGE":case "REMOVE":i[s]=t.oldValue;break;case "CREATE":Array.isArray(i)&&typeof s=="number"?i.splice(s,1):delete i[s];break}else i=i[s];}):E.warn("No path found, skipping diff",t);}function ie(f,t){let i=f;t.path&&t.path.length>0?t.path.forEach((s,r)=>{if(t.path&&r===t.path.length-1){if(t.kind==="E"||t.kind==="D")i[s]=t.lhs;else if(t.kind==="N")Number.isInteger(s)?Array.isArray(i)&&i.splice(s,1):typeof s=="string"&&delete i[s];else if(t.kind==="A"){let o=t.index;t.item.kind==="N"?i[s].splice(o,1):t.item.kind==="E"||t.item.kind==="D"?i[s][o]=t.item.lhs:t.item.kind==="A"?E.warn("Nested array found, skipping diff",t):E.warn("No array found, skipping diff",t);}}else i=i[s];}):E.warn("No path found, skipping diff",t);}var se=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,$t=new Set,Gt=typeof process=="object"&&process?process:{},Bt=(f,t,i,s)=>{typeof Gt.emitWarning=="function"?Gt.emitWarning(f,t,i,s):console.error(`[${i}] ${t}: ${f}`);},Nt=globalThis.AbortController,Ut=globalThis.AbortSignal;if(typeof Nt>"u"){Ut=class{constructor(){w(this,"onabort");w(this,"_onabort",[]);w(this,"reason");w(this,"aborted",false);}addEventListener(i,s){this._onabort.push(s);}},Nt=class{constructor(){w(this,"signal",new Ut);t();}abort(i){if(!this.signal.aborted){this.signal.reason=i,this.signal.aborted=true;for(let s of this.signal._onabort)s(i);this.signal.onabort?.(i);}}};let f=Gt.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{f&&(f=false,Bt("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",t));};}var re=f=>!$t.has(f);var ot=f=>f&&f===Math.floor(f)&&f>0&&isFinite(f),qt=f=>ot(f)?f<=Math.pow(2,8)?Uint8Array:f<=Math.pow(2,16)?Uint16Array:f<=Math.pow(2,32)?Uint32Array:f<=Number.MAX_SAFE_INTEGER?Ct:null:null,Ct=class extends Array{constructor(f){super(f),this.fill(0);}},it,gt,oe=(it=class{constructor(t,i){w(this,"heap");w(this,"length");if(!e(it,gt))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new i(t),this.length=0;}static create(t){let i=qt(t);if(!i)return [];c(it,gt,true);let s=new it(t,i);return c(it,gt,false),s}push(t){this.heap[this.length++]=t;}pop(){return this.heap[--this.length]}},gt=new WeakMap,b(it,gt,false),it),Kt,Pt,P,M,$,ut,B,St,bt,q,D,J,T,A,m,k,W,z,C,Y,F,X,Q,j,V,Z,lt,G,wt,l,Rt,ct,rt,Et,U,Yt,pt,vt,Ht,nt,at,Lt,Ft,zt,x,Mt,At,ht,Wt,_t,Jt=(_t=class{constructor(t){b(this,l);b(this,P);b(this,M);b(this,$);b(this,ut);b(this,B);b(this,St);b(this,bt);b(this,q);w(this,"ttl");w(this,"ttlResolution");w(this,"ttlAutopurge");w(this,"updateAgeOnGet");w(this,"updateAgeOnHas");w(this,"allowStale");w(this,"noDisposeOnSet");w(this,"noUpdateTTL");w(this,"maxEntrySize");w(this,"sizeCalculation");w(this,"noDeleteOnFetchRejection");w(this,"noDeleteOnStaleGet");w(this,"allowStaleOnFetchAbort");w(this,"allowStaleOnFetchRejection");w(this,"ignoreFetchAbort");b(this,D);b(this,J);b(this,T);b(this,A);b(this,m);b(this,k);b(this,W);b(this,z);b(this,C);b(this,Y);b(this,F);b(this,X);b(this,Q);b(this,j);b(this,V);b(this,Z);b(this,lt);b(this,G);b(this,wt);b(this,ct,()=>{});b(this,rt,()=>{});b(this,Et,()=>{});b(this,U,()=>false);b(this,pt,t=>{});b(this,vt,(t,i,s)=>{});b(this,Ht,(t,i,s,r)=>{if(s||r)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0});w(this,Kt,"LRUCache");let{max:i=0,ttl:s,ttlResolution:r=1,ttlAutopurge:o,updateAgeOnGet:n,updateAgeOnHas:a,allowStale:h,dispose:d,onInsert:y,disposeAfter:g,noDisposeOnSet:v,noUpdateTTL:K,maxSize:tt=0,maxEntrySize:H=0,sizeCalculation:_,fetchMethod:S,memoMethod:N,noDeleteOnFetchRejection:R,noDeleteOnStaleGet:I,allowStaleOnFetchRejection:O,allowStaleOnFetchAbort:xt,ignoreFetchAbort:dt,perf:mt}=t;if(mt!==void 0&&typeof mt?.now!="function")throw new TypeError("perf option must have a now() method if specified");if(c(this,q,mt??se),i!==0&&!ot(i))throw new TypeError("max option must be a nonnegative integer");let yt=i?qt(i):Array;if(!yt)throw new Error("invalid max value: "+i);if(c(this,P,i),c(this,M,tt),this.maxEntrySize=H||e(this,M),this.sizeCalculation=_,this.sizeCalculation){if(!e(this,M)&&!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(N!==void 0&&typeof N!="function")throw new TypeError("memoMethod must be a function if defined");if(c(this,bt,N),S!==void 0&&typeof S!="function")throw new TypeError("fetchMethod must be a function if specified");if(c(this,St,S),c(this,lt,!!S),c(this,T,new Map),c(this,A,new Array(i).fill(void 0)),c(this,m,new Array(i).fill(void 0)),c(this,k,new yt(i)),c(this,W,new yt(i)),c(this,z,0),c(this,C,0),c(this,Y,oe.create(i)),c(this,D,0),c(this,J,0),typeof d=="function"&&c(this,$,d),typeof y=="function"&&c(this,ut,y),typeof g=="function"?(c(this,B,g),c(this,F,[])):(c(this,B,void 0),c(this,F,void 0)),c(this,Z,!!e(this,$)),c(this,wt,!!e(this,ut)),c(this,G,!!e(this,B)),this.noDisposeOnSet=!!v,this.noUpdateTTL=!!K,this.noDeleteOnFetchRejection=!!R,this.allowStaleOnFetchRejection=!!O,this.allowStaleOnFetchAbort=!!xt,this.ignoreFetchAbort=!!dt,this.maxEntrySize!==0){if(e(this,M)!==0&&!ot(e(this,M)))throw new TypeError("maxSize must be a positive integer if specified");if(!ot(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");u(this,l,Yt).call(this);}if(this.allowStale=!!h,this.noDeleteOnStaleGet=!!I,this.updateAgeOnGet=!!n,this.updateAgeOnHas=!!a,this.ttlResolution=ot(r)||r===0?r:1,this.ttlAutopurge=!!o,this.ttl=s||0,this.ttl){if(!ot(this.ttl))throw new TypeError("ttl must be a positive integer if specified");u(this,l,Rt).call(this);}if(e(this,P)===0&&this.ttl===0&&e(this,M)===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!e(this,P)&&!e(this,M)){let It="LRU_CACHE_UNBOUNDED";re(It)&&($t.add(It),Bt("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",It,_t));}}get perf(){return e(this,q)}static unsafeExposeInternals(t){return {starts:e(t,Q),ttls:e(t,j),autopurgeTimers:e(t,V),sizes:e(t,X),keyMap:e(t,T),keyList:e(t,A),valList:e(t,m),next:e(t,k),prev:e(t,W),get head(){return e(t,z)},get tail(){return e(t,C)},free:e(t,Y),isBackgroundFetch:i=>{var s;return u(s=t,l,x).call(s,i)},backgroundFetch:(i,s,r,o)=>{var n;return u(n=t,l,zt).call(n,i,s,r,o)},moveToTail:i=>{var s;return u(s=t,l,At).call(s,i)},indexes:i=>{var s;return u(s=t,l,nt).call(s,i)},rindexes:i=>{var s;return u(s=t,l,at).call(s,i)},isStale:i=>{var s;return e(s=t,U).call(s,i)}}}get max(){return e(this,P)}get maxSize(){return e(this,M)}get calculatedSize(){return e(this,J)}get size(){return e(this,D)}get fetchMethod(){return e(this,St)}get memoMethod(){return e(this,bt)}get dispose(){return e(this,$)}get onInsert(){return e(this,ut)}get disposeAfter(){return e(this,B)}getRemainingTTL(t){return e(this,T).has(t)?1/0:0}*entries(){for(let t of u(this,l,nt).call(this))e(this,m)[t]!==void 0&&e(this,A)[t]!==void 0&&!u(this,l,x).call(this,e(this,m)[t])&&(yield [e(this,A)[t],e(this,m)[t]]);}*rentries(){for(let t of u(this,l,at).call(this))e(this,m)[t]!==void 0&&e(this,A)[t]!==void 0&&!u(this,l,x).call(this,e(this,m)[t])&&(yield [e(this,A)[t],e(this,m)[t]]);}*keys(){for(let t of u(this,l,nt).call(this)){let i=e(this,A)[t];i!==void 0&&!u(this,l,x).call(this,e(this,m)[t])&&(yield i);}}*rkeys(){for(let t of u(this,l,at).call(this)){let i=e(this,A)[t];i!==void 0&&!u(this,l,x).call(this,e(this,m)[t])&&(yield i);}}*values(){for(let t of u(this,l,nt).call(this))e(this,m)[t]!==void 0&&!u(this,l,x).call(this,e(this,m)[t])&&(yield e(this,m)[t]);}*rvalues(){for(let t of u(this,l,at).call(this))e(this,m)[t]!==void 0&&!u(this,l,x).call(this,e(this,m)[t])&&(yield e(this,m)[t]);}[(Pt=Symbol.iterator,Kt=Symbol.toStringTag,Pt)](){return this.entries()}find(t,i={}){for(let s of u(this,l,nt).call(this)){let r=e(this,m)[s],o=u(this,l,x).call(this,r)?r.__staleWhileFetching:r;if(o!==void 0&&t(o,e(this,A)[s],this))return this.get(e(this,A)[s],i)}}forEach(t,i=this){for(let s of u(this,l,nt).call(this)){let r=e(this,m)[s],o=u(this,l,x).call(this,r)?r.__staleWhileFetching:r;o!==void 0&&t.call(i,o,e(this,A)[s],this);}}rforEach(t,i=this){for(let s of u(this,l,at).call(this)){let r=e(this,m)[s],o=u(this,l,x).call(this,r)?r.__staleWhileFetching:r;o!==void 0&&t.call(i,o,e(this,A)[s],this);}}purgeStale(){let t=false;for(let i of u(this,l,at).call(this,{allowStale:true}))e(this,U).call(this,i)&&(u(this,l,ht).call(this,e(this,A)[i],"expire"),t=true);return t}info(t){let i=e(this,T).get(t);if(i===void 0)return;let s=e(this,m)[i],r=u(this,l,x).call(this,s)?s.__staleWhileFetching:s;if(r===void 0)return;let o={value:r};if(e(this,j)&&e(this,Q)){let n=e(this,j)[i],a=e(this,Q)[i];if(n&&a){let h=n-(e(this,q).now()-a);o.ttl=h,o.start=Date.now();}}return e(this,X)&&(o.size=e(this,X)[i]),o}dump(){let t=[];for(let i of u(this,l,nt).call(this,{allowStale:true})){let s=e(this,A)[i],r=e(this,m)[i],o=u(this,l,x).call(this,r)?r.__staleWhileFetching:r;if(o===void 0||s===void 0)continue;let n={value:o};if(e(this,j)&&e(this,Q)){n.ttl=e(this,j)[i];let a=e(this,q).now()-e(this,Q)[i];n.start=Math.floor(Date.now()-a);}e(this,X)&&(n.size=e(this,X)[i]),t.unshift([s,n]);}return t}load(t){this.clear();for(let[i,s]of t){if(s.start){let r=Date.now()-s.start;s.start=e(this,q).now()-r;}this.set(i,s.value,s);}}set(t,i,s={}){var v,K,tt,H;if(i===void 0)return this.delete(t),this;let{ttl:r=this.ttl,start:o,noDisposeOnSet:n=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:h}=s,{noUpdateTTL:d=this.noUpdateTTL}=s,y=e(this,Ht).call(this,t,i,s.size||0,a);if(this.maxEntrySize&&y>this.maxEntrySize)return h&&(h.set="miss",h.maxEntrySizeExceeded=true),u(this,l,ht).call(this,t,"set"),this;let g=e(this,D)===0?void 0:e(this,T).get(t);if(g===void 0)g=e(this,D)===0?e(this,C):e(this,Y).length!==0?e(this,Y).pop():e(this,D)===e(this,P)?u(this,l,Ft).call(this,false):e(this,D),e(this,A)[g]=t,e(this,m)[g]=i,e(this,T).set(t,g),e(this,k)[e(this,C)]=g,e(this,W)[g]=e(this,C),c(this,C,g),Tt(this,D)._++,e(this,vt).call(this,g,y,h),h&&(h.set="add"),d=false,e(this,wt)&&((v=e(this,ut))==null||v.call(this,i,t,"add"));else {u(this,l,At).call(this,g);let _=e(this,m)[g];if(i!==_){if(e(this,lt)&&u(this,l,x).call(this,_)){_.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:S}=_;S!==void 0&&!n&&(e(this,Z)&&((K=e(this,$))==null||K.call(this,S,t,"set")),e(this,G)&&e(this,F)?.push([S,t,"set"]));}else n||(e(this,Z)&&((tt=e(this,$))==null||tt.call(this,_,t,"set")),e(this,G)&&e(this,F)?.push([_,t,"set"]));if(e(this,pt).call(this,g),e(this,vt).call(this,g,y,h),e(this,m)[g]=i,h){h.set="replace";let S=_&&u(this,l,x).call(this,_)?_.__staleWhileFetching:_;S!==void 0&&(h.oldValue=S);}}else h&&(h.set="update");e(this,wt)&&this.onInsert?.(i,t,i===_?"update":"replace");}if(r!==0&&!e(this,j)&&u(this,l,Rt).call(this),e(this,j)&&(d||e(this,Et).call(this,g,r,o),h&&e(this,rt).call(this,h,g)),!n&&e(this,G)&&e(this,F)){let _=e(this,F),S;for(;S=_?.shift();)(H=e(this,B))==null||H.call(this,...S);}return this}pop(){var t;try{for(;e(this,D);){let i=e(this,m)[e(this,z)];if(u(this,l,Ft).call(this,!0),u(this,l,x).call(this,i)){if(i.__staleWhileFetching)return i.__staleWhileFetching}else if(i!==void 0)return i}}finally{if(e(this,G)&&e(this,F)){let i=e(this,F),s;for(;s=i?.shift();)(t=e(this,B))==null||t.call(this,...s);}}}has(t,i={}){let{updateAgeOnHas:s=this.updateAgeOnHas,status:r}=i,o=e(this,T).get(t);if(o!==void 0){let n=e(this,m)[o];if(u(this,l,x).call(this,n)&&n.__staleWhileFetching===void 0)return false;if(e(this,U).call(this,o))r&&(r.has="stale",e(this,rt).call(this,r,o));else return s&&e(this,ct).call(this,o),r&&(r.has="hit",e(this,rt).call(this,r,o)),true}else r&&(r.has="miss");return false}peek(t,i={}){let{allowStale:s=this.allowStale}=i,r=e(this,T).get(t);if(r===void 0||!s&&e(this,U).call(this,r))return;let o=e(this,m)[r];return u(this,l,x).call(this,o)?o.__staleWhileFetching:o}async fetch(t,i={}){let{allowStale:s=this.allowStale,updateAgeOnGet:r=this.updateAgeOnGet,noDeleteOnStaleGet:o=this.noDeleteOnStaleGet,ttl:n=this.ttl,noDisposeOnSet:a=this.noDisposeOnSet,size:h=0,sizeCalculation:d=this.sizeCalculation,noUpdateTTL:y=this.noUpdateTTL,noDeleteOnFetchRejection:g=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:v=this.allowStaleOnFetchRejection,ignoreFetchAbort:K=this.ignoreFetchAbort,allowStaleOnFetchAbort:tt=this.allowStaleOnFetchAbort,context:H,forceRefresh:_=false,status:S,signal:N}=i;if(!e(this,lt))return S&&(S.fetch="get"),this.get(t,{allowStale:s,updateAgeOnGet:r,noDeleteOnStaleGet:o,status:S});let R={allowStale:s,updateAgeOnGet:r,noDeleteOnStaleGet:o,ttl:n,noDisposeOnSet:a,size:h,sizeCalculation:d,noUpdateTTL:y,noDeleteOnFetchRejection:g,allowStaleOnFetchRejection:v,allowStaleOnFetchAbort:tt,ignoreFetchAbort:K,status:S,signal:N},I=e(this,T).get(t);if(I===void 0){S&&(S.fetch="miss");let O=u(this,l,zt).call(this,t,I,R,H);return O.__returned=O}else {let O=e(this,m)[I];if(u(this,l,x).call(this,O)){let yt=s&&O.__staleWhileFetching!==void 0;return S&&(S.fetch="inflight",yt&&(S.returnedStale=true)),yt?O.__staleWhileFetching:O.__returned=O}let xt=e(this,U).call(this,I);if(!_&&!xt)return S&&(S.fetch="hit"),u(this,l,At).call(this,I),r&&e(this,ct).call(this,I),S&&e(this,rt).call(this,S,I),O;let dt=u(this,l,zt).call(this,t,I,R,H),mt=dt.__staleWhileFetching!==void 0&&s;return S&&(S.fetch=xt?"stale":"refresh",mt&&xt&&(S.returnedStale=true)),mt?dt.__staleWhileFetching:dt.__returned=dt}}async forceFetch(t,i={}){let s=await this.fetch(t,i);if(s===void 0)throw new Error("fetch() returned undefined");return s}memo(t,i={}){let s=e(this,bt);if(!s)throw new Error("no memoMethod provided to constructor");let{context:r,forceRefresh:o,...n}=i,a=this.get(t,n);if(!o&&a!==void 0)return a;let h=s(t,a,{options:n,context:r});return this.set(t,h,n),h}get(t,i={}){let{allowStale:s=this.allowStale,updateAgeOnGet:r=this.updateAgeOnGet,noDeleteOnStaleGet:o=this.noDeleteOnStaleGet,status:n}=i,a=e(this,T).get(t);if(a!==void 0){let h=e(this,m)[a],d=u(this,l,x).call(this,h);return n&&e(this,rt).call(this,n,a),e(this,U).call(this,a)?(n&&(n.get="stale"),d?(n&&s&&h.__staleWhileFetching!==void 0&&(n.returnedStale=true),s?h.__staleWhileFetching:void 0):(o||u(this,l,ht).call(this,t,"expire"),n&&s&&(n.returnedStale=true),s?h:void 0)):(n&&(n.get="hit"),d?h.__staleWhileFetching:(u(this,l,At).call(this,a),r&&e(this,ct).call(this,a),h))}else n&&(n.get="miss");}delete(t){return u(this,l,ht).call(this,t,"delete")}clear(){return u(this,l,Wt).call(this,"delete")}},P=new WeakMap,M=new WeakMap,$=new WeakMap,ut=new WeakMap,B=new WeakMap,St=new WeakMap,bt=new WeakMap,q=new WeakMap,D=new WeakMap,J=new WeakMap,T=new WeakMap,A=new WeakMap,m=new WeakMap,k=new WeakMap,W=new WeakMap,z=new WeakMap,C=new WeakMap,Y=new WeakMap,F=new WeakMap,X=new WeakMap,Q=new WeakMap,j=new WeakMap,V=new WeakMap,Z=new WeakMap,lt=new WeakMap,G=new WeakMap,wt=new WeakMap,l=new WeakSet,Rt=function(){let t=new Ct(e(this,P)),i=new Ct(e(this,P));c(this,j,t),c(this,Q,i);let s=this.ttlAutopurge?new Array(e(this,P)):void 0;c(this,V,s),c(this,Et,(a,h,d=e(this,q).now())=>{i[a]=h!==0?d:0,t[a]=h,r(a,h);}),c(this,ct,a=>{i[a]=t[a]!==0?e(this,q).now():0,r(a,t[a]);});let r=this.ttlAutopurge?(a,h)=>{if(s?.[a]&&(clearTimeout(s[a]),s[a]=void 0),h&&h!==0&&s){let d=setTimeout(()=>{e(this,U).call(this,a)&&u(this,l,ht).call(this,e(this,A)[a],"expire");},h+1);d.unref&&d.unref(),s[a]=d;}}:()=>{};c(this,rt,(a,h)=>{if(t[h]){let d=t[h],y=i[h];if(!d||!y)return;a.ttl=d,a.start=y,a.now=o||n();let g=a.now-y;a.remainingTTL=d-g;}});let o=0,n=()=>{let a=e(this,q).now();if(this.ttlResolution>0){o=a;let h=setTimeout(()=>o=0,this.ttlResolution);h.unref&&h.unref();}return a};this.getRemainingTTL=a=>{let h=e(this,T).get(a);if(h===void 0)return 0;let d=t[h],y=i[h];if(!d||!y)return 1/0;let g=(o||n())-y;return d-g},c(this,U,a=>{let h=i[a],d=t[a];return !!d&&!!h&&(o||n())-h>d});},ct=new WeakMap,rt=new WeakMap,Et=new WeakMap,U=new WeakMap,Yt=function(){let t=new Ct(e(this,P));c(this,J,0),c(this,X,t),c(this,pt,i=>{c(this,J,e(this,J)-t[i]),t[i]=0;}),c(this,Ht,(i,s,r,o)=>{if(u(this,l,x).call(this,s))return 0;if(!ot(r))if(o){if(typeof o!="function")throw new TypeError("sizeCalculation must be a function");if(r=o(s,i),!ot(r))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 r}),c(this,vt,(i,s,r)=>{if(t[i]=s,e(this,M)){let o=e(this,M)-t[i];for(;e(this,J)>o;)u(this,l,Ft).call(this,true);}c(this,J,e(this,J)+t[i]),r&&(r.entrySize=s,r.totalCalculatedSize=e(this,J));});},pt=new WeakMap,vt=new WeakMap,Ht=new WeakMap,nt=function*({allowStale:t=this.allowStale}={}){if(e(this,D))for(let i=e(this,C);!(!u(this,l,Lt).call(this,i)||((t||!e(this,U).call(this,i))&&(yield i),i===e(this,z)));)i=e(this,W)[i];},at=function*({allowStale:t=this.allowStale}={}){if(e(this,D))for(let i=e(this,z);!(!u(this,l,Lt).call(this,i)||((t||!e(this,U).call(this,i))&&(yield i),i===e(this,C)));)i=e(this,k)[i];},Lt=function(t){return t!==void 0&&e(this,T).get(e(this,A)[t])===t},Ft=function(t){var o;let i=e(this,z),s=e(this,A)[i],r=e(this,m)[i];return e(this,lt)&&u(this,l,x).call(this,r)?r.__abortController.abort(new Error("evicted")):(e(this,Z)||e(this,G))&&(e(this,Z)&&((o=e(this,$))==null||o.call(this,r,s,"evict")),e(this,G)&&e(this,F)?.push([r,s,"evict"])),e(this,pt).call(this,i),e(this,V)?.[i]&&(clearTimeout(e(this,V)[i]),e(this,V)[i]=void 0),t&&(e(this,A)[i]=void 0,e(this,m)[i]=void 0,e(this,Y).push(i)),e(this,D)===1?(c(this,z,c(this,C,0)),e(this,Y).length=0):c(this,z,e(this,k)[i]),e(this,T).delete(s),Tt(this,D)._--,i},zt=function(t,i,s,r){let o=i===void 0?void 0:e(this,m)[i];if(u(this,l,x).call(this,o))return o;let n=new Nt,{signal:a}=s;a?.addEventListener("abort",()=>n.abort(a.reason),{signal:n.signal});let h={signal:n.signal,options:s,context:r},d=(H,_=false)=>{let{aborted:S}=n.signal,N=s.ignoreFetchAbort&&H!==void 0,R=s.ignoreFetchAbort||!!(s.allowStaleOnFetchAbort&&H!==void 0);if(s.status&&(S&&!_?(s.status.fetchAborted=true,s.status.fetchError=n.signal.reason,N&&(s.status.fetchAbortIgnored=true)):s.status.fetchResolved=true),S&&!N&&!_)return g(n.signal.reason,R);let I=K,O=e(this,m)[i];return (O===K||N&&_&&O===void 0)&&(H===void 0?I.__staleWhileFetching!==void 0?e(this,m)[i]=I.__staleWhileFetching:u(this,l,ht).call(this,t,"fetch"):(s.status&&(s.status.fetchUpdated=true),this.set(t,H,h.options))),H},y=H=>(s.status&&(s.status.fetchRejected=true,s.status.fetchError=H),g(H,false)),g=(H,_)=>{let{aborted:S}=n.signal,N=S&&s.allowStaleOnFetchAbort,R=N||s.allowStaleOnFetchRejection,I=R||s.noDeleteOnFetchRejection,O=K;if(e(this,m)[i]===K&&(!I||!_&&O.__staleWhileFetching===void 0?u(this,l,ht).call(this,t,"fetch"):N||(e(this,m)[i]=O.__staleWhileFetching)),R)return s.status&&O.__staleWhileFetching!==void 0&&(s.status.returnedStale=true),O.__staleWhileFetching;if(O.__returned===O)throw H},v=(H,_)=>{var N;let S=(N=e(this,St))==null?void 0:N.call(this,t,o,h);S&&S instanceof Promise&&S.then(R=>H(R===void 0?void 0:R),_),n.signal.addEventListener("abort",()=>{(!s.ignoreFetchAbort||s.allowStaleOnFetchAbort)&&(H(void 0),s.allowStaleOnFetchAbort&&(H=R=>d(R,true)));});};s.status&&(s.status.fetchDispatched=true);let K=new Promise(v).then(d,y),tt=Object.assign(K,{__abortController:n,__staleWhileFetching:o,__returned:void 0});return i===void 0?(this.set(t,tt,{...h.options,status:void 0}),i=e(this,T).get(t)):e(this,m)[i]=tt,tt},x=function(t){if(!e(this,lt))return false;let i=t;return !!i&&i instanceof Promise&&i.hasOwnProperty("__staleWhileFetching")&&i.__abortController instanceof Nt},Mt=function(t,i){e(this,W)[i]=t,e(this,k)[t]=i;},At=function(t){t!==e(this,C)&&(t===e(this,z)?c(this,z,e(this,k)[t]):u(this,l,Mt).call(this,e(this,W)[t],e(this,k)[t]),u(this,l,Mt).call(this,e(this,C),t),c(this,C,t));},ht=function(t,i){var r,o;let s=false;if(e(this,D)!==0){let n=e(this,T).get(t);if(n!==void 0)if(e(this,V)?.[n]&&(clearTimeout(e(this,V)?.[n]),e(this,V)[n]=void 0),s=true,e(this,D)===1)u(this,l,Wt).call(this,i);else {e(this,pt).call(this,n);let a=e(this,m)[n];if(u(this,l,x).call(this,a)?a.__abortController.abort(new Error("deleted")):(e(this,Z)||e(this,G))&&(e(this,Z)&&((r=e(this,$))==null||r.call(this,a,t,i)),e(this,G)&&e(this,F)?.push([a,t,i])),e(this,T).delete(t),e(this,A)[n]=void 0,e(this,m)[n]=void 0,n===e(this,C))c(this,C,e(this,W)[n]);else if(n===e(this,z))c(this,z,e(this,k)[n]);else {let h=e(this,W)[n];e(this,k)[h]=e(this,k)[n];let d=e(this,k)[n];e(this,W)[d]=e(this,W)[n];}Tt(this,D)._--,e(this,Y).push(n);}}if(e(this,G)&&e(this,F)?.length){let n=e(this,F),a;for(;a=n?.shift();)(o=e(this,B))==null||o.call(this,...a);}return s},Wt=function(t){var i,s;for(let r of u(this,l,at).call(this,{allowStale:true})){let o=e(this,m)[r];if(u(this,l,x).call(this,o))o.__abortController.abort(new Error("deleted"));else {let n=e(this,A)[r];e(this,Z)&&((i=e(this,$))==null||i.call(this,o,n,t)),e(this,G)&&e(this,F)?.push([o,n,t]);}}if(e(this,T).clear(),e(this,m).fill(void 0),e(this,A).fill(void 0),e(this,j)&&e(this,Q)){e(this,j).fill(0),e(this,Q).fill(0);for(let r of e(this,V)??[])r!==void 0&&clearTimeout(r);e(this,V)?.fill(void 0);}if(e(this,X)&&e(this,X).fill(0),c(this,z,0),c(this,C,0),e(this,Y).length=0,c(this,J,0),c(this,D,0),e(this,G)&&e(this,F)){let r=e(this,F),o;for(;o=r?.shift();)(s=e(this,B))==null||s.call(this,...o);}},_t);var ft=class{constructor(t){w(this,"cache");w(this,"map",new Map);this.cache=new Jt({max:t.cacheSize}),this.map=new Map;}get[Symbol.iterator](){return this.map[Symbol.iterator]}get[Symbol.toStringTag](){return this.map[Symbol.toStringTag]}clear(){return this.cache.clear(),this.map.clear()}delete(t){let i=this.map.delete(t);return i&&this.cache.delete(t),i}get forEach(){return this.map.forEach}get(t){let i=this.cache.get(t);return i||this.map.get(t)}has(t){return this.map.has(t)}set(t,i){return this.map.set(t,i),this.cache.set(t,i),this}get size(){return this.map.size}entries(){return this.map.entries()}keys(){return this.map.keys()}values(){return this.map.values()}};var st=class st{static get originalStepData(){return st._originalStepData?et(st._originalStepData):{path:"",storage:{},canvas:{elementAliasesOrder:[],elements:{},stage:{},tickers:{},tickersSteps:{},tickersOnPause:{},tickersToCompleteOnStepEnd:{tikersIds:[],stepAlias:[]}},sound:{soundAliasesOrder:[],soundsPlaying:{},playInStepIndex:{},filters:void 0},labelIndex:-1,openedLabels:[]}}static set originalStepData(t){st._originalStepData=et(t);}};w(st,"_diffHistory",new ft({cacheSize:5})),w(st,"_stepsInfoHistory",new ft({cacheSize:5})),w(st,"_narrationHistory",new ft({cacheSize:50})),w(st,"stepLimitSaved",20),w(st,"_originalStepData");var p=st;var Ot=class{get stepsInfoMap(){return p._stepsInfoHistory}get diffMap(){return p._diffHistory}get narrationMap(){return p._narrationHistory}get size(){return p._stepsInfoHistory.size}get lastKey(){return this.size===0?null:Math.max(...Array.from(this.keys()))}keys(){return p._stepsInfoHistory.keys()}get(t){let i=p._narrationHistory.get(t);if(!(i&&Object.keys(i).length===1&&i.stepIndex!==void 0))return i}delete(t){p._stepsInfoHistory.delete(t),p._diffHistory.delete(t),p._narrationHistory.delete(t);}getOldGameState(t,i){if(t<=0||this.size==0)return i;let s=this.lastKey;if(typeof s!="number")return E.warn("You can't go back, there is no step to go back"),i;let r=p._diffHistory.get(s);if(r)try{let o=Vt(i,r);return core.GameUnifier.stepCounter=s,this.delete(s),this.getOldGameState(t-1,o)}catch(o){return E.error("Error applying diff",o),i}else return E.warn("No diff found for the last step, cannot go back"),i}async back(t,i={}){let{steps:s=1}=i;if(!Number.isFinite(s)){E.warn(`[back] The parameter steps must be a valid finite number, received: ${s}`);return}if(s<=0){E.warn(`[back] The parameter steps must be greater than 0, received: ${s}`);return}if(core.GameUnifier.runningStepsCount>0){core.GameUnifier.increaseBackRequest(s);return}if(p._diffHistory.size<1){E.warn("You can't go back, there is no step to go back");return}core.GameUnifier.runningStepsCount++;try{let r=et(this.getOldGameState(s,p.originalStepData));if(r){await core.GameUnifier.restoreGameStepState(r,core.GameUnifier.navigate);let o=core.GameUnifier.stepCounter-1,n=p._narrationHistory.get(o);if(n&&Object.keys(n).length===1&&n.stepIndex!==void 0){let a=p._stepsInfoHistory.get(o);if(a){let h=this.itemMapper({step:a});p._narrationHistory.set(a.index,h);}}}else E.error("Error going back");p.originalStepData=r;}catch(r){E.error("Error going back",r);}finally{if(core.GameUnifier.runningStepsCount--,core.GameUnifier.runningStepsCount===0&&core.GameUnifier.backRequestsCount!==0)return await core.GameUnifier.processNavigationRequests(t)}}add(t,i={}){let s=p.originalStepData,{ignoreSameStep:r}=i,o=core.GameUnifier.currentGameStepState;if(!r&&this.isSameStep(s,o))return;let n=this.lastKey;(async()=>{try{let h,d;if(typeof n=="number"&&(h=p._stepsInfoHistory.get(n),d=p._narrationHistory.get(n)),p._stepsInfoHistory.set(t.index,t),t.index!==0){let v=Dt(s,o);v?p._diffHistory.set(t.index,v):E.warn("It was not possible to create the difference between the two steps");}let y={},g=this.itemMapper({step:t},y);if(p._narrationHistory.set(t.index,g),h&&d&&typeof n=="number"){let v=this.itemMapper({...y,step:h},{});p._narrationHistory.set(n,v);}}catch(h){E.error("Error adding history step",h);}})(),p.originalStepData=o;}itemMapper(t,i){let{step:s,choiceIndexMade:r,inputValue:o,removeDialogue:n}=t,a=s.dialogue||s.dialoge;i&&s.isGlued&&(i.removeDialogue=true),n&&(a=void 0);let h=s.choices;if(i&&s.currentLabel&&s.choiceIndexMade!==void 0&&(i.choiceIndexMade=s.choiceIndexMade),s.inputValue&&i&&(i.inputValue=s.inputValue),a||h||o){let d=h?.map((y,g)=>{let v=false;return y.oneTime&&s.alreadyMadeChoices&&s.alreadyMadeChoices.includes(g)&&(v=true),{text:y.text,type:y.type,isResponse:false,hidden:v}});if(d){if(d.every(y=>y.hidden)){let y=d.find(g=>g.hidden===false);y&&(y.hidden=false);}r!==void 0&&(d[r].isResponse=true);}return {dialogue:a?{...a,character:a.character?core.GameUnifier.getCharacter(a.character)||a.character:void 0}:void 0,playerMadeChoice:typeof r=="number",choices:d,stepIndex:s.index,inputValue:o}}return {stepIndex:s.index}}get narrativeHistory(){let t=[];return Array.from(this.keys()).sort((s,r)=>s-r).forEach(s=>{let r=this.get(s);r&&t.push(r);}),t}get currentLabelHistory(){let t=[],i=Array.from(this.keys()).sort((h,d)=>d-h);if(i.length===0)return t;let s=i[0];if(typeof s!="number")return t;let r=p._stepsInfoHistory.get(s);if(!r)return t;let o=r.openedLabels;if(!o||!Array.isArray(o)||o.length===0)return t;let n=o[0].currentStepIndex,a=o[0].label;return i.every((h,d)=>{let y=this.get(h);if(y){if(d===0)return t.push(y),true;let g=p._stepsInfoHistory.get(h);if(!g)return true;let v=g.openedLabels;if(!v||!Array.isArray(v)||v.length===0||v[0].label!==a||v[0].currentStepIndex>=n)return false;n=v[0].currentStepIndex,t.push(y);}return true}),t.reverse()}removeNarrativeHistory(t){if(t){let i=Array.from(this.keys()).sort((s,r)=>s-r);i=i.slice(0,t),i.forEach(s=>{p._narrationHistory.delete(s),p._stepsInfoHistory.delete(s),p._diffHistory.delete(s);});}else p._stepsInfoHistory.clear(),p._diffHistory.clear(),p._narrationHistory.clear();}get canGoBack(){let t=this.lastKey;return typeof t!="number"?false:p._diffHistory.has(t)}blockGoBack(){core.GameUnifier.runningStepsCount===0&&p._diffHistory.clear();}isSameStep(t,i){if(t.openedLabels.length===i.openedLabels.length)try{let s=JSON.stringify(t.openedLabels),r=JSON.stringify(i.openedLabels);if(s===r&&t.path===i.path&&t.labelIndex===i.labelIndex)return !0}catch(s){return E.error("Error comparing opened labels",s),true}return false}clear(){p._stepsInfoHistory.clear(),p._diffHistory.clear(),p._narrationHistory.clear(),p._originalStepData=void 0;}get stepLimitSaved(){return p.stepLimitSaved}set stepLimitSaved(t){p.stepLimitSaved=t;}export(){let t=Array.from(this.keys()).sort((s,r)=>s-r);t.length>this.stepLimitSaved&&(t=t.slice(t.length-this.stepLimitSaved));let i=[];return t.forEach(s=>{let r=p._stepsInfoHistory.get(s);if(r){let o=p._diffHistory.get(s);i.push({...r,diff:o});}}),{stepsHistory:et(i),originalStepData:et(p._originalStepData)}}restoreNarrativeHistory(){let t=Array.from(this.keys()).sort((s,r)=>s-r),i={};t.forEach(s=>{let r=p._stepsInfoHistory.get(s);if(r){let o={...i};i={};let n=this.itemMapper({step:r,choiceIndexMade:o.choiceIndexMade,inputValue:o.inputValue,removeDialogue:o.removeDialogue},i);n&&p._narrationHistory.set(s,n);}});}async restore(t){this.clear();try{t.hasOwnProperty("stepsHistory")?(t.stepsHistory.forEach(s=>{s.diff&&p._diffHistory.set(s.index,s.diff);let r={...s,diff:void 0};p._stepsInfoHistory.set(s.index,r);}),this.restoreNarrativeHistory()):E.warn("Could not import stepsHistory data, so will be ignored"),t.hasOwnProperty("originalStepData")?p._originalStepData=t.originalStepData:E.warn("Could not import originalStepData data, so will be ignored");}catch(i){E.error("Error importing data",i);}}};var Me=new Ot;exports.HistoryManagerStatic=p;exports.stepHistory=Me;//# sourceMappingURL=history.cjs.map
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9taWNyb2RpZmYvZGlzdC9pbmRleC5qcyIsIi4uL3NyYy91dGlscy9sb2ctdXRpbGl0eS50cyIsIi4uL3NyYy91dGlscy9leHBvcnQtdXRpbGl0eS50cyIsIi4uL3NyYy91dGlscy9kaWZmLXV0aWxpdHkudHMiLCIuLi9ub2RlX21vZHVsZXMvbHJ1LWNhY2hlL3NyYy9pbmRleC50cyIsIi4uL3NyYy9jbGFzc2VzL0NhY2hlZE1hcC50cyIsIi4uL3NyYy9oaXN0b3J5L0hpc3RvcnlNYW5hZ2VyU3RhdGljLnRzIiwiLi4vc3JjL2hpc3RvcnkvSGlzdG9yeU1hbmFnZXIudHMiLCIuLi9zcmMvaGlzdG9yeS9pbmRleC50cyJdLCJuYW1lcyI6WyJyaWNoVHlwZXMiLCJkaWZmIiwib2JqIiwibmV3T2JqIiwib3B0aW9ucyIsIl9zdGFjayIsImRpZmZzIiwiaXNPYmpBcnJheSIsImtleSIsIm9iaktleSIsInBhdGgiLCJuZXdPYmpLZXkiLCJhcmVDb21wYXRpYmxlT2JqZWN0cyIsImRpZmZlcmVuY2UiLCJpc05ld09iakFycmF5IiwibG9nZ2VyIiwibWVzc2FnZSIsIm9wdGlvbmFsUGFyYW1zIiwiY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQiLCJlbGVtZW50IiwiZWxlbWVudFN0cmluZyIsImUiLCJQaXhpRXJyb3IiLCJyZXN0b3JlRGlmZkNoYW5nZXMiLCJkYXRhIiwiZGlmZmVyZW5jZXMiLCJyZXN1bHQiLCJyZXN0b3JlTWljcm9EaWZmQ2hhbmdlcyIsInJlc3RvcmVEZWVwRGlmZkNoYW5nZXMiLCJkYXRhVG9FZGl0IiwiaW5kZXgiLCJkZWZhdWx0UGVyZiIsIndhcm5lZCIsIlBST0NFU1MiLCJlbWl0V2FybmluZyIsIm1zZyIsInR5cGUiLCJjb2RlIiwiZm4iLCJBQyIsIkFTIiwiX19wdWJsaWNGaWVsZCIsIl8iLCJ3YXJuQUNQb2x5ZmlsbCIsInJlYXNvbiIsInByaW50QUNQb2x5ZmlsbFdhcm5pbmciLCJzaG91bGRXYXJuIiwiaXNQb3NJbnQiLCJuIiwiZ2V0VWludEFycmF5IiwibWF4IiwiWmVyb0FycmF5Iiwic2l6ZSIsIl9hIiwiX28iLCJTdGFjayIsIkhlYXBDbHMiLCJfU3RhY2siLCIjY29uc3RydWN0aW5nIiwicyIsIl9fcHJpdmF0ZUFkZCIsIl9iIiwiX2MiLCJfdyIsIl9DIiwiX1MiLCJfTCIsIl9JIiwiX20iLCJfbiIsIl9fIiwiX3MiLCJfaSIsIl90IiwiX3UiLCJfbCIsIl9oIiwiX3IiLCJfeSIsIl9BIiwiX2QiLCJfZyIsIl9UIiwiX3YiLCJfZiIsIl9VIiwiX2NfaW5zdGFuY2VzIiwial9mbiIsIl9SIiwiX3oiLCJfTiIsIl9wIiwiQl9mbiIsIl9XIiwiX00iLCJfUCIsIkZfZm4iLCJPX2ZuIiwiSF9mbiIsInhfZm4iLCJHX2ZuIiwiZV9mbiIsImtfZm4iLCJEX2ZuIiwiRV9mbiIsIlZfZm4iLCJMUlVDYWNoZSIsIiNtYXgiLCIjbWF4U2l6ZSIsIiNkaXNwb3NlIiwiI29uSW5zZXJ0IiwiI2Rpc3Bvc2VBZnRlciIsIiNmZXRjaE1ldGhvZCIsIiNtZW1vTWV0aG9kIiwiI3BlcmYiLCIjc2l6ZSIsIiNjYWxjdWxhdGVkU2l6ZSIsIiNrZXlNYXAiLCIja2V5TGlzdCIsIiN2YWxMaXN0IiwiI25leHQiLCIjcHJldiIsIiNoZWFkIiwiI3RhaWwiLCIjZnJlZSIsIiNkaXNwb3NlZCIsIiNzaXplcyIsIiNzdGFydHMiLCIjdHRscyIsIiNhdXRvcHVyZ2VUaW1lcnMiLCIjaGFzRGlzcG9zZSIsIiNoYXNGZXRjaE1ldGhvZCIsIiNoYXNEaXNwb3NlQWZ0ZXIiLCIjaGFzT25JbnNlcnQiLCIjdXBkYXRlSXRlbUFnZSIsIiNzdGF0dXNUVEwiLCIjc2V0SXRlbVRUTCIsIiNpc1N0YWxlIiwiI3JlbW92ZUl0ZW1TaXplIiwiI2FkZEl0ZW1TaXplIiwiX3N0IiwiI3JlcXVpcmVTaXplIiwiX2siLCJzaXplQ2FsY3VsYXRpb24iLCJ0dGwiLCJ0dGxSZXNvbHV0aW9uIiwidHRsQXV0b3B1cmdlIiwidXBkYXRlQWdlT25HZXQiLCJ1cGRhdGVBZ2VPbkhhcyIsImFsbG93U3RhbGUiLCJkaXNwb3NlIiwib25JbnNlcnQiLCJkaXNwb3NlQWZ0ZXIiLCJub0Rpc3Bvc2VPblNldCIsIm5vVXBkYXRlVFRMIiwibWF4U2l6ZSIsIm1heEVudHJ5U2l6ZSIsImZldGNoTWV0aG9kIiwibWVtb01ldGhvZCIsIm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiIsIm5vRGVsZXRlT25TdGFsZUdldCIsImFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uIiwiYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCIsImlnbm9yZUZldGNoQWJvcnQiLCJwZXJmIiwiX19wcml2YXRlU2V0IiwiVWludEFycmF5IiwiX19wcml2YXRlR2V0IiwiX19wcml2YXRlTWV0aG9kIiwiI2luaXRpYWxpemVTaXplVHJhY2tpbmciLCIjaW5pdGlhbGl6ZVRUTFRyYWNraW5nIiwiX0xSVUNhY2hlIiwiYyIsInAiLCIjaXNCYWNrZ3JvdW5kRmV0Y2giLCJrIiwiY29udGV4dCIsIiNiYWNrZ3JvdW5kRmV0Y2giLCIjbW92ZVRvVGFpbCIsIiNpbmRleGVzIiwiI3JpbmRleGVzIiwiaSIsImdldE9wdGlvbnMiLCJ2IiwidmFsdWUiLCJ0aGlzcCIsImRlbGV0ZWQiLCIjZGVsZXRlIiwiZW50cnkiLCJzdGFydCIsInJlbWFpbiIsImFyciIsImFnZSIsInNldE9wdGlvbnMiLCJzdGF0dXMiLCIjZXZpY3QiLCJfX3ByaXZhdGVXcmFwcGVyIiwib2xkVmFsIiwib2xkVmFsdWUiLCJkdCIsInRhc2siLCJ2YWwiLCJoYXNPcHRpb25zIiwicGVla09wdGlvbnMiLCJmZXRjaE9wdGlvbnMiLCJmb3JjZVJlZnJlc2giLCJzaWduYWwiLCJzdGFsZSIsImlzU3RhbGUiLCJzdGFsZVZhbCIsIm1lbW9PcHRpb25zIiwidnYiLCJmZXRjaGluZyIsIiNjbGVhciIsInR0bHMiLCJzdGFydHMiLCJwdXJnZVRpbWVycyIsInNldFB1cmdldFRpbWVyIiwidCIsImNhY2hlZE5vdyIsImdldE5vdyIsInNpemVzIiwiI2lzVmFsaWRJbmRleCIsImZyZWUiLCJoZWFkIiwiYWMiLCJmZXRjaE9wdHMiLCJjYiIsInVwZGF0ZUNhY2hlIiwiYWJvcnRlZCIsImlnbm9yZUFib3J0IiwicHJvY2VlZCIsImZldGNoRmFpbCIsImJmIiwidmwiLCJlYiIsImVyIiwiYWxsb3dTdGFsZUFib3J0ZWQiLCJub0RlbGV0ZSIsInBjYWxsIiwicmVzIiwicmVqIiwiZm1wIiwiYiIsIiNjb25uZWN0IiwicGkiLCJuaSIsIkNhY2hlZE1hcCIsIkwiLCJjYWNoZWRWYWx1ZSIsIl9IaXN0b3J5TWFuYWdlclN0YXRpYyIsIkhpc3RvcnlNYW5hZ2VyU3RhdGljIiwiSGlzdG9yeU1hbmFnZXIiLCJzdGVwSW5kZXgiLCJpdGVtIiwic3RlcHMiLCJyZXN0b3JlZFN0ZXAiLCJsYXN0S2V5IiwiR2FtZVVuaWZpZXIiLCJwcm9wcyIsInN0ZXBDb3VudGVyIiwiaGlzdG9yeUluZm8iLCJuYXJyYXRpdmVIaXN0b3J5Iiwib3JpZ2luYWxTdGVwRGF0YSIsImlnbm9yZVNhbWVTdGVwIiwiY3VycmVudFN0ZXBEYXRhIiwibGFzdFN0ZXBIaXN0b3J5IiwibGFzdE5hcnJhdGl2ZUhpc3RvcnkiLCJwcmV2aW91c0l0ZW0iLCJwcmV2aW91c05hcnJhdGl2ZUhpc3RvcnkiLCJzdGVwIiwiY2hvaWNlSW5kZXhNYWRlIiwiaW5wdXRWYWx1ZSIsInJlbW92ZURpYWxvZ3VlIiwiZGlhbG9ndWUiLCJyZXF1aXJlZENob2ljZXMiLCJjaG9pY2VzIiwiY2hvaWNlIiwiaGlkZGVuIiwib25seUhhdmVOb0Nob2ljZSIsImEiLCJrZXlzIiwibGFzdEl0ZW0iLCJvcGVuZWRMYWJlbHMiLCJjdXJyZW50U3RlcEluZGV4IiwibGFiZWwiLCJpbmZvIiwib3BlbmVkTGFiZWxzVGVtcCIsIml0ZW1zTnVtYmVyIiwib3JpZ2luYWxTdGF0ZSIsIm5ld1N0YXRlIiwibGFzdFN0ZXBEYXRhT3BlbmVkTGFiZWxzU3RyaW5nIiwiaGlzdG9yeVN0ZXBPcGVuZWRMYWJlbHNTdHJpbmciLCJsaW1pdCIsInN0ZXBzSGlz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Q0FBQUMsQ0FBQUEsQ0FBQUMsR0FBQUMsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsQ0FBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsR0FBQUMsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsRUFBQUMsRUFBQUEsQ0FBQUMsRUFBQUEsQ0FBQUMsR0FBQUMsRUFBQUEsQ0FBQTNDLEVBQUFBLENBMm5DYTRDLElBQVA1QyxFQUFBQSxDQUFBLEtBQWUsQ0FtTm5CLFdBQUEsQ0FBWTFELENBQUFBLENBQXdELENBbk5oRXdELEVBQUEsSUFBQSxDQUFBMEIsQ0FBQUEsQ0FBQUEsQ0FFS3FCLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLEtBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLElBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEdBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLElBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEVBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBWVR6RSxFQUFBLElBQUEsQ0FBQSxLQUFBLENBQUEsQ0FLQUEsQ0FBQUEsQ0FBQSxJQUFBLENBQUEsZUFBQSxDQUFBLENBSUFBLENBQUFBLENBQUEsSUFBQSxDQUFBLGNBQUEsQ0FBQSxDQUlBQSxDQUFBQSxDQUFBLHVCQUlBQSxDQUFBQSxDQUFBLElBQUEsQ0FBQSxnQkFBQSxDQUFBLENBSUFBLENBQUFBLENBQUEsSUFBQSxDQUFBLFlBQUEsQ0FBQSxDQUtBQSxDQUFBQSxDQUFBLElBQUEsQ0FBQSxnQkFBQSxDQUFBLENBSUFBLEVBQUEsSUFBQSxDQUFBLGFBQUEsQ0FBQSxDQUlBQSxDQUFBQSxDQUFBLHFCQUlBQSxDQUFBQSxDQUFBLElBQUEsQ0FBQSxpQkFBQSxDQUFBLENBSUFBLEVBQUEsSUFBQSxDQUFBLDBCQUFBLENBQUEsQ0FJQUEsQ0FBQUEsQ0FBQSxJQUFBLENBQUEsb0JBQUEsQ0FBQSxDQUlBQSxDQUFBQSxDQUFBLElBQUEsQ0FBQSx3QkFBQSxDQUFBLENBSUFBLENBQUFBLENBQUEsbUNBSUFBLENBQUFBLENBQUEsSUFBQSxDQUFBLGtCQUFBLENBQUEsQ0FHQTBFLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLEtBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEdBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEdBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEdBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLEVBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLEtBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEdBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEdBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEdBRUFDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENBQUFBLEVBQUFBLENBQUFBLENBQ0FDLEVBQUFBLElBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQ0FDLENBQUFBLENBQUFBLElBQUFBLENB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QU0sS0FBQSxDQUFVLENBQUEsQ0FDdENuQixDQUFBQSxDQUFxQixrQkFBa0IsR0FBQSxDQUFJbUIsQ0FBQUEsQ0FBSyxLQUFBLENBQU9nQixDQUFJLEVBQy9ELENBQUMsRUFDRCxJQUFBLENBQUssdUJBQUEsRUFBd0IsRUFFN0IvUSxDQUFBQSxDQUFPLElBQUEsQ0FBSyx3REFBd0QsRUFFcEVTLENBQUFBLENBQUssY0FBQSxDQUFlLGtCQUFrQixDQUFBLENBQ3RDbU8sQ0FBQUEsQ0FBcUIsaUJBQUEsQ0FBcUJuTyxFQUEwQixnQkFBQSxDQUVwRVQsQ0FBQUEsQ0FBTyxJQUFBLENBQUssNERBQTRELEVBRWhGLENBQUEsTUFBU00sRUFBRyxDQUNSTixDQUFBQSxDQUFPLEtBQUEsQ0FBTSxzQkFBQSxDQUF3Qk0sQ0FBQyxFQUMxQyxDQUNKLENBQ0osQ0FBQSxDQzliQSxJQUFNbVIsRUFBQUEsQ0FBdUMsSUFBSTVDIiwiZmlsZSI6Imhpc3RvcnkuY2pzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcmljaFR5cGVzID0geyBEYXRlOiB0cnVlLCBSZWdFeHA6IHRydWUsIFN0cmluZzogdHJ1ZSwgTnVtYmVyOiB0cnVlIH07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkaWZmKG9iaiwgbmV3T2JqLCBvcHRpb25zID0geyBjeWNsZXNGaXg6IHRydWUgfSwgX3N0YWNrID0gW10pIHtcbiAgICBsZXQgZGlmZnMgPSBbXTtcbiAgICBjb25zdCBpc09iakFycmF5ID0gQXJyYXkuaXNBcnJheShvYmopO1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCBvYmpLZXkgPSBvYmpba2V5XTtcbiAgICAgICAgY29uc3QgcGF0aCA9IGlzT2JqQXJyYXkgPyAra2V5IDoga2V5O1xuICAgICAgICBpZiAoIShrZXkgaW4gbmV3T2JqKSkge1xuICAgICAgICAgICAgZGlmZnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJSRU1PVkVcIixcbiAgICAgICAgICAgICAgICBwYXRoOiBbcGF0aF0sXG4gICAgICAgICAgICAgICAgb2xkVmFsdWU6IG9ialtrZXldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdPYmpLZXkgPSBuZXdPYmpba2V5XTtcbiAgICAgICAgY29uc3QgYXJlQ29tcGF0aWJsZU9iamVjdHMgPSB0eXBlb2Ygb2JqS2V5ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgbmV3T2JqS2V5ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KG9iaktleSkgPT09IEFycmF5LmlzQXJyYXkobmV3T2JqS2V5KTtcbiAgICAgICAgaWYgKG9iaktleSAmJlxuICAgICAgICAgICAgbmV3T2JqS2V5ICYmXG4gICAgICAgICAgICBhcmVDb21wYXRpYmxlT2JqZWN0cyAmJlxuICAgICAgICAgICAgIXJpY2hUeXBlc1tPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqS2V5KT8uY29uc3RydWN0b3I/Lm5hbWVdICYmXG4gICAgICAgICAgICAoIW9wdGlvbnMuY3ljbGVzRml4IHx8ICFfc3RhY2suaW5jbHVkZXMob2JqS2V5KSkpIHtcbiAgICAgICAgICAgIGRpZmZzLnB1c2guYXBwbHkoZGlmZnMsIGRpZmYob2JqS2V5LCBuZXdPYmpLZXksIG9wdGlvbnMsIG9wdGlvbnMuY3ljbGVzRml4ID8gX3N0YWNrLmNvbmNhdChbb2JqS2V5XSkgOiBbXSkubWFwKChkaWZmZXJlbmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgZGlmZmVyZW5jZS5wYXRoLnVuc2hpZnQocGF0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpZmZlcmVuY2U7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqS2V5ICE9PSBuZXdPYmpLZXkgJiZcbiAgICAgICAgICAgIC8vIHRyZWF0IE5hTiB2YWx1ZXMgYXMgZXF1aXZhbGVudFxuICAgICAgICAgICAgIShOdW1iZXIuaXNOYU4ob2JqS2V5KSAmJiBOdW1iZXIuaXNOYU4obmV3T2JqS2V5KSkgJiZcbiAgICAgICAgICAgICEoYXJlQ29tcGF0aWJsZU9iamVjdHMgJiZcbiAgICAgICAgICAgICAgICAoaXNOYU4ob2JqS2V5KVxuICAgICAgICAgICAgICAgICAgICA/IG9iaktleSArIFwiXCIgPT09IG5ld09iaktleSArIFwiXCJcbiAgICAgICAgICAgICAgICAgICAgOiArb2JqS2V5ID09PSArbmV3T2JqS2V5KSkpIHtcbiAgICAgICAgICAgIGRpZmZzLnB1c2goe1xuICAgICAgICAgICAgICAgIHBhdGg6IFtwYXRoXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIkNIQU5HRVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdPYmpLZXksXG4gICAgICAgICAgICAgICAgb2xkVmFsdWU6IG9iaktleSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzTmV3T2JqQXJyYXkgPSBBcnJheS5pc0FycmF5KG5ld09iaik7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3T2JqKSB7XG4gICAgICAgIGlmICghKGtleSBpbiBvYmopKSB7XG4gICAgICAgICAgICBkaWZmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIkNSRUFURVwiLFxuICAgICAgICAgICAgICAgIHBhdGg6IFtpc05ld09iakFycmF5ID8gK2tleSA6IGtleV0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5ld09ialtrZXldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpZmZzO1xufVxuIiwiZXhwb3J0IG5hbWVzcGFjZSBsb2dnZXIge1xuICAgIGV4cG9ydCBjb25zdCBsb2cgPSAobWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PlxuICAgICAgICBjb25zb2xlLmxvZyhgW1BpeGnigJlWTl0gJHttZXNzYWdlfWAsIC4uLm9wdGlvbmFsUGFyYW1zKTtcbiAgICBleHBvcnQgY29uc3Qgd2FybiA9IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+XG4gICAgICAgIGNvbnNvbGUud2FybihgW1BpeGnigJlWTl0gJHttZXNzYWdlfWAsIC4uLm9wdGlvbmFsUGFyYW1zKTtcbiAgICBleHBvcnQgY29uc3QgZXJyb3IgPSAobWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PlxuICAgICAgICBjb25zb2xlLmVycm9yKGBbUGl4aeKAmVZOXSAke21lc3NhZ2V9YCwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICAgIGV4cG9ydCBjb25zdCBpbmZvID0gKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkgPT5cbiAgICAgICAgY29uc29sZS5pbmZvKGBbUGl4aeKAmVZOXSAke21lc3NhZ2V9YCwgLi4ub3B0aW9uYWxQYXJhbXMpO1xufVxuIiwiaW1wb3J0IHsgUGl4aUVycm9yIH0gZnJvbSBcIkBkcmluY3MvcGl4aS12bi9jb3JlXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi9sb2ctdXRpbGl0eVwiO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBkZWVwIGNvcHkgb2YgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGJlIGNvcGllZFxuICogQHJldHVybnMgVGhlIGNvcGllZCBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHBvcnRhYmxlRWxlbWVudDxUPihlbGVtZW50OiBUKTogVCB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZWxlbWVudFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShlbGVtZW50U3RyaW5nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGNyZWF0aW5nIGV4cG9ydGFibGUgZWxlbWVudFwiLCBlbGVtZW50LCBlKTtcbiAgICAgICAgdGhyb3cgbmV3IFBpeGlFcnJvcihcIm5vdF9qc29uX3NlcmlhbGl6YWJsZVwiLCBcIkVycm9yIGNyZWF0aW5nIGV4cG9ydGFibGUgZWxlbWVudFwiKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgZGVlcERpZmYgZnJvbSBcImRlZXAtZGlmZlwiO1xuaW1wb3J0IHsgRGlmZmVyZW5jZSB9IGZyb20gXCJtaWNyb2RpZmZcIjtcbmltcG9ydCB7IGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50IH0gZnJvbSBcIi4vZXhwb3J0LXV0aWxpdHlcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZy11dGlsaXR5XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlRGlmZkNoYW5nZXM8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4oXG4gICAgZGF0YTogVCxcbiAgICBkaWZmZXJlbmNlczogZGVlcERpZmYuRGlmZjxULCBUPltdIHwgRGlmZmVyZW5jZVtdXG4pOiBUIHtcbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQoZGF0YSk7XG4gICAgaWYgKGRpZmZlcmVuY2VzLmxlbmd0aCA+IDEgJiYgXCJ0eXBlXCIgaW4gZGlmZmVyZW5jZXNbMF0pIHtcbiAgICAgICAgZGlmZmVyZW5jZXMgPSBkaWZmZXJlbmNlcy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGRpZmZlcmVuY2VzLmZvckVhY2goKGRpZmYpID0+IHtcbiAgICAgICAgaWYgKFwidHlwZVwiIGluIGRpZmYpIHtcbiAgICAgICAgICAgIHJlc3RvcmVNaWNyb0RpZmZDaGFuZ2VzPFQ+KHJlc3VsdCwgZGlmZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN0b3JlRGVlcERpZmZDaGFuZ2VzPFQ+KHJlc3VsdCwgZGlmZik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXN0b3JlTWljcm9EaWZmQ2hhbmdlczxUIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PihyZXN1bHQ6IFQsIGRpZmY6IERpZmZlcmVuY2UpIHtcbiAgICBsZXQgZGF0YVRvRWRpdDogYW55ID0gcmVzdWx0O1xuICAgIGlmIChkaWZmLnBhdGggJiYgZGlmZi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGlmZi5wYXRoLmZvckVhY2goKHBhdGgsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoZGlmZi5wYXRoICYmIGluZGV4ID09PSBkaWZmLnBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlmZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDSEFOR0VcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFTU9WRVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVRvRWRpdFtwYXRoXSA9IGRpZmYub2xkVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNSRUFURVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGF0aCBpcyBhIG51bWJlciwgZGF0YVRvRWRpdCBpcyBhbiBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVRvRWRpdCkgJiYgdHlwZW9mIHBhdGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVG9FZGl0LnNwbGljZShwYXRoLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhdGggaXMgYSBzdHJpbmcsIGRhdGFUb0VkaXQgaXMgYW4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUga2V5IGZyb20gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFUb0VkaXRbcGF0aF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGFUb0VkaXQgPSBkYXRhVG9FZGl0W3BhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybihcIk5vIHBhdGggZm91bmQsIHNraXBwaW5nIGRpZmZcIiwgZGlmZik7XG4gICAgfVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFRoaXMgaXMgdGhlIG9sZCBpbXBsZW1lbnRhdGlvbi4gd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVEZWVwRGlmZkNoYW5nZXM8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ocmVzdWx0OiBULCBkaWZmOiBkZWVwRGlmZi5EaWZmPFQsIFQ+KSB7XG4gICAgbGV0IGRhdGFUb0VkaXQ6IGFueSA9IHJlc3VsdDtcbiAgICBpZiAoZGlmZi5wYXRoICYmIGRpZmYucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRpZmYucGF0aC5mb3JFYWNoKChwYXRoLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRpZmYucGF0aCAmJiBpbmRleCA9PT0gZGlmZi5wYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGlmZi5raW5kID09PSBcIkVcIiB8fCBkaWZmLmtpbmQgPT09IFwiRFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFUb0VkaXRbcGF0aF0gPSBkaWZmLmxocztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYua2luZCA9PT0gXCJOXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGF0aCBpcyBhIG51bWJlciwgZGF0YVRvRWRpdCBpcyBhbiBhcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihwYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4IGZyb20gYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFUb0VkaXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVRvRWRpdC5zcGxpY2UocGF0aCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGF0aCBpcyBhIHN0cmluZywgZGF0YVRvRWRpdCBpcyBhbiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBrZXkgZnJvbSBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhVG9FZGl0W3BhdGhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmLmtpbmQgPT09IFwiQVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGRpZmYuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLml0ZW0ua2luZCA9PT0gXCJOXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbmRleCBmcm9tIGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICAoZGF0YVRvRWRpdFtwYXRoXSBhcyBhbnlbXSkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmLml0ZW0ua2luZCA9PT0gXCJFXCIgfHwgZGlmZi5pdGVtLmtpbmQgPT09IFwiRFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlZGl0IGluZGV4IGluIGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICAoZGF0YVRvRWRpdFtwYXRoXSBhcyBhbnlbXSlbaW5kZXhdID0gZGlmZi5pdGVtLmxocztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmLml0ZW0ua2luZCA9PT0gXCJBXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiTmVzdGVkIGFycmF5IGZvdW5kLCBza2lwcGluZyBkaWZmXCIsIGRpZmYpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJObyBhcnJheSBmb3VuZCwgc2tpcHBpbmcgZGlmZlwiLCBkaWZmKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YVRvRWRpdCA9IGRhdGFUb0VkaXRbcGF0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiTm8gcGF0aCBmb3VuZCwgc2tpcHBpbmcgZGlmZlwiLCBkaWZmKTtcbiAgICB9XG59XG4iLCIvKipcbiAqIEBtb2R1bGUgTFJVQ2FjaGVcbiAqL1xuXG4vLyBtb2R1bGUtcHJpdmF0ZSBuYW1lcyBhbmQgdHlwZXNcbi8vIHRoaXMgcHJvdmlkZXMgdGhlIGRlZmF1bHQgUGVyZiBvYmplY3Qgc291cmNlLlxuLy8gaXQgY2FuIGJlIHBhc3NlZCBpbiB2aWEgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSBpdFxuLy8gZm9yIGEgc2luZ2xlIExSVSBvYmplY3QuXG5leHBvcnQgdHlwZSBQZXJmID0geyBub3c6ICgpID0+IG51bWJlciB9XG5jb25zdCBkZWZhdWx0UGVyZjogUGVyZiA9XG4gIChcbiAgICB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgcGVyZm9ybWFuY2UgJiZcbiAgICB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nXG4gICkgP1xuICAgIHBlcmZvcm1hbmNlXG4gIDogRGF0ZVxuXG5jb25zdCB3YXJuZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4vLyBlaXRoZXIgYSBmdW5jdGlvbiBvciBhIGNsYXNzXG50eXBlIEZvckMgPSAoKC4uLmE6IGFueVtdKSA9PiBhbnkpIHwgeyBuZXcgKC4uLmE6IGFueVtdKTogYW55IH1cblxuLyogYzggaWdub3JlIHN0YXJ0ICovXG5jb25zdCBQUk9DRVNTID0gKFxuICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgISFwcm9jZXNzID9cbiAgICBwcm9jZXNzXG4gIDoge30pIGFzIHsgW2s6IHN0cmluZ106IGFueSB9XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cblxuY29uc3QgZW1pdFdhcm5pbmcgPSAoXG4gIG1zZzogc3RyaW5nLFxuICB0eXBlOiBzdHJpbmcsXG4gIGNvZGU6IHN0cmluZyxcbiAgZm46IEZvckMsXG4pID0+IHtcbiAgdHlwZW9mIFBST0NFU1MuZW1pdFdhcm5pbmcgPT09ICdmdW5jdGlvbicgP1xuICAgIFBST0NFU1MuZW1pdFdhcm5pbmcobXNnLCB0eXBlLCBjb2RlLCBmbilcbiAgOiBjb25zb2xlLmVycm9yKGBbJHtjb2RlfV0gJHt0eXBlfTogJHttc2d9YClcbn1cblxubGV0IEFDID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXJcbmxldCBBUyA9IGdsb2JhbFRoaXMuQWJvcnRTaWduYWxcblxuLyogYzggaWdub3JlIHN0YXJ0ICovXG5pZiAodHlwZW9mIEFDID09PSAndW5kZWZpbmVkJykge1xuICAvL0B0cy1pZ25vcmVcbiAgQVMgPSBjbGFzcyBBYm9ydFNpZ25hbCB7XG4gICAgb25hYm9ydD86ICguLi5hOiBhbnlbXSkgPT4gYW55XG4gICAgX29uYWJvcnQ6ICgoLi4uYTogYW55W10pID0+IGFueSlbXSA9IFtdXG4gICAgcmVhc29uPzogYW55XG4gICAgYWJvcnRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgYWRkRXZlbnRMaXN0ZW5lcihfOiBzdHJpbmcsIGZuOiAoLi4uYTogYW55W10pID0+IGFueSkge1xuICAgICAgdGhpcy5fb25hYm9ydC5wdXNoKGZuKVxuICAgIH1cbiAgfVxuICAvL0B0cy1pZ25vcmVcbiAgQUMgPSBjbGFzcyBBYm9ydENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgd2FybkFDUG9seWZpbGwoKVxuICAgIH1cbiAgICBzaWduYWwgPSBuZXcgQVMoKVxuICAgIGFib3J0KHJlYXNvbjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZCkgcmV0dXJuXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHRoaXMuc2lnbmFsLnJlYXNvbiA9IHJlYXNvblxuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICB0aGlzLnNpZ25hbC5hYm9ydGVkID0gdHJ1ZVxuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBmb3IgKGNvbnN0IGZuIG9mIHRoaXMuc2lnbmFsLl9vbmFib3J0KSB7XG4gICAgICAgIGZuKHJlYXNvbilcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmFsLm9uYWJvcnQ/LihyZWFzb24pXG4gICAgfVxuICB9XG4gIGxldCBwcmludEFDUG9seWZpbGxXYXJuaW5nID1cbiAgICBQUk9DRVNTLmVudj8uTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HICE9PSAnMSdcbiAgY29uc3Qgd2FybkFDUG9seWZpbGwgPSAoKSA9PiB7XG4gICAgaWYgKCFwcmludEFDUG9seWZpbGxXYXJuaW5nKSByZXR1cm5cbiAgICBwcmludEFDUG9seWZpbGxXYXJuaW5nID0gZmFsc2VcbiAgICBlbWl0V2FybmluZyhcbiAgICAgICdBYm9ydENvbnRyb2xsZXIgaXMgbm90IGRlZmluZWQuIElmIHVzaW5nIGxydS1jYWNoZSBpbiAnICtcbiAgICAgICAgJ25vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlICcgK1xuICAgICAgICAnYG5vZGUtYWJvcnQtY29udHJvbGxlcmAgcGFja2FnZS4gQSBtaW5pbWFsIHBvbHlmaWxsIGlzICcgK1xuICAgICAgICAncHJvdmlkZWQgZm9yIHVzZSBieSBMUlVDYWNoZS5mZXRjaCgpLCBidXQgaXQgc2hvdWxkIG5vdCBiZSAnICtcbiAgICAgICAgJ3JlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgJyArXG4gICAgICAgICd1c2UgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIG1pZ2h0IGhhdmUgdW5kZXNpcmFibGUgZWZmZWN0cykuICcgK1xuICAgICAgICAnWW91IG1heSBkaXNhYmxlIHRoaXMgd2l0aCBMUlVfQ0FDSEVfSUdOT1JFX0FDX1dBUk5JTkc9MSBpbiB0aGUgZW52LicsXG4gICAgICAnTk9fQUJPUlRfQ09OVFJPTExFUicsXG4gICAgICAnRU5PVFNVUCcsXG4gICAgICB3YXJuQUNQb2x5ZmlsbCxcbiAgICApXG4gIH1cbn1cbi8qIGM4IGlnbm9yZSBzdG9wICovXG5cbmNvbnN0IHNob3VsZFdhcm4gPSAoY29kZTogc3RyaW5nKSA9PiAhd2FybmVkLmhhcyhjb2RlKVxuXG5jb25zdCBUWVBFID0gU3ltYm9sKCd0eXBlJylcbmV4cG9ydCB0eXBlIFBvc0ludCA9IG51bWJlciAmIHsgW1RZUEVdOiAnUG9zaXRpdmUgSW50ZWdlcicgfVxuZXhwb3J0IHR5cGUgSW5kZXggPSBudW1iZXIgJiB7IFtUWVBFXTogJ0xSVUNhY2hlIEluZGV4JyB9XG5cbmNvbnN0IGlzUG9zSW50ID0gKG46IGFueSk6IG4gaXMgUG9zSW50ID0+XG4gIG4gJiYgbiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID4gMCAmJiBpc0Zpbml0ZShuKVxuXG5leHBvcnQgdHlwZSBVaW50QXJyYXkgPSBVaW50OEFycmF5IHwgVWludDE2QXJyYXkgfCBVaW50MzJBcnJheVxuZXhwb3J0IHR5cGUgTnVtYmVyQXJyYXkgPSBVaW50QXJyYXkgfCBudW1iZXJbXVxuXG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbi8vIFRoaXMgaXMgYSBsaXR0bGUgYml0IHJpZGljdWxvdXMsIHRiaC5cbi8vIFRoZSBtYXhpbXVtIGFycmF5IGxlbmd0aCBpcyAyXjMyLTEgb3IgdGhlcmVhYm91dHMgb24gbW9zdCBKUyBpbXBscy5cbi8vIEFuZCB3ZWxsIGJlZm9yZSB0aGF0IHBvaW50LCB5b3UncmUgY2FjaGluZyB0aGUgZW50aXJlIHdvcmxkLCBJIG1lYW4sXG4vLyB0aGF0J3MgfjMyR0Igb2YganVzdCBpbnRlZ2VycyBmb3IgdGhlIG5leHQvcHJldiBsaW5rcywgcGx1cyB3aGF0ZXZlclxuLy8gZWxzZSB0byBob2xkIHRoYXQgbWFueSBrZXlzIGFuZCB2YWx1ZXMuICBKdXN0IGZpbGxpbmcgdGhlIG1lbW9yeSB3aXRoXG4vLyB6ZXJvZXMgYXQgaW5pdCB0aW1lIGlzIGJydXRhbCB3aGVuIHlvdSBnZXQgdGhhdCBiaWcuXG4vLyBCdXQgd2h5IG5vdCBiZSBjb21wbGV0ZT9cbi8vIE1heWJlIGluIHRoZSBmdXR1cmUsIHRoZXNlIGxpbWl0cyB3aWxsIGhhdmUgZXhwYW5kZWQuXG5jb25zdCBnZXRVaW50QXJyYXkgPSAobWF4OiBudW1iZXIpID0+XG4gICFpc1Bvc0ludChtYXgpID8gbnVsbFxuICA6IG1heCA8PSBNYXRoLnBvdygyLCA4KSA/IFVpbnQ4QXJyYXlcbiAgOiBtYXggPD0gTWF0aC5wb3coMiwgMTYpID8gVWludDE2QXJyYXlcbiAgOiBtYXggPD0gTWF0aC5wb3coMiwgMzIpID8gVWludDMyQXJyYXlcbiAgOiBtYXggPD0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgPyBaZXJvQXJyYXlcbiAgOiBudWxsXG4vKiBjOCBpZ25vcmUgc3RvcCAqL1xuXG5jbGFzcyBaZXJvQXJyYXkgZXh0ZW5kcyBBcnJheTxudW1iZXI+IHtcbiAgY29uc3RydWN0b3Ioc2l6ZTogbnVtYmVyKSB7XG4gICAgc3VwZXIoc2l6ZSlcbiAgICB0aGlzLmZpbGwoMClcbiAgfVxufVxuZXhwb3J0IHR5cGUgeyBaZXJvQXJyYXkgfVxuZXhwb3J0IHR5cGUgeyBTdGFjayB9XG5cbmV4cG9ydCB0eXBlIFN0YWNrTGlrZSA9IFN0YWNrIHwgSW5kZXhbXVxuY2xhc3MgU3RhY2sge1xuICBoZWFwOiBOdW1iZXJBcnJheVxuICBsZW5ndGg6IG51bWJlclxuICAvLyBwcml2YXRlIGNvbnN0cnVjdG9yXG4gIHN0YXRpYyAjY29uc3RydWN0aW5nOiBib29sZWFuID0gZmFsc2VcbiAgc3RhdGljIGNyZWF0ZShtYXg6IG51bWJlcik6IFN0YWNrTGlrZSB7XG4gICAgY29uc3QgSGVhcENscyA9IGdldFVpbnRBcnJheShtYXgpXG4gICAgaWYgKCFIZWFwQ2xzKSByZXR1cm4gW11cbiAgICBTdGFjay4jY29uc3RydWN0aW5nID0gdHJ1ZVxuICAgIGNvbnN0IHMgPSBuZXcgU3RhY2sobWF4LCBIZWFwQ2xzKVxuICAgIFN0YWNrLiNjb25zdHJ1Y3RpbmcgPSBmYWxzZVxuICAgIHJldHVybiBzXG4gIH1cbiAgY29uc3RydWN0b3IobWF4OiBudW1iZXIsIEhlYXBDbHM6IHsgbmV3IChuOiBudW1iZXIpOiBOdW1iZXJBcnJheSB9KSB7XG4gICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgaWYgKCFTdGFjay4jY29uc3RydWN0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnN0YW50aWF0ZSBTdGFjayB1c2luZyBTdGFjay5jcmVhdGUobiknKVxuICAgIH1cbiAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgIHRoaXMuaGVhcCA9IG5ldyBIZWFwQ2xzKG1heClcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuICBwdXNoKG46IEluZGV4KSB7XG4gICAgdGhpcy5oZWFwW3RoaXMubGVuZ3RoKytdID0gblxuICB9XG4gIHBvcCgpOiBJbmRleCB7XG4gICAgcmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXSBhcyBJbmRleFxuICB9XG59XG5cbi8qKlxuICogUHJvbWlzZSByZXByZXNlbnRpbmcgYW4gaW4tcHJvZ3Jlc3Mge0BsaW5rIExSVUNhY2hlI2ZldGNofSBjYWxsXG4gKi9cbmV4cG9ydCB0eXBlIEJhY2tncm91bmRGZXRjaDxWPiA9IFByb21pc2U8ViB8IHVuZGVmaW5lZD4gJiB7XG4gIF9fcmV0dXJuZWQ6IEJhY2tncm91bmRGZXRjaDxWPiB8IHVuZGVmaW5lZFxuICBfX2Fib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyXG4gIF9fc3RhbGVXaGlsZUZldGNoaW5nOiBWIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCB0eXBlIERpc3Bvc2VUYXNrPEssIFY+ID0gW1xuICB2YWx1ZTogVixcbiAga2V5OiBLLFxuICByZWFzb246IExSVUNhY2hlLkRpc3Bvc2VSZWFzb24sXG5dXG5cbmV4cG9ydCBuYW1lc3BhY2UgTFJVQ2FjaGUge1xuICAvKipcbiAgICogQW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMCwgcmVmbGVjdGluZyB0aGUgY2FsY3VsYXRlZCBzaXplIG9mIGl0ZW1zXG4gICAqL1xuICBleHBvcnQgdHlwZSBTaXplID0gbnVtYmVyXG5cbiAgLyoqXG4gICAqIEludGVnZXIgZ3JlYXRlciB0aGFuIDAsIHJlcHJlc2VudGluZyBzb21lIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIG9yIHRoZVxuICAgKiB0aW1lIGF0IHdoaWNoIGEgVFRMIHN0YXJ0ZWQgY291bnRpbmcgZnJvbS5cbiAgICovXG4gIGV4cG9ydCB0eXBlIE1pbGxpc2Vjb25kcyA9IG51bWJlclxuXG4gIC8qKlxuICAgKiBBbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwLCByZWZsZWN0aW5nIGEgbnVtYmVyIG9mIGl0ZW1zXG4gICAqL1xuICBleHBvcnQgdHlwZSBDb3VudCA9IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgcmVhc29uIHdoeSBhbiBpdGVtIHdhcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLCBwYXNzZWRcbiAgICogdG8gdGhlIHtAbGluayBEaXNwb3Nlcn0gbWV0aG9kcy5cbiAgICpcbiAgICogLSBgZXZpY3RgOiBUaGUgaXRlbSB3YXMgZXZpY3RlZCBiZWNhdXNlIGl0IGlzIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkLFxuICAgKiAgIGFuZCB0aGUgY2FjaGUgaXMgZnVsbC5cbiAgICogLSBgc2V0YDogQSBuZXcgdmFsdWUgd2FzIHNldCwgb3ZlcndyaXRpbmcgdGhlIG9sZCB2YWx1ZSBiZWluZyBkaXNwb3NlZC5cbiAgICogLSBgZGVsZXRlYDogVGhlIGl0ZW0gd2FzIGV4cGxpY2l0bHkgZGVsZXRlZCwgZWl0aGVyIGJ5IGNhbGxpbmdcbiAgICogICB7QGxpbmsgTFJVQ2FjaGUjZGVsZXRlfSwge0BsaW5rIExSVUNhY2hlI2NsZWFyfSwgb3JcbiAgICogICB7QGxpbmsgTFJVQ2FjaGUjc2V0fSB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAgICogLSBgZXhwaXJlYDogVGhlIGl0ZW0gd2FzIHJlbW92ZWQgZHVlIHRvIGV4Y2VlZGluZyBpdHMgVFRMLlxuICAgKiAtIGBmZXRjaGA6IEEge0BsaW5rIE9wdGlvbnNCYXNlI2ZldGNoTWV0aG9kfSBvcGVyYXRpb24gcmV0dXJuZWRcbiAgICogICBgdW5kZWZpbmVkYCBvciB3YXMgYWJvcnRlZCwgY2F1c2luZyB0aGUgaXRlbSB0byBiZSBkZWxldGVkLlxuICAgKi9cbiAgZXhwb3J0IHR5cGUgRGlzcG9zZVJlYXNvbiA9XG4gICAgfCAnZXZpY3QnXG4gICAgfCAnc2V0J1xuICAgIHwgJ2RlbGV0ZSdcbiAgICB8ICdleHBpcmUnXG4gICAgfCAnZmV0Y2gnXG4gIC8qKlxuICAgKiBBIG1ldGhvZCBjYWxsZWQgdXBvbiBpdGVtIHJlbW92YWwsIHBhc3NlZCBhcyB0aGVcbiAgICoge0BsaW5rIE9wdGlvbnNCYXNlLmRpc3Bvc2V9IGFuZC9vclxuICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuZGlzcG9zZUFmdGVyfSBvcHRpb25zLlxuICAgKi9cbiAgZXhwb3J0IHR5cGUgRGlzcG9zZXI8SywgVj4gPSAoXG4gICAgdmFsdWU6IFYsXG4gICAga2V5OiBLLFxuICAgIHJlYXNvbjogRGlzcG9zZVJlYXNvbixcbiAgKSA9PiB2b2lkXG5cbiAgLyoqXG4gICAqIFRoZSByZWFzb24gd2h5IGFuIGl0ZW0gd2FzIGFkZGVkIHRvIHRoZSBjYWNoZSwgcGFzc2VkXG4gICAqIHRvIHRoZSB7QGxpbmsgSW5zZXJ0ZXJ9IG1ldGhvZHMuXG4gICAqXG4gICAqIC0gYGFkZGA6IHRoZSBpdGVtIHdhcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBhbmQgd2FzIGFkZGVkXG4gICAqIC0gYHVwZGF0ZWA6IHRoZSBpdGVtIHdhcyBpbiB0aGUgY2FjaGUsIHdpdGggdGhlIHNhbWUgdmFsdWUgcHJvdmlkZWRcbiAgICogLSBgcmVwbGFjZWA6IHRoZSBpdGVtIHdhcyBpbiB0aGUgY2FjaGUsIGFuZCByZXBsYWNlZFxuICAgKi9cbiAgZXhwb3J0IHR5cGUgSW5zZXJ0UmVhc29uID0gJ2FkZCcgfCAndXBkYXRlJyB8ICdyZXBsYWNlJ1xuXG4gIC8qKlxuICAgKiBBIG1ldGhvZCBjYWxsZWQgdXBvbiBpdGVtIGluc2VydGlvbiwgcGFzc2VkIGFzIHRoZVxuICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuaW5zZXJ0fVxuICAgKi9cbiAgZXhwb3J0IHR5cGUgSW5zZXJ0ZXI8SywgVj4gPSAoXG4gICAgdmFsdWU6IFYsXG4gICAga2V5OiBLLFxuICAgIHJlYXNvbjogSW5zZXJ0UmVhc29uLFxuICApID0+IHZvaWRcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGVmZmVjdGl2ZSBjYWxjdWxhdGVkIHNpemVcbiAgICogb2YgYW4gZW50cnkgaW4gdGhlIGNhY2hlLlxuICAgKi9cbiAgZXhwb3J0IHR5cGUgU2l6ZUNhbGN1bGF0b3I8SywgVj4gPSAodmFsdWU6IFYsIGtleTogSykgPT4gU2l6ZVxuXG4gIC8qKlxuICAgKiBPcHRpb25zIHByb3ZpZGVkIHRvIHRoZVxuICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IGZ1bmN0aW9uLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGZXRjaGVyT3B0aW9uczxLLCBWLCBGQyA9IHVua25vd24+IHtcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsXG4gICAgb3B0aW9uczogRmV0Y2hlckZldGNoT3B0aW9uczxLLCBWLCBGQz5cbiAgICAvKipcbiAgICAgKiBPYmplY3QgcHJvdmlkZWQgaW4gdGhlIHtAbGluayBGZXRjaE9wdGlvbnMuY29udGV4dH0gb3B0aW9uIHRvXG4gICAgICoge0BsaW5rIExSVUNhY2hlI2ZldGNofVxuICAgICAqL1xuICAgIGNvbnRleHQ6IEZDXG4gIH1cblxuICAvKipcbiAgICogT2NjYXNpb25hbGx5LCBpdCBtYXkgYmUgdXNlZnVsIHRvIHRyYWNrIHRoZSBpbnRlcm5hbCBiZWhhdmlvciBvZiB0aGVcbiAgICogY2FjaGUsIHBhcnRpY3VsYXJseSBmb3IgbG9nZ2luZywgZGVidWdnaW5nLCBvciBmb3IgYmVoYXZpb3Igd2l0aGluIHRoZVxuICAgKiBgZmV0Y2hNZXRob2RgLiBUbyBkbyB0aGlzLCB5b3UgY2FuIHBhc3MgYSBgc3RhdHVzYCBvYmplY3QgdG8gdGhlXG4gICAqIHtAbGluayBMUlVDYWNoZSNmZXRjaH0sIHtAbGluayBMUlVDYWNoZSNnZXR9LCB7QGxpbmsgTFJVQ2FjaGUjc2V0fSxcbiAgICoge0BsaW5rIExSVUNhY2hlI21lbW99LCBhbmQge0BsaW5rIExSVUNhY2hlI2hhc30gbWV0aG9kcy5cbiAgICpcbiAgICogVGhlIGBzdGF0dXNgIG9wdGlvbiBzaG91bGQgYmUgYSBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdC4gVGhlIGZvbGxvd2luZ1xuICAgKiBmaWVsZHMgd2lsbCBiZSBzZXQgb24gaXQgYXBwcm9wcmlhdGVseSwgZGVwZW5kaW5nIG9uIHRoZSBzaXR1YXRpb24uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFN0YXR1czxWPiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiBhIHNldCgpIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIC0gYWRkOiB0aGUgaXRlbSB3YXMgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgYW5kIHdhcyBhZGRlZFxuICAgICAqIC0gdXBkYXRlOiB0aGUgaXRlbSB3YXMgaW4gdGhlIGNhY2hlLCB3aXRoIHRoZSBzYW1lIHZhbHVlIHByb3ZpZGVkXG4gICAgICogLSByZXBsYWNlOiB0aGUgaXRlbSB3YXMgaW4gdGhlIGNhY2hlLCBhbmQgcmVwbGFjZWRcbiAgICAgKiAtIG1pc3M6IHRoZSBpdGVtIHdhcyBub3QgYWRkZWQgdG8gdGhlIGNhY2hlIGZvciBzb21lIHJlYXNvblxuICAgICAqL1xuICAgIHNldD86ICdhZGQnIHwgJ3VwZGF0ZScgfCAncmVwbGFjZScgfCAnbWlzcydcblxuICAgIC8qKlxuICAgICAqIHRoZSB0dGwgc3RvcmVkIGZvciB0aGUgaXRlbSwgb3IgdW5kZWZpbmVkIGlmIHR0bHMgYXJlIG5vdCB1c2VkLlxuICAgICAqL1xuICAgIHR0bD86IE1pbGxpc2Vjb25kc1xuXG4gICAgLyoqXG4gICAgICogdGhlIHN0YXJ0IHRpbWUgZm9yIHRoZSBpdGVtLCBvciB1bmRlZmluZWQgaWYgdHRscyBhcmUgbm90IHVzZWQuXG4gICAgICovXG4gICAgc3RhcnQ/OiBNaWxsaXNlY29uZHNcblxuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgdXNlZCBmb3IgVFRMIGNhbGN1bGF0aW9uXG4gICAgICovXG4gICAgbm93PzogTWlsbGlzZWNvbmRzXG5cbiAgICAvKipcbiAgICAgKiB0aGUgcmVtYWluaW5nIHR0bCBmb3IgdGhlIGl0ZW0sIG9yIHVuZGVmaW5lZCBpZiB0dGxzIGFyZSBub3QgdXNlZC5cbiAgICAgKi9cbiAgICByZW1haW5pbmdUVEw/OiBNaWxsaXNlY29uZHNcblxuICAgIC8qKlxuICAgICAqIFRoZSBjYWxjdWxhdGVkIHNpemUgZm9yIHRoZSBpdGVtLCBpZiBzaXplcyBhcmUgdXNlZC5cbiAgICAgKi9cbiAgICBlbnRyeVNpemU/OiBTaXplXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY2FsY3VsYXRlZCBzaXplIG9mIHRoZSBjYWNoZSwgaWYgc2l6ZXMgYXJlIHVzZWQuXG4gICAgICovXG4gICAgdG90YWxDYWxjdWxhdGVkU2l6ZT86IFNpemVcblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGl0ZW0gd2FzIG5vdCBzdG9yZWQsIGR1ZSB0byBleGNlZWRpbmcgdGhlXG4gICAgICoge0BsaW5rIE9wdGlvbnNCYXNlLm1heEVudHJ5U2l6ZX1cbiAgICAgKi9cbiAgICBtYXhFbnRyeVNpemVFeGNlZWRlZD86IHRydWVcblxuICAgIC8qKlxuICAgICAqIFRoZSBvbGQgdmFsdWUsIHNwZWNpZmllZCBpbiB0aGUgY2FzZSBvZiBgc2V0Oid1cGRhdGUnYCBvclxuICAgICAqIGBzZXQ6J3JlcGxhY2UnYFxuICAgICAqL1xuICAgIG9sZFZhbHVlPzogVlxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlc3VsdHMgb2YgYSB7QGxpbmsgTFJVQ2FjaGUjaGFzfSBvcGVyYXRpb25cbiAgICAgKlxuICAgICAqIC0gaGl0OiB0aGUgaXRlbSB3YXMgZm91bmQgaW4gdGhlIGNhY2hlXG4gICAgICogLSBzdGFsZTogdGhlIGl0ZW0gd2FzIGZvdW5kIGluIHRoZSBjYWNoZSwgYnV0IGlzIHN0YWxlXG4gICAgICogLSBtaXNzOiB0aGUgaXRlbSB3YXMgbm90IGZvdW5kIGluIHRoZSBjYWNoZVxuICAgICAqL1xuICAgIGhhcz86ICdoaXQnIHwgJ3N0YWxlJyB8ICdtaXNzJ1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiBhIHtAbGluayBMUlVDYWNoZSNmZXRjaH0gb3BlcmF0aW9uLlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGNhbiBjaGFuZ2UgYXMgdGhlIHVuZGVybHlpbmcgZmV0Y2goKSBtb3ZlcyB0aHJvdWdoXG4gICAgICogdmFyaW91cyBzdGF0ZXMuXG4gICAgICpcbiAgICAgKiAtIGluZmxpZ2h0OiB0aGVyZSBpcyBhbm90aGVyIGZldGNoKCkgZm9yIHRoaXMga2V5IHdoaWNoIGlzIGluIHByb2Nlc3NcbiAgICAgKiAtIGdldDogdGhlcmUgaXMgbm8ge0BsaW5rIE9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSwgc29cbiAgICAgKiAgIHtAbGluayBMUlVDYWNoZSNnZXR9IHdhcyBjYWxsZWQuXG4gICAgICogLSBtaXNzOiB0aGUgaXRlbSBpcyBub3QgaW4gY2FjaGUsIGFuZCB3aWxsIGJlIGZldGNoZWQuXG4gICAgICogLSBoaXQ6IHRoZSBpdGVtIGlzIGluIHRoZSBjYWNoZSwgYW5kIHdhcyByZXNvbHZlZCBpbW1lZGlhdGVseS5cbiAgICAgKiAtIHN0YWxlOiB0aGUgaXRlbSBpcyBpbiB0aGUgY2FjaGUsIGJ1dCBzdGFsZS5cbiAgICAgKiAtIHJlZnJlc2g6IHRoZSBpdGVtIGlzIGluIHRoZSBjYWNoZSwgYW5kIG5vdCBzdGFsZSwgYnV0XG4gICAgICogICB7QGxpbmsgRmV0Y2hPcHRpb25zLmZvcmNlUmVmcmVzaH0gd2FzIHNwZWNpZmllZC5cbiAgICAgKi9cbiAgICBmZXRjaD86ICdnZXQnIHwgJ2luZmxpZ2h0JyB8ICdtaXNzJyB8ICdoaXQnIHwgJ3N0YWxlJyB8ICdyZWZyZXNoJ1xuXG4gICAgLyoqXG4gICAgICogVGhlIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gd2FzIGNhbGxlZFxuICAgICAqL1xuICAgIGZldGNoRGlzcGF0Y2hlZD86IHRydWVcblxuICAgIC8qKlxuICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgd2FzIHVwZGF0ZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG9cbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9XG4gICAgICovXG4gICAgZmV0Y2hVcGRhdGVkPzogdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiBmb3IgYSBmZXRjaCgpIHJlamVjdGlvbi4gIEVpdGhlciB0aGUgZXJyb3IgcmFpc2VkIGJ5IHRoZVxuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0sIG9yIHRoZSByZWFzb24gZm9yIGFuXG4gICAgICogQWJvcnRTaWduYWwuXG4gICAgICovXG4gICAgZmV0Y2hFcnJvcj86IEVycm9yXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmV0Y2ggcmVjZWl2ZWQgYW4gYWJvcnQgc2lnbmFsXG4gICAgICovXG4gICAgZmV0Y2hBYm9ydGVkPzogdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogVGhlIGFib3J0IHNpZ25hbCByZWNlaXZlZCB3YXMgaWdub3JlZCwgYW5kIHRoZSBmZXRjaCB3YXMgYWxsb3dlZCB0b1xuICAgICAqIGNvbnRpbnVlLlxuICAgICAqL1xuICAgIGZldGNoQWJvcnRJZ25vcmVkPzogdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogVGhlIGZldGNoTWV0aG9kIHByb21pc2UgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgZmV0Y2hSZXNvbHZlZD86IHRydWVcblxuICAgIC8qKlxuICAgICAqIFRoZSBmZXRjaE1ldGhvZCBwcm9taXNlIHdhcyByZWplY3RlZFxuICAgICAqL1xuICAgIGZldGNoUmVqZWN0ZWQ/OiB0cnVlXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIGEge0BsaW5rIExSVUNhY2hlI2dldH0gb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogLSBmZXRjaGluZzogVGhlIGl0ZW0gaXMgY3VycmVudGx5IGJlaW5nIGZldGNoZWQuICBJZiBhIHByZXZpb3VzIHZhbHVlXG4gICAgICogICBpcyBwcmVzZW50IGFuZCBhbGxvd2VkLCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogLSBzdGFsZTogVGhlIGl0ZW0gaXMgaW4gdGhlIGNhY2hlLCBhbmQgaXMgc3RhbGUuXG4gICAgICogLSBoaXQ6IHRoZSBpdGVtIGlzIGluIHRoZSBjYWNoZVxuICAgICAqIC0gbWlzczogdGhlIGl0ZW0gaXMgbm90IGluIHRoZSBjYWNoZVxuICAgICAqL1xuICAgIGdldD86ICdzdGFsZScgfCAnaGl0JyB8ICdtaXNzJ1xuXG4gICAgLyoqXG4gICAgICogQSBmZXRjaCBvciBnZXQgb3BlcmF0aW9uIHJldHVybmVkIGEgc3RhbGUgdmFsdWUuXG4gICAgICovXG4gICAgcmV0dXJuZWRTdGFsZT86IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBvcHRpb25zIHdoaWNoIG92ZXJyaWRlIHRoZSBvcHRpb25zIHNldCBpbiB0aGUgTFJVQ2FjaGUgY29uc3RydWN0b3JcbiAgICogd2hlbiBjYWxsaW5nIHtAbGluayBMUlVDYWNoZSNmZXRjaH0uXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHVuaW9uIG9mIHtAbGluayBHZXRPcHRpb25zfSBhbmQge0BsaW5rIFNldE9wdGlvbnN9LCBwbHVzXG4gICAqIHtAbGluayBPcHRpb25zQmFzZS5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb259LFxuICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb259LFxuICAgKiB7QGxpbmsgRmV0Y2hPcHRpb25zLmZvcmNlUmVmcmVzaH0sIGFuZFxuICAgKiB7QGxpbmsgRmV0Y2hlck9wdGlvbnMuY29udGV4dH1cbiAgICpcbiAgICogQW55IG9mIHRoZXNlIG1heSBiZSBtb2RpZmllZCBpbiB0aGUge0BsaW5rIE9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfVxuICAgKiBmdW5jdGlvbiwgYnV0IHRoZSB7QGxpbmsgR2V0T3B0aW9uc30gZmllbGRzIHdpbGwgb2YgY291cnNlIGhhdmUgbm9cbiAgICogZWZmZWN0LCBhcyB0aGUge0BsaW5rIExSVUNhY2hlI2dldH0gY2FsbCBhbHJlYWR5IGhhcHBlbmVkIGJ5IHRoZSB0aW1lXG4gICAqIHRoZSBmZXRjaE1ldGhvZCBpcyBjYWxsZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZldGNoZXJGZXRjaE9wdGlvbnM8SywgViwgRkMgPSB1bmtub3duPlxuICAgIGV4dGVuZHMgUGljazxcbiAgICAgIE9wdGlvbnNCYXNlPEssIFYsIEZDPixcbiAgICAgIHwgJ2FsbG93U3RhbGUnXG4gICAgICB8ICd1cGRhdGVBZ2VPbkdldCdcbiAgICAgIHwgJ25vRGVsZXRlT25TdGFsZUdldCdcbiAgICAgIHwgJ3NpemVDYWxjdWxhdGlvbidcbiAgICAgIHwgJ3R0bCdcbiAgICAgIHwgJ25vRGlzcG9zZU9uU2V0J1xuICAgICAgfCAnbm9VcGRhdGVUVEwnXG4gICAgICB8ICdub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24nXG4gICAgICB8ICdhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbidcbiAgICAgIHwgJ2lnbm9yZUZldGNoQWJvcnQnXG4gICAgICB8ICdhbGxvd1N0YWxlT25GZXRjaEFib3J0J1xuICAgID4ge1xuICAgIHN0YXR1cz86IFN0YXR1czxWPlxuICAgIHNpemU/OiBTaXplXG4gIH1cblxuICAvKipcbiAgICogT3B0aW9ucyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBMUlVDYWNoZSNmZXRjaH0gbWV0aG9kLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGZXRjaE9wdGlvbnM8SywgViwgRkM+XG4gICAgZXh0ZW5kcyBGZXRjaGVyRmV0Y2hPcHRpb25zPEssIFYsIEZDPiB7XG4gICAgLyoqXG4gICAgICogU2V0IHRvIHRydWUgdG8gZm9yY2UgYSByZS1sb2FkIG9mIHRoZSBleGlzdGluZyBkYXRhLCBldmVuIGlmIGl0XG4gICAgICogaXMgbm90IHlldCBzdGFsZS5cbiAgICAgKi9cbiAgICBmb3JjZVJlZnJlc2g/OiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udGV4dCBwcm92aWRlZCB0byB0aGUge0BsaW5rIE9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSBhc1xuICAgICAqIHRoZSB7QGxpbmsgRmV0Y2hlck9wdGlvbnMuY29udGV4dH0gcGFyYW0uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgRkMgdHlwZSBpcyBzcGVjaWZpZWQgYXMgdW5rbm93biAodGhlIGRlZmF1bHQpLFxuICAgICAqIHVuZGVmaW5lZCBvciB2b2lkLCB0aGVuIHRoaXMgaXMgb3B0aW9uYWwuICBPdGhlcndpc2UsIGl0IHdpbGxcbiAgICAgKiBiZSByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBjb250ZXh0PzogRkNcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbFxuICAgIHN0YXR1cz86IFN0YXR1czxWPlxuICB9XG4gIC8qKlxuICAgKiBPcHRpb25zIHByb3ZpZGVkIHRvIHtAbGluayBMUlVDYWNoZSNmZXRjaH0gd2hlbiB0aGUgRkMgdHlwZSBpcyBzb21ldGhpbmdcbiAgICogb3RoZXIgdGhhbiBgdW5rbm93bmAsIGB1bmRlZmluZWRgLCBvciBgdm9pZGBcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hPcHRpb25zV2l0aENvbnRleHQ8SywgViwgRkM+XG4gICAgZXh0ZW5kcyBGZXRjaE9wdGlvbnM8SywgViwgRkM+IHtcbiAgICBjb250ZXh0OiBGQ1xuICB9XG4gIC8qKlxuICAgKiBPcHRpb25zIHByb3ZpZGVkIHRvIHtAbGluayBMUlVDYWNoZSNmZXRjaH0gd2hlbiB0aGUgRkMgdHlwZSBpc1xuICAgKiBgdW5kZWZpbmVkYCBvciBgdm9pZGBcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hPcHRpb25zTm9Db250ZXh0PEssIFY+XG4gICAgZXh0ZW5kcyBGZXRjaE9wdGlvbnM8SywgViwgdW5kZWZpbmVkPiB7XG4gICAgY29udGV4dD86IHVuZGVmaW5lZFxuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBNZW1vT3B0aW9uczxLLCBWLCBGQyA9IHVua25vd24+XG4gICAgZXh0ZW5kcyBQaWNrPFxuICAgICAgT3B0aW9uc0Jhc2U8SywgViwgRkM+LFxuICAgICAgfCAnYWxsb3dTdGFsZSdcbiAgICAgIHwgJ3VwZGF0ZUFnZU9uR2V0J1xuICAgICAgfCAnbm9EZWxldGVPblN0YWxlR2V0J1xuICAgICAgfCAnc2l6ZUNhbGN1bGF0aW9uJ1xuICAgICAgfCAndHRsJ1xuICAgICAgfCAnbm9EaXNwb3NlT25TZXQnXG4gICAgICB8ICdub1VwZGF0ZVRUTCdcbiAgICAgIHwgJ25vRGVsZXRlT25GZXRjaFJlamVjdGlvbidcbiAgICAgIHwgJ2FsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uJ1xuICAgICAgfCAnaWdub3JlRmV0Y2hBYm9ydCdcbiAgICAgIHwgJ2FsbG93U3RhbGVPbkZldGNoQWJvcnQnXG4gICAgPiB7XG4gICAgLyoqXG4gICAgICogU2V0IHRvIHRydWUgdG8gZm9yY2UgYSByZS1sb2FkIG9mIHRoZSBleGlzdGluZyBkYXRhLCBldmVuIGlmIGl0XG4gICAgICogaXMgbm90IHlldCBzdGFsZS5cbiAgICAgKi9cbiAgICBmb3JjZVJlZnJlc2g/OiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udGV4dCBwcm92aWRlZCB0byB0aGUge0BsaW5rIE9wdGlvbnNCYXNlLm1lbW9NZXRob2R9IGFzXG4gICAgICogdGhlIHtAbGluayBNZW1vaXplck9wdGlvbnMuY29udGV4dH0gcGFyYW0uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgRkMgdHlwZSBpcyBzcGVjaWZpZWQgYXMgdW5rbm93biAodGhlIGRlZmF1bHQpLFxuICAgICAqIHVuZGVmaW5lZCBvciB2b2lkLCB0aGVuIHRoaXMgaXMgb3B0aW9uYWwuICBPdGhlcndpc2UsIGl0IHdpbGxcbiAgICAgKiBiZSByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBjb250ZXh0PzogRkNcbiAgICBzdGF0dXM/OiBTdGF0dXM8Vj5cbiAgfVxuICAvKipcbiAgICogT3B0aW9ucyBwcm92aWRlZCB0byB7QGxpbmsgTFJVQ2FjaGUjbWVtb30gd2hlbiB0aGUgRkMgdHlwZSBpcyBzb21ldGhpbmdcbiAgICogb3RoZXIgdGhhbiBgdW5rbm93bmAsIGB1bmRlZmluZWRgLCBvciBgdm9pZGBcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVtb09wdGlvbnNXaXRoQ29udGV4dDxLLCBWLCBGQz5cbiAgICBleHRlbmRzIE1lbW9PcHRpb25zPEssIFYsIEZDPiB7XG4gICAgY29udGV4dDogRkNcbiAgfVxuICAvKipcbiAgICogT3B0aW9ucyBwcm92aWRlZCB0byB7QGxpbmsgTFJVQ2FjaGUjbWVtb30gd2hlbiB0aGUgRkMgdHlwZSBpc1xuICAgKiBgdW5kZWZpbmVkYCBvciBgdm9pZGBcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVtb09wdGlvbnNOb0NvbnRleHQ8SywgVj5cbiAgICBleHRlbmRzIE1lbW9PcHRpb25zPEssIFYsIHVuZGVmaW5lZD4ge1xuICAgIGNvbnRleHQ/OiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25zIHByb3ZpZGVkIHRvIHRoZVxuICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UubWVtb01ldGhvZH0gZnVuY3Rpb24uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIE1lbW9pemVyT3B0aW9uczxLLCBWLCBGQyA9IHVua25vd24+IHtcbiAgICBvcHRpb25zOiBNZW1vaXplck1lbW9PcHRpb25zPEssIFYsIEZDPlxuICAgIC8qKlxuICAgICAqIE9iamVjdCBwcm92aWRlZCBpbiB0aGUge0BsaW5rIE1lbW9PcHRpb25zLmNvbnRleHR9IG9wdGlvbiB0b1xuICAgICAqIHtAbGluayBMUlVDYWNoZSNtZW1vfVxuICAgICAqL1xuICAgIGNvbnRleHQ6IEZDXG4gIH1cblxuICAvKipcbiAgICogb3B0aW9ucyB3aGljaCBvdmVycmlkZSB0aGUgb3B0aW9ucyBzZXQgaW4gdGhlIExSVUNhY2hlIGNvbnN0cnVjdG9yXG4gICAqIHdoZW4gY2FsbGluZyB7QGxpbmsgTFJVQ2FjaGUjbWVtb30uXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHVuaW9uIG9mIHtAbGluayBHZXRPcHRpb25zfSBhbmQge0BsaW5rIFNldE9wdGlvbnN9LCBwbHVzXG4gICAqIHtAbGluayBNZW1vT3B0aW9ucy5mb3JjZVJlZnJlc2h9LCBhbmRcbiAgICoge0BsaW5rIE1lbW9PcHRpb25zLmNvbnRleHR9XG4gICAqXG4gICAqIEFueSBvZiB0aGVzZSBtYXkgYmUgbW9kaWZpZWQgaW4gdGhlIHtAbGluayBPcHRpb25zQmFzZS5tZW1vTWV0aG9kfVxuICAgKiBmdW5jdGlvbiwgYnV0IHRoZSB7QGxpbmsgR2V0T3B0aW9uc30gZmllbGRzIHdpbGwgb2YgY291cnNlIGhhdmUgbm9cbiAgICogZWZmZWN0LCBhcyB0aGUge0BsaW5rIExSVUNhY2hlI2dldH0gY2FsbCBhbHJlYWR5IGhhcHBlbmVkIGJ5IHRoZSB0aW1lXG4gICAqIHRoZSBtZW1vTWV0aG9kIGlzIGNhbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVtb2l6ZXJNZW1vT3B0aW9uczxLLCBWLCBGQyA9IHVua25vd24+XG4gICAgZXh0ZW5kcyBQaWNrPFxuICAgICAgT3B0aW9uc0Jhc2U8SywgViwgRkM+LFxuICAgICAgfCAnYWxsb3dTdGFsZSdcbiAgICAgIHwgJ3VwZGF0ZUFnZU9uR2V0J1xuICAgICAgfCAnbm9EZWxldGVPblN0YWxlR2V0J1xuICAgICAgfCAnc2l6ZUNhbGN1bGF0aW9uJ1xuICAgICAgfCAndHRsJ1xuICAgICAgfCAnbm9EaXNwb3NlT25TZXQnXG4gICAgICB8ICdub1VwZGF0ZVRUTCdcbiAgICA+IHtcbiAgICBzdGF0dXM/OiBTdGF0dXM8Vj5cbiAgICBzaXplPzogU2l6ZVxuICAgIHN0YXJ0PzogTWlsbGlzZWNvbmRzXG4gIH1cblxuICAvKipcbiAgICogT3B0aW9ucyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBMUlVDYWNoZSNoYXN9IG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgSGFzT3B0aW9uczxLLCBWLCBGQz5cbiAgICBleHRlbmRzIFBpY2s8T3B0aW9uc0Jhc2U8SywgViwgRkM+LCAndXBkYXRlQWdlT25IYXMnPiB7XG4gICAgc3RhdHVzPzogU3RhdHVzPFY+XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9ucyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBMUlVDYWNoZSNnZXR9IG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgR2V0T3B0aW9uczxLLCBWLCBGQz5cbiAgICBleHRlbmRzIFBpY2s8XG4gICAgICBPcHRpb25zQmFzZTxLLCBWLCBGQz4sXG4gICAgICAnYWxsb3dTdGFsZScgfCAndXBkYXRlQWdlT25HZXQnIHwgJ25vRGVsZXRlT25TdGFsZUdldCdcbiAgICA+IHtcbiAgICBzdGF0dXM/OiBTdGF0dXM8Vj5cbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25zIHRoYXQgbWF5IGJlIHBhc3NlZCB0byB0aGUge0BsaW5rIExSVUNhY2hlI3BlZWt9IG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgUGVla09wdGlvbnM8SywgViwgRkM+XG4gICAgZXh0ZW5kcyBQaWNrPE9wdGlvbnNCYXNlPEssIFYsIEZDPiwgJ2FsbG93U3RhbGUnPiB7fVxuXG4gIC8qKlxuICAgKiBPcHRpb25zIHRoYXQgbWF5IGJlIHBhc3NlZCB0byB0aGUge0BsaW5rIExSVUNhY2hlI3NldH0gbWV0aG9kLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBTZXRPcHRpb25zPEssIFYsIEZDPlxuICAgIGV4dGVuZHMgUGljazxcbiAgICAgIE9wdGlvbnNCYXNlPEssIFYsIEZDPixcbiAgICAgICdzaXplQ2FsY3VsYXRpb24nIHwgJ3R0bCcgfCAnbm9EaXNwb3NlT25TZXQnIHwgJ25vVXBkYXRlVFRMJ1xuICAgID4ge1xuICAgIC8qKlxuICAgICAqIElmIHNpemUgdHJhY2tpbmcgaXMgZW5hYmxlZCwgdGhlbiBzZXR0aW5nIGFuIGV4cGxpY2l0IHNpemVcbiAgICAgKiBpbiB0aGUge0BsaW5rIExSVUNhY2hlI3NldH0gY2FsbCB3aWxsIHByZXZlbnQgY2FsbGluZyB0aGVcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2Uuc2l6ZUNhbGN1bGF0aW9ufSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBzaXplPzogU2l6ZVxuICAgIC8qKlxuICAgICAqIElmIFRUTCB0cmFja2luZyBpcyBlbmFibGVkLCB0aGVuIHNldHRpbmcgYW4gZXhwbGljaXQgc3RhcnRcbiAgICAgKiB0aW1lIGluIHRoZSB7QGxpbmsgTFJVQ2FjaGUjc2V0fSBjYWxsIHdpbGwgb3ZlcnJpZGUgdGhlXG4gICAgICogZGVmYXVsdCB0aW1lIGZyb20gYHBlcmZvcm1hbmNlLm5vdygpYCBvciBgRGF0ZS5ub3coKWAuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgaXQgbXVzdCBiZSBhIHZhbGlkIHZhbHVlIGZvciB3aGljaGV2ZXIgdGltZS10cmFja2luZ1xuICAgICAqIG1ldGhvZCBpcyBpbiB1c2UuXG4gICAgICovXG4gICAgc3RhcnQ/OiBNaWxsaXNlY29uZHNcbiAgICBzdGF0dXM/OiBTdGF0dXM8Vj5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBzaWduYXR1cmUgZm9yIHRoZSB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IG9wdGlvbi5cbiAgICovXG4gIGV4cG9ydCB0eXBlIEZldGNoZXI8SywgViwgRkMgPSB1bmtub3duPiA9IChcbiAgICBrZXk6IEssXG4gICAgc3RhbGVWYWx1ZTogViB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBGZXRjaGVyT3B0aW9uczxLLCBWLCBGQz4sXG4gICkgPT4gUHJvbWlzZTxWIHwgdW5kZWZpbmVkIHwgdm9pZD4gfCBWIHwgdW5kZWZpbmVkIHwgdm9pZFxuXG4gIC8qKlxuICAgKiB0aGUgdHlwZSBzaWduYXR1cmUgZm9yIHRoZSB7QGxpbmsgT3B0aW9uc0Jhc2UubWVtb01ldGhvZH0gb3B0aW9uLlxuICAgKi9cbiAgZXhwb3J0IHR5cGUgTWVtb2l6ZXI8SywgViwgRkMgPSB1bmtub3duPiA9IChcbiAgICBrZXk6IEssXG4gICAgc3RhbGVWYWx1ZTogViB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBNZW1vaXplck9wdGlvbnM8SywgViwgRkM+LFxuICApID0+IFZcblxuICAvKipcbiAgICogT3B0aW9ucyB3aGljaCBtYXkgYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgTFJVQ2FjaGV9IGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBNb3N0IG9mIHRoZXNlIG1heSBiZSBvdmVycmlkZGVuIGluIHRoZSB2YXJpb3VzIG9wdGlvbnMgdGhhdCB1c2VcbiAgICogdGhlbS5cbiAgICpcbiAgICogRGVzcGl0ZSBhbGwgYmVpbmcgdGVjaG5pY2FsbHkgb3B0aW9uYWwsIHRoZSBjb25zdHJ1Y3RvciByZXF1aXJlcyB0aGF0XG4gICAqIGEgY2FjaGUgaXMgYXQgbWluaW11bSBsaW1pdGVkIGJ5IG9uZSBvciBtb3JlIG9mIHtAbGluayBPcHRpb25zQmFzZS5tYXh9LFxuICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UudHRsfSwgb3Ige0BsaW5rIE9wdGlvbnNCYXNlLm1heFNpemV9LlxuICAgKlxuICAgKiBJZiB7QGxpbmsgT3B0aW9uc0Jhc2UudHRsfSBpcyB1c2VkIGFsb25lLCB0aGVuIGl0IGlzIHN0cm9uZ2x5IGFkdmlzZWRcbiAgICogKGFuZCBpbiBmYWN0IHJlcXVpcmVkIGJ5IHRoZSB0eXBlIGRlZmluaXRpb25zIGhlcmUpIHRoYXQgdGhlIGNhY2hlXG4gICAqIGFsc28gc2V0IHtAbGluayBPcHRpb25zQmFzZS50dGxBdXRvcHVyZ2V9LCB0byBwcmV2ZW50IHBvdGVudGlhbGx5XG4gICAqIHVuYm91bmRlZCBzdG9yYWdlLlxuICAgKlxuICAgKiBBbGwgb3B0aW9ucyBhcmUgYWxzbyBhdmFpbGFibGUgb24gdGhlIHtAbGluayBMUlVDYWNoZX0gaW5zdGFuY2UsIG1ha2luZ1xuICAgKiBpdCBzYWZlIHRvIHBhc3MgYW4gTFJVQ2FjaGUgaW5zdGFuY2UgYXMgdGhlIG9wdGlvbnMgYXJndW1lbW50IHRvXG4gICAqIG1ha2UgYW5vdGhlciBlbXB0eSBjYWNoZSBvZiB0aGUgc2FtZSB0eXBlLlxuICAgKlxuICAgKiBTb21lIG9wdGlvbnMgYXJlIG1hcmtlZCBhcyByZWFkLW9ubHksIGJlY2F1c2UgY2hhbmdpbmcgdGhlbSBhZnRlclxuICAgKiBpbnN0YW50aWF0aW9uIGlzIG5vdCBzYWZlLiBDaGFuZ2luZyBhbnkgb2YgdGhlIG90aGVyIG9wdGlvbnMgd2lsbCBvZlxuICAgKiBjb3Vyc2Ugb25seSBoYXZlIGFuIGVmZmVjdCBvbiBzdWJzZXF1ZW50IG1ldGhvZCBjYWxscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uc0Jhc2U8SywgViwgRkM+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gc3RvcmUgaW4gdGhlIGNhY2hlIGJlZm9yZSBldmljdGluZ1xuICAgICAqIG9sZCBlbnRyaWVzLiBUaGlzIGlzIHJlYWQtb25seSBvbiB0aGUge0BsaW5rIExSVUNhY2hlfSBpbnN0YW5jZSxcbiAgICAgKiBhbmQgbWF5IG5vdCBiZSBvdmVycmlkZGVuLlxuICAgICAqXG4gICAgICogSWYgc2V0LCB0aGVuIHN0b3JhZ2Ugc3BhY2Ugd2lsbCBiZSBwcmUtYWxsb2NhdGVkIGF0IGNvbnN0cnVjdGlvblxuICAgICAqIHRpbWUsIGFuZCB0aGUgY2FjaGUgd2lsbCBwZXJmb3JtIHNpZ25pZmljYW50bHkgZmFzdGVyLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHNpZ25pZmljYW50bHkgZmV3ZXIgaXRlbXMgbWF5IGJlIHN0b3JlZCwgaWZcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UubWF4U2l6ZX0gYW5kL29yIHtAbGluayBPcHRpb25zQmFzZS50dGx9IGFyZSBhbHNvXG4gICAgICogc2V0LlxuICAgICAqXG4gICAgICogKipJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBzZXQgYSBgbWF4YCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAgICAgKiBvZiB0aGUgY2FjaGUuKipcbiAgICAgKi9cbiAgICBtYXg/OiBDb3VudFxuXG4gICAgLyoqXG4gICAgICogTWF4IHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciBpdGVtcyB0byBsaXZlIGluIGNhY2hlIGJlZm9yZSB0aGV5IGFyZVxuICAgICAqIGNvbnNpZGVyZWQgc3RhbGUuICBOb3RlIHRoYXQgc3RhbGUgaXRlbXMgYXJlIE5PVCBwcmVlbXB0aXZlbHkgcmVtb3ZlZCBieVxuICAgICAqIGRlZmF1bHQsIGFuZCBNQVkgbGl2ZSBpbiB0aGUgY2FjaGUsIGNvbnRyaWJ1dGluZyB0byBpdHMgTFJVIG1heCwgbG9uZ1xuICAgICAqIGFmdGVyIHRoZXkgaGF2ZSBleHBpcmVkLCB1bmxlc3Mge0BsaW5rIE9wdGlvbnNCYXNlLnR0bEF1dG9wdXJnZX0gaXNcbiAgICAgKiBzZXQuXG4gICAgICpcbiAgICAgKiBJZiBzZXQgdG8gYDBgICh0aGUgZGVmYXVsdCB2YWx1ZSksIHRoZW4gdGhhdCBtZWFucyBcImRvIG5vdCB0cmFja1xuICAgICAqIFRUTFwiLCBub3QgXCJleHBpcmUgaW1tZWRpYXRlbHlcIi5cbiAgICAgKlxuICAgICAqIEFsc28sIGFzIHRoaXMgY2FjaGUgaXMgb3B0aW1pemVkIGZvciBMUlUvTVJVIG9wZXJhdGlvbnMsIHNvbWUgb2ZcbiAgICAgKiB0aGUgc3RhbGVuZXNzL1RUTCBjaGVja3Mgd2lsbCByZWR1Y2UgcGVyZm9ybWFuY2UsIGFzIHRoZXkgd2lsbCBpbmN1clxuICAgICAqIG92ZXJoZWFkIGJ5IGRlbGV0aW5nIGl0ZW1zLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBub3QgcHJpbWFyaWx5IGEgVFRMIGNhY2hlLCBhbmQgZG9lcyBub3QgbWFrZSBzdHJvbmcgVFRMXG4gICAgICogZ3VhcmFudGVlcy4gVGhlcmUgaXMgbm8gcHJlLWVtcHRpdmUgcHJ1bmluZyBvZiBleHBpcmVkIGl0ZW1zLCBidXQgeW91XG4gICAgICogX21heV8gc2V0IGEgVFRMIG9uIHRoZSBjYWNoZSwgYW5kIGl0IHdpbGwgdHJlYXQgZXhwaXJlZCBpdGVtcyBhcyBtaXNzaW5nXG4gICAgICogd2hlbiB0aGV5IGFyZSBmZXRjaGVkLCBhbmQgZGVsZXRlIHRoZW0uXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCwgYnV0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBpbiBtcyBpZiBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgYW4gb3B0aW9ucyBvYmplY3QgdG8gYGNhY2hlLnNldCgpYC5cbiAgICAgKlxuICAgICAqIEF0IGxlYXN0IG9uZSBvZiBgbWF4YCwgYG1heFNpemVgLCBvciBgVFRMYCBpcyByZXF1aXJlZC4gVGhpcyBtdXN0IGJlIGFcbiAgICAgKiBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNldC5cbiAgICAgKlxuICAgICAqIEV2ZW4gaWYgdHRsIHRyYWNraW5nIGlzIGVuYWJsZWQsICoqaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gc2V0IGFcbiAgICAgKiBgbWF4YCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGggb2YgdGhlIGNhY2hlLioqXG4gICAgICpcbiAgICAgKiBJZiB0dGwgdHJhY2tpbmcgaXMgZW5hYmxlZCwgYW5kIGBtYXhgIGFuZCBgbWF4U2l6ZWAgYXJlIG5vdCBzZXQsXG4gICAgICogYW5kIGB0dGxBdXRvcHVyZ2VgIGlzIG5vdCBzZXQsIHRoZW4gYSB3YXJuaW5nIHdpbGwgYmUgZW1pdHRlZFxuICAgICAqIGNhdXRpb25pbmcgYWJvdXQgdGhlIHBvdGVudGlhbCBmb3IgdW5ib3VuZGVkIG1lbW9yeSBjb25zdW1wdGlvbi5cbiAgICAgKiAoVGhlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbnMgd2lsbCBhbHNvIGRpc2NvdXJhZ2UgdGhpcy4pXG4gICAgICovXG4gICAgdHRsPzogTWlsbGlzZWNvbmRzXG5cbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIGFtb3VudCBvZiB0aW1lIGluIG1zIGluIHdoaWNoIHRvIGNoZWNrIGZvciBzdGFsZW5lc3MuXG4gICAgICogRGVmYXVsdHMgdG8gMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY3VycmVudCB0aW1lIGlzIGNoZWNrZWRcbiAgICAgKiBhdCBtb3N0IG9uY2UgcGVyIG1pbGxpc2Vjb25kLlxuICAgICAqXG4gICAgICogU2V0IHRvIDAgdG8gY2hlY2sgdGhlIGN1cnJlbnQgdGltZSBldmVyeSB0aW1lIHN0YWxlbmVzcyBpcyB0ZXN0ZWQuXG4gICAgICogKFRoaXMgcmVkdWNlcyBwZXJmb3JtYW5jZSwgYW5kIGlzIHRoZW9yZXRpY2FsbHkgdW5uZWNlc3NhcnkuKVxuICAgICAqXG4gICAgICogU2V0dGluZyB0aGlzIHRvIGEgaGlnaGVyIHZhbHVlIHdpbGwgaW1wcm92ZSBwZXJmb3JtYW5jZSBzb21ld2hhdFxuICAgICAqIHdoaWxlIHVzaW5nIHR0bCB0cmFja2luZywgYWxiZWl0IGF0IHRoZSBleHBlbnNlIG9mIGtlZXBpbmcgc3RhbGVcbiAgICAgKiBpdGVtcyBhcm91bmQgYSBiaXQgbG9uZ2VyIHRoYW4gdGhlaXIgVFRMcyB3b3VsZCBpbmRpY2F0ZS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgICB0dGxSZXNvbHV0aW9uPzogTWlsbGlzZWNvbmRzXG5cbiAgICAvKipcbiAgICAgKiBQcmVlbXB0aXZlbHkgcmVtb3ZlIHN0YWxlIGl0ZW1zIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoaXMgbWF5ICpzaWduaWZpY2FudGx5KiBkZWdyYWRlIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IGlmXG4gICAgICogdGhlIGNhY2hlIGlzIHN0b3JpbmcgYSBsYXJnZSBudW1iZXIgb2YgaXRlbXMuIEl0IGlzIGFsbW9zdCBhbHdheXMgYmVzdFxuICAgICAqIHRvIGp1c3QgbGVhdmUgdGhlIHN0YWxlIGl0ZW1zIGluIHRoZSBjYWNoZSwgYW5kIGxldCB0aGVtIGZhbGwgb3V0IGFzIG5ld1xuICAgICAqIGl0ZW1zIGFyZSBhZGRlZC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoYXQge0BsaW5rIE9wdGlvbnNCYXNlLmFsbG93U3RhbGV9IGlzIGEgYml0XG4gICAgICogcG9pbnRsZXNzLCBhcyBzdGFsZSBpdGVtcyB3aWxsIGJlIGRlbGV0ZWQgYWxtb3N0IGFzIHNvb24gYXMgdGhleVxuICAgICAqIGV4cGlyZS5cbiAgICAgKlxuICAgICAqIFVzZSB3aXRoIGNhdXRpb24hXG4gICAgICovXG4gICAgdHRsQXV0b3B1cmdlPzogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogV2hlbiB1c2luZyB0aW1lLWV4cGlyaW5nIGVudHJpZXMgd2l0aCBgdHRsYCwgc2V0dGluZyB0aGlzIHRvIGB0cnVlYCB3aWxsXG4gICAgICogbWFrZSBlYWNoIGl0ZW0ncyBhZ2UgcmVzZXQgdG8gMCB3aGVuZXZlciBpdCBpcyByZXRyaWV2ZWQgZnJvbSBjYWNoZSB3aXRoXG4gICAgICoge0BsaW5rIExSVUNhY2hlI2dldH0sIGNhdXNpbmcgaXQgdG8gbm90IGV4cGlyZS4gKEl0IGNhbiBzdGlsbCBmYWxsIG91dFxuICAgICAqIG9mIGNhY2hlIGJhc2VkIG9uIHJlY2VuY3kgb2YgdXNlLCBvZiBjb3Vyc2UuKVxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiB7QGxpbmsgT3B0aW9uc0Jhc2UudHRsfSBpcyBub3Qgc2V0LlxuICAgICAqXG4gICAgICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIGFuIG9wdGlvbnMgb2JqZWN0IHRvIGBjYWNoZS5nZXQoKWAuXG4gICAgICovXG4gICAgdXBkYXRlQWdlT25HZXQ/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHVzaW5nIHRpbWUtZXhwaXJpbmcgZW50cmllcyB3aXRoIGB0dGxgLCBzZXR0aW5nIHRoaXMgdG8gYHRydWVgIHdpbGxcbiAgICAgKiBtYWtlIGVhY2ggaXRlbSdzIGFnZSByZXNldCB0byAwIHdoZW5ldmVyIGl0cyBwcmVzZW5jZSBpbiB0aGUgY2FjaGUgaXNcbiAgICAgKiBjaGVja2VkIHdpdGgge0BsaW5rIExSVUNhY2hlI2hhc30sIGNhdXNpbmcgaXQgdG8gbm90IGV4cGlyZS4gKEl0IGNhblxuICAgICAqIHN0aWxsIGZhbGwgb3V0IG9mIGNhY2hlIGJhc2VkIG9uIHJlY2VuY3kgb2YgdXNlLCBvZiBjb3Vyc2UuKVxuICAgICAqXG4gICAgICogSGFzIG5vIGVmZmVjdCBpZiB7QGxpbmsgT3B0aW9uc0Jhc2UudHRsfSBpcyBub3Qgc2V0LlxuICAgICAqL1xuICAgIHVwZGF0ZUFnZU9uSGFzPzogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogQWxsb3cge0BsaW5rIExSVUNhY2hlI2dldH0gYW5kIHtAbGluayBMUlVDYWNoZSNmZXRjaH0gY2FsbHMgdG8gcmV0dXJuXG4gICAgICogc3RhbGUgZGF0YSwgaWYgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgaWYgeW91IHNldCBgdHRsYCwgc3RhbGUgaXRlbXMgd2lsbCBvbmx5IGJlIGRlbGV0ZWQgZnJvbSB0aGVcbiAgICAgKiBjYWNoZSB3aGVuIHlvdSBgZ2V0KGtleSlgLiBUaGF0IGlzLCBpdCdzIG5vdCBwcmVlbXB0aXZlbHkgcHJ1bmluZyBpdGVtcyxcbiAgICAgKiB1bmxlc3Mge0BsaW5rIE9wdGlvbnNCYXNlLnR0bEF1dG9wdXJnZX0gaXMgc2V0LlxuICAgICAqXG4gICAgICogSWYgeW91IHNldCBgYWxsb3dTdGFsZTp0cnVlYCwgaXQnbGwgcmV0dXJuIHRoZSBzdGFsZSB2YWx1ZSAqYXMgd2VsbCBhcypcbiAgICAgKiBkZWxldGluZyBpdC4gSWYgeW91IGRvbid0IHNldCB0aGlzLCB0aGVuIGl0J2xsIHJldHVybiBgdW5kZWZpbmVkYCB3aGVuXG4gICAgICogeW91IHRyeSB0byBnZXQgYSBzdGFsZSBlbnRyeS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB3aGVuIGEgc3RhbGUgZW50cnkgaXMgZmV0Y2hlZCwgX2V2ZW4gaWYgaXQgaXMgcmV0dXJuZWQgZHVlIHRvXG4gICAgICogYGFsbG93U3RhbGVgIGJlaW5nIHNldF8sIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgaW1tZWRpYXRlbHkuIFlvdVxuICAgICAqIGNhbiBzdXBwcmVzcyB0aGlzIGJlaGF2aW9yIGJ5IHNldHRpbmdcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2Uubm9EZWxldGVPblN0YWxlR2V0fSwgZWl0aGVyIGluIHRoZSBjb25zdHJ1Y3Rvciwgb3IgaW5cbiAgICAgKiB0aGUgb3B0aW9ucyBwcm92aWRlZCB0byB7QGxpbmsgTFJVQ2FjaGUjZ2V0fS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhbiBvcHRpb25zIG9iamVjdCB0byBgY2FjaGUuZ2V0KClgLlxuICAgICAqIFRoZSBgY2FjaGUuaGFzKClgIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gYGZhbHNlYCBmb3Igc3RhbGUgaXRlbXMuXG4gICAgICpcbiAgICAgKiBPbmx5IHJlbGV2YW50IGlmIGEgdHRsIGlzIHNldC5cbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlPzogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb24gaXRlbXMgd2hlbiB0aGV5IGFyZSBkcm9wcGVkIGZyb20gdGhlXG4gICAgICogY2FjaGUsIGFzIGBkaXNwb3NlKHZhbHVlLCBrZXksIHJlYXNvbilgLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgaGFuZHkgaWYgeW91IHdhbnQgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyBvciBkb1xuICAgICAqIG90aGVyIGNsZWFudXAgdGFza3Mgd2hlbiBpdGVtcyBhcmUgbm8gbG9uZ2VyIHN0b3JlZCBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKjogSXQgaXMgY2FsbGVkIF9iZWZvcmVfIHRoZSBpdGVtIGhhcyBiZWVuIGZ1bGx5IHJlbW92ZWRcbiAgICAgKiBmcm9tIHRoZSBjYWNoZSwgc28gaWYgeW91IHdhbnQgdG8gcHV0IGl0IHJpZ2h0IGJhY2sgaW4sIHlvdSBuZWVkXG4gICAgICogdG8gd2FpdCB1bnRpbCB0aGUgbmV4dCB0aWNrLiBJZiB5b3UgdHJ5IHRvIGFkZCBpdCBiYWNrIGluIGR1cmluZ1xuICAgICAqIHRoZSBgZGlzcG9zZSgpYCBmdW5jdGlvbiBjYWxsLCBpdCB3aWxsIGJyZWFrIHRoaW5ncyBpbiBzdWJ0bGUgYW5kXG4gICAgICogd2VpcmQgd2F5cy5cbiAgICAgKlxuICAgICAqIFVubGlrZSBzZXZlcmFsIG90aGVyIG9wdGlvbnMsIHRoaXMgbWF5IF9ub3RfIGJlIG92ZXJyaWRkZW4gYnlcbiAgICAgKiBwYXNzaW5nIGFuIG9wdGlvbiB0byBgc2V0KClgLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cbiAgICAgKlxuICAgICAqIFRoZSBgcmVhc29uYCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3MsIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB0byB0aGUgcmVhc29uIGZvciB0aGUgaXRlbSdzIGRlbGV0aW9uOlxuICAgICAqXG4gICAgICogLSBgZXZpY3RgIEl0ZW0gd2FzIGV2aWN0ZWQgdG8gbWFrZSBzcGFjZSBmb3IgYSBuZXcgYWRkaXRpb25cbiAgICAgKiAtIGBzZXRgIEl0ZW0gd2FzIG92ZXJ3cml0dGVuIGJ5IGEgbmV3IHZhbHVlXG4gICAgICogLSBgZXhwaXJlYCBJdGVtIGV4cGlyZWQgaXRzIFRUTFxuICAgICAqIC0gYGZldGNoYCBJdGVtIHdhcyBkZWxldGVkIGR1ZSB0byBhIGZhaWxlZCBvciBhYm9ydGVkIGZldGNoLCBvciBhXG4gICAgICogICBmZXRjaE1ldGhvZCByZXR1cm5pbmcgYHVuZGVmaW5lZC5cbiAgICAgKiAtIGBkZWxldGVgIEl0ZW0gd2FzIHJlbW92ZWQgYnkgZXhwbGljaXQgYGNhY2hlLmRlbGV0ZShrZXkpYCxcbiAgICAgKiAgIGBjYWNoZS5jbGVhcigpYCwgb3IgYGNhY2hlLnNldChrZXksIHVuZGVmaW5lZClgLlxuICAgICAqL1xuICAgIGRpc3Bvc2U/OiBEaXNwb3NlcjxLLCBWPlxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBuZXcgaXRlbXMgYXJlIGluc2VydGVkIGludG8gdGhlIGNhY2hlLFxuICAgICAqIGFzIGBvbkluc2VydCh2YWx1ZSwga2V5LCByZWFzb24pYC5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgbmVlZCB0byBwZXJmb3JtIGFjdGlvbnMgd2hlbiBhbiBpdGVtIGlzXG4gICAgICogYWRkZWQsIHN1Y2ggYXMgbG9nZ2luZyBvciB0cmFja2luZyBpbnNlcnRpb25zLlxuICAgICAqXG4gICAgICogVW5saWtlIHNvbWUgb3RoZXIgb3B0aW9ucywgdGhpcyBtYXkgX25vdF8gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nXG4gICAgICogYW4gb3B0aW9uIHRvIGBzZXQoKWAsIGZvciBwZXJmb3JtYW5jZSBhbmQgY29uc2lzdGVuY3kgcmVhc29ucy5cbiAgICAgKi9cbiAgICBvbkluc2VydD86IEluc2VydGVyPEssIFY+XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2FtZSBhcyB7QGxpbmsgT3B0aW9uc0Jhc2UuZGlzcG9zZX0sIGJ1dCBjYWxsZWQgKmFmdGVyKiB0aGUgZW50cnlcbiAgICAgKiBpcyBjb21wbGV0ZWx5IHJlbW92ZWQgYW5kIHRoZSBjYWNoZSBpcyBvbmNlIGFnYWluIGluIGEgY2xlYW4gc3RhdGUuXG4gICAgICpcbiAgICAgKiBJdCBpcyBzYWZlIHRvIGFkZCBhbiBpdGVtIHJpZ2h0IGJhY2sgaW50byB0aGUgY2FjaGUgYXQgdGhpcyBwb2ludC5cbiAgICAgKiBIb3dldmVyLCBub3RlIHRoYXQgaXQgaXMgKnZlcnkqIGVhc3kgdG8gaW5hZHZlcnRlbnRseSBjcmVhdGUgaW5maW5pdGVcbiAgICAgKiByZWN1cnNpb24gdGhpcyB3YXkuXG4gICAgICovXG4gICAgZGlzcG9zZUFmdGVyPzogRGlzcG9zZXI8SywgVj5cblxuICAgIC8qKlxuICAgICAqIFNldCB0byB0cnVlIHRvIHN1cHByZXNzIGNhbGxpbmcgdGhlXG4gICAgICoge0BsaW5rIE9wdGlvbnNCYXNlLmRpc3Bvc2V9IGZ1bmN0aW9uIGlmIHRoZSBlbnRyeSBrZXkgaXNcbiAgICAgKiBzdGlsbCBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgYW4gb3B0aW9ucyBvYmplY3QgdG9cbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUjc2V0fS5cbiAgICAgKlxuICAgICAqIE9ubHkgcmVsZXZhbnQgaWYgYGRpc3Bvc2VgIG9yIGBkaXNwb3NlQWZ0ZXJgIGFyZSBzZXQuXG4gICAgICovXG4gICAgbm9EaXNwb3NlT25TZXQ/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBCb29sZWFuIGZsYWcgdG8gdGVsbCB0aGUgY2FjaGUgdG8gbm90IHVwZGF0ZSB0aGUgVFRMIHdoZW4gc2V0dGluZyBhIG5ld1xuICAgICAqIHZhbHVlIGZvciBhbiBleGlzdGluZyBrZXkgKGllLCB3aGVuIHVwZGF0aW5nIGEgdmFsdWUgcmF0aGVyIHRoYW5cbiAgICAgKiBpbnNlcnRpbmcgYSBuZXcgdmFsdWUpLiAgTm90ZSB0aGF0IHRoZSBUVEwgdmFsdWUgaXMgX2Fsd2F5c18gc2V0IChpZlxuICAgICAqIHByb3ZpZGVkKSB3aGVuIGFkZGluZyBhIG5ldyBlbnRyeSBpbnRvIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgYSB7QGxpbmsgT3B0aW9uc0Jhc2UudHRsfSBpcyBub3Qgc2V0LlxuICAgICAqXG4gICAgICogTWF5IGJlIHBhc3NlZCBhcyBhbiBvcHRpb24gdG8ge0BsaW5rIExSVUNhY2hlI3NldH0uXG4gICAgICovXG4gICAgbm9VcGRhdGVUVEw/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIHRvIHRyYWNrIHRoZSBzaXplcyBvZiBpdGVtcyBhZGRlZCB0byB0aGVcbiAgICAgKiBjYWNoZSwgYW5kIGF1dG9tYXRpY2FsbHkgZXZpY3QgaXRlbXMgaW4gb3JkZXIgdG8gc3RheSBiZWxvdyB0aGlzIHNpemUuXG4gICAgICogTm90ZSB0aGF0IHRoaXMgbWF5IHJlc3VsdCBpbiBmZXdlciB0aGFuIGBtYXhgIGl0ZW1zIGJlaW5nIHN0b3JlZC5cbiAgICAgKlxuICAgICAqIEF0dGVtcHRpbmcgdG8gYWRkIGFuIGl0ZW0gdG8gdGhlIGNhY2hlIHdob3NlIGNhbGN1bGF0ZWQgc2l6ZSBpcyBncmVhdGVyXG4gICAgICogdGhhdCB0aGlzIGFtb3VudCB3aWxsIGJlIGEgbm8tb3AuIFRoZSBpdGVtIHdpbGwgbm90IGJlIGNhY2hlZCwgYW5kIG5vXG4gICAgICogb3RoZXIgaXRlbXMgd2lsbCBiZSBldmljdGVkLlxuICAgICAqXG4gICAgICogT3B0aW9uYWwsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogU2V0cyBgbWF4RW50cnlTaXplYCB0byB0aGUgc2FtZSB2YWx1ZSwgdW5sZXNzIGEgZGlmZmVyZW50IHZhbHVlIGlzXG4gICAgICogcHJvdmlkZWQgZm9yIGBtYXhFbnRyeVNpemVgLlxuICAgICAqXG4gICAgICogQXQgbGVhc3Qgb25lIG9mIGBtYXhgLCBgbWF4U2l6ZWAsIG9yIGBUVExgIGlzIHJlcXVpcmVkLiBUaGlzIG11c3QgYmUgYVxuICAgICAqIHBvc2l0aXZlIGludGVnZXIgaWYgc2V0LlxuICAgICAqXG4gICAgICogRXZlbiBpZiBzaXplIHRyYWNraW5nIGlzIGVuYWJsZWQsICoqaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gc2V0IGFcbiAgICAgKiBgbWF4YCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGggb2YgdGhlIGNhY2hlLioqXG4gICAgICpcbiAgICAgKiBOb3RlIGFsc28gdGhhdCBzaXplIHRyYWNraW5nIGNhbiBuZWdhdGl2ZWx5IGltcGFjdCBwZXJmb3JtYW5jZSxcbiAgICAgKiB0aG91Z2ggZm9yIG1vc3QgY2FzZXMsIG9ubHkgbWluaW1hbGx5LlxuICAgICAqL1xuICAgIG1heFNpemU/OiBTaXplXG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBhbGxvd2VkIHNpemUgZm9yIGFueSBzaW5nbGUgaXRlbSBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBJZiBhIGxhcmdlciBpdGVtIGlzIHBhc3NlZCB0byB7QGxpbmsgTFJVQ2FjaGUjc2V0fSBvciByZXR1cm5lZCBieSBhXG4gICAgICoge0BsaW5rIE9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSBvciB7QGxpbmsgT3B0aW9uc0Jhc2UubWVtb01ldGhvZH0sIHRoZW5cbiAgICAgKiBpdCB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQXR0ZW1wdGluZyB0byBhZGQgYW4gaXRlbSB3aG9zZSBjYWxjdWxhdGVkIHNpemUgaXMgZ3JlYXRlciB0aGFuXG4gICAgICogdGhpcyBhbW91bnQgd2lsbCBub3QgY2FjaGUgdGhlIGl0ZW0gb3IgZXZpY3QgYW55IG9sZCBpdGVtcywgYnV0XG4gICAgICogV0lMTCBkZWxldGUgYW4gZXhpc3RpbmcgdmFsdWUgaWYgb25lIGlzIGFscmVhZHkgcHJlc2VudC5cbiAgICAgKlxuICAgICAqIE9wdGlvbmFsLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBwcm92aWRlZC4gRGVmYXVsdHMgdG9cbiAgICAgKiB0aGUgdmFsdWUgb2YgYG1heFNpemVgIGlmIHByb3ZpZGVkLlxuICAgICAqL1xuICAgIG1heEVudHJ5U2l6ZT86IFNpemVcblxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbnVtYmVyIGluZGljYXRpbmcgdGhlIGl0ZW0ncyBzaXplLlxuICAgICAqXG4gICAgICogUmVxdWlyZXMge0BsaW5rIE9wdGlvbnNCYXNlLm1heFNpemV9IHRvIGJlIHNldC5cbiAgICAgKlxuICAgICAqIElmIG5vdCBwcm92aWRlZCwgYW5kIHtAbGluayBPcHRpb25zQmFzZS5tYXhTaXplfSBvclxuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5tYXhFbnRyeVNpemV9IGFyZSBzZXQsIHRoZW4gYWxsXG4gICAgICoge0BsaW5rIExSVUNhY2hlI3NldH0gY2FsbHMgKiptdXN0KiogcHJvdmlkZSBhbiBleHBsaWNpdFxuICAgICAqIHtAbGluayBTZXRPcHRpb25zLnNpemV9IG9yIHNpemVDYWxjdWxhdGlvbiBwYXJhbS5cbiAgICAgKi9cbiAgICBzaXplQ2FsY3VsYXRpb24/OiBTaXplQ2FsY3VsYXRvcjxLLCBWPlxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIHRoYXQgcHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgTFJVQ2FjaGUjZmV0Y2h9XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGZldGNoTWV0aG9kKGtleSwgc3RhbGVWYWx1ZSwgeyBzaWduYWwsIG9wdGlvbnMsIGNvbnRleHQgfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIElmIGBmZXRjaE1ldGhvZGAgaXMgbm90IHByb3ZpZGVkLCB0aGVuIGBjYWNoZS5mZXRjaChrZXkpYCBpcyBlcXVpdmFsZW50XG4gICAgICogdG8gYFByb21pc2UucmVzb2x2ZShjYWNoZS5nZXQoa2V5KSlgLlxuICAgICAqXG4gICAgICogSWYgYXQgYW55IHRpbWUsIGBzaWduYWwuYWJvcnRlZGAgaXMgc2V0IHRvIGB0cnVlYCwgb3IgaWYgdGhlXG4gICAgICogYHNpZ25hbC5vbmFib3J0YCBtZXRob2QgaXMgY2FsbGVkLCBvciBpZiBpdCBlbWl0cyBhbiBgJ2Fib3J0J2AgZXZlbnRcbiAgICAgKiB3aGljaCB5b3UgY2FuIGxpc3RlbiB0byB3aXRoIGBhZGRFdmVudExpc3RlbmVyYCwgdGhlbiB0aGF0IG1lYW5zIHRoYXRcbiAgICAgKiB0aGUgZmV0Y2ggc2hvdWxkIGJlIGFiYW5kb25lZC4gVGhpcyBtYXkgYmUgcGFzc2VkIGFsb25nIHRvIGFzeW5jXG4gICAgICogZnVuY3Rpb25zIGF3YXJlIG9mIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBiZWhhdmlvci5cbiAgICAgKlxuICAgICAqIFRoZSBgZmV0Y2hNZXRob2RgIHNob3VsZCAqKm9ubHkqKiByZXR1cm4gYHVuZGVmaW5lZGAgb3IgYSBQcm9taXNlXG4gICAgICogcmVzb2x2aW5nIHRvIGB1bmRlZmluZWRgIGlmIHRoZSBBYm9ydENvbnRyb2xsZXIgc2lnbmFsZWQgYW4gYGFib3J0YFxuICAgICAqIGV2ZW50LiBJbiBhbGwgb3RoZXIgY2FzZXMsIGl0IHNob3VsZCByZXR1cm4gb3IgcmVzb2x2ZSB0byBhIHZhbHVlXG4gICAgICogc3VpdGFibGUgZm9yIGFkZGluZyB0byB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBUaGUgYG9wdGlvbnNgIG9iamVjdCBpcyBhIHVuaW9uIG9mIHRoZSBvcHRpb25zIHRoYXQgbWF5IGJlIHByb3ZpZGVkIHRvXG4gICAgICogYHNldCgpYCBhbmQgYGdldCgpYC4gSWYgdGhleSBhcmUgbW9kaWZpZWQsIHRoZW4gdGhhdCB3aWxsIHJlc3VsdCBpblxuICAgICAqIG1vZGlmeWluZyB0aGUgc2V0dGluZ3MgdG8gYGNhY2hlLnNldCgpYCB3aGVuIHRoZSB2YWx1ZSBpcyByZXNvbHZlZCwgYW5kXG4gICAgICogaW4gdGhlIGNhc2Ugb2ZcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2Uubm9EZWxldGVPbkZldGNoUmVqZWN0aW9ufSBhbmRcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb259LCB0aGUgaGFuZGxpbmcgb2ZcbiAgICAgKiBgZmV0Y2hNZXRob2RgIGZhaWx1cmVzLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIGEgRE5TIGNhY2hlIG1heSB1cGRhdGUgdGhlIFRUTCBiYXNlZCBvbiB0aGUgdmFsdWUgcmV0dXJuZWRcbiAgICAgKiBmcm9tIGEgcmVtb3RlIEROUyBzZXJ2ZXIgYnkgY2hhbmdpbmcgYG9wdGlvbnMudHRsYCBpbiB0aGUgYGZldGNoTWV0aG9kYC5cbiAgICAgKi9cbiAgICBmZXRjaE1ldGhvZD86IEZldGNoZXI8SywgViwgRkM+XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdGhhdCBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBMUlVDYWNoZSNtZW1vfVxuICAgICAqL1xuICAgIG1lbW9NZXRob2Q/OiBNZW1vaXplcjxLLCBWLCBGQz5cblxuICAgIC8qKlxuICAgICAqIFNldCB0byB0cnVlIHRvIHN1cHByZXNzIHRoZSBkZWxldGlvbiBvZiBzdGFsZSBkYXRhIHdoZW4gYVxuICAgICAqIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gcmV0dXJucyBhIHJlamVjdGVkIHByb21pc2UuXG4gICAgICovXG4gICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uPzogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogRG8gbm90IGRlbGV0ZSBzdGFsZSBpdGVtcyB3aGVuIHRoZXkgYXJlIHJldHJpZXZlZCB3aXRoXG4gICAgICoge0BsaW5rIExSVUNhY2hlI2dldH0uXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlIGBnZXRgIHJldHVybiB2YWx1ZSB3aWxsIHN0aWxsIGJlIGB1bmRlZmluZWRgXG4gICAgICogdW5sZXNzIHtAbGluayBPcHRpb25zQmFzZS5hbGxvd1N0YWxlfSBpcyB0cnVlLlxuICAgICAqXG4gICAgICogV2hlbiB1c2luZyB0aW1lLWV4cGlyaW5nIGVudHJpZXMgd2l0aCBgdHRsYCwgYnkgZGVmYXVsdCBzdGFsZVxuICAgICAqIGl0ZW1zIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSB3aGVuIHRoZSBrZXkgaXMgYWNjZXNzZWRcbiAgICAgKiB3aXRoIGBjYWNoZS5nZXQoKWAuXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHRoaXMgb3B0aW9uIHdpbGwgY2F1c2Ugc3RhbGUgaXRlbXMgdG8gcmVtYWluIGluIHRoZSBjYWNoZSwgdW50aWxcbiAgICAgKiB0aGV5IGFyZSBleHBsaWNpdGx5IGRlbGV0ZWQgd2l0aCBgY2FjaGUuZGVsZXRlKGtleSlgLCBvciByZXRyaWV2ZWQgd2l0aFxuICAgICAqIGBub0RlbGV0ZU9uU3RhbGVHZXRgIHNldCB0byBgZmFsc2VgLlxuICAgICAqXG4gICAgICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIGFuIG9wdGlvbnMgb2JqZWN0IHRvIGBjYWNoZS5nZXQoKWAuXG4gICAgICpcbiAgICAgKiBPbmx5IHJlbGV2YW50IGlmIGEgdHRsIGlzIHVzZWQuXG4gICAgICovXG4gICAgbm9EZWxldGVPblN0YWxlR2V0PzogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIHRydWUgdG8gYWxsb3cgcmV0dXJuaW5nIHN0YWxlIGRhdGEgd2hlbiBhXG4gICAgICoge0BsaW5rIE9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSB0aHJvd3MgYW4gZXJyb3Igb3IgcmV0dXJucyBhIHJlamVjdGVkXG4gICAgICogcHJvbWlzZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHVzaW5nIHtAbGluayBPcHRpb25zQmFzZS5hbGxvd1N0YWxlfSBpbiB0aGF0IHN0YWxlXG4gICAgICogZGF0YSB3aWxsIE9OTFkgYmUgcmV0dXJuZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUge0BsaW5rIExSVUNhY2hlI2ZldGNofVxuICAgICAqIGZhaWxzLCBub3QgYW55IG90aGVyIHRpbWVzLlxuICAgICAqXG4gICAgICogSWYgYSBgZmV0Y2hNZXRob2RgIGZhaWxzLCBhbmQgdGhlcmUgaXMgbm8gc3RhbGUgdmFsdWUgYXZhaWxhYmxlLCB0aGVcbiAgICAgKiBgZmV0Y2goKWAgd2lsbCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBJZSwgYWxsIGBmZXRjaE1ldGhvZGAgZXJyb3JzIGFyZVxuICAgICAqIHN1cHByZXNzZWQuXG4gICAgICpcbiAgICAgKiBJbXBsaWVzIGBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb25gLlxuICAgICAqXG4gICAgICogVGhpcyBtYXkgYmUgc2V0IGluIGNhbGxzIHRvIGBmZXRjaCgpYCwgb3IgZGVmYXVsdGVkIG9uIHRoZSBjb25zdHJ1Y3RvcixcbiAgICAgKiBvciBvdmVycmlkZGVuIGJ5IG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW4gdGhlIGBmZXRjaE1ldGhvZGAuXG4gICAgICovXG4gICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gdHJ1ZSB0byByZXR1cm4gYSBzdGFsZSB2YWx1ZSBmcm9tIHRoZSBjYWNoZSB3aGVuIHRoZVxuICAgICAqIGBBYm9ydFNpZ25hbGAgcGFzc2VkIHRvIHRoZSB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IGRpc3BhdGNoZXNcbiAgICAgKiBhbiBgJ2Fib3J0J2AgZXZlbnQsIHdoZXRoZXIgdXNlci10cmlnZ2VyZWQsIG9yIGR1ZSB0byBpbnRlcm5hbCBjYWNoZVxuICAgICAqIGJlaGF2aW9yLlxuICAgICAqXG4gICAgICogVW5sZXNzIHtAbGluayBPcHRpb25zQmFzZS5pZ25vcmVGZXRjaEFib3J0fSBpcyBhbHNvIHNldCwgdGhlIHVuZGVybHlpbmdcbiAgICAgKiB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IHdpbGwgc3RpbGwgYmUgY29uc2lkZXJlZCBjYW5jZWxlZCwgYW5kXG4gICAgICogYW55IHZhbHVlIGl0IHJldHVybnMgd2lsbCBiZSBpZ25vcmVkIGFuZCBub3QgY2FjaGVkLlxuICAgICAqXG4gICAgICogQ2F2ZWF0OiBzaW5jZSBmZXRjaGVzIGFyZSBhYm9ydGVkIHdoZW4gYSBuZXcgdmFsdWUgaXMgZXhwbGljaXRseVxuICAgICAqIHNldCBpbiB0aGUgY2FjaGUsIHRoaXMgY2FuIGxlYWQgdG8gZmV0Y2ggcmV0dXJuaW5nIGEgc3RhbGUgdmFsdWUsXG4gICAgICogc2luY2UgdGhhdCB3YXMgdGhlIGZhbGxiYWNrIHZhbHVlIF9hdCB0aGUgbW9tZW50IHRoZSBgZmV0Y2goKWAgd2FzXG4gICAgICogaW5pdGlhdGVkXywgZXZlbiB0aG91Z2ggdGhlIG5ldyB1cGRhdGVkIHZhbHVlIGlzIG5vdyBwcmVzZW50IGluXG4gICAgICogdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGNhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgYW55Pih7XG4gICAgICogICB0dGw6IDEwMCxcbiAgICAgKiAgIGZldGNoTWV0aG9kOiBhc3luYyAodXJsLCBvbGRWYWx1ZSwgeyBzaWduYWwgfSkgPT4gIHtcbiAgICAgKiAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KVxuICAgICAqICAgICByZXR1cm4gYXdhaXQgcmVzLmpzb24oKVxuICAgICAqICAgfVxuICAgICAqIH0pXG4gICAgICogY2FjaGUuc2V0KCdodHRwczovL2V4YW1wbGUuY29tLycsIHsgc29tZTogJ2RhdGEnIH0pXG4gICAgICogLy8gMTAwbXMgZ28gYnkuLi5cbiAgICAgKiBjb25zdCByZXN1bHQgPSBjYWNoZS5mZXRjaCgnaHR0cHM6Ly9leGFtcGxlLmNvbS8nKVxuICAgICAqIGNhY2hlLnNldCgnaHR0cHM6Ly9leGFtcGxlLmNvbS8nLCB7IG90aGVyOiAndGhpbmcnIH0pXG4gICAgICogY29uc29sZS5sb2coYXdhaXQgcmVzdWx0KSAvLyB7IHNvbWU6ICdkYXRhJyB9XG4gICAgICogY29uc29sZS5sb2coY2FjaGUuZ2V0KCdodHRwczovL2V4YW1wbGUuY29tLycpKSAvLyB7IG90aGVyOiAndGhpbmcnIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0PzogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIHRydWUgdG8gaWdub3JlIHRoZSBgYWJvcnRgIGV2ZW50IGVtaXR0ZWQgYnkgdGhlIGBBYm9ydFNpZ25hbGBcbiAgICAgKiBvYmplY3QgcGFzc2VkIHRvIHtAbGluayBPcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0sIGFuZCBzdGlsbCBjYWNoZSB0aGVcbiAgICAgKiByZXN1bHRpbmcgcmVzb2x1dGlvbiB2YWx1ZSwgYXMgbG9uZyBhcyBpdCBpcyBub3QgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBXaGVuIHVzZWQgb24gaXRzIG93biwgdGhpcyBtZWFucyBhYm9ydGVkIHtAbGluayBMUlVDYWNoZSNmZXRjaH0gY2FsbHNcbiAgICAgKiBhcmUgbm90IGltbWVkaWF0ZWx5IHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gdGhleSBhcmUgYWJvcnRlZCwgYW5kXG4gICAgICogaW5zdGVhZCB0YWtlIHRoZSBmdWxsIHRpbWUgdG8gYXdhaXQuXG4gICAgICpcbiAgICAgKiBXaGVuIHVzZWQgd2l0aCB7QGxpbmsgT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydH0sIGFib3J0ZWRcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUjZmV0Y2h9IGNhbGxzIHdpbGwgcmVzb2x2ZSBpbW1lZGlhdGVseSB0byB0aGVpciBzdGFsZVxuICAgICAqIGNhY2hlZCB2YWx1ZSBvciBgdW5kZWZpbmVkYCwgYW5kIHdpbGwgY29udGludWUgdG8gcHJvY2VzcyBhbmQgZXZlbnR1YWxseVxuICAgICAqIHVwZGF0ZSB0aGUgY2FjaGUgd2hlbiB0aGV5IHJlc29sdmUsIGFzIGxvbmcgYXMgdGhlIHJlc3VsdGluZyB2YWx1ZSBpc1xuICAgICAqIG5vdCBgdW5kZWZpbmVkYCwgdGh1cyBzdXBwb3J0aW5nIGEgXCJyZXR1cm4gc3RhbGUgb24gdGltZW91dCB3aGlsZVxuICAgICAqIHJlZnJlc2hpbmdcIiBtZWNoYW5pc20gYnkgcGFzc2luZyBgQWJvcnRTaWduYWwudGltZW91dChuKWAgYXMgdGhlIHNpZ25hbC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBjID0gbmV3IExSVUNhY2hlKHtcbiAgICAgKiAgIHR0bDogMTAwLFxuICAgICAqICAgaWdub3JlRmV0Y2hBYm9ydDogdHJ1ZSxcbiAgICAgKiAgIGFsbG93U3RhbGVPbkZldGNoQWJvcnQ6IHRydWUsXG4gICAgICogICBmZXRjaE1ldGhvZDogYXN5bmMgKGtleSwgb2xkVmFsdWUsIHsgc2lnbmFsIH0pID0+IHtcbiAgICAgKiAgICAgLy8gbm90ZTogZG8gTk9UIHBhc3MgdGhlIHNpZ25hbCB0byBmZXRjaCgpIVxuICAgICAqICAgICAvLyBsZXQncyBzYXkgdGhpcyBmZXRjaCBjYW4gdGFrZSBhIGxvbmcgdGltZS5cbiAgICAgKiAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vc2xvdy1iYWNrZW5kLXNlcnZlci8ke2tleX1gKVxuICAgICAqICAgICByZXR1cm4gYXdhaXQgcmVzLmpzb24oKVxuICAgICAqICAgfSxcbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogLy8gdGhpcyB3aWxsIHJldHVybiB0aGUgc3RhbGUgdmFsdWUgYWZ0ZXIgMTAwbXMsIHdoaWxlIHN0aWxsXG4gICAgICogLy8gdXBkYXRpbmcgaW4gdGhlIGJhY2tncm91bmQgZm9yIG5leHQgdGltZS5cbiAgICAgKiBjb25zdCB2YWwgPSBhd2FpdCBjLmZldGNoKCdrZXknLCB7IHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMDApIH0pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiAqKk5vdGUqKjogcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcsIGFuIGBhYm9ydGAgZXZlbnQgX2lzIHN0aWxsXG4gICAgICogZW1pdHRlZCBvbiB0aGUgYEFib3J0U2lnbmFsYCBvYmplY3RfLCBzbyBtYXkgcmVzdWx0IGluIGludmFsaWQgcmVzdWx0c1xuICAgICAqIHdoZW4gcGFzc2VkIHRvIG90aGVyIHVuZGVybHlpbmcgQVBJcyB0aGF0IHVzZSBBYm9ydFNpZ25hbHMuXG4gICAgICpcbiAgICAgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGluIHRoZSB7QGxpbmsgT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IG9yIHRoZVxuICAgICAqIGNhbGwgdG8ge0BsaW5rIExSVUNhY2hlI2ZldGNofS5cbiAgICAgKi9cbiAgICBpZ25vcmVGZXRjaEFib3J0PzogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogSW4gc29tZSBjYXNlcywgeW91IG1heSB3YW50IHRvIHN3YXAgb3V0IHRoZSBwZXJmb3JtYW5jZS9EYXRlIG9iamVjdFxuICAgICAqIHVzZWQgZm9yIFRUTCB0cmFja2luZy4gVGhpcyBzaG91bGQgYWxtb3N0IGNlcnRhaW5seSBOT1QgYmUgZG9uZSBpblxuICAgICAqIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIVxuICAgICAqXG4gICAgICogVGhpcyB2YWx1ZSBkZWZhdWx0cyB0byBgZ2xvYmFsLnBlcmZvcm1hbmNlYCBpZiBpdCBoYXMgYSBgbm93KClgIG1ldGhvZCxcbiAgICAgKiBvciB0aGUgYGdsb2JhbC5EYXRlYCBvYmplY3Qgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHBlcmY/OiBQZXJmXG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIE9wdGlvbnNNYXhMaW1pdDxLLCBWLCBGQz5cbiAgICBleHRlbmRzIE9wdGlvbnNCYXNlPEssIFYsIEZDPiB7XG4gICAgbWF4OiBDb3VudFxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uc1RUTExpbWl0PEssIFYsIEZDPlxuICAgIGV4dGVuZHMgT3B0aW9uc0Jhc2U8SywgViwgRkM+IHtcbiAgICB0dGw6IE1pbGxpc2Vjb25kc1xuICAgIHR0bEF1dG9wdXJnZTogYm9vbGVhblxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uc1NpemVMaW1pdDxLLCBWLCBGQz5cbiAgICBleHRlbmRzIE9wdGlvbnNCYXNlPEssIFYsIEZDPiB7XG4gICAgbWF4U2l6ZTogU2l6ZVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWxpZCBzYWZlIG9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgTFJVQ2FjaGV9IGNvbnN0cnVjdG9yXG4gICAqL1xuICBleHBvcnQgdHlwZSBPcHRpb25zPEssIFYsIEZDPiA9XG4gICAgfCBPcHRpb25zTWF4TGltaXQ8SywgViwgRkM+XG4gICAgfCBPcHRpb25zU2l6ZUxpbWl0PEssIFYsIEZDPlxuICAgIHwgT3B0aW9uc1RUTExpbWl0PEssIFYsIEZDPlxuXG4gIC8qKlxuICAgKiBFbnRyeSBvYmplY3RzIHVzZWQgYnkge0BsaW5rIExSVUNhY2hlI2xvYWR9IGFuZCB7QGxpbmsgTFJVQ2FjaGUjZHVtcH0sXG4gICAqIGFuZCByZXR1cm5lZCBieSB7QGxpbmsgTFJVQ2FjaGUjaW5mb30uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEVudHJ5PFY+IHtcbiAgICB2YWx1ZTogVlxuICAgIHR0bD86IE1pbGxpc2Vjb25kc1xuICAgIHNpemU/OiBTaXplXG4gICAgc3RhcnQ/OiBNaWxsaXNlY29uZHNcbiAgfVxufVxuXG4vKipcbiAqIERlZmF1bHQgZXhwb3J0LCB0aGUgdGhpbmcgeW91J3JlIHVzaW5nIHRoaXMgbW9kdWxlIHRvIGdldC5cbiAqXG4gKiBUaGUgYEtgIGFuZCBgVmAgdHlwZXMgZGVmaW5lIHRoZSBrZXkgYW5kIHZhbHVlIHR5cGVzLCByZXNwZWN0aXZlbHkuIFRoZVxuICogb3B0aW9uYWwgYEZDYCB0eXBlIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIGBjb250ZXh0YCBvYmplY3QgcGFzc2VkIHRvXG4gKiBgY2FjaGUuZmV0Y2goKWAgYW5kIGBjYWNoZS5tZW1vKClgLlxuICpcbiAqIEtleXMgYW5kIHZhbHVlcyAqKm11c3Qgbm90KiogYmUgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIG9wdGlvbnMgb2JqZWN0ICh3aXRoIHRoZSBleGNlcHRpb24gb2YgYG1heGAsXG4gKiBgbWF4U2l6ZWAsIGBmZXRjaE1ldGhvZGAsIGBtZW1vTWV0aG9kYCwgYGRpc3Bvc2VgIGFuZCBgZGlzcG9zZUFmdGVyYCkgYXJlXG4gKiBhZGRlZCBhcyBub3JtYWwgcHVibGljIG1lbWJlcnMuIChUaGUgbGlzdGVkIG9wdGlvbnMgYXJlIHJlYWQtb25seSBnZXR0ZXJzLilcbiAqXG4gKiBDaGFuZ2luZyBhbnkgb2YgdGhlc2Ugd2lsbCBhbHRlciB0aGUgZGVmYXVsdHMgZm9yIHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxzLlxuICovXG5leHBvcnQgY2xhc3MgTFJVQ2FjaGU8SyBleHRlbmRzIHt9LCBWIGV4dGVuZHMge30sIEZDID0gdW5rbm93bj4ge1xuICAvLyBvcHRpb25zIHRoYXQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dCBkaXNhc3RlclxuICByZWFkb25seSAjbWF4OiBMUlVDYWNoZS5Db3VudFxuICByZWFkb25seSAjbWF4U2l6ZTogTFJVQ2FjaGUuU2l6ZVxuICByZWFkb25seSAjZGlzcG9zZT86IExSVUNhY2hlLkRpc3Bvc2VyPEssIFY+XG4gIHJlYWRvbmx5ICNvbkluc2VydD86IExSVUNhY2hlLkluc2VydGVyPEssIFY+XG4gIHJlYWRvbmx5ICNkaXNwb3NlQWZ0ZXI/OiBMUlVDYWNoZS5EaXNwb3NlcjxLLCBWPlxuICByZWFkb25seSAjZmV0Y2hNZXRob2Q/OiBMUlVDYWNoZS5GZXRjaGVyPEssIFYsIEZDPlxuICByZWFkb25seSAjbWVtb01ldGhvZD86IExSVUNhY2hlLk1lbW9pemVyPEssIFYsIEZDPlxuICByZWFkb25seSAjcGVyZjogUGVyZlxuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UucGVyZn1cbiAgICovXG4gIGdldCBwZXJmKCkge1xuICAgIHJldHVybiB0aGlzLiNwZXJmXG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnR0bH1cbiAgICovXG4gIHR0bDogTFJVQ2FjaGUuTWlsbGlzZWNvbmRzXG5cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGxSZXNvbHV0aW9ufVxuICAgKi9cbiAgdHRsUmVzb2x1dGlvbjogTFJVQ2FjaGUuTWlsbGlzZWNvbmRzXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudHRsQXV0b3B1cmdlfVxuICAgKi9cbiAgdHRsQXV0b3B1cmdlOiBib29sZWFuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25HZXR9XG4gICAqL1xuICB1cGRhdGVBZ2VPbkdldDogYm9vbGVhblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uSGFzfVxuICAgKi9cbiAgdXBkYXRlQWdlT25IYXM6IGJvb2xlYW5cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfVxuICAgKi9cbiAgYWxsb3dTdGFsZTogYm9vbGVhblxuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9EaXNwb3NlT25TZXR9XG4gICAqL1xuICBub0Rpc3Bvc2VPblNldDogYm9vbGVhblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vVXBkYXRlVFRMfVxuICAgKi9cbiAgbm9VcGRhdGVUVEw6IGJvb2xlYW5cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tYXhFbnRyeVNpemV9XG4gICAqL1xuICBtYXhFbnRyeVNpemU6IExSVUNhY2hlLlNpemVcbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5zaXplQ2FsY3VsYXRpb259XG4gICAqL1xuICBzaXplQ2FsY3VsYXRpb24/OiBMUlVDYWNoZS5TaXplQ2FsY3VsYXRvcjxLLCBWPlxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbn1cbiAgICovXG4gIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjogYm9vbGVhblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGVsZXRlT25TdGFsZUdldH1cbiAgICovXG4gIG5vRGVsZXRlT25TdGFsZUdldDogYm9vbGVhblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGVPbkZldGNoQWJvcnR9XG4gICAqL1xuICBhbGxvd1N0YWxlT25GZXRjaEFib3J0OiBib29sZWFuXG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb259XG4gICAqL1xuICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbjogYm9vbGVhblxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmlnbm9yZUZldGNoQWJvcnR9XG4gICAqL1xuICBpZ25vcmVGZXRjaEFib3J0OiBib29sZWFuXG5cbiAgLy8gY29tcHV0ZWQgcHJvcGVydGllc1xuICAjc2l6ZTogTFJVQ2FjaGUuQ291bnRcbiAgI2NhbGN1bGF0ZWRTaXplOiBMUlVDYWNoZS5TaXplXG4gICNrZXlNYXA6IE1hcDxLLCBJbmRleD5cbiAgI2tleUxpc3Q6IChLIHwgdW5kZWZpbmVkKVtdXG4gICN2YWxMaXN0OiAoViB8IEJhY2tncm91bmRGZXRjaDxWPiB8IHVuZGVmaW5lZClbXVxuICAjbmV4dDogTnVtYmVyQXJyYXlcbiAgI3ByZXY6IE51bWJlckFycmF5XG4gICNoZWFkOiBJbmRleFxuICAjdGFpbDogSW5kZXhcbiAgI2ZyZWU6IFN0YWNrTGlrZVxuICAjZGlzcG9zZWQ/OiBEaXNwb3NlVGFzazxLLCBWPltdXG4gICNzaXplcz86IFplcm9BcnJheVxuICAjc3RhcnRzPzogWmVyb0FycmF5XG4gICN0dGxzPzogWmVyb0FycmF5XG4gICNhdXRvcHVyZ2VUaW1lcnM/OiAodW5kZWZpbmVkIHwgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4pW11cblxuICAjaGFzRGlzcG9zZTogYm9vbGVhblxuICAjaGFzRmV0Y2hNZXRob2Q6IGJvb2xlYW5cbiAgI2hhc0Rpc3Bvc2VBZnRlcjogYm9vbGVhblxuICAjaGFzT25JbnNlcnQ6IGJvb2xlYW5cblxuICAvKipcbiAgICogRG8gbm90IGNhbGwgdGhpcyBtZXRob2QgdW5sZXNzIHlvdSBuZWVkIHRvIGluc3BlY3QgdGhlXG4gICAqIGlubmVyIHdvcmtpbmdzIG9mIHRoZSBjYWNoZS4gIElmIGFueXRoaW5nIHJldHVybmVkIGJ5IHRoaXNcbiAgICogb2JqZWN0IGlzIG1vZGlmaWVkIGluIGFueSB3YXksIHN0cmFuZ2UgYnJlYWthZ2UgbWF5IG9jY3VyLlxuICAgKlxuICAgKiBUaGVzZSBmaWVsZHMgYXJlIHByaXZhdGUgZm9yIGEgcmVhc29uIVxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyB1bnNhZmVFeHBvc2VJbnRlcm5hbHM8XG4gICAgSyBleHRlbmRzIHt9LFxuICAgIFYgZXh0ZW5kcyB7fSxcbiAgICBGQyBleHRlbmRzIHVua25vd24gPSB1bmtub3duLFxuICA+KGM6IExSVUNhY2hlPEssIFYsIEZDPikge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBwcm9wZXJ0aWVzXG4gICAgICBzdGFydHM6IGMuI3N0YXJ0cyxcbiAgICAgIHR0bHM6IGMuI3R0bHMsXG4gICAgICBhdXRvcHVyZ2VUaW1lcnM6IGMuI2F1dG9wdXJnZVRpbWVycyxcbiAgICAgIHNpemVzOiBjLiNzaXplcyxcbiAgICAgIGtleU1hcDogYy4ja2V5TWFwIGFzIE1hcDxLLCBudW1iZXI+LFxuICAgICAga2V5TGlzdDogYy4ja2V5TGlzdCxcbiAgICAgIHZhbExpc3Q6IGMuI3ZhbExpc3QsXG4gICAgICBuZXh0OiBjLiNuZXh0LFxuICAgICAgcHJldjogYy4jcHJldixcbiAgICAgIGdldCBoZWFkKCkge1xuICAgICAgICByZXR1cm4gYy4jaGVhZFxuICAgICAgfSxcbiAgICAgIGdldCB0YWlsKCkge1xuICAgICAgICByZXR1cm4gYy4jdGFpbFxuICAgICAgfSxcbiAgICAgIGZyZWU6IGMuI2ZyZWUsXG4gICAgICAvLyBtZXRob2RzXG4gICAgICBpc0JhY2tncm91bmRGZXRjaDogKHA6IGFueSkgPT4gYy4jaXNCYWNrZ3JvdW5kRmV0Y2gocCksXG4gICAgICBiYWNrZ3JvdW5kRmV0Y2g6IChcbiAgICAgICAgazogSyxcbiAgICAgICAgaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgb3B0aW9uczogTFJVQ2FjaGUuRmV0Y2hPcHRpb25zPEssIFYsIEZDPixcbiAgICAgICAgY29udGV4dDogYW55LFxuICAgICAgKTogQmFja2dyb3VuZEZldGNoPFY+ID0+XG4gICAgICAgIGMuI2JhY2tncm91bmRGZXRjaChcbiAgICAgICAgICBrLFxuICAgICAgICAgIGluZGV4IGFzIEluZGV4IHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKSxcbiAgICAgIG1vdmVUb1RhaWw6IChpbmRleDogbnVtYmVyKTogdm9pZCA9PiBjLiNtb3ZlVG9UYWlsKGluZGV4IGFzIEluZGV4KSxcbiAgICAgIGluZGV4ZXM6IChvcHRpb25zPzogeyBhbGxvd1N0YWxlOiBib29sZWFuIH0pID0+IGMuI2luZGV4ZXMob3B0aW9ucyksXG4gICAgICByaW5kZXhlczogKG9wdGlvbnM/OiB7IGFsbG93U3RhbGU6IGJvb2xlYW4gfSkgPT5cbiAgICAgICAgYy4jcmluZGV4ZXMob3B0aW9ucyksXG4gICAgICBpc1N0YWxlOiAoaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gYy4jaXNTdGFsZShpbmRleCBhcyBJbmRleCksXG4gICAgfVxuICB9XG5cbiAgLy8gUHJvdGVjdGVkIHJlYWQtb25seSBtZW1iZXJzXG5cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tYXh9IChyZWFkLW9ubHkpXG4gICAqL1xuICBnZXQgbWF4KCk6IExSVUNhY2hlLkNvdW50IHtcbiAgICByZXR1cm4gdGhpcy4jbWF4XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tYXhTaXplfSAocmVhZC1vbmx5KVxuICAgKi9cbiAgZ2V0IG1heFNpemUoKTogTFJVQ2FjaGUuQ291bnQge1xuICAgIHJldHVybiB0aGlzLiNtYXhTaXplXG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBjb21wdXRlZCBzaXplIG9mIGl0ZW1zIGluIHRoZSBjYWNoZSAocmVhZC1vbmx5KVxuICAgKi9cbiAgZ2V0IGNhbGN1bGF0ZWRTaXplKCk6IExSVUNhY2hlLlNpemUge1xuICAgIHJldHVybiB0aGlzLiNjYWxjdWxhdGVkU2l6ZVxuICB9XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHN0b3JlZCBpbiB0aGUgY2FjaGUgKHJlYWQtb25seSlcbiAgICovXG4gIGdldCBzaXplKCk6IExSVUNhY2hlLkNvdW50IHtcbiAgICByZXR1cm4gdGhpcy4jc2l6ZVxuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IChyZWFkLW9ubHkpXG4gICAqL1xuICBnZXQgZmV0Y2hNZXRob2QoKTogTFJVQ2FjaGUuRmV0Y2hlcjxLLCBWLCBGQz4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNmZXRjaE1ldGhvZFxuICB9XG4gIGdldCBtZW1vTWV0aG9kKCk6IExSVUNhY2hlLk1lbW9pemVyPEssIFYsIEZDPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21lbW9NZXRob2RcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmRpc3Bvc2V9IChyZWFkLW9ubHkpXG4gICAqL1xuICBnZXQgZGlzcG9zZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZGlzcG9zZVxuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uub25JbnNlcnR9IChyZWFkLW9ubHkpXG4gICAqL1xuICBnZXQgb25JbnNlcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI29uSW5zZXJ0XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5kaXNwb3NlQWZ0ZXJ9IChyZWFkLW9ubHkpXG4gICAqL1xuICBnZXQgZGlzcG9zZUFmdGVyKCkge1xuICAgIHJldHVybiB0aGlzLiNkaXNwb3NlQWZ0ZXJcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IExSVUNhY2hlLk9wdGlvbnM8SywgViwgRkM+IHwgTFJVQ2FjaGU8SywgViwgRkM+KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWF4ID0gMCxcbiAgICAgIHR0bCxcbiAgICAgIHR0bFJlc29sdXRpb24gPSAxLFxuICAgICAgdHRsQXV0b3B1cmdlLFxuICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICB1cGRhdGVBZ2VPbkhhcyxcbiAgICAgIGFsbG93U3RhbGUsXG4gICAgICBkaXNwb3NlLFxuICAgICAgb25JbnNlcnQsXG4gICAgICBkaXNwb3NlQWZ0ZXIsXG4gICAgICBub0Rpc3Bvc2VPblNldCxcbiAgICAgIG5vVXBkYXRlVFRMLFxuICAgICAgbWF4U2l6ZSA9IDAsXG4gICAgICBtYXhFbnRyeVNpemUgPSAwLFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uLFxuICAgICAgZmV0Y2hNZXRob2QsXG4gICAgICBtZW1vTWV0aG9kLFxuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICAgIHBlcmYsXG4gICAgfSA9IG9wdGlvbnNcblxuICAgIGlmIChwZXJmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgcGVyZj8ubm93ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ3BlcmYgb3B0aW9uIG11c3QgaGF2ZSBhIG5vdygpIG1ldGhvZCBpZiBzcGVjaWZpZWQnLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy4jcGVyZiA9IHBlcmYgPz8gZGVmYXVsdFBlcmZcblxuICAgIGlmIChtYXggIT09IDAgJiYgIWlzUG9zSW50KG1heCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXInKVxuICAgIH1cblxuICAgIGNvbnN0IFVpbnRBcnJheSA9IG1heCA/IGdldFVpbnRBcnJheShtYXgpIDogQXJyYXlcbiAgICBpZiAoIVVpbnRBcnJheSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCB2YWx1ZTogJyArIG1heClcbiAgICB9XG5cbiAgICB0aGlzLiNtYXggPSBtYXhcbiAgICB0aGlzLiNtYXhTaXplID0gbWF4U2l6ZVxuICAgIHRoaXMubWF4RW50cnlTaXplID0gbWF4RW50cnlTaXplIHx8IHRoaXMuI21heFNpemVcbiAgICB0aGlzLnNpemVDYWxjdWxhdGlvbiA9IHNpemVDYWxjdWxhdGlvblxuICAgIGlmICh0aGlzLnNpemVDYWxjdWxhdGlvbikge1xuICAgICAgaWYgKCF0aGlzLiNtYXhTaXplICYmICF0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUnLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRoaXMuc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemVDYWxjdWxhdGlvbiBzZXQgdG8gbm9uLWZ1bmN0aW9uJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWVtb01ldGhvZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBtZW1vTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtZW1vTWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiBpZiBkZWZpbmVkJylcbiAgICB9XG4gICAgdGhpcy4jbWVtb01ldGhvZCA9IG1lbW9NZXRob2RcblxuICAgIGlmIChmZXRjaE1ldGhvZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBmZXRjaE1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmV0Y2hNZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIHNwZWNpZmllZCcpXG4gICAgfVxuICAgIHRoaXMuI2ZldGNoTWV0aG9kID0gZmV0Y2hNZXRob2RcbiAgICB0aGlzLiNoYXNGZXRjaE1ldGhvZCA9ICEhZmV0Y2hNZXRob2RcblxuICAgIHRoaXMuI2tleU1hcCA9IG5ldyBNYXAoKVxuICAgIHRoaXMuI2tleUxpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKHVuZGVmaW5lZClcbiAgICB0aGlzLiN2YWxMaXN0ID0gbmV3IEFycmF5KG1heCkuZmlsbCh1bmRlZmluZWQpXG4gICAgdGhpcy4jbmV4dCA9IG5ldyBVaW50QXJyYXkobWF4KVxuICAgIHRoaXMuI3ByZXYgPSBuZXcgVWludEFycmF5KG1heClcbiAgICB0aGlzLiNoZWFkID0gMCBhcyBJbmRleFxuICAgIHRoaXMuI3RhaWwgPSAwIGFzIEluZGV4XG4gICAgdGhpcy4jZnJlZSA9IFN0YWNrLmNyZWF0ZShtYXgpXG4gICAgdGhpcy4jc2l6ZSA9IDBcbiAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDBcblxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jZGlzcG9zZSA9IGRpc3Bvc2VcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvbkluc2VydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jb25JbnNlcnQgPSBvbkluc2VydFxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2VBZnRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyID0gZGlzcG9zZUFmdGVyXG4gICAgICB0aGlzLiNkaXNwb3NlZCA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlciA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy4jZGlzcG9zZWQgPSB1bmRlZmluZWRcbiAgICB9XG4gICAgdGhpcy4jaGFzRGlzcG9zZSA9ICEhdGhpcy4jZGlzcG9zZVxuICAgIHRoaXMuI2hhc09uSW5zZXJ0ID0gISF0aGlzLiNvbkluc2VydFxuICAgIHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciA9ICEhdGhpcy4jZGlzcG9zZUFmdGVyXG5cbiAgICB0aGlzLm5vRGlzcG9zZU9uU2V0ID0gISFub0Rpc3Bvc2VPblNldFxuICAgIHRoaXMubm9VcGRhdGVUVEwgPSAhIW5vVXBkYXRlVFRMXG4gICAgdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24gPSAhIW5vRGVsZXRlT25GZXRjaFJlamVjdGlvblxuICAgIHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24gPSAhIWFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uXG4gICAgdGhpcy5hbGxvd1N0YWxlT25GZXRjaEFib3J0ID0gISFhbGxvd1N0YWxlT25GZXRjaEFib3J0XG4gICAgdGhpcy5pZ25vcmVGZXRjaEFib3J0ID0gISFpZ25vcmVGZXRjaEFib3J0XG5cbiAgICAvLyBOQjogbWF4RW50cnlTaXplIGlzIHNldCB0byBtYXhTaXplIGlmIGl0J3Mgc2V0XG4gICAgaWYgKHRoaXMubWF4RW50cnlTaXplICE9PSAwKSB7XG4gICAgICBpZiAodGhpcy4jbWF4U2l6ZSAhPT0gMCkge1xuICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMuI21heFNpemUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCcsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzUG9zSW50KHRoaXMubWF4RW50cnlTaXplKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdtYXhFbnRyeVNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJyxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy4jaW5pdGlhbGl6ZVNpemVUcmFja2luZygpXG4gICAgfVxuXG4gICAgdGhpcy5hbGxvd1N0YWxlID0gISFhbGxvd1N0YWxlXG4gICAgdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQgPSAhIW5vRGVsZXRlT25TdGFsZUdldFxuICAgIHRoaXMudXBkYXRlQWdlT25HZXQgPSAhIXVwZGF0ZUFnZU9uR2V0XG4gICAgdGhpcy51cGRhdGVBZ2VPbkhhcyA9ICEhdXBkYXRlQWdlT25IYXNcbiAgICB0aGlzLnR0bFJlc29sdXRpb24gPVxuICAgICAgaXNQb3NJbnQodHRsUmVzb2x1dGlvbikgfHwgdHRsUmVzb2x1dGlvbiA9PT0gMCA/IHR0bFJlc29sdXRpb24gOiAxXG4gICAgdGhpcy50dGxBdXRvcHVyZ2UgPSAhIXR0bEF1dG9wdXJnZVxuICAgIHRoaXMudHRsID0gdHRsIHx8IDBcbiAgICBpZiAodGhpcy50dGwpIHtcbiAgICAgIGlmICghaXNQb3NJbnQodGhpcy50dGwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3R0bCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKVxuICAgICAgfVxuICAgICAgdGhpcy4jaW5pdGlhbGl6ZVRUTFRyYWNraW5nKClcbiAgICB9XG5cbiAgICAvLyBkbyBub3QgYWxsb3cgY29tcGxldGVseSB1bmJvdW5kZWQgY2FjaGVzXG4gICAgaWYgKHRoaXMuI21heCA9PT0gMCAmJiB0aGlzLnR0bCA9PT0gMCAmJiB0aGlzLiNtYXhTaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkJyxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKCF0aGlzLnR0bEF1dG9wdXJnZSAmJiAhdGhpcy4jbWF4ICYmICF0aGlzLiNtYXhTaXplKSB7XG4gICAgICBjb25zdCBjb2RlID0gJ0xSVV9DQUNIRV9VTkJPVU5ERUQnXG4gICAgICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgICAgICB3YXJuZWQuYWRkKGNvZGUpXG4gICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgJ1RUTCBjYWNoaW5nIHdpdGhvdXQgdHRsQXV0b3B1cmdlLCBtYXgsIG9yIG1heFNpemUgY2FuICcgK1xuICAgICAgICAgICdyZXN1bHQgaW4gdW5ib3VuZGVkIG1lbW9yeSBjb25zdW1wdGlvbi4nXG4gICAgICAgIGVtaXRXYXJuaW5nKG1zZywgJ1VuYm91bmRlZENhY2hlV2FybmluZycsIGNvZGUsIExSVUNhY2hlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtcyBsZWZ0IGluIHRoZSBpdGVtJ3MgVFRMLiBJZiBpdGVtIGlzIG5vdCBpbiBjYWNoZSxcbiAgICogcmV0dXJucyBgMGAuIFJldHVybnMgYEluZmluaXR5YCBpZiBpdGVtIGlzIGluIGNhY2hlIHdpdGhvdXQgYSBkZWZpbmVkIFRUTC5cbiAgICovXG4gIGdldFJlbWFpbmluZ1RUTChrZXk6IEspIHtcbiAgICByZXR1cm4gdGhpcy4ja2V5TWFwLmhhcyhrZXkpID8gSW5maW5pdHkgOiAwXG4gIH1cblxuICAjaW5pdGlhbGl6ZVRUTFRyYWNraW5nKCkge1xuICAgIGNvbnN0IHR0bHMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heClcbiAgICBjb25zdCBzdGFydHMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heClcbiAgICB0aGlzLiN0dGxzID0gdHRsc1xuICAgIHRoaXMuI3N0YXJ0cyA9IHN0YXJ0c1xuICAgIGNvbnN0IHB1cmdlVGltZXJzID1cbiAgICAgIHRoaXMudHRsQXV0b3B1cmdlID9cbiAgICAgICAgbmV3IEFycmF5PHVuZGVmaW5lZCB8IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+Pih0aGlzLiNtYXgpXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIHRoaXMuI2F1dG9wdXJnZVRpbWVycyA9IHB1cmdlVGltZXJzXG5cbiAgICB0aGlzLiNzZXRJdGVtVFRMID0gKGluZGV4LCB0dGwsIHN0YXJ0ID0gdGhpcy4jcGVyZi5ub3coKSkgPT4ge1xuICAgICAgc3RhcnRzW2luZGV4XSA9IHR0bCAhPT0gMCA/IHN0YXJ0IDogMFxuICAgICAgdHRsc1tpbmRleF0gPSB0dGxcbiAgICAgIHNldFB1cmdldFRpbWVyKGluZGV4LCB0dGwpXG4gICAgfVxuXG4gICAgdGhpcy4jdXBkYXRlSXRlbUFnZSA9IGluZGV4ID0+IHtcbiAgICAgIHN0YXJ0c1tpbmRleF0gPSB0dGxzW2luZGV4XSAhPT0gMCA/IHRoaXMuI3BlcmYubm93KCkgOiAwXG4gICAgICBzZXRQdXJnZXRUaW1lcihpbmRleCwgdHRsc1tpbmRleF0pXG4gICAgfVxuXG4gICAgLy8gY2xlYXIgb3V0IHRoZSBwdXJnZSB0aW1lciBpZiB3ZSdyZSBzZXR0aW5nIFRUTCB0byAwLCBhbmRcbiAgICAvLyBwcmV2aW91c2x5IGhhZCBhIHR0bCBwdXJnZSB0aW1lciBydW5uaW5nLCBzbyBpdCBkb2Vzbid0XG4gICAgLy8gZmlyZSB1bm5lY2Vzc2FyaWx5LiBEb24ndCBuZWVkIHRvIGRvIHRoaXMgaWYgd2UncmUgbm90IGRvaW5nXG4gICAgLy8gYXV0b3B1cmdlLlxuICAgIGNvbnN0IHNldFB1cmdldFRpbWVyID1cbiAgICAgICF0aGlzLnR0bEF1dG9wdXJnZSA/XG4gICAgICAgICgpID0+IHt9XG4gICAgICA6IChpbmRleDogSW5kZXgsIHR0bD86IG51bWJlcikgPT4ge1xuICAgICAgICAgIGlmIChwdXJnZVRpbWVycz8uW2luZGV4XSkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHB1cmdlVGltZXJzW2luZGV4XSlcbiAgICAgICAgICAgIHB1cmdlVGltZXJzW2luZGV4XSA9IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHRsICYmIHR0bCAhPT0gMCAmJiBwdXJnZVRpbWVycykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAodGhpcy4jaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUodGhpcy4ja2V5TGlzdFtpbmRleF0gYXMgSywgJ2V4cGlyZScpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHR0bCArIDEpXG4gICAgICAgICAgICAvLyB1bnJlZigpIG5vdCBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtc1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICBpZiAodC51bnJlZikge1xuICAgICAgICAgICAgICB0LnVucmVmKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICBwdXJnZVRpbWVyc1tpbmRleF0gPSB0XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB0aGlzLiNzdGF0dXNUVEwgPSAoc3RhdHVzLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHR0bHNbaW5kZXhdKSB7XG4gICAgICAgIGNvbnN0IHR0bCA9IHR0bHNbaW5kZXhdXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRzW2luZGV4XVxuICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBpZiAoIXR0bCB8fCAhc3RhcnQpIHJldHVyblxuICAgICAgICBzdGF0dXMudHRsID0gdHRsXG4gICAgICAgIHN0YXR1cy5zdGFydCA9IHN0YXJ0XG4gICAgICAgIHN0YXR1cy5ub3cgPSBjYWNoZWROb3cgfHwgZ2V0Tm93KClcbiAgICAgICAgY29uc3QgYWdlID0gc3RhdHVzLm5vdyAtIHN0YXJ0XG4gICAgICAgIHN0YXR1cy5yZW1haW5pbmdUVEwgPSB0dGwgLSBhZ2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWJvdW5jZSBjYWxscyB0byBwZXJmLm5vdygpIHRvIDFzIHNvIHdlJ3JlIG5vdCBoaXR0aW5nXG4gICAgLy8gdGhhdCBjb3N0bHkgY2FsbCByZXBlYXRlZGx5LlxuICAgIGxldCBjYWNoZWROb3cgPSAwXG4gICAgY29uc3QgZ2V0Tm93ID0gKCkgPT4ge1xuICAgICAgY29uc3QgbiA9IHRoaXMuI3BlcmYubm93KClcbiAgICAgIGlmICh0aGlzLnR0bFJlc29sdXRpb24gPiAwKSB7XG4gICAgICAgIGNhY2hlZE5vdyA9IG5cbiAgICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4gKGNhY2hlZE5vdyA9IDApLCB0aGlzLnR0bFJlc29sdXRpb24pXG4gICAgICAgIC8vIG5vdCBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3Jtc1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKHQudW5yZWYpIHtcbiAgICAgICAgICB0LnVucmVmKClcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5cbiAgICB9XG5cbiAgICB0aGlzLmdldFJlbWFpbmluZ1RUTCA9IGtleSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoa2V5KVxuICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIGNvbnN0IHR0bCA9IHR0bHNbaW5kZXhdXG4gICAgICBjb25zdCBzdGFydCA9IHN0YXJ0c1tpbmRleF1cbiAgICAgIGlmICghdHRsIHx8ICFzdGFydCkge1xuICAgICAgICByZXR1cm4gSW5maW5pdHlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFnZSA9IChjYWNoZWROb3cgfHwgZ2V0Tm93KCkpIC0gc3RhcnRcbiAgICAgIHJldHVybiB0dGwgLSBhZ2VcbiAgICB9XG5cbiAgICB0aGlzLiNpc1N0YWxlID0gaW5kZXggPT4ge1xuICAgICAgY29uc3QgcyA9IHN0YXJ0c1tpbmRleF1cbiAgICAgIGNvbnN0IHQgPSB0dGxzW2luZGV4XVxuICAgICAgcmV0dXJuICEhdCAmJiAhIXMgJiYgKGNhY2hlZE5vdyB8fCBnZXROb3coKSkgLSBzID4gdFxuICAgIH1cbiAgfVxuXG4gIC8vIGNvbmRpdGlvbmFsbHkgc2V0IHByaXZhdGUgbWV0aG9kcyByZWxhdGVkIHRvIFRUTFxuICAjdXBkYXRlSXRlbUFnZTogKGluZGV4OiBJbmRleCkgPT4gdm9pZCA9ICgpID0+IHt9XG4gICNzdGF0dXNUVEw6IChzdGF0dXM6IExSVUNhY2hlLlN0YXR1czxWPiwgaW5kZXg6IEluZGV4KSA9PiB2b2lkID0gKCkgPT4ge31cbiAgI3NldEl0ZW1UVEw6IChcbiAgICBpbmRleDogSW5kZXgsXG4gICAgdHRsOiBMUlVDYWNoZS5NaWxsaXNlY29uZHMsXG4gICAgc3RhcnQ/OiBMUlVDYWNoZS5NaWxsaXNlY29uZHMsXG4gICAgLy8gaWdub3JlIGJlY2F1c2Ugd2UgbmV2ZXIgY2FsbCB0aGlzIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGluIFRUTCBtb2RlXG4gICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICkgPT4gdm9pZCA9ICgpID0+IHt9XG4gIC8qIGM4IGlnbm9yZSBzdG9wICovXG5cbiAgI2lzU3RhbGU6IChpbmRleDogSW5kZXgpID0+IGJvb2xlYW4gPSAoKSA9PiBmYWxzZVxuXG4gICNpbml0aWFsaXplU2l6ZVRyYWNraW5nKCkge1xuICAgIGNvbnN0IHNpemVzID0gbmV3IFplcm9BcnJheSh0aGlzLiNtYXgpXG4gICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwXG4gICAgdGhpcy4jc2l6ZXMgPSBzaXplc1xuICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplID0gaW5kZXggPT4ge1xuICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgLT0gc2l6ZXNbaW5kZXhdIGFzIG51bWJlclxuICAgICAgc2l6ZXNbaW5kZXhdID0gMFxuICAgIH1cbiAgICB0aGlzLiNyZXF1aXJlU2l6ZSA9IChrLCB2LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pID0+IHtcbiAgICAgIC8vIHByb3Zpc2lvbmFsbHkgYWNjZXB0IGJhY2tncm91bmQgZmV0Y2hlcy5cbiAgICAgIC8vIGFjdHVhbCB2YWx1ZSBzaXplIHdpbGwgYmUgY2hlY2tlZCB3aGVuIHRoZXkgcmV0dXJuLlxuICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG4gICAgICBpZiAoIWlzUG9zSW50KHNpemUpKSB7XG4gICAgICAgIGlmIChzaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHNpemVDYWxjdWxhdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gICAgICAgICAgfVxuICAgICAgICAgIHNpemUgPSBzaXplQ2FsY3VsYXRpb24odiwgaylcbiAgICAgICAgICBpZiAoIWlzUG9zSW50KHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAnc2l6ZUNhbGN1bGF0aW9uIHJldHVybiBpbnZhbGlkIChleHBlY3QgcG9zaXRpdmUgaW50ZWdlciknLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ2ludmFsaWQgc2l6ZSB2YWx1ZSAobXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyKS4gJyArXG4gICAgICAgICAgICAgICdXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ29yIHNpemUgbXVzdCBiZSBzZXQuJyxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzaXplXG4gICAgfVxuICAgIHRoaXMuI2FkZEl0ZW1TaXplID0gKFxuICAgICAgaW5kZXg6IEluZGV4LFxuICAgICAgc2l6ZTogTFJVQ2FjaGUuU2l6ZSxcbiAgICAgIHN0YXR1cz86IExSVUNhY2hlLlN0YXR1czxWPixcbiAgICApID0+IHtcbiAgICAgIHNpemVzW2luZGV4XSA9IHNpemVcbiAgICAgIGlmICh0aGlzLiNtYXhTaXplKSB7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB0aGlzLiNtYXhTaXplIC0gKHNpemVzW2luZGV4XSBhcyBudW1iZXIpXG4gICAgICAgIHdoaWxlICh0aGlzLiNjYWxjdWxhdGVkU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICB0aGlzLiNldmljdCh0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSArPSBzaXplc1tpbmRleF0gYXMgbnVtYmVyXG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5lbnRyeVNpemUgPSBzaXplXG4gICAgICAgIHN0YXR1cy50b3RhbENhbGN1bGF0ZWRTaXplID0gdGhpcy4jY2FsY3VsYXRlZFNpemVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAjcmVtb3ZlSXRlbVNpemU6IChpbmRleDogSW5kZXgpID0+IHZvaWQgPSBfaSA9PiB7fVxuICAjYWRkSXRlbVNpemU6IChcbiAgICBpbmRleDogSW5kZXgsXG4gICAgc2l6ZTogTFJVQ2FjaGUuU2l6ZSxcbiAgICBzdGF0dXM/OiBMUlVDYWNoZS5TdGF0dXM8Vj4sXG4gICkgPT4gdm9pZCA9IChfaSwgX3MsIF9zdCkgPT4ge31cbiAgI3JlcXVpcmVTaXplOiAoXG4gICAgazogSyxcbiAgICB2OiBWIHwgQmFja2dyb3VuZEZldGNoPFY+LFxuICAgIHNpemU/OiBMUlVDYWNoZS5TaXplLFxuICAgIHNpemVDYWxjdWxhdGlvbj86IExSVUNhY2hlLlNpemVDYWxjdWxhdG9yPEssIFY+LFxuICApID0+IExSVUNhY2hlLlNpemUgPSAoXG4gICAgX2s6IEssXG4gICAgX3Y6IFYgfCBCYWNrZ3JvdW5kRmV0Y2g8Vj4sXG4gICAgc2l6ZT86IExSVUNhY2hlLlNpemUsXG4gICAgc2l6ZUNhbGN1bGF0aW9uPzogTFJVQ2FjaGUuU2l6ZUNhbGN1bGF0b3I8SywgVj4sXG4gICkgPT4ge1xuICAgIGlmIChzaXplIHx8IHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ2Nhbm5vdCBzZXQgc2l6ZSB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgb24gY2FjaGUnLFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gMFxuICB9O1xuXG4gICojaW5kZXhlcyh7IGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuI3NpemUpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLiN0YWlsOyB0cnVlOyApIHtcbiAgICAgICAgaWYgKCF0aGlzLiNpc1ZhbGlkSW5kZXgoaSkpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxvd1N0YWxlIHx8ICF0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgeWllbGQgaVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSB0aGlzLiNoZWFkKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gdGhpcy4jcHJldltpXSBhcyBJbmRleFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgKiNyaW5kZXhlcyh7IGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuI3NpemUpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLiNoZWFkOyB0cnVlOyApIHtcbiAgICAgICAgaWYgKCF0aGlzLiNpc1ZhbGlkSW5kZXgoaSkpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxvd1N0YWxlIHx8ICF0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgeWllbGQgaVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gdGhpcy4jbmV4dFtpXSBhcyBJbmRleFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2lzVmFsaWRJbmRleChpbmRleDogSW5kZXgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgaW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy4ja2V5TWFwLmdldCh0aGlzLiNrZXlMaXN0W2luZGV4XSBhcyBLKSA9PT0gaW5kZXhcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIGBba2V5LCB2YWx1ZV1gIHBhaXJzLFxuICAgKiBpbiBvcmRlciBmcm9tIG1vc3QgcmVjZW50bHkgdXNlZCB0byBsZWFzdCByZWNlbnRseSB1c2VkLlxuICAgKi9cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLiN2YWxMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdGhpcy4ja2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKVxuICAgICAgKSB7XG4gICAgICAgIHlpZWxkIFt0aGlzLiNrZXlMaXN0W2ldLCB0aGlzLiN2YWxMaXN0W2ldXSBhcyBbSywgVl1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS5lbnRyaWVzfVxuICAgKlxuICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgYFtrZXksIHZhbHVlXWAgcGFpcnMsXG4gICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAqL1xuICAqcmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy4jdmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMuI2tleUxpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCBbdGhpcy4ja2V5TGlzdFtpXSwgdGhpcy4jdmFsTGlzdFtpXV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBrZXlzIGluIHRoZSBjYWNoZSxcbiAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICovXG4gICprZXlzKCkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2ldXG4gICAgICBpZiAoayAhPT0gdW5kZWZpbmVkICYmICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICB5aWVsZCBrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludmVyc2Ugb3JkZXIgdmVyc2lvbiBvZiB7QGxpbmsgTFJVQ2FjaGUua2V5c31cbiAgICpcbiAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBrZXlzIGluIHRoZSBjYWNoZSxcbiAgICogaW4gb3JkZXIgZnJvbSBsZWFzdCByZWNlbnRseSB1c2VkIHRvIG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICovXG4gICpya2V5cygpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaV1cbiAgICAgIGlmIChrICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgIHlpZWxkIGtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIGNhY2hlLFxuICAgKiBpbiBvcmRlciBmcm9tIG1vc3QgcmVjZW50bHkgdXNlZCB0byBsZWFzdCByZWNlbnRseSB1c2VkLlxuICAgKi9cbiAgKnZhbHVlcygpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXVxuICAgICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgeWllbGQgdGhpcy4jdmFsTGlzdFtpXSBhcyBWXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludmVyc2Ugb3JkZXIgdmVyc2lvbiBvZiB7QGxpbmsgTFJVQ2FjaGUudmFsdWVzfVxuICAgKlxuICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIHZhbHVlcyBpbiB0aGUgY2FjaGUsXG4gICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAqL1xuICAqcnZhbHVlcygpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV1cbiAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgIHlpZWxkIHRoaXMuI3ZhbExpc3RbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0aW5nIG92ZXIgdGhlIGNhY2hlIGl0c2VsZiB5aWVsZHMgdGhlIHNhbWUgcmVzdWx0cyBhc1xuICAgKiB7QGxpbmsgTFJVQ2FjaGUuZW50cmllc31cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEEgU3RyaW5nIHZhbHVlIHRoYXQgaXMgdXNlZCBpbiB0aGUgY3JlYXRpb24gb2YgdGhlIGRlZmF1bHQgc3RyaW5nXG4gICAqIGRlc2NyaXB0aW9uIG9mIGFuIG9iamVjdC4gQ2FsbGVkIGJ5IHRoZSBidWlsdC1pbiBtZXRob2RcbiAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgKi9cbiAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTFJVQ2FjaGUnXG5cbiAgLyoqXG4gICAqIEZpbmQgYSB2YWx1ZSBmb3Igd2hpY2ggdGhlIHN1cHBsaWVkIGZuIG1ldGhvZCByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLFxuICAgKiBzaW1pbGFyIHRvIGBBcnJheS5maW5kKClgLiBmbiBpcyBjYWxsZWQgYXMgYGZuKHZhbHVlLCBrZXksIGNhY2hlKWAuXG4gICAqL1xuICBmaW5kKFxuICAgIGZuOiAodjogViwgazogSywgc2VsZjogTFJVQ2FjaGU8SywgViwgRkM+KSA9PiBib29sZWFuLFxuICAgIGdldE9wdGlvbnM6IExSVUNhY2hlLkdldE9wdGlvbnM8SywgViwgRkM+ID0ge30sXG4gICkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHZcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgaWYgKGZuKHZhbHVlLCB0aGlzLiNrZXlMaXN0W2ldIGFzIEssIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCh0aGlzLiNrZXlMaXN0W2ldIGFzIEssIGdldE9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbSBpbiB0aGUgY2FjaGUsIGluIG9yZGVyIGZyb20gbW9zdFxuICAgKiByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAqXG4gICAqIGBmbmAgaXMgY2FsbGVkIGFzIGBmbih2YWx1ZSwga2V5LCBjYWNoZSlgLlxuICAgKlxuICAgKiBJZiBgdGhpc3BgIGlzIHByb3ZpZGVkLCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgYHRoaXNgLWNvbnRleHQgb2ZcbiAgICogdGhlIHByb3ZpZGVkIG9iamVjdCwgb3IgdGhlIGNhY2hlIGlmIG5vIGB0aGlzcGAgb2JqZWN0IGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBEb2VzIG5vdCB1cGRhdGUgYWdlIG9yIHJlY2VudHkgb2YgdXNlLCBvciBpdGVyYXRlIG92ZXIgc3RhbGUgdmFsdWVzLlxuICAgKi9cbiAgZm9yRWFjaChcbiAgICBmbjogKHY6IFYsIGs6IEssIHNlbGY6IExSVUNhY2hlPEssIFYsIEZDPikgPT4gYW55LFxuICAgIHRoaXNwOiBhbnkgPSB0aGlzLFxuICApIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXVxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLiNrZXlMaXN0W2ldIGFzIEssIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzYW1lIGFzIHtAbGluayBMUlVDYWNoZS5mb3JFYWNofSBidXQgaXRlbXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW5cbiAgICogcmV2ZXJzZSBvcmRlci4gIChpZSwgbGVzcyByZWNlbnRseSB1c2VkIGl0ZW1zIGFyZSBpdGVyYXRlZCBvdmVyIGZpcnN0LilcbiAgICovXG4gIHJmb3JFYWNoKFxuICAgIGZuOiAodjogViwgazogSywgc2VsZjogTFJVQ2FjaGU8SywgViwgRkM+KSA9PiBhbnksXG4gICAgdGhpc3A6IGFueSA9IHRoaXMsXG4gICkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXVxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLiNrZXlMaXN0W2ldIGFzIEssIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbnkgc3RhbGUgZW50cmllcy4gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIHdhcyByZW1vdmVkLFxuICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdXJnZVN0YWxlKCkge1xuICAgIGxldCBkZWxldGVkID0gZmFsc2VcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICBpZiAodGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICB0aGlzLiNkZWxldGUodGhpcy4ja2V5TGlzdFtpXSBhcyBLLCAnZXhwaXJlJylcbiAgICAgICAgZGVsZXRlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlbGV0ZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGV4dGVuZGVkIGluZm8gYWJvdXQgYSBnaXZlbiBlbnRyeSwgdG8gZ2V0IGl0cyB2YWx1ZSwgc2l6ZSwgYW5kXG4gICAqIFRUTCBpbmZvIHNpbXVsdGFuZW91c2x5LiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQuXG4gICAqXG4gICAqIFVubGlrZSB7QGxpbmsgTFJVQ2FjaGUjZHVtcH0sIHdoaWNoIGlzIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlIGFuZCBzdXJ2aXZlXG4gICAqIHNlcmlhbGl6YXRpb24sIHRoZSBgc3RhcnRgIHZhbHVlIGlzIGFsd2F5cyB0aGUgY3VycmVudCB0aW1lc3RhbXAsIGFuZCB0aGVcbiAgICogYHR0bGAgaXMgYSBjYWxjdWxhdGVkIHJlbWFpbmluZyB0aW1lIHRvIGxpdmUgKG5lZ2F0aXZlIGlmIGV4cGlyZWQpLlxuICAgKlxuICAgKiBBbHdheXMgcmV0dXJucyBzdGFsZSB2YWx1ZXMsIGlmIHRoZWlyIGluZm8gaXMgZm91bmQgaW4gdGhlIGNhY2hlLCBzbyBiZVxuICAgKiBzdXJlIHRvIGNoZWNrIGZvciBleHBpcmF0aW9ucyAoaWUsIGEgbmVnYXRpdmUge0BsaW5rIExSVUNhY2hlLkVudHJ5I3R0bH0pXG4gICAqIGlmIHJlbGV2YW50LlxuICAgKi9cbiAgaW5mbyhrZXk6IEspOiBMUlVDYWNoZS5FbnRyeTxWPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaSA9IHRoaXMuI2tleU1hcC5nZXQoa2V5KVxuICAgIGlmIChpID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcbiAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXVxuICAgIC8qIGM4IGlnbm9yZSBzdGFydCAtIHRoaXMgaXNuJ3QgdGVzdGVkIGZvciB0aGUgaW5mbyBmdW5jdGlvbixcbiAgICAgKiBidXQgaXQncyB0aGUgc2FtZSBsb2dpYyBhcyBmb3VuZCBpbiBvdGhlciBwbGFjZXMuICovXG4gICAgY29uc3QgdmFsdWU6IFYgfCB1bmRlZmluZWQgPVxuICAgICAgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nIDogdlxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgLyogYzggaWdub3JlIGVuZCAqL1xuICAgIGNvbnN0IGVudHJ5OiBMUlVDYWNoZS5FbnRyeTxWPiA9IHsgdmFsdWUgfVxuICAgIGlmICh0aGlzLiN0dGxzICYmIHRoaXMuI3N0YXJ0cykge1xuICAgICAgY29uc3QgdHRsID0gdGhpcy4jdHRsc1tpXVxuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLiNzdGFydHNbaV1cbiAgICAgIGlmICh0dGwgJiYgc3RhcnQpIHtcbiAgICAgICAgY29uc3QgcmVtYWluID0gdHRsIC0gKHRoaXMuI3BlcmYubm93KCkgLSBzdGFydClcbiAgICAgICAgZW50cnkudHRsID0gcmVtYWluXG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy4jc2l6ZXMpIHtcbiAgICAgIGVudHJ5LnNpemUgPSB0aGlzLiNzaXplc1tpXVxuICAgIH1cbiAgICByZXR1cm4gZW50cnlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgW2tleSwge0BsaW5rIExSVUNhY2hlLkVudHJ5fV0gdHVwbGVzIHdoaWNoIGNhbiBiZVxuICAgKiBwYXNzZWQgdG8ge0BsaW5rIExSVUNhY2hlI2xvYWR9LlxuICAgKlxuICAgKiBUaGUgYHN0YXJ0YCBmaWVsZHMgYXJlIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZSBgRGF0ZS5ub3coKWBcbiAgICogdGltZXN0YW1wLCBldmVuIGlmIGBwZXJmb3JtYW5jZS5ub3coKWAgaXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBTdGFsZSBlbnRyaWVzIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIGBkdW1wYCwgZXZlbiBpZlxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZX0gaXMgZmFsc2UuXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgcmV0dXJucyBhbiBhY3R1YWwgYXJyYXksIG5vdCBhIGdlbmVyYXRvciwgc28gaXQgY2FuIGJlIG1vcmVcbiAgICogZWFzaWx5IHBhc3NlZCBhcm91bmQuXG4gICAqL1xuICBkdW1wKCkge1xuICAgIGNvbnN0IGFycjogW0ssIExSVUNhY2hlLkVudHJ5PFY+XVtdID0gW11cbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuI2tleUxpc3RbaV1cbiAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldXG4gICAgICBjb25zdCB2YWx1ZTogViB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHZcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgY29uc3QgZW50cnk6IExSVUNhY2hlLkVudHJ5PFY+ID0geyB2YWx1ZSB9XG4gICAgICBpZiAodGhpcy4jdHRscyAmJiB0aGlzLiNzdGFydHMpIHtcbiAgICAgICAgZW50cnkudHRsID0gdGhpcy4jdHRsc1tpXVxuICAgICAgICAvLyBhbHdheXMgZHVtcCB0aGUgc3RhcnQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZSB0aW1lc3RhbXBcbiAgICAgICAgLy8gaXQncyBvayBmb3IgdGhpcyB0byBiZSBhIGJpdCBzbG93LCBpdCdzIGEgcmFyZSBvcGVyYXRpb24uXG4gICAgICAgIGNvbnN0IGFnZSA9IHRoaXMuI3BlcmYubm93KCkgLSAodGhpcy4jc3RhcnRzW2ldIGFzIG51bWJlcilcbiAgICAgICAgZW50cnkuc3RhcnQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLSBhZ2UpXG4gICAgICB9XG4gICAgICBpZiAodGhpcy4jc2l6ZXMpIHtcbiAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuI3NpemVzW2ldXG4gICAgICB9XG4gICAgICBhcnIudW5zaGlmdChba2V5LCBlbnRyeV0pXG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY2FjaGUgYW5kIGxvYWQgaW4gdGhlIGl0ZW1zIGluIGVudHJpZXMgaW4gdGhlIG9yZGVyIGxpc3RlZC5cbiAgICpcbiAgICogVGhlIHNoYXBlIG9mIHRoZSByZXN1bHRpbmcgY2FjaGUgbWF5IGJlIGRpZmZlcmVudCBpZiB0aGUgc2FtZSBvcHRpb25zIGFyZVxuICAgKiBub3QgdXNlZCBpbiBib3RoIGNhY2hlcy5cbiAgICpcbiAgICogVGhlIGBzdGFydGAgZmllbGRzIGFyZSBhc3N1bWVkIHRvIGJlIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZVxuICAgKiBgRGF0ZS5ub3coKWAgdGltZXN0YW1wLCBldmVuIGlmIGBwZXJmb3JtYW5jZS5ub3coKWAgaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgbG9hZChhcnI6IFtLLCBMUlVDYWNoZS5FbnRyeTxWPl1bXSkge1xuICAgIHRoaXMuY2xlYXIoKVxuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGFycikge1xuICAgICAgaWYgKGVudHJ5LnN0YXJ0KSB7XG4gICAgICAgIC8vIGVudHJ5LnN0YXJ0IGlzIGEgcG9ydGFibGUgdGltZXN0YW1wLCBidXQgd2UgbWF5IGJlIHVzaW5nXG4gICAgICAgIC8vIG5vZGUncyBwZXJmb3JtYW5jZS5ub3coKSwgc28gY2FsY3VsYXRlIHRoZSBvZmZzZXQsIHNvIHRoYXRcbiAgICAgICAgLy8gd2UgZ2V0IHRoZSBpbnRlbmRlZCByZW1haW5pbmcgVFRMLCBubyBtYXR0ZXIgaG93IGxvbmcgaXQnc1xuICAgICAgICAvLyBiZWVuIG9uIGljZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gaXQncyBvayBmb3IgdGhpcyB0byBiZSBhIGJpdCBzbG93LCBpdCdzIGEgcmFyZSBvcGVyYXRpb24uXG4gICAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBlbnRyeS5zdGFydFxuICAgICAgICBlbnRyeS5zdGFydCA9IHRoaXMuI3BlcmYubm93KCkgLSBhZ2VcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0KGtleSwgZW50cnkudmFsdWUsIGVudHJ5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB2YWx1ZSB0byB0aGUgY2FjaGUuXG4gICAqXG4gICAqIE5vdGU6IGlmIGB1bmRlZmluZWRgIGlzIHNwZWNpZmllZCBhcyBhIHZhbHVlLCB0aGlzIGlzIGFuIGFsaWFzIGZvclxuICAgKiB7QGxpbmsgTFJVQ2FjaGUjZGVsZXRlfVxuICAgKlxuICAgKiBGaWVsZHMgb24gdGhlIHtAbGluayBMUlVDYWNoZS5TZXRPcHRpb25zfSBvcHRpb25zIHBhcmFtIHdpbGwgb3ZlcnJpZGVcbiAgICogdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMgZm9yIHRoZSBzY29wZVxuICAgKiBvZiB0aGlzIHNpbmdsZSBgc2V0KClgIG9wZXJhdGlvbi5cbiAgICpcbiAgICogSWYgYHN0YXJ0YCBpcyBwcm92aWRlZCwgdGhlbiB0aGF0IHdpbGwgc2V0IHRoZSBlZmZlY3RpdmUgc3RhcnRcbiAgICogdGltZSBmb3IgdGhlIFRUTCBjYWxjdWxhdGlvbi4gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBhIHByZXZpb3VzXG4gICAqIHZhbHVlIG9mIGBwZXJmb3JtYW5jZS5ub3coKWAgaWYgc3VwcG9ydGVkLCBvciBhIHByZXZpb3VzIHZhbHVlIG9mXG4gICAqIGBEYXRlLm5vdygpYCBpZiBub3QuXG4gICAqXG4gICAqIE9wdGlvbnMgb2JqZWN0IG1heSBhbHNvIGluY2x1ZGUgYHNpemVgLCB3aGljaCB3aWxsIHByZXZlbnRcbiAgICogY2FsbGluZyB0aGUgYHNpemVDYWxjdWxhdGlvbmAgZnVuY3Rpb24gYW5kIGp1c3QgdXNlIHRoZSBzcGVjaWZpZWRcbiAgICogbnVtYmVyIGlmIGl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciwgYW5kIGBub0Rpc3Bvc2VPblNldGAgd2hpY2hcbiAgICogd2lsbCBwcmV2ZW50IGNhbGxpbmcgYSBgZGlzcG9zZWAgZnVuY3Rpb24gaW4gdGhlIGNhc2Ugb2ZcbiAgICogb3ZlcndyaXRlcy5cbiAgICpcbiAgICogSWYgdGhlIGBzaXplYCAob3IgcmV0dXJuIHZhbHVlIG9mIGBzaXplQ2FsY3VsYXRpb25gKSBmb3IgYSBnaXZlblxuICAgKiBlbnRyeSBpcyBncmVhdGVyIHRoYW4gYG1heEVudHJ5U2l6ZWAsIHRoZW4gdGhlIGl0ZW0gd2lsbCBub3QgYmVcbiAgICogYWRkZWQgdG8gdGhlIGNhY2hlLlxuICAgKlxuICAgKiBXaWxsIHVwZGF0ZSB0aGUgcmVjZW5jeSBvZiB0aGUgZW50cnkuXG4gICAqXG4gICAqIElmIHRoZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgdGhlbiB0aGlzIGlzIGFuIGFsaWFzIGZvclxuICAgKiBgY2FjaGUuZGVsZXRlKGtleSlgLiBgdW5kZWZpbmVkYCBpcyBuZXZlciBzdG9yZWQgaW4gdGhlIGNhY2hlLlxuICAgKi9cbiAgc2V0KFxuICAgIGs6IEssXG4gICAgdjogViB8IEJhY2tncm91bmRGZXRjaDxWPiB8IHVuZGVmaW5lZCxcbiAgICBzZXRPcHRpb25zOiBMUlVDYWNoZS5TZXRPcHRpb25zPEssIFYsIEZDPiA9IHt9LFxuICApIHtcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgdHRsID0gdGhpcy50dGwsXG4gICAgICBzdGFydCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCxcbiAgICAgIHNpemVDYWxjdWxhdGlvbiA9IHRoaXMuc2l6ZUNhbGN1bGF0aW9uLFxuICAgICAgc3RhdHVzLFxuICAgIH0gPSBzZXRPcHRpb25zXG4gICAgbGV0IHsgbm9VcGRhdGVUVEwgPSB0aGlzLm5vVXBkYXRlVFRMIH0gPSBzZXRPcHRpb25zXG5cbiAgICBjb25zdCBzaXplID0gdGhpcy4jcmVxdWlyZVNpemUoXG4gICAgICBrLFxuICAgICAgdixcbiAgICAgIHNldE9wdGlvbnMuc2l6ZSB8fCAwLFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uLFxuICAgIClcbiAgICAvLyBpZiB0aGUgaXRlbSBkb2Vzbid0IGZpdCwgZG9uJ3QgZG8gYW55dGhpbmdcbiAgICAvLyBOQjogbWF4RW50cnlTaXplIHNldCB0byBtYXhTaXplIGJ5IGRlZmF1bHRcbiAgICBpZiAodGhpcy5tYXhFbnRyeVNpemUgJiYgc2l6ZSA+IHRoaXMubWF4RW50cnlTaXplKSB7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5zZXQgPSAnbWlzcydcbiAgICAgICAgc3RhdHVzLm1heEVudHJ5U2l6ZUV4Y2VlZGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgLy8gaGF2ZSB0byBkZWxldGUsIGluIGNhc2Ugc29tZXRoaW5nIGlzIHRoZXJlIGFscmVhZHkuXG4gICAgICB0aGlzLiNkZWxldGUoaywgJ3NldCcpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSB0aGlzLiNzaXplID09PSAwID8gdW5kZWZpbmVkIDogdGhpcy4ja2V5TWFwLmdldChrKVxuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBhZGRpdGlvblxuICAgICAgaW5kZXggPSAoXG4gICAgICAgIHRoaXMuI3NpemUgPT09IDAgPyB0aGlzLiN0YWlsXG4gICAgICAgIDogdGhpcy4jZnJlZS5sZW5ndGggIT09IDAgPyB0aGlzLiNmcmVlLnBvcCgpXG4gICAgICAgIDogdGhpcy4jc2l6ZSA9PT0gdGhpcy4jbWF4ID8gdGhpcy4jZXZpY3QoZmFsc2UpXG4gICAgICAgIDogdGhpcy4jc2l6ZSkgYXMgSW5kZXhcbiAgICAgIHRoaXMuI2tleUxpc3RbaW5kZXhdID0ga1xuICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSB2XG4gICAgICB0aGlzLiNrZXlNYXAuc2V0KGssIGluZGV4KVxuICAgICAgdGhpcy4jbmV4dFt0aGlzLiN0YWlsXSA9IGluZGV4XG4gICAgICB0aGlzLiNwcmV2W2luZGV4XSA9IHRoaXMuI3RhaWxcbiAgICAgIHRoaXMuI3RhaWwgPSBpbmRleFxuICAgICAgdGhpcy4jc2l6ZSsrXG4gICAgICB0aGlzLiNhZGRJdGVtU2l6ZShpbmRleCwgc2l6ZSwgc3RhdHVzKVxuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLnNldCA9ICdhZGQnXG4gICAgICBub1VwZGF0ZVRUTCA9IGZhbHNlXG4gICAgICBpZiAodGhpcy4jaGFzT25JbnNlcnQpIHtcbiAgICAgICAgdGhpcy4jb25JbnNlcnQ/Lih2IGFzIFYsIGssICdhZGQnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1cGRhdGVcbiAgICAgIHRoaXMuI21vdmVUb1RhaWwoaW5kZXgpXG4gICAgICBjb25zdCBvbGRWYWwgPSB0aGlzLiN2YWxMaXN0W2luZGV4XSBhcyBWIHwgQmFja2dyb3VuZEZldGNoPFY+XG4gICAgICBpZiAodiAhPT0gb2xkVmFsKSB7XG4gICAgICAgIGlmICh0aGlzLiNoYXNGZXRjaE1ldGhvZCAmJiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaChvbGRWYWwpKSB7XG4gICAgICAgICAgb2xkVmFsLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigncmVwbGFjZWQnKSlcbiAgICAgICAgICBjb25zdCB7IF9fc3RhbGVXaGlsZUZldGNoaW5nOiBzIH0gPSBvbGRWYWxcbiAgICAgICAgICBpZiAocyAhPT0gdW5kZWZpbmVkICYmICFub0Rpc3Bvc2VPblNldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHMgYXMgViwgaywgJ3NldCcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFtzIGFzIFYsIGssICdzZXQnXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/LihvbGRWYWwgYXMgViwgaywgJ3NldCcpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFtvbGRWYWwgYXMgViwgaywgJ3NldCddKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZShpbmRleClcbiAgICAgICAgdGhpcy4jYWRkSXRlbVNpemUoaW5kZXgsIHNpemUsIHN0YXR1cylcbiAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSB2XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3JlcGxhY2UnXG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPVxuICAgICAgICAgICAgb2xkVmFsICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKG9sZFZhbCkgP1xuICAgICAgICAgICAgICBvbGRWYWwuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgIDogb2xkVmFsXG4gICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQpIHN0YXR1cy5vbGRWYWx1ZSA9IG9sZFZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5zZXQgPSAndXBkYXRlJ1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy4jaGFzT25JbnNlcnQpIHtcbiAgICAgICAgdGhpcy5vbkluc2VydD8uKHYgYXMgViwgaywgdiA9PT0gb2xkVmFsID8gJ3VwZGF0ZScgOiAncmVwbGFjZScpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0dGwgIT09IDAgJiYgIXRoaXMuI3R0bHMpIHtcbiAgICAgIHRoaXMuI2luaXRpYWxpemVUVExUcmFja2luZygpXG4gICAgfVxuICAgIGlmICh0aGlzLiN0dGxzKSB7XG4gICAgICBpZiAoIW5vVXBkYXRlVFRMKSB7XG4gICAgICAgIHRoaXMuI3NldEl0ZW1UVEwoaW5kZXgsIHR0bCwgc3RhcnQpXG4gICAgICB9XG4gICAgICBpZiAoc3RhdHVzKSB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICB9XG4gICAgaWYgKCFub0Rpc3Bvc2VPblNldCAmJiB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWRcbiAgICAgIGxldCB0YXNrOiBEaXNwb3NlVGFzazxLLCBWPiB8IHVuZGVmaW5lZFxuICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogRXZpY3QgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbSwgcmV0dXJuaW5nIGl0cyB2YWx1ZSBvclxuICAgKiBgdW5kZWZpbmVkYCBpZiBjYWNoZSBpcyBlbXB0eS5cbiAgICovXG4gIHBvcCgpOiBWIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy4jdmFsTGlzdFt0aGlzLiNoZWFkXVxuICAgICAgICB0aGlzLiNldmljdCh0cnVlKVxuICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godmFsKSkge1xuICAgICAgICAgIGlmICh2YWwuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkXG4gICAgICAgIGxldCB0YXNrOiBEaXNwb3NlVGFzazxLLCBWPiB8IHVuZGVmaW5lZFxuICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2V2aWN0KGZyZWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBoZWFkID0gdGhpcy4jaGVhZFxuICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2hlYWRdIGFzIEtcbiAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtoZWFkXSBhcyBWXG4gICAgaWYgKHRoaXMuI2hhc0ZldGNoTWV0aG9kICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZXZpY3RlZCcpKVxuICAgIH0gZWxzZSBpZiAodGhpcy4jaGFzRGlzcG9zZSB8fCB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2U/Lih2LCBrLCAnZXZpY3QnKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbdiwgaywgJ2V2aWN0J10pXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplKGhlYWQpXG4gICAgaWYgKHRoaXMuI2F1dG9wdXJnZVRpbWVycz8uW2hlYWRdKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jYXV0b3B1cmdlVGltZXJzW2hlYWRdKVxuICAgICAgdGhpcy4jYXV0b3B1cmdlVGltZXJzW2hlYWRdID0gdW5kZWZpbmVkXG4gICAgfVxuICAgIC8vIGlmIHdlIGFyZW4ndCBhYm91dCB0byB1c2UgdGhlIGluZGV4LCB0aGVuIG51bGwgdGhlc2Ugb3V0XG4gICAgaWYgKGZyZWUpIHtcbiAgICAgIHRoaXMuI2tleUxpc3RbaGVhZF0gPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuI3ZhbExpc3RbaGVhZF0gPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuI2ZyZWUucHVzaChoZWFkKVxuICAgIH1cbiAgICBpZiAodGhpcy4jc2l6ZSA9PT0gMSkge1xuICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI3RhaWwgPSAwIGFzIEluZGV4XG4gICAgICB0aGlzLiNmcmVlLmxlbmd0aCA9IDBcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaGVhZF0gYXMgSW5kZXhcbiAgICB9XG4gICAgdGhpcy4ja2V5TWFwLmRlbGV0ZShrKVxuICAgIHRoaXMuI3NpemUtLVxuICAgIHJldHVybiBoZWFkXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBrZXkgaXMgaW4gdGhlIGNhY2hlLCB3aXRob3V0IHVwZGF0aW5nIHRoZSByZWNlbmN5IG9mIHVzZS5cbiAgICogV2lsbCByZXR1cm4gZmFsc2UgaWYgdGhlIGl0ZW0gaXMgc3RhbGUsIGV2ZW4gdGhvdWdoIGl0IGlzIHRlY2huaWNhbGx5XG4gICAqIGluIHRoZSBjYWNoZS5cbiAgICpcbiAgICogQ2hlY2sgaWYgYSBrZXkgaXMgaW4gdGhlIGNhY2hlLCB3aXRob3V0IHVwZGF0aW5nIHRoZSByZWNlbmN5IG9mXG4gICAqIHVzZS4gQWdlIGlzIHVwZGF0ZWQgaWYge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uSGFzfSBpcyBzZXRcbiAgICogdG8gYHRydWVgIGluIGVpdGhlciB0aGUgb3B0aW9ucyBvciB0aGUgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIFdpbGwgcmV0dXJuIGBmYWxzZWAgaWYgdGhlIGl0ZW0gaXMgc3RhbGUsIGV2ZW4gdGhvdWdoIGl0IGlzIHRlY2huaWNhbGx5IGluXG4gICAqIHRoZSBjYWNoZS4gVGhlIGRpZmZlcmVuY2UgY2FuIGJlIGRldGVybWluZWQgKGlmIGl0IG1hdHRlcnMpIGJ5IHVzaW5nIGFcbiAgICogYHN0YXR1c2AgYXJndW1lbnQsIGFuZCBpbnNwZWN0aW5nIHRoZSBgaGFzYCBmaWVsZC5cbiAgICpcbiAgICogV2lsbCBub3QgdXBkYXRlIGl0ZW0gYWdlIHVubGVzc1xuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25IYXN9IGlzIHNldC5cbiAgICovXG4gIGhhcyhrOiBLLCBoYXNPcHRpb25zOiBMUlVDYWNoZS5IYXNPcHRpb25zPEssIFYsIEZDPiA9IHt9KSB7XG4gICAgY29uc3QgeyB1cGRhdGVBZ2VPbkhhcyA9IHRoaXMudXBkYXRlQWdlT25IYXMsIHN0YXR1cyB9ID0gaGFzT3B0aW9uc1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKVxuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikgJiZcbiAgICAgICAgdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuI2lzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkhhcykge1xuICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgIHN0YXR1cy5oYXMgPSAnaGl0J1xuICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuaGFzID0gJ3N0YWxlJ1xuICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLmhhcyA9ICdtaXNzJ1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWtlIHtAbGluayBMUlVDYWNoZSNnZXR9IGJ1dCBkb2Vzbid0IHVwZGF0ZSByZWNlbmN5IG9yIGRlbGV0ZSBzdGFsZVxuICAgKiBpdGVtcy5cbiAgICpcbiAgICogUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgdW5sZXNzXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfSBpcyBzZXQuXG4gICAqL1xuICBwZWVrKGs6IEssIHBlZWtPcHRpb25zOiBMUlVDYWNoZS5QZWVrT3B0aW9uczxLLCBWLCBGQz4gPSB7fSkge1xuICAgIGNvbnN0IHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0gcGVla09wdGlvbnNcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCAoIWFsbG93U3RhbGUgJiYgdGhpcy4jaXNTdGFsZShpbmRleCkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdXG4gICAgLy8gZWl0aGVyIHN0YWxlIGFuZCBhbGxvd2VkLCBvciBmb3JjaW5nIGEgcmVmcmVzaCBvZiBub24tc3RhbGUgdmFsdWVcbiAgICByZXR1cm4gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nIDogdlxuICB9XG5cbiAgI2JhY2tncm91bmRGZXRjaChcbiAgICBrOiBLLFxuICAgIGluZGV4OiBJbmRleCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBMUlVDYWNoZS5GZXRjaE9wdGlvbnM8SywgViwgRkM+LFxuICAgIGNvbnRleHQ6IGFueSxcbiAgKTogQmFja2dyb3VuZEZldGNoPFY+IHtcbiAgICBjb25zdCB2ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuI3ZhbExpc3RbaW5kZXhdXG4gICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICByZXR1cm4gdlxuICAgIH1cblxuICAgIGNvbnN0IGFjID0gbmV3IEFDKClcbiAgICBjb25zdCB7IHNpZ25hbCB9ID0gb3B0aW9uc1xuICAgIC8vIHdoZW4vaWYgb3VyIEFDIHNpZ25hbHMsIHRoZW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlaXJzLlxuICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiBhYy5hYm9ydChzaWduYWwucmVhc29uKSwge1xuICAgICAgc2lnbmFsOiBhYy5zaWduYWwsXG4gICAgfSlcblxuICAgIGNvbnN0IGZldGNoT3B0cyA9IHtcbiAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGNvbnRleHQsXG4gICAgfVxuXG4gICAgY29uc3QgY2IgPSAodjogViB8IHVuZGVmaW5lZCwgdXBkYXRlQ2FjaGUgPSBmYWxzZSk6IFYgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgeyBhYm9ydGVkIH0gPSBhYy5zaWduYWxcbiAgICAgIGNvbnN0IGlnbm9yZUFib3J0ID0gb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0ICYmIHYgIT09IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcHJvY2VlZCA9XG4gICAgICAgIG9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCB8fFxuICAgICAgICAhIShvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQgJiYgdiAhPT0gdW5kZWZpbmVkKVxuICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKSB7XG4gICAgICAgIGlmIChhYm9ydGVkICYmICF1cGRhdGVDYWNoZSkge1xuICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRlZCA9IHRydWVcbiAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gYWMuc2lnbmFsLnJlYXNvblxuICAgICAgICAgIGlmIChpZ25vcmVBYm9ydCkgb3B0aW9ucy5zdGF0dXMuZmV0Y2hBYm9ydElnbm9yZWQgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hSZXNvbHZlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFib3J0ZWQgJiYgIWlnbm9yZUFib3J0ICYmICF1cGRhdGVDYWNoZSkge1xuICAgICAgICByZXR1cm4gZmV0Y2hGYWlsKGFjLnNpZ25hbC5yZWFzb24sIHByb2NlZWQpXG4gICAgICB9XG4gICAgICAvLyBlaXRoZXIgd2UgZGlkbid0IGFib3J0LCBhbmQgYXJlIHN0aWxsIGhlcmUsIG9yIHdlIGRpZCwgYW5kIGlnbm9yZWRcbiAgICAgIGNvbnN0IGJmID0gcCBhcyBCYWNrZ3JvdW5kRmV0Y2g8Vj5cbiAgICAgIC8vIGlmIG5vdGhpbmcgZWxzZSBoYXMgYmVlbiB3cml0dGVuIHRoZXJlIGJ1dCB3ZSdyZSBzZXQgdG8gdXBkYXRlIHRoZVxuICAgICAgLy8gY2FjaGUgYW5kIGlnbm9yZSB0aGUgYWJvcnQsIG9yIGlmIGl0J3Mgc3RpbGwgcGVuZGluZyBvbiB0aGlzIHNwZWNpZmljXG4gICAgICAvLyBiYWNrZ3JvdW5kIHJlcXVlc3QsIHRoZW4gd3JpdGUgaXQgdG8gdGhlIGNhY2hlLlxuICAgICAgY29uc3QgdmwgPSB0aGlzLiN2YWxMaXN0W2luZGV4IGFzIEluZGV4XVxuICAgICAgaWYgKHZsID09PSBwIHx8IChpZ25vcmVBYm9ydCAmJiB1cGRhdGVDYWNoZSAmJiB2bCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXggYXMgSW5kZXhdID0gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdmZXRjaCcpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hVcGRhdGVkID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuc2V0KGssIHYsIGZldGNoT3B0cy5vcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdlxuICAgIH1cblxuICAgIGNvbnN0IGViID0gKGVyOiBhbnkpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlamVjdGVkID0gdHJ1ZVxuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gZXJcbiAgICAgIH1cbiAgICAgIC8vIGRvIG5vdCBwYXNzIGdvLCBkbyBub3QgY29sbGVjdCAkMjAwXG4gICAgICByZXR1cm4gZmV0Y2hGYWlsKGVyLCBmYWxzZSlcbiAgICB9XG5cbiAgICBjb25zdCBmZXRjaEZhaWwgPSAoZXI6IGFueSwgcHJvY2VlZDogYm9vbGVhbik6IFYgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgeyBhYm9ydGVkIH0gPSBhYy5zaWduYWxcbiAgICAgIGNvbnN0IGFsbG93U3RhbGVBYm9ydGVkID0gYWJvcnRlZCAmJiBvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnRcbiAgICAgIGNvbnN0IGFsbG93U3RhbGUgPVxuICAgICAgICBhbGxvd1N0YWxlQWJvcnRlZCB8fCBvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uXG4gICAgICBjb25zdCBub0RlbGV0ZSA9IGFsbG93U3RhbGUgfHwgb3B0aW9ucy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb25cbiAgICAgIGNvbnN0IGJmID0gcCBhcyBCYWNrZ3JvdW5kRmV0Y2g8Vj5cbiAgICAgIGlmICh0aGlzLiN2YWxMaXN0W2luZGV4IGFzIEluZGV4XSA9PT0gcCkge1xuICAgICAgICAvLyBpZiB3ZSBhbGxvdyBzdGFsZSBvbiBmZXRjaCByZWplY3Rpb25zLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgLy8gdGhlIHN0YWxlIHZhbHVlIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlIGZldGNoIGZhaWxzLlxuICAgICAgICBjb25zdCBkZWwgPVxuICAgICAgICAgICFub0RlbGV0ZSB8fCAoIXByb2NlZWQgJiYgYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgaWYgKGRlbCkge1xuICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnZmV0Y2gnKVxuICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd1N0YWxlQWJvcnRlZCkge1xuICAgICAgICAgIC8vIHN0aWxsIHJlcGxhY2UgdGhlICpwcm9taXNlKiB3aXRoIHRoZSBzdGFsZSB2YWx1ZSxcbiAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBwcm9taXNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgLy8gbGVhdmUgaXQgdW50b3VjaGVkIGlmIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGFuXG4gICAgICAgICAgLy8gYWJvcnRlZCBiYWNrZ3JvdW5kIGZldGNoIHRoYXQgaGFzbid0IHlldCByZXR1cm5lZC5cbiAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4IGFzIEluZGV4XSA9IGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhbGxvd1N0YWxlKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnN0YXR1cyAmJiBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgIH0gZWxzZSBpZiAoYmYuX19yZXR1cm5lZCA9PT0gYmYpIHtcbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwY2FsbCA9IChcbiAgICAgIHJlczogKHY6IFYgfCB1bmRlZmluZWQpID0+IHZvaWQsXG4gICAgICByZWo6IChlOiBhbnkpID0+IHZvaWQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmbXAgPSB0aGlzLiNmZXRjaE1ldGhvZD8uKGssIHYsIGZldGNoT3B0cylcbiAgICAgIGlmIChmbXAgJiYgZm1wIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBmbXAudGhlbih2ID0+IHJlcyh2ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB2KSwgcmVqKVxuICAgICAgfVxuICAgICAgLy8gaWdub3JlZCwgd2UgZ28gdW50aWwgd2UgZmluaXNoLCByZWdhcmRsZXNzLlxuICAgICAgLy8gZGVmZXIgY2hlY2sgdW50aWwgd2UgYXJlIGFjdHVhbGx5IGFib3J0aW5nLFxuICAgICAgLy8gc28gZmV0Y2hNZXRob2QgY2FuIG92ZXJyaWRlLlxuICAgICAgYWMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCB8fCBvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICByZXModW5kZWZpbmVkKVxuICAgICAgICAgIC8vIHdoZW4gaXQgZXZlbnR1YWxseSByZXNvbHZlcywgdXBkYXRlIHRoZSBjYWNoZS5cbiAgICAgICAgICBpZiAob3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSB7XG4gICAgICAgICAgICByZXMgPSB2ID0+IGNiKHYsIHRydWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hEaXNwYXRjaGVkID0gdHJ1ZVxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShwY2FsbCkudGhlbihjYiwgZWIpXG4gICAgY29uc3QgYmY6IEJhY2tncm91bmRGZXRjaDxWPiA9IE9iamVjdC5hc3NpZ24ocCwge1xuICAgICAgX19hYm9ydENvbnRyb2xsZXI6IGFjLFxuICAgICAgX19zdGFsZVdoaWxlRmV0Y2hpbmc6IHYsXG4gICAgICBfX3JldHVybmVkOiB1bmRlZmluZWQsXG4gICAgfSlcblxuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBpbnRlcm5hbCwgZG9uJ3QgZXhwb3NlIHN0YXR1cy5cbiAgICAgIHRoaXMuc2V0KGssIGJmLCB7IC4uLmZldGNoT3B0cy5vcHRpb25zLCBzdGF0dXM6IHVuZGVmaW5lZCB9KVxuICAgICAgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gYmZcbiAgICB9XG4gICAgcmV0dXJuIGJmXG4gIH1cblxuICAjaXNCYWNrZ3JvdW5kRmV0Y2gocDogYW55KTogcCBpcyBCYWNrZ3JvdW5kRmV0Y2g8Vj4ge1xuICAgIGlmICghdGhpcy4jaGFzRmV0Y2hNZXRob2QpIHJldHVybiBmYWxzZVxuICAgIGNvbnN0IGIgPSBwIGFzIEJhY2tncm91bmRGZXRjaDxWPlxuICAgIHJldHVybiAoXG4gICAgICAhIWIgJiZcbiAgICAgIGIgaW5zdGFuY2VvZiBQcm9taXNlICYmXG4gICAgICBiLmhhc093blByb3BlcnR5KCdfX3N0YWxlV2hpbGVGZXRjaGluZycpICYmXG4gICAgICBiLl9fYWJvcnRDb250cm9sbGVyIGluc3RhbmNlb2YgQUNcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhbiBhc3luY2hyb25vdXMgY2FjaGVkIGZldGNoIHVzaW5nIHRoZVxuICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IGZ1bmN0aW9uLlxuICAgKlxuICAgKiBJZiB0aGUgdmFsdWUgaXMgaW4gdGhlIGNhY2hlIGFuZCBub3Qgc3RhbGUsIHRoZW4gdGhlIHJldHVybmVkXG4gICAqIFByb21pc2UgcmVzb2x2ZXMgdG8gdGhlIHZhbHVlLlxuICAgKlxuICAgKiBJZiBub3QgaW4gdGhlIGNhY2hlLCBvciBiZXlvbmQgaXRzIFRUTCBzdGFsZW5lc3MsIHRoZW5cbiAgICogYGZldGNoTWV0aG9kKGtleSwgc3RhbGVWYWx1ZSwgeyBvcHRpb25zLCBzaWduYWwsIGNvbnRleHQgfSlgIGlzXG4gICAqIGNhbGxlZCwgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjYWNoZSBvbmNlXG4gICAqIHJlc29sdmVkLlxuICAgKlxuICAgKiBJZiBjYWxsZWQgd2l0aCBgYWxsb3dTdGFsZWAsIGFuZCBhbiBhc3luY2hyb25vdXMgZmV0Y2ggaXNcbiAgICogY3VycmVudGx5IGluIHByb2dyZXNzIHRvIHJlbG9hZCBhIHN0YWxlIHZhbHVlLCB0aGVuIHRoZSBmb3JtZXJcbiAgICogc3RhbGUgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC5cbiAgICpcbiAgICogSWYgY2FsbGVkIHdpdGggYGZvcmNlUmVmcmVzaGAsIHRoZW4gdGhlIGNhY2hlZCBpdGVtIHdpbGwgYmVcbiAgICogcmUtZmV0Y2hlZCwgZXZlbiBpZiBpdCBpcyBub3Qgc3RhbGUuIEhvd2V2ZXIsIGlmIGBhbGxvd1N0YWxlYCBpcyBhbHNvXG4gICAqIHNldCwgdGhlbiB0aGUgb2xkIHZhbHVlIHdpbGwgc3RpbGwgYmUgcmV0dXJuZWQuIFRoaXMgaXMgdXNlZnVsXG4gICAqIGluIGNhc2VzIHdoZXJlIHlvdSB3YW50IHRvIGZvcmNlIGEgcmVsb2FkIG9mIGEgY2FjaGVkIHZhbHVlLiBJZlxuICAgKiBhIGJhY2tncm91bmQgZmV0Y2ggaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgdGhlbiBgZm9yY2VSZWZyZXNoYFxuICAgKiBoYXMgbm8gZWZmZWN0LlxuICAgKlxuICAgKiBJZiBtdWx0aXBsZSBmZXRjaGVzIGZvciB0aGUgc2FtZSBrZXkgYXJlIGlzc3VlZCwgdGhlbiB0aGV5IHdpbGwgYWxsIGJlXG4gICAqIGNvYWxlc2NlZCBpbnRvIGEgc2luZ2xlIGNhbGwgdG8gZmV0Y2hNZXRob2QuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoYXQgaGFuZGxpbmcgb3B0aW9ucyBzdWNoIGFzXG4gICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlT25GZXRjaEFib3J0fSxcbiAgICoge0BsaW5rIExSVUNhY2hlLkZldGNoT3B0aW9ucy5zaWduYWx9LFxuICAgKiBhbmQge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9ufSB3aWxsIGJlXG4gICAqIGRldGVybWluZWQgYnkgdGhlIEZJUlNUIGZldGNoKCkgY2FsbCBmb3IgYSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBrbm93biAoZml4YWJsZSkgc2hvcnRjb21pbmcgd2hpY2ggd2lsbCBiZSBhZGRyZXNlZCBvbiB3aGVuXG4gICAqIHNvbWVvbmUgY29tcGxhaW5zIGFib3V0IGl0LCBhcyB0aGUgZml4IHdvdWxkIGludm9sdmUgYWRkZWQgY29tcGxleGl0eSBhbmRcbiAgICogbWF5IG5vdCBiZSB3b3J0aCB0aGUgY29zdHMgZm9yIHRoaXMgZWRnZSBjYXNlLlxuICAgKlxuICAgKiBJZiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhpcyBpc1xuICAgKiBlZmZlY3RpdmVseSBhbiBhbGlhcyBmb3IgYFByb21pc2UucmVzb2x2ZShjYWNoZS5nZXQoa2V5KSlgLlxuICAgKlxuICAgKiBXaGVuIHRoZSBmZXRjaCBtZXRob2QgcmVzb2x2ZXMgdG8gYSB2YWx1ZSwgaWYgdGhlIGZldGNoIGhhcyBub3RcbiAgICogYmVlbiBhYm9ydGVkIGR1ZSB0byBkZWxldGlvbiwgZXZpY3Rpb24sIG9yIGJlaW5nIG92ZXJ3cml0dGVuLFxuICAgKiB0aGVuIGl0IGlzIGFkZGVkIHRvIHRoZSBjYWNoZSB1c2luZyB0aGUgb3B0aW9ucyBwcm92aWRlZC5cbiAgICpcbiAgICogSWYgdGhlIGtleSBpcyBldmljdGVkIG9yIGRlbGV0ZWQgYmVmb3JlIHRoZSBgZmV0Y2hNZXRob2RgXG4gICAqIHJlc29sdmVzLCB0aGVuIHRoZSBBYm9ydFNpZ25hbCBwYXNzZWQgdG8gdGhlIGBmZXRjaE1ldGhvZGAgd2lsbFxuICAgKiByZWNlaXZlIGFuIGBhYm9ydGAgZXZlbnQsIGFuZCB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBgZmV0Y2goKWBcbiAgICogd2lsbCByZWplY3Qgd2l0aCB0aGUgcmVhc29uIGZvciB0aGUgYWJvcnQuXG4gICAqXG4gICAqIElmIGEgYHNpZ25hbGAgaXMgcGFzc2VkIHRvIHRoZSBgZmV0Y2goKWAgY2FsbCwgdGhlbiBhYm9ydGluZyB0aGVcbiAgICogc2lnbmFsIHdpbGwgYWJvcnQgdGhlIGZldGNoIGFuZCBjYXVzZSB0aGUgYGZldGNoKClgIHByb21pc2UgdG9cbiAgICogcmVqZWN0IHdpdGggdGhlIHJlYXNvbiBwcm92aWRlZC5cbiAgICpcbiAgICogKipTZXR0aW5nIGBjb250ZXh0YCoqXG4gICAqXG4gICAqIElmIGFuIGBGQ2AgdHlwZSBpcyBzZXQgdG8gYSB0eXBlIG90aGVyIHRoYW4gYHVua25vd25gLCBgdm9pZGAsIG9yXG4gICAqIGB1bmRlZmluZWRgIGluIHRoZSB7QGxpbmsgTFJVQ2FjaGV9IGNvbnN0cnVjdG9yLCB0aGVuIGFsbFxuICAgKiBjYWxscyB0byBgY2FjaGUuZmV0Y2goKWAgX211c3RfIHByb3ZpZGUgYSBgY29udGV4dGAgb3B0aW9uLiBJZlxuICAgKiBzZXQgdG8gYHVuZGVmaW5lZGAgb3IgYHZvaWRgLCB0aGVuIGNhbGxzIHRvIGZldGNoIF9tdXN0IG5vdF9cbiAgICogcHJvdmlkZSBhIGBjb250ZXh0YCBvcHRpb24uXG4gICAqXG4gICAqIFRoZSBgY29udGV4dGAgcGFyYW0gYWxsb3dzIHlvdSB0byBwcm92aWRlIGFyYml0cmFyeSBkYXRhIHRoYXRcbiAgICogbWlnaHQgYmUgcmVsZXZhbnQgaW4gdGhlIGNvdXJzZSBvZiBmZXRjaGluZyB0aGUgZGF0YS4gSXQgaXMgb25seVxuICAgKiByZWxldmFudCBmb3IgdGhlIGNvdXJzZSBvZiBhIHNpbmdsZSBgZmV0Y2goKWAgb3BlcmF0aW9uLCBhbmRcbiAgICogZGlzY2FyZGVkIGFmdGVyd2FyZHMuXG4gICAqXG4gICAqICoqTm90ZTogYGZldGNoKClgIGNhbGxzIGFyZSBpbmZsaWdodC11bmlxdWUqKlxuICAgKlxuICAgKiBJZiB5b3UgY2FsbCBgZmV0Y2goKWAgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBrZXkgdmFsdWUsXG4gICAqIHRoZW4gZXZlcnkgY2FsbCBhZnRlciB0aGUgZmlyc3Qgd2lsbCByZXNvbHZlIG9uIHRoZSBzYW1lXG4gICAqIHByb21pc2U8c3VwPjE8L3N1cD4sXG4gICAqIF9ldmVuIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgc2V0dGluZ3MgdGhhdCB3b3VsZCBvdGhlcndpc2UgY2hhbmdlXG4gICAqIHRoZSBiZWhhdmlvciBvZiB0aGUgZmV0Y2hfLCBzdWNoIGFzIGBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb25gXG4gICAqIG9yIGBpZ25vcmVGZXRjaEFib3J0YC5cbiAgICpcbiAgICogSW4gbW9zdCBjYXNlcywgdGhpcyBpcyBub3QgYSBwcm9ibGVtIChpbiBmYWN0LCBvbmx5IGZldGNoaW5nXG4gICAqIHNvbWV0aGluZyBvbmNlIGlzIHdoYXQgeW91IHByb2JhYmx5IHdhbnQsIGlmIHlvdSdyZSBjYWNoaW5nIGluXG4gICAqIHRoZSBmaXJzdCBwbGFjZSkuIElmIHlvdSBhcmUgY2hhbmdpbmcgdGhlIGZldGNoKCkgb3B0aW9uc1xuICAgKiBkcmFtYXRpY2FsbHkgYmV0d2VlbiBydW5zLCB0aGVyZSdzIGEgZ29vZCBjaGFuY2UgdGhhdCB5b3UgbWlnaHRcbiAgICogYmUgdHJ5aW5nIHRvIGZpdCBkaXZlcmdlbnQgc2VtYW50aWNzIGludG8gYSBzaW5nbGUgb2JqZWN0LCBhbmRcbiAgICogd291bGQgYmUgYmV0dGVyIG9mZiB3aXRoIG11bHRpcGxlIGNhY2hlIGluc3RhbmNlcy5cbiAgICpcbiAgICogKioxKio6IEllLCB0aGV5J3JlIG5vdCB0aGUgXCJzYW1lIFByb21pc2VcIiwgYnV0IHRoZXkgcmVzb2x2ZSBhdFxuICAgKiB0aGUgc2FtZSB0aW1lLCBiZWNhdXNlIHRoZXkncmUgYm90aCB3YWl0aW5nIG9uIHRoZSBzYW1lXG4gICAqIHVuZGVybHlpbmcgZmV0Y2hNZXRob2QgcmVzcG9uc2UuXG4gICAqL1xuXG4gIGZldGNoKFxuICAgIGs6IEssXG4gICAgZmV0Y2hPcHRpb25zOiB1bmtub3duIGV4dGVuZHMgRkMgPyBMUlVDYWNoZS5GZXRjaE9wdGlvbnM8SywgViwgRkM+XG4gICAgOiBGQyBleHRlbmRzIHVuZGVmaW5lZCB8IHZvaWQgPyBMUlVDYWNoZS5GZXRjaE9wdGlvbnNOb0NvbnRleHQ8SywgVj5cbiAgICA6IExSVUNhY2hlLkZldGNoT3B0aW9uc1dpdGhDb250ZXh0PEssIFYsIEZDPixcbiAgKTogUHJvbWlzZTx1bmRlZmluZWQgfCBWPlxuXG4gIC8vIHRoaXMgb3ZlcmxvYWQgbm90IGFsbG93ZWQgaWYgY29udGV4dCBpcyByZXF1aXJlZFxuICBmZXRjaChcbiAgICBrOiB1bmtub3duIGV4dGVuZHMgRkMgPyBLXG4gICAgOiBGQyBleHRlbmRzIHVuZGVmaW5lZCB8IHZvaWQgPyBLXG4gICAgOiBuZXZlcixcbiAgICBmZXRjaE9wdGlvbnM/OiB1bmtub3duIGV4dGVuZHMgRkMgPyBMUlVDYWNoZS5GZXRjaE9wdGlvbnM8SywgViwgRkM+XG4gICAgOiBGQyBleHRlbmRzIHVuZGVmaW5lZCB8IHZvaWQgPyBMUlVDYWNoZS5GZXRjaE9wdGlvbnNOb0NvbnRleHQ8SywgVj5cbiAgICA6IG5ldmVyLFxuICApOiBQcm9taXNlPHVuZGVmaW5lZCB8IFY+XG5cbiAgYXN5bmMgZmV0Y2goXG4gICAgazogSyxcbiAgICBmZXRjaE9wdGlvbnM6IExSVUNhY2hlLkZldGNoT3B0aW9uczxLLCBWLCBGQz4gPSB7fSxcbiAgKTogUHJvbWlzZTx1bmRlZmluZWQgfCBWPiB7XG4gICAgY29uc3Qge1xuICAgICAgLy8gZ2V0IG9wdGlvbnNcbiAgICAgIGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsXG4gICAgICB1cGRhdGVBZ2VPbkdldCA9IHRoaXMudXBkYXRlQWdlT25HZXQsXG4gICAgICBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgIC8vIHNldCBvcHRpb25zXG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCxcbiAgICAgIHNpemUgPSAwLFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sXG4gICAgICBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwsXG4gICAgICAvLyBmZXRjaCBleGNsdXNpdmUgb3B0aW9uc1xuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBpZ25vcmVGZXRjaEFib3J0ID0gdGhpcy5pZ25vcmVGZXRjaEFib3J0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBmb3JjZVJlZnJlc2ggPSBmYWxzZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHNpZ25hbCxcbiAgICB9ID0gZmV0Y2hPcHRpb25zXG5cbiAgICBpZiAoIXRoaXMuI2hhc0ZldGNoTWV0aG9kKSB7XG4gICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZmV0Y2ggPSAnZ2V0J1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KGssIHtcbiAgICAgICAgYWxsb3dTdGFsZSxcbiAgICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgYWxsb3dTdGFsZSxcbiAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgdHRsLFxuICAgICAgbm9EaXNwb3NlT25TZXQsXG4gICAgICBzaXplLFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uLFxuICAgICAgbm9VcGRhdGVUVEwsXG4gICAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixcbiAgICAgIGFsbG93U3RhbGVPbkZldGNoQWJvcnQsXG4gICAgICBpZ25vcmVGZXRjaEFib3J0LFxuICAgICAgc3RhdHVzLFxuICAgICAgc2lnbmFsLFxuICAgIH1cblxuICAgIGxldCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ21pc3MnXG4gICAgICBjb25zdCBwID0gdGhpcy4jYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KVxuICAgICAgcmV0dXJuIChwLl9fcmV0dXJuZWQgPSBwKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbiBjYWNoZSwgbWF5YmUgYWxyZWFkeSBmZXRjaGluZ1xuICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdXG4gICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgY29uc3Qgc3RhbGUgPSBhbGxvd1N0YWxlICYmIHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZFxuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgc3RhdHVzLmZldGNoID0gJ2luZmxpZ2h0J1xuICAgICAgICAgIGlmIChzdGFsZSkgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YWxlID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6ICh2Ll9fcmV0dXJuZWQgPSB2KVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBmb3JjZSBhIHJlZnJlc2gsIHRoYXQgbWVhbnMgZG8gTk9UIHNlcnZlIHRoZSBjYWNoZWQgdmFsdWUsXG4gICAgICAvLyB1bmxlc3Mgd2UgYXJlIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgcmVmcmVzaGluZyB0aGUgY2FjaGUuXG4gICAgICBjb25zdCBpc1N0YWxlID0gdGhpcy4jaXNTdGFsZShpbmRleClcbiAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICFpc1N0YWxlKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHN0YXR1cy5mZXRjaCA9ICdoaXQnXG4gICAgICAgIHRoaXMuI21vdmVUb1RhaWwoaW5kZXgpXG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkdldCkge1xuICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXR1cykgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICAgIHJldHVybiB2XG4gICAgICB9XG5cbiAgICAgIC8vIG9rLCBpdCBpcyBzdGFsZSBvciBhIGZvcmNlZCByZWZyZXNoLCBhbmQgbm90IGFscmVhZHkgZmV0Y2hpbmcuXG4gICAgICAvLyByZWZyZXNoIHRoZSBjYWNoZS5cbiAgICAgIGNvbnN0IHAgPSB0aGlzLiNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpXG4gICAgICBjb25zdCBoYXNTdGFsZSA9IHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZFxuICAgICAgY29uc3Qgc3RhbGVWYWwgPSBoYXNTdGFsZSAmJiBhbGxvd1N0YWxlXG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5mZXRjaCA9IGlzU3RhbGUgPyAnc3RhbGUnIDogJ3JlZnJlc2gnXG4gICAgICAgIGlmIChzdGFsZVZhbCAmJiBpc1N0YWxlKSBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGFsZVZhbCA/IHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiAocC5fX3JldHVybmVkID0gcClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW4gc29tZSBjYXNlcywgYGNhY2hlLmZldGNoKClgIG1heSByZXNvbHZlIHRvIGB1bmRlZmluZWRgLCBlaXRoZXIgYmVjYXVzZVxuICAgKiBhIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZSNmZXRjaE1ldGhvZH0gd2FzIG5vdCBwcm92aWRlZCAodHVybmluZ1xuICAgKiBgY2FjaGUuZmV0Y2goaylgIGludG8ganVzdCBhbiBhc3luYyB3cmFwcGVyIGFyb3VuZCBgY2FjaGUuZ2V0KGspYCkgb3JcbiAgICogYmVjYXVzZSBgaWdub3JlRmV0Y2hBYm9ydGAgd2FzIHNwZWNpZmllZCAoZWl0aGVyIHRvIHRoZSBjb25zdHJ1Y3RvciBvclxuICAgKiBpbiB0aGUge0BsaW5rIExSVUNhY2hlLkZldGNoT3B0aW9uc30pLiBBbHNvLCB0aGVcbiAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSBtYXkgcmV0dXJuIGB1bmRlZmluZWRgIG9yIGB2b2lkYCwgbWFraW5nXG4gICAqIHRoZSB0ZXN0IGV2ZW4gbW9yZSBjb21wbGljYXRlZC5cbiAgICpcbiAgICogQmVjYXVzZSBpbmZlcnJpbmcgdGhlIGNhc2VzIHdoZXJlIGB1bmRlZmluZWRgIG1pZ2h0IGJlIHJldHVybmVkIGFyZSBzb1xuICAgKiBjdW1iZXJzb21lLCBidXQgdGVzdGluZyBmb3IgYHVuZGVmaW5lZGAgY2FuIGFsc28gYmUgYW5ub3lpbmcsIHRoaXMgbWV0aG9kXG4gICAqIGNhbiBiZSB1c2VkLCB3aGljaCB3aWxsIHJlamVjdCBpZiBgdGhpcy5mZXRjaCgpYCByZXNvbHZlcyB0byB1bmRlZmluZWQuXG4gICAqL1xuICBmb3JjZUZldGNoKFxuICAgIGs6IEssXG4gICAgZmV0Y2hPcHRpb25zOiB1bmtub3duIGV4dGVuZHMgRkMgPyBMUlVDYWNoZS5GZXRjaE9wdGlvbnM8SywgViwgRkM+XG4gICAgOiBGQyBleHRlbmRzIHVuZGVmaW5lZCB8IHZvaWQgPyBMUlVDYWNoZS5GZXRjaE9wdGlvbnNOb0NvbnRleHQ8SywgVj5cbiAgICA6IExSVUNhY2hlLkZldGNoT3B0aW9uc1dpdGhDb250ZXh0PEssIFYsIEZDPixcbiAgKTogUHJvbWlzZTxWPlxuICAvLyB0aGlzIG92ZXJsb2FkIG5vdCBhbGxvd2VkIGlmIGNvbnRleHQgaXMgcmVxdWlyZWRcbiAgZm9yY2VGZXRjaChcbiAgICBrOiB1bmtub3duIGV4dGVuZHMgRkMgPyBLXG4gICAgOiBGQyBleHRlbmRzIHVuZGVmaW5lZCB8IHZvaWQgPyBLXG4gICAgOiBuZXZlcixcbiAgICBmZXRjaE9wdGlvbnM/OiB1bmtub3duIGV4dGVuZHMgRkMgPyBMUlVDYWNoZS5GZXRjaE9wdGlvbnM8SywgViwgRkM+XG4gICAgOiBGQyBleHRlbmRzIHVuZGVmaW5lZCB8IHZvaWQgPyBMUlVDYWNoZS5GZXRjaE9wdGlvbnNOb0NvbnRleHQ8SywgVj5cbiAgICA6IG5ldmVyLFxuICApOiBQcm9taXNlPFY+XG4gIGFzeW5jIGZvcmNlRmV0Y2goXG4gICAgazogSyxcbiAgICBmZXRjaE9wdGlvbnM6IExSVUNhY2hlLkZldGNoT3B0aW9uczxLLCBWLCBGQz4gPSB7fSxcbiAgKTogUHJvbWlzZTxWPiB7XG4gICAgY29uc3QgdiA9IGF3YWl0IHRoaXMuZmV0Y2goXG4gICAgICBrLFxuICAgICAgZmV0Y2hPcHRpb25zIGFzIHVua25vd24gZXh0ZW5kcyBGQyA/IExSVUNhY2hlLkZldGNoT3B0aW9uczxLLCBWLCBGQz5cbiAgICAgIDogRkMgZXh0ZW5kcyB1bmRlZmluZWQgfCB2b2lkID8gTFJVQ2FjaGUuRmV0Y2hPcHRpb25zTm9Db250ZXh0PEssIFY+XG4gICAgICA6IExSVUNhY2hlLkZldGNoT3B0aW9uc1dpdGhDb250ZXh0PEssIFYsIEZDPixcbiAgICApXG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdmZXRjaCgpIHJldHVybmVkIHVuZGVmaW5lZCcpXG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUga2V5IGlzIGZvdW5kIGluIHRoZSBjYWNoZSwgdGhlbiB0aGlzIGlzIGVxdWl2YWxlbnQgdG9cbiAgICoge0BsaW5rIExSVUNhY2hlI2dldH0uIElmIG5vdCwgaW4gdGhlIGNhY2hlLCB0aGVuIGNhbGN1bGF0ZSB0aGUgdmFsdWUgdXNpbmdcbiAgICogdGhlIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tZW1vTWV0aG9kfSwgYW5kIGFkZCBpdCB0byB0aGUgY2FjaGUuXG4gICAqXG4gICAqIElmIGFuIGBGQ2AgdHlwZSBpcyBzZXQgdG8gYSB0eXBlIG90aGVyIHRoYW4gYHVua25vd25gLCBgdm9pZGAsIG9yXG4gICAqIGB1bmRlZmluZWRgIGluIHRoZSBMUlVDYWNoZSBjb25zdHJ1Y3RvciwgdGhlbiBhbGwgY2FsbHMgdG8gYGNhY2hlLm1lbW8oKWBcbiAgICogX211c3RfIHByb3ZpZGUgYSBgY29udGV4dGAgb3B0aW9uLiBJZiBzZXQgdG8gYHVuZGVmaW5lZGAgb3IgYHZvaWRgLCB0aGVuXG4gICAqIGNhbGxzIHRvIG1lbW8gX211c3Qgbm90XyBwcm92aWRlIGEgYGNvbnRleHRgIG9wdGlvbi5cbiAgICpcbiAgICogVGhlIGBjb250ZXh0YCBwYXJhbSBhbGxvd3MgeW91IHRvIHByb3ZpZGUgYXJiaXRyYXJ5IGRhdGEgdGhhdCBtaWdodCBiZVxuICAgKiByZWxldmFudCBpbiB0aGUgY291cnNlIG9mIGZldGNoaW5nIHRoZSBkYXRhLiBJdCBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGVcbiAgICogY291cnNlIG9mIGEgc2luZ2xlIGBtZW1vKClgIG9wZXJhdGlvbiwgYW5kIGRpc2NhcmRlZCBhZnRlcndhcmRzLlxuICAgKi9cbiAgbWVtbyhcbiAgICBrOiBLLFxuICAgIG1lbW9PcHRpb25zOiB1bmtub3duIGV4dGVuZHMgRkMgPyBMUlVDYWNoZS5NZW1vT3B0aW9uczxLLCBWLCBGQz5cbiAgICA6IEZDIGV4dGVuZHMgdW5kZWZpbmVkIHwgdm9pZCA/IExSVUNhY2hlLk1lbW9PcHRpb25zTm9Db250ZXh0PEssIFY+XG4gICAgOiBMUlVDYWNoZS5NZW1vT3B0aW9uc1dpdGhDb250ZXh0PEssIFYsIEZDPixcbiAgKTogVlxuICAvLyB0aGlzIG92ZXJsb2FkIG5vdCBhbGxvd2VkIGlmIGNvbnRleHQgaXMgcmVxdWlyZWRcbiAgbWVtbyhcbiAgICBrOiB1bmtub3duIGV4dGVuZHMgRkMgPyBLXG4gICAgOiBGQyBleHRlbmRzIHVuZGVmaW5lZCB8IHZvaWQgPyBLXG4gICAgOiBuZXZlcixcbiAgICBtZW1vT3B0aW9ucz86IHVua25vd24gZXh0ZW5kcyBGQyA/IExSVUNhY2hlLk1lbW9PcHRpb25zPEssIFYsIEZDPlxuICAgIDogRkMgZXh0ZW5kcyB1bmRlZmluZWQgfCB2b2lkID8gTFJVQ2FjaGUuTWVtb09wdGlvbnNOb0NvbnRleHQ8SywgVj5cbiAgICA6IG5ldmVyLFxuICApOiBWXG4gIG1lbW8oazogSywgbWVtb09wdGlvbnM6IExSVUNhY2hlLk1lbW9PcHRpb25zPEssIFYsIEZDPiA9IHt9KSB7XG4gICAgY29uc3QgbWVtb01ldGhvZCA9IHRoaXMuI21lbW9NZXRob2RcbiAgICBpZiAoIW1lbW9NZXRob2QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gbWVtb01ldGhvZCBwcm92aWRlZCB0byBjb25zdHJ1Y3RvcicpXG4gICAgfVxuICAgIGNvbnN0IHsgY29udGV4dCwgZm9yY2VSZWZyZXNoLCAuLi5vcHRpb25zIH0gPSBtZW1vT3B0aW9uc1xuICAgIGNvbnN0IHYgPSB0aGlzLmdldChrLCBvcHRpb25zKVxuICAgIGlmICghZm9yY2VSZWZyZXNoICYmIHYgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHZcbiAgICBjb25zdCB2diA9IG1lbW9NZXRob2Qoaywgdiwge1xuICAgICAgb3B0aW9ucyxcbiAgICAgIGNvbnRleHQsXG4gICAgfSBhcyBMUlVDYWNoZS5NZW1vaXplck9wdGlvbnM8SywgViwgRkM+KVxuICAgIHRoaXMuc2V0KGssIHZ2LCBvcHRpb25zKVxuICAgIHJldHVybiB2dlxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHZhbHVlIGZyb20gdGhlIGNhY2hlLiBXaWxsIHVwZGF0ZSB0aGUgcmVjZW5jeSBvZiB0aGUgY2FjaGVcbiAgICogZW50cnkgZm91bmQuXG4gICAqXG4gICAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCBnZXQoKSB3aWxsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGdldChrOiBLLCBnZXRPcHRpb25zOiBMUlVDYWNoZS5HZXRPcHRpb25zPEssIFYsIEZDPiA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSxcbiAgICAgIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgc3RhdHVzLFxuICAgIH0gPSBnZXRPcHRpb25zXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jdmFsTGlzdFtpbmRleF1cbiAgICAgIGNvbnN0IGZldGNoaW5nID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godmFsdWUpXG4gICAgICBpZiAoc3RhdHVzKSB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ3N0YWxlJ1xuICAgICAgICAvLyBkZWxldGUgb25seSBpZiBub3QgYW4gaW4tZmxpZ2h0IGJhY2tncm91bmQgZmV0Y2hcbiAgICAgICAgaWYgKCFmZXRjaGluZykge1xuICAgICAgICAgIGlmICghbm9EZWxldGVPblN0YWxlR2V0KSB7XG4gICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ2V4cGlyZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0dXMgJiYgYWxsb3dTdGFsZSkgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlXG4gICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHN0YXR1cyAmJlxuICAgICAgICAgICAgYWxsb3dTdGFsZSAmJlxuICAgICAgICAgICAgdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhbGxvd1N0YWxlID8gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmdldCA9ICdoaXQnXG4gICAgICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBmZXRjaGluZyBpdCwgd2UgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBpdCB5ZXRcbiAgICAgICAgLy8gaXQncyBub3Qgc3RhbGUsIHdoaWNoIG1lYW5zIHRoaXMgaXNuJ3QgYSBzdGFsZVdoaWxlUmVmZXRjaGluZy5cbiAgICAgICAgLy8gSWYgaXQncyBub3Qgc3RhbGUsIGFuZCBmZXRjaGluZywgQU5EIGhhcyBhIF9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgIC8vIHZhbHVlLCB0aGVuIHRoYXQgbWVhbnMgdGhlIHVzZXIgZmV0Y2hlZCB3aXRoIHtmb3JjZVJlZnJlc2g6dHJ1ZX0sXG4gICAgICAgIC8vIHNvIGl0J3Mgc2FmZSB0byByZXR1cm4gdGhhdCB2YWx1ZS5cbiAgICAgICAgaWYgKGZldGNoaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleClcbiAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLmdldCA9ICdtaXNzJ1xuICAgIH1cbiAgfVxuXG4gICNjb25uZWN0KHA6IEluZGV4LCBuOiBJbmRleCkge1xuICAgIHRoaXMuI3ByZXZbbl0gPSBwXG4gICAgdGhpcy4jbmV4dFtwXSA9IG5cbiAgfVxuXG4gICNtb3ZlVG9UYWlsKGluZGV4OiBJbmRleCk6IHZvaWQge1xuICAgIC8vIGlmIHRhaWwgYWxyZWFkeSwgbm90aGluZyB0byBkb1xuICAgIC8vIGlmIGhlYWQsIG1vdmUgaGVhZCB0byBuZXh0W2luZGV4XVxuICAgIC8vIGVsc2VcbiAgICAvLyAgIG1vdmUgbmV4dFtwcmV2W2luZGV4XV0gdG8gbmV4dFtpbmRleF0gKGhlYWQgaGFzIG5vIHByZXYpXG4gICAgLy8gICBtb3ZlIHByZXZbbmV4dFtpbmRleF1dIHRvIHByZXZbaW5kZXhdXG4gICAgLy8gcHJldltpbmRleF0gPSB0YWlsXG4gICAgLy8gbmV4dFt0YWlsXSA9IGluZGV4XG4gICAgLy8gdGFpbCA9IGluZGV4XG4gICAgaWYgKGluZGV4ICE9PSB0aGlzLiN0YWlsKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHRoaXMuI2hlYWQpIHtcbiAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaW5kZXhdIGFzIEluZGV4XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNjb25uZWN0KFxuICAgICAgICAgIHRoaXMuI3ByZXZbaW5kZXhdIGFzIEluZGV4LFxuICAgICAgICAgIHRoaXMuI25leHRbaW5kZXhdIGFzIEluZGV4LFxuICAgICAgICApXG4gICAgICB9XG4gICAgICB0aGlzLiNjb25uZWN0KHRoaXMuI3RhaWwsIGluZGV4KVxuICAgICAgdGhpcy4jdGFpbCA9IGluZGV4XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBrZXkgb3V0IG9mIHRoZSBjYWNoZS5cbiAgICpcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgd2FzIGRlbGV0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGRlbGV0ZShrOiBLKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZShrLCAnZGVsZXRlJylcbiAgfVxuXG4gICNkZWxldGUoazogSywgcmVhc29uOiBMUlVDYWNoZS5EaXNwb3NlUmVhc29uKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGlmICh0aGlzLiNzaXplICE9PSAwKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoaylcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLiNhdXRvcHVyZ2VUaW1lcnM/LltpbmRleF0pIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jYXV0b3B1cmdlVGltZXJzPy5baW5kZXhdKVxuICAgICAgICAgIHRoaXMuI2F1dG9wdXJnZVRpbWVyc1tpbmRleF0gPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVkID0gdHJ1ZVxuICAgICAgICBpZiAodGhpcy4jc2l6ZSA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuI2NsZWFyKHJlYXNvbilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZShpbmRleClcbiAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF1cbiAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgIHYuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdkZWxldGVkJykpXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNoYXNEaXNwb3NlIHx8IHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYgYXMgViwgaywgcmVhc29uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbdiBhcyBWLCBrLCByZWFzb25dKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLiNrZXlNYXAuZGVsZXRlKGspXG4gICAgICAgICAgdGhpcy4ja2V5TGlzdFtpbmRleF0gPSB1bmRlZmluZWRcbiAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHVuZGVmaW5lZFxuICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy4jdGFpbCkge1xuICAgICAgICAgICAgdGhpcy4jdGFpbCA9IHRoaXMuI3ByZXZbaW5kZXhdIGFzIEluZGV4XG4gICAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PT0gdGhpcy4jaGVhZCkge1xuICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaW5kZXhdIGFzIEluZGV4XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBpID0gdGhpcy4jcHJldltpbmRleF0gYXMgbnVtYmVyXG4gICAgICAgICAgICB0aGlzLiNuZXh0W3BpXSA9IHRoaXMuI25leHRbaW5kZXhdIGFzIG51bWJlclxuICAgICAgICAgICAgY29uc3QgbmkgPSB0aGlzLiNuZXh0W2luZGV4XSBhcyBudW1iZXJcbiAgICAgICAgICAgIHRoaXMuI3ByZXZbbmldID0gdGhpcy4jcHJldltpbmRleF0gYXMgbnVtYmVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuI3NpemUtLVxuICAgICAgICAgIHRoaXMuI2ZyZWUucHVzaChpbmRleClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWRcbiAgICAgIGxldCB0YXNrOiBEaXNwb3NlVGFzazxLLCBWPiB8IHVuZGVmaW5lZFxuICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGNhY2hlIGVudGlyZWx5LCB0aHJvd2luZyBhd2F5IGFsbCB2YWx1ZXMuXG4gICAqL1xuICBjbGVhcigpIHtcbiAgICByZXR1cm4gdGhpcy4jY2xlYXIoJ2RlbGV0ZScpXG4gIH1cbiAgI2NsZWFyKHJlYXNvbjogTFJVQ2FjaGUuRGlzcG9zZVJlYXNvbikge1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdGhpcy4jcmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF1cbiAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZGVsZXRlZCcpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaW5kZXhdXG4gICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYgYXMgViwgayBhcyBLLCByZWFzb24pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2IGFzIFYsIGsgYXMgSywgcmVhc29uXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuI2tleU1hcC5jbGVhcigpXG4gICAgdGhpcy4jdmFsTGlzdC5maWxsKHVuZGVmaW5lZClcbiAgICB0aGlzLiNrZXlMaXN0LmZpbGwodW5kZWZpbmVkKVxuICAgIGlmICh0aGlzLiN0dGxzICYmIHRoaXMuI3N0YXJ0cykge1xuICAgICAgdGhpcy4jdHRscy5maWxsKDApXG4gICAgICB0aGlzLiNzdGFydHMuZmlsbCgwKVxuICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuI2F1dG9wdXJnZVRpbWVycyA/PyBbXSkge1xuICAgICAgICBpZiAodCAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodClcbiAgICAgIH1cbiAgICAgIHRoaXMuI2F1dG9wdXJnZVRpbWVycz8uZmlsbCh1bmRlZmluZWQpXG4gICAgfVxuICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgdGhpcy4jc2l6ZXMuZmlsbCgwKVxuICAgIH1cbiAgICB0aGlzLiNoZWFkID0gMCBhcyBJbmRleFxuICAgIHRoaXMuI3RhaWwgPSAwIGFzIEluZGV4XG4gICAgdGhpcy4jZnJlZS5sZW5ndGggPSAwXG4gICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwXG4gICAgdGhpcy4jc2l6ZSA9IDBcbiAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkXG4gICAgICBsZXQgdGFzazogRGlzcG9zZVRhc2s8SywgVj4gfCB1bmRlZmluZWRcbiAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tIFwibHJ1LWNhY2hlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhY2hlZE1hcDxLIGV4dGVuZHMge30sIFYgZXh0ZW5kcyB7fT4gaW1wbGVtZW50cyBNYXA8SywgVj4ge1xuICAgIHJlYWRvbmx5IGNhY2hlOiBMUlVDYWNoZTxLLCBWPjtcbiAgICByZWFkb25seSBtYXA6IE1hcDxLLCBWPiA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IGNhY2hlU2l6ZTogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBMUlVDYWNoZTxLLCBWPih7XG4gICAgICAgICAgICBtYXg6IG9wdGlvbnMuY2FjaGVTaXplLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGdldCBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgfVxuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gICAgfVxuICAgIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5jbGVhcigpO1xuICAgIH1cbiAgICBkZWxldGUoa2V5OiBLKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLm1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgaWYgKGRlbGV0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuICAgIGdldCBmb3JFYWNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZm9yRWFjaDtcbiAgICB9XG4gICAgZ2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBjYWNoZWRWYWx1ZSA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIGlmIChjYWNoZWRWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5nZXQoa2V5KTtcbiAgICB9XG4gICAgaGFzKGtleTogSyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIHNldChrZXk6IEssIHZhbHVlOiBWKTogdGhpcyB7XG4gICAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnNpemU7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5lbnRyaWVzKCk7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gICAgfVxuICAgIHZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEdhbWVTdGVwU3RhdGUgfSBmcm9tIFwiQGRyaW5jcy9waXhpLXZuXCI7XG5pbXBvcnQgZGVlcERpZmYgZnJvbSBcImRlZXAtZGlmZlwiO1xuaW1wb3J0IHsgRGlmZmVyZW5jZSB9IGZyb20gXCJtaWNyb2RpZmZcIjtcbmltcG9ydCB7IENhY2hlZE1hcCB9IGZyb20gXCIuLi9jbGFzc2VzXCI7XG5pbXBvcnQgeyBIaXN0b3J5U3RlcCwgTmFycmF0aW9uSGlzdG9yeSB9IGZyb20gXCIuLi9uYXJyYXRpb25cIjtcbmltcG9ydCB7IGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnlNYW5hZ2VyU3RhdGljIHtcbiAgICBzdGF0aWMgX2RpZmZIaXN0b3J5ID0gbmV3IENhY2hlZE1hcDxudW1iZXIsIGRlZXBEaWZmLkRpZmY8R2FtZVN0ZXBTdGF0ZSwgR2FtZVN0ZXBTdGF0ZT5bXSB8IERpZmZlcmVuY2VbXT4oe1xuICAgICAgICBjYWNoZVNpemU6IDUsXG4gICAgfSk7XG4gICAgc3RhdGljIF9zdGVwc0luZm9IaXN0b3J5ID0gbmV3IENhY2hlZE1hcDxudW1iZXIsIE9taXQ8SGlzdG9yeVN0ZXAsIFwiZGlmZlwiPj4oeyBjYWNoZVNpemU6IDUgfSk7XG4gICAgc3RhdGljIF9uYXJyYXRpb25IaXN0b3J5ID0gbmV3IENhY2hlZE1hcDxudW1iZXIsIE5hcnJhdGlvbkhpc3Rvcnk+KHsgY2FjaGVTaXplOiA1MCB9KTtcbiAgICBzdGF0aWMgc3RlcExpbWl0U2F2ZWQ6IG51bWJlciA9IDIwO1xuICAgIHN0YXRpYyBfb3JpZ2luYWxTdGVwRGF0YTogR2FtZVN0ZXBTdGF0ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBzdGF0aWMgZ2V0IG9yaWdpbmFsU3RlcERhdGEoKTogR2FtZVN0ZXBTdGF0ZSB7XG4gICAgICAgIGlmICghSGlzdG9yeU1hbmFnZXJTdGF0aWMuX29yaWdpbmFsU3RlcERhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICBzdG9yYWdlOiB7fSxcbiAgICAgICAgICAgICAgICBjYW52YXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEFsaWFzZXNPcmRlcjogW10sXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2U6IHt9LFxuICAgICAgICAgICAgICAgICAgICB0aWNrZXJzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgdGlja2Vyc1N0ZXBzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgdGlja2Vyc09uUGF1c2U6IHt9LFxuICAgICAgICAgICAgICAgICAgICB0aWNrZXJzVG9Db21wbGV0ZU9uU3RlcEVuZDogeyB0aWtlcnNJZHM6IFtdLCBzdGVwQWxpYXM6IFtdIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICBzb3VuZEFsaWFzZXNPcmRlcjogW10sXG4gICAgICAgICAgICAgICAgICAgIHNvdW5kc1BsYXlpbmc6IHt9LFxuICAgICAgICAgICAgICAgICAgICBwbGF5SW5TdGVwSW5kZXg6IHt9LFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsYWJlbEluZGV4OiAtMSxcbiAgICAgICAgICAgICAgICBvcGVuZWRMYWJlbHM6IFtdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQoSGlzdG9yeU1hbmFnZXJTdGF0aWMuX29yaWdpbmFsU3RlcERhdGEpO1xuICAgIH1cbiAgICBzdGF0aWMgc2V0IG9yaWdpbmFsU3RlcERhdGEodmFsdWU6IEdhbWVTdGVwU3RhdGUpIHtcbiAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX29yaWdpbmFsU3RlcERhdGEgPSBjcmVhdGVFeHBvcnRhYmxlRWxlbWVudCh2YWx1ZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgR2FtZVN0ZXBTdGF0ZSwgSGlzdG9yeUluZm8gfSBmcm9tIFwiQGRyaW5jcy9waXhpLXZuXCI7XG5pbXBvcnQgeyBHYW1lVW5pZmllciB9IGZyb20gXCJAZHJpbmNzL3BpeGktdm4vY29yZVwiO1xuaW1wb3J0IGRpZmYgZnJvbSBcIm1pY3JvZGlmZlwiO1xuaW1wb3J0IHsgSGlzdG9yeUNob2ljZU1lbnVPcHRpb24sIEhpc3RvcnlTdGVwLCBOYXJyYXRpb25IaXN0b3J5LCBTdGVwTGFiZWxQcm9wc1R5cGUgfSBmcm9tIFwiLi4vbmFycmF0aW9uXCI7XG5pbXBvcnQgeyBTdG9yYWdlRWxlbWVudFR5cGUgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlcy9TdG9yYWdlRWxlbWVudFR5cGVcIjtcbmltcG9ydCB7IGNyZWF0ZUV4cG9ydGFibGVFbGVtZW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByZXN0b3JlRGlmZkNoYW5nZXMgfSBmcm9tIFwiLi4vdXRpbHMvZGlmZi11dGlsaXR5XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vdXRpbHMvbG9nLXV0aWxpdHlcIjtcbmltcG9ydCBIaXN0b3J5TWFuYWdlclN0YXRpYyBmcm9tIFwiLi9IaXN0b3J5TWFuYWdlclN0YXRpY1wiO1xuaW1wb3J0IEhpc3RvcnlHYW1lU3RhdGUgZnJvbSBcIi4vaW50ZXJmYWNlcy9IaXN0b3J5R2FtZVN0YXRlXCI7XG5pbXBvcnQgSGlzdG9yeU1hbmFnZXJJbnRlcmZhY2UgZnJvbSBcIi4vaW50ZXJmYWNlcy9IaXN0b3J5TWFuYWdlckludGVyZmFjZVwiO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYSBjbGFzcyB0aGF0IG1hbmFnZXMgdGhlIHN0ZXBzIGFuZCBsYWJlbHMgb2YgdGhlIGdhbWUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnlNYW5hZ2VyIGltcGxlbWVudHMgSGlzdG9yeU1hbmFnZXJJbnRlcmZhY2Uge1xuICAgIGdldCBzdGVwc0luZm9NYXAoKSB7XG4gICAgICAgIHJldHVybiBIaXN0b3J5TWFuYWdlclN0YXRpYy5fc3RlcHNJbmZvSGlzdG9yeTtcbiAgICB9XG4gICAgZ2V0IGRpZmZNYXAoKSB7XG4gICAgICAgIHJldHVybiBIaXN0b3J5TWFuYWdlclN0YXRpYy5fZGlmZkhpc3Rvcnk7XG4gICAgfVxuICAgIGdldCBuYXJyYXRpb25NYXAoKSB7XG4gICAgICAgIHJldHVybiBIaXN0b3J5TWFuYWdlclN0YXRpYy5fbmFycmF0aW9uSGlzdG9yeTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9zdGVwc0luZm9IaXN0b3J5LnNpemU7XG4gICAgfVxuICAgIGdldCBsYXN0S2V5KCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoLi4uQXJyYXkuZnJvbSh0aGlzLmtleXMoKSkpO1xuICAgIH1cbiAgICBrZXlzKCkge1xuICAgICAgICByZXR1cm4gSGlzdG9yeU1hbmFnZXJTdGF0aWMuX3N0ZXBzSW5mb0hpc3Rvcnkua2V5cygpO1xuICAgIH1cbiAgICBnZXQoc3RlcEluZGV4OiBudW1iZXIpOiBOYXJyYXRpb25IaXN0b3J5IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9uYXJyYXRpb25IaXN0b3J5LmdldChzdGVwSW5kZXgpO1xuICAgICAgICBpZiAoaXRlbSAmJiBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGggPT09IDEgJiYgaXRlbS5zdGVwSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgZGVsZXRlKHN0ZXBJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9zdGVwc0luZm9IaXN0b3J5LmRlbGV0ZShzdGVwSW5kZXgpO1xuICAgICAgICBIaXN0b3J5TWFuYWdlclN0YXRpYy5fZGlmZkhpc3RvcnkuZGVsZXRlKHN0ZXBJbmRleCk7XG4gICAgICAgIEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9uYXJyYXRpb25IaXN0b3J5LmRlbGV0ZShzdGVwSW5kZXgpO1xuICAgIH1cbiAgICBwcml2YXRlIGdldE9sZEdhbWVTdGF0ZShzdGVwczogbnVtYmVyLCByZXN0b3JlZFN0ZXA6IEdhbWVTdGVwU3RhdGUpOiBHYW1lU3RlcFN0YXRlIHtcbiAgICAgICAgaWYgKHN0ZXBzIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN0b3JlZFN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2l6ZSA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdG9yZWRTdGVwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSB0aGlzLmxhc3RLZXk7XG4gICAgICAgIGlmICh0eXBlb2YgbGFzdEtleSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJZb3UgY2FuJ3QgZ28gYmFjaywgdGhlcmUgaXMgbm8gc3RlcCB0byBnbyBiYWNrXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3RvcmVkU3RlcDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWZmID0gSGlzdG9yeU1hbmFnZXJTdGF0aWMuX2RpZmZIaXN0b3J5LmdldChsYXN0S2V5KTtcbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3RvcmVEaWZmQ2hhbmdlcyhyZXN0b3JlZFN0ZXAsIGRpZmYpO1xuICAgICAgICAgICAgICAgIEdhbWVVbmlmaWVyLnN0ZXBDb3VudGVyID0gbGFzdEtleTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZShsYXN0S2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPbGRHYW1lU3RhdGUoc3RlcHMgLSAxLCByZXN1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGFwcGx5aW5nIGRpZmZcIiwgZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3RvcmVkU3RlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiTm8gZGlmZiBmb3VuZCBmb3IgdGhlIGxhc3Qgc3RlcCwgY2Fubm90IGdvIGJhY2tcIik7XG4gICAgICAgICAgICByZXR1cm4gcmVzdG9yZWRTdGVwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBiYWNrKHByb3BzOiBTdGVwTGFiZWxQcm9wc1R5cGUsIG9wdGlvbnM6IHsgc3RlcHM/OiBudW1iZXIgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc3RlcHMgPSAxIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzdGVwcykpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbYmFja10gVGhlIHBhcmFtZXRlciBzdGVwcyBtdXN0IGJlIGEgdmFsaWQgZmluaXRlIG51bWJlciwgcmVjZWl2ZWQ6ICR7c3RlcHN9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZXBzIDw9IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbYmFja10gVGhlIHBhcmFtZXRlciBzdGVwcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLCByZWNlaXZlZDogJHtzdGVwc31gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5pbmNyZWFzZUJhY2tSZXF1ZXN0KHN0ZXBzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSGlzdG9yeU1hbmFnZXJTdGF0aWMuX2RpZmZIaXN0b3J5LnNpemUgPCAxKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIllvdSBjYW4ndCBnbyBiYWNrLCB0aGVyZSBpcyBubyBzdGVwIHRvIGdvIGJhY2tcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgR2FtZVVuaWZpZXIucnVubmluZ1N0ZXBzQ291bnQrKztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXN0b3JlZFN0ZXAgPSBjcmVhdGVFeHBvcnRhYmxlRWxlbWVudChcbiAgICAgICAgICAgICAgICB0aGlzLmdldE9sZEdhbWVTdGF0ZShzdGVwcywgSGlzdG9yeU1hbmFnZXJTdGF0aWMub3JpZ2luYWxTdGVwRGF0YSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHJlc3RvcmVkU3RlcCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IEdhbWVVbmlmaWVyLnJlc3RvcmVHYW1lU3RlcFN0YXRlKHJlc3RvcmVkU3RlcCwgR2FtZVVuaWZpZXIubmF2aWdhdGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBDb3VudGVyID0gR2FtZVVuaWZpZXIuc3RlcENvdW50ZXIgLSAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBIaXN0b3J5TWFuYWdlclN0YXRpYy5fbmFycmF0aW9uSGlzdG9yeS5nZXQoc3RlcENvdW50ZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMSAmJiBpdGVtLnN0ZXBJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpc3RvcnlJbmZvID0gSGlzdG9yeU1hbmFnZXJTdGF0aWMuX3N0ZXBzSW5mb0hpc3RvcnkuZ2V0KHN0ZXBDb3VudGVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnlJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXJyYXRpdmVIaXN0b3J5ID0gdGhpcy5pdGVtTWFwcGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiBoaXN0b3J5SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX25hcnJhdGlvbkhpc3Rvcnkuc2V0KGhpc3RvcnlJbmZvLmluZGV4LCBuYXJyYXRpdmVIaXN0b3J5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgZ29pbmcgYmFja1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEhpc3RvcnlNYW5hZ2VyU3RhdGljLm9yaWdpbmFsU3RlcERhdGEgPSByZXN0b3JlZFN0ZXA7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGdvaW5nIGJhY2tcIiwgZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBHYW1lVW5pZmllci5ydW5uaW5nU3RlcHNDb3VudC0tO1xuICAgICAgICAgICAgaWYgKEdhbWVVbmlmaWVyLnJ1bm5pbmdTdGVwc0NvdW50ID09PSAwICYmIEdhbWVVbmlmaWVyLmJhY2tSZXF1ZXN0c0NvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEdhbWVVbmlmaWVyLnByb2Nlc3NOYXZpZ2F0aW9uUmVxdWVzdHMocHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFkZChcbiAgICAgICAgaGlzdG9yeUluZm86IEhpc3RvcnlJbmZvLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBpZ25vcmVTYW1lU3RlcD86IGJvb2xlYW47XG4gICAgICAgIH0gPSB7fSxcbiAgICApIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGVwRGF0YSA9IEhpc3RvcnlNYW5hZ2VyU3RhdGljLm9yaWdpbmFsU3RlcERhdGE7XG4gICAgICAgIGNvbnN0IHsgaWdub3JlU2FtZVN0ZXAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGVwRGF0YTogR2FtZVN0ZXBTdGF0ZSA9IEdhbWVVbmlmaWVyLmN1cnJlbnRHYW1lU3RlcFN0YXRlO1xuICAgICAgICBpZiAoIWlnbm9yZVNhbWVTdGVwICYmIHRoaXMuaXNTYW1lU3RlcChvcmlnaW5hbFN0ZXBEYXRhLCBjdXJyZW50U3RlcERhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdEtleSA9IHRoaXMubGFzdEtleTtcbiAgICAgICAgY29uc3QgYXN5bmNGdW5jdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RTdGVwSGlzdG9yeTogT21pdDxIaXN0b3J5U3RlcCwgXCJkaWZmXCI+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBsYXN0TmFycmF0aXZlSGlzdG9yeTogTmFycmF0aW9uSGlzdG9yeSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxhc3RLZXkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFN0ZXBIaXN0b3J5ID0gSGlzdG9yeU1hbmFnZXJTdGF0aWMuX3N0ZXBzSW5mb0hpc3RvcnkuZ2V0KGxhc3RLZXkpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0TmFycmF0aXZlSGlzdG9yeSA9IEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9uYXJyYXRpb25IaXN0b3J5LmdldChsYXN0S2V5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBIaXN0b3J5TWFuYWdlclN0YXRpYy5fc3RlcHNJbmZvSGlzdG9yeS5zZXQoaGlzdG9yeUluZm8uaW5kZXgsIGhpc3RvcnlJbmZvKTtcbiAgICAgICAgICAgICAgICBpZiAoaGlzdG9yeUluZm8uaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBkaWZmKG9yaWdpbmFsU3RlcERhdGEsIGN1cnJlbnRTdGVwRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBIaXN0b3J5TWFuYWdlclN0YXRpYy5fZGlmZkhpc3Rvcnkuc2V0KGhpc3RvcnlJbmZvLmluZGV4LCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiSXQgd2FzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHN0ZXBzXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwcmV2aW91c0l0ZW0gPSB7fTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYXJyYXRpdmVIaXN0b3J5ID0gdGhpcy5pdGVtTWFwcGVyKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiBoaXN0b3J5SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJdGVtLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX25hcnJhdGlvbkhpc3Rvcnkuc2V0KGhpc3RvcnlJbmZvLmluZGV4LCBuYXJyYXRpdmVIaXN0b3J5KTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFN0ZXBIaXN0b3J5ICYmIGxhc3ROYXJyYXRpdmVIaXN0b3J5ICYmIHR5cGVvZiBsYXN0S2V5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzTmFycmF0aXZlSGlzdG9yeSA9IHRoaXMuaXRlbU1hcHBlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wcmV2aW91c0l0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogbGFzdFN0ZXBIaXN0b3J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBIaXN0b3J5TWFuYWdlclN0YXRpYy5fbmFycmF0aW9uSGlzdG9yeS5zZXQobGFzdEtleSwgcHJldmlvdXNOYXJyYXRpdmVIaXN0b3J5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgYWRkaW5nIGhpc3Rvcnkgc3RlcFwiLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXN5bmNGdW5jdGlvbigpO1xuICAgICAgICBIaXN0b3J5TWFuYWdlclN0YXRpYy5vcmlnaW5hbFN0ZXBEYXRhID0gY3VycmVudFN0ZXBEYXRhO1xuICAgIH1cbiAgICBpdGVtTWFwcGVyKFxuICAgICAgICBpdGVtOiB7XG4gICAgICAgICAgICBzdGVwOiBPbWl0PEhpc3RvcnlTdGVwLCBcImRpZmZcIj47XG4gICAgICAgICAgICBjaG9pY2VJbmRleE1hZGU/OiBudW1iZXI7XG4gICAgICAgICAgICBpbnB1dFZhbHVlPzogU3RvcmFnZUVsZW1lbnRUeXBlO1xuICAgICAgICAgICAgcmVtb3ZlRGlhbG9ndWU/OiBib29sZWFuO1xuICAgICAgICB9LFxuICAgICAgICBwcmV2aW91c0l0ZW0/OiB7IGNob2ljZUluZGV4TWFkZT86IG51bWJlcjsgaW5wdXRWYWx1ZT86IFN0b3JhZ2VFbGVtZW50VHlwZTsgcmVtb3ZlRGlhbG9ndWU/OiBib29sZWFuIH0sXG4gICAgKTogTmFycmF0aW9uSGlzdG9yeSB7XG4gICAgICAgIGNvbnN0IHsgc3RlcCwgY2hvaWNlSW5kZXhNYWRlLCBpbnB1dFZhbHVlLCByZW1vdmVEaWFsb2d1ZSB9ID0gaXRlbTtcbiAgICAgICAgbGV0IGRpYWxvZ3VlID0gc3RlcC5kaWFsb2d1ZSB8fCBzdGVwLmRpYWxvZ2U7XG4gICAgICAgIGlmIChwcmV2aW91c0l0ZW0gJiYgc3RlcC5pc0dsdWVkKSB7XG4gICAgICAgICAgICBwcmV2aW91c0l0ZW0ucmVtb3ZlRGlhbG9ndWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1vdmVEaWFsb2d1ZSkge1xuICAgICAgICAgICAgZGlhbG9ndWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hvaWNlcyA9IHN0ZXAuY2hvaWNlcztcbiAgICAgICAgaWYgKHByZXZpb3VzSXRlbSAmJiBzdGVwLmN1cnJlbnRMYWJlbCkge1xuICAgICAgICAgICAgaWYgKHN0ZXAuY2hvaWNlSW5kZXhNYWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0l0ZW0uY2hvaWNlSW5kZXhNYWRlID0gc3RlcC5jaG9pY2VJbmRleE1hZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZXAuaW5wdXRWYWx1ZSAmJiBwcmV2aW91c0l0ZW0pIHtcbiAgICAgICAgICAgIHByZXZpb3VzSXRlbS5pbnB1dFZhbHVlID0gc3RlcC5pbnB1dFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWFsb2d1ZSB8fCByZXF1aXJlZENob2ljZXMgfHwgaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgbGV0IGNob2ljZXM6IEhpc3RvcnlDaG9pY2VNZW51T3B0aW9uW10gfCB1bmRlZmluZWQgPSByZXF1aXJlZENob2ljZXM/Lm1hcCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBoaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlLm9uZVRpbWUgJiYgc3RlcC5hbHJlYWR5TWFkZUNob2ljZXMgJiYgc3RlcC5hbHJlYWR5TWFkZUNob2ljZXMuaW5jbHVkZXMoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGNob2ljZS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBjaG9pY2UudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgaXNSZXNwb25zZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbjogaGlkZGVuLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjaG9pY2VzKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgYWxsIGNob2ljZXMgYXJlIGhpZGRlbiBmaW5kIG9ubHlIYXZlTm9DaG9pY2VcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlcy5ldmVyeSgoY2hvaWNlKSA9PiBjaG9pY2UuaGlkZGVuKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb25seUhhdmVOb0Nob2ljZSA9IGNob2ljZXMuZmluZCgoY2hvaWNlKSA9PiBjaG9pY2UuaGlkZGVuID09PSBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmx5SGF2ZU5vQ2hvaWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbmx5SGF2ZU5vQ2hvaWNlLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaG9pY2VJbmRleE1hZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjaG9pY2VzW2Nob2ljZUluZGV4TWFkZV0uaXNSZXNwb25zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkaWFsb2d1ZTogZGlhbG9ndWVcbiAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRpYWxvZ3VlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXI6IGRpYWxvZ3VlLmNoYXJhY3RlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHYW1lVW5pZmllci5nZXRDaGFyYWN0ZXIoZGlhbG9ndWUuY2hhcmFjdGVyKSB8fCBkaWFsb2d1ZS5jaGFyYWN0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGxheWVyTWFkZUNob2ljZTogdHlwZW9mIGNob2ljZUluZGV4TWFkZSA9PT0gXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgICAgICAgICAgIHN0ZXBJbmRleDogc3RlcC5pbmRleCxcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBpbnB1dFZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RlcEluZGV4OiBzdGVwLmluZGV4LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXQgbmFycmF0aXZlSGlzdG9yeSgpOiBOYXJyYXRpb25IaXN0b3J5W10ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IE5hcnJhdGlvbkhpc3RvcnlbXSA9IFtdO1xuICAgICAgICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbSh0aGlzLmtleXMoKSkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRMYWJlbEhpc3RvcnkoKTogTmFycmF0aW9uSGlzdG9yeVtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBOYXJyYXRpb25IaXN0b3J5W10gPSBbXTtcbiAgICAgICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20odGhpcy5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzWzBdO1xuICAgICAgICBpZiAodHlwZW9mIGxhc3RLZXkgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBIaXN0b3J5TWFuYWdlclN0YXRpYy5fc3RlcHNJbmZvSGlzdG9yeS5nZXQobGFzdEtleSk7XG4gICAgICAgIGlmICghbGFzdEl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlbmVkTGFiZWxzID0gbGFzdEl0ZW0ub3BlbmVkTGFiZWxzO1xuICAgICAgICBpZiAoIW9wZW5lZExhYmVscyB8fCAhQXJyYXkuaXNBcnJheShvcGVuZWRMYWJlbHMpIHx8IG9wZW5lZExhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnRTdGVwSW5kZXggPSBvcGVuZWRMYWJlbHNbMF0uY3VycmVudFN0ZXBJbmRleDtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBvcGVuZWRMYWJlbHNbMF0ubGFiZWw7XG5cbiAgICAgICAga2V5cy5ldmVyeSgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBIaXN0b3J5TWFuYWdlclN0YXRpYy5fc3RlcHNJbmZvSGlzdG9yeS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5lZExhYmVsc1RlbXAgPSBpbmZvLm9wZW5lZExhYmVscztcbiAgICAgICAgICAgICAgICBpZiAoIW9wZW5lZExhYmVsc1RlbXAgfHwgIUFycmF5LmlzQXJyYXkob3BlbmVkTGFiZWxzVGVtcCkgfHwgb3BlbmVkTGFiZWxzVGVtcC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3BlbmVkTGFiZWxzVGVtcFswXS5sYWJlbCAhPT0gbGFiZWwgfHwgb3BlbmVkTGFiZWxzVGVtcFswXS5jdXJyZW50U3RlcEluZGV4ID49IGN1cnJlbnRTdGVwSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50U3RlcEluZGV4ID0gb3BlbmVkTGFiZWxzVGVtcFswXS5jdXJyZW50U3RlcEluZGV4O1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZW1vdmVOYXJyYXRpdmVIaXN0b3J5KGl0ZW1zTnVtYmVyPzogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpdGVtc051bWJlcikge1xuICAgICAgICAgICAgbGV0IGtleXMgPSBBcnJheS5mcm9tKHRoaXMua2V5cygpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IGl0ZW1zTnVtYmVyIGtleXNcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLnNsaWNlKDAsIGl0ZW1zTnVtYmVyKTtcbiAgICAgICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX25hcnJhdGlvbkhpc3RvcnkuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX3N0ZXBzSW5mb0hpc3RvcnkuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX2RpZmZIaXN0b3J5LmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBIaXN0b3J5TWFuYWdlclN0YXRpYy5fc3RlcHNJbmZvSGlzdG9yeS5jbGVhcigpO1xuICAgICAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX2RpZmZIaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgICAgICBIaXN0b3J5TWFuYWdlclN0YXRpYy5fbmFycmF0aW9uSGlzdG9yeS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBjYW5Hb0JhY2soKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGxhc3RLZXkgPSB0aGlzLmxhc3RLZXk7XG4gICAgICAgIGlmICh0eXBlb2YgbGFzdEtleSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIaXN0b3J5TWFuYWdlclN0YXRpYy5fZGlmZkhpc3RvcnkuaGFzKGxhc3RLZXkpO1xuICAgIH1cbiAgICBibG9ja0dvQmFjaygpIHtcbiAgICAgICAgaWYgKEdhbWVVbmlmaWVyLnJ1bm5pbmdTdGVwc0NvdW50ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX2RpZmZIaXN0b3J5LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1NhbWVTdGVwKG9yaWdpbmFsU3RhdGU6IEdhbWVTdGVwU3RhdGUsIG5ld1N0YXRlOiBHYW1lU3RlcFN0YXRlKSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFN0YXRlLm9wZW5lZExhYmVscy5sZW5ndGggPT09IG5ld1N0YXRlLm9wZW5lZExhYmVscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RTdGVwRGF0YU9wZW5lZExhYmVsc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsU3RhdGUub3BlbmVkTGFiZWxzKTtcbiAgICAgICAgICAgICAgICBsZXQgaGlzdG9yeVN0ZXBPcGVuZWRMYWJlbHNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShuZXdTdGF0ZS5vcGVuZWRMYWJlbHMpO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbGFzdFN0ZXBEYXRhT3BlbmVkTGFiZWxzU3RyaW5nID09PSBoaXN0b3J5U3RlcE9wZW5lZExhYmVsc1N0cmluZyAmJlxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFN0YXRlLnBhdGggPT09IG5ld1N0YXRlLnBhdGggJiZcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGF0ZS5sYWJlbEluZGV4ID09PSBuZXdTdGF0ZS5sYWJlbEluZGV4XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciBjb21wYXJpbmcgb3BlbmVkIGxhYmVsc1wiLCBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICBIaXN0b3J5TWFuYWdlclN0YXRpYy5fc3RlcHNJbmZvSGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBIaXN0b3J5TWFuYWdlclN0YXRpYy5fZGlmZkhpc3RvcnkuY2xlYXIoKTtcbiAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX25hcnJhdGlvbkhpc3RvcnkuY2xlYXIoKTtcbiAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX29yaWdpbmFsU3RlcERhdGEgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHN0ZXBMaW1pdFNhdmVkKCkge1xuICAgICAgICByZXR1cm4gSGlzdG9yeU1hbmFnZXJTdGF0aWMuc3RlcExpbWl0U2F2ZWQ7XG4gICAgfVxuICAgIHNldCBzdGVwTGltaXRTYXZlZChsaW1pdDogbnVtYmVyKSB7XG4gICAgICAgIEhpc3RvcnlNYW5hZ2VyU3RhdGljLnN0ZXBMaW1pdFNhdmVkID0gbGltaXQ7XG4gICAgfVxuXG4gICAgLyogRXhwb3J0IGFuZCBJbXBvcnQgTWV0aG9kcyAqL1xuXG4gICAgcHVibGljIGV4cG9ydCgpOiBIaXN0b3J5R2FtZVN0YXRlIHtcbiAgICAgICAgbGV0IGtleXMgPSBBcnJheS5mcm9tKHRoaXMua2V5cygpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIC8vIHRha2Ugb25seSBsYXN0IHRoZSB0aGlzLnN0ZXBMaW1pdFNhdmVkIHN0ZXBzXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IHRoaXMuc3RlcExpbWl0U2F2ZWQpIHtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLnNsaWNlKGtleXMubGVuZ3RoIC0gdGhpcy5zdGVwTGltaXRTYXZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0ZXBzSGlzdG9yeTogSGlzdG9yeVN0ZXBbXSA9IFtdO1xuICAgICAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RlcCA9IEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9zdGVwc0luZm9IaXN0b3J5LmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlmZiA9IEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9kaWZmSGlzdG9yeS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBzdGVwc0hpc3RvcnkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0ZXAsXG4gICAgICAgICAgICAgICAgICAgIGRpZmY6IGRpZmYsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RlcHNIaXN0b3J5OiBjcmVhdGVFeHBvcnRhYmxlRWxlbWVudChzdGVwc0hpc3RvcnkpLFxuICAgICAgICAgICAgb3JpZ2luYWxTdGVwRGF0YTogY3JlYXRlRXhwb3J0YWJsZUVsZW1lbnQoSGlzdG9yeU1hbmFnZXJTdGF0aWMuX29yaWdpbmFsU3RlcERhdGEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXN0b3JlTmFycmF0aXZlSGlzdG9yeSgpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20odGhpcy5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgbGV0IHByZXZpb3VzSXRlbToge1xuICAgICAgICAgICAgY2hvaWNlSW5kZXhNYWRlPzogbnVtYmVyO1xuICAgICAgICAgICAgaW5wdXRWYWx1ZT86IFN0b3JhZ2VFbGVtZW50VHlwZTtcbiAgICAgICAgICAgIHJlbW92ZURpYWxvZ3VlPzogYm9vbGVhbjtcbiAgICAgICAgfSA9IHt9O1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgc3RlcHNIaXN0b3J5IGFycmF5IGluIHJldmVyc2Ugb3JkZXJcbiAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBIaXN0b3J5TWFuYWdlclN0YXRpYy5fc3RlcHNJbmZvSGlzdG9yeS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1vcmVJbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcmV2aW91c0l0ZW0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0l0ZW0gPSB7fTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzID0gdGhpcy5pdGVtTWFwcGVyKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiBzdGVwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlSW5kZXhNYWRlOiBtb3JlSW5mby5jaG9pY2VJbmRleE1hZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlOiBtb3JlSW5mby5pbnB1dFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGlhbG9ndWU6IG1vcmVJbmZvLnJlbW92ZURpYWxvZ3VlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9uYXJyYXRpb25IaXN0b3J5LnNldChrZXksIHJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlc3RvcmUoZGF0YTogb2JqZWN0KSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwic3RlcHNIaXN0b3J5XCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RlcHNIaXN0b3J5ID0gKGRhdGEgYXMgSGlzdG9yeUdhbWVTdGF0ZSlbXCJzdGVwc0hpc3RvcnlcIl07XG4gICAgICAgICAgICAgICAgc3RlcHNIaXN0b3J5LmZvckVhY2goKHN0ZXA6IEhpc3RvcnlTdGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGVwLmRpZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9kaWZmSGlzdG9yeS5zZXQoc3RlcC5pbmRleCwgc3RlcC5kaWZmKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IHsgLi4uc3RlcCwgZGlmZjogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgIEhpc3RvcnlNYW5hZ2VyU3RhdGljLl9zdGVwc0luZm9IaXN0b3J5LnNldChzdGVwLmluZGV4LCBpbmZvKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVOYXJyYXRpdmVIaXN0b3J5KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQ291bGQgbm90IGltcG9ydCBzdGVwc0hpc3RvcnkgZGF0YSwgc28gd2lsbCBiZSBpZ25vcmVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJvcmlnaW5hbFN0ZXBEYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgSGlzdG9yeU1hbmFnZXJTdGF0aWMuX29yaWdpbmFsU3RlcERhdGEgPSAoZGF0YSBhcyBIaXN0b3J5R2FtZVN0YXRlKVtcIm9yaWdpbmFsU3RlcERhdGFcIl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQ291bGQgbm90IGltcG9ydCBvcmlnaW5hbFN0ZXBEYXRhIGRhdGEsIHNvIHdpbGwgYmUgaWdub3JlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIGRhdGFcIiwgZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgSGlzdG9yeU1hbmFnZXIgZnJvbSBcIi4vSGlzdG9yeU1hbmFnZXJcIjtcbmltcG9ydCBIaXN0b3J5TWFuYWdlckludGVyZmFjZSBmcm9tIFwiLi9pbnRlcmZhY2VzL0hpc3RvcnlNYW5hZ2VySW50ZXJmYWNlXCI7XG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgSGlzdG9yeU1hbmFnZXJTdGF0aWMgfSBmcm9tIFwiLi9IaXN0b3J5TWFuYWdlclN0YXRpY1wiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEhpc3RvcnlHYW1lU3RhdGUgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL0hpc3RvcnlHYW1lU3RhdGVcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBIaXN0b3J5TWFuYWdlckludGVyZmFjZSB9IGZyb20gXCIuL2ludGVyZmFjZXMvSGlzdG9yeU1hbmFnZXJJbnRlcmZhY2VcIjtcbmV4cG9ydCB7IHN0ZXBIaXN0b3J5IH07XG5cbmNvbnN0IHN0ZXBIaXN0b3J5OiBIaXN0b3J5TWFuYWdlckludGVyZmFjZSA9IG5ldyBIaXN0b3J5TWFuYWdlcigpO1xuIl19
|