@willbooster/wb 10.7.3 → 11.0.0

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.
Files changed (2) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:fs";import t from"node:path";import n from"tree-kill";import r from"yargs";import{hideBin as s}from"yargs/helpers";import o,{spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import d from"chalk";import{globby as l}from"globby";import{config as u}from"dotenv";import p from"kill-port";import{PromisePool as m}from"minimal-promise-pool";import f from"node:fs/promises";import h from"node:os";import{createServer as g}from"node:net";const b=new Map;function y(e){const n=b.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{}}).parsed??{};return b.set(e,r),r}async function v(e,t,r){return new Promise((s,o)=>{try{const a=i(e,t??[],r??{});a.stdout?.setEncoding?.("utf8"),a.stderr?.setEncoding?.("utf8");let c="",d="";a.stdout?.on("data",e=>{c+=e,r?.printingStdout&&process.stdout.write(e)}),a.stderr?.on("data",e=>{r?.mergeOutAndError?c+=e:d+=e,r?.printingStderr&&process.stderr.write(e)});let l=!1;const u=()=>{!l&&a.pid&&(l=!0,r?.verbose&&console.info(`treeKill(${a.pid})`),n(a.pid))};r?.killOnExit&&(process.on("beforeExit",u),process.on("SIGINT",u)),a.on("error",e=>{process.removeListener("beforeExit",u),process.removeListener("SIGINT",u),a.removeAllListeners("close"),o(e)}),a.on("close",(e,t)=>{process.removeListener("beforeExit",u),process.removeListener("SIGINT",u),void 0===a.pid?o(new Error("Process has no pid.")):s({pid:a.pid,stdout:c,stderr:d,status:e,signal:t})}),r?.input&&(a.stdin?.write(r.input),a.stdin?.end())}catch(e){o(e)}})}function w(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function $(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function E(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
1
+ import e from"node:fs";import t from"node:path";import n from"tree-kill";import r from"yargs";import{hideBin as o}from"yargs/helpers";import s,{spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import d from"chalk";import{globby as l}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f from"kill-port";import{PromisePool as m}from"minimal-promise-pool";import h from"node:fs/promises";import g from"node:os";import{createServer as v}from"node:net";const b=new Map;function y(e){const n=b.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{}}).parsed??{};return b.set(e,r),r}async function w(e,t,r){return new Promise((o,s)=>{try{const a=i(e,t??[],r??{});a.stdout?.setEncoding?.("utf8"),a.stderr?.setEncoding?.("utf8");let c="",d="";a.stdout?.on("data",e=>{c+=e,r?.printingStdout&&process.stdout.write(e)}),a.stderr?.on("data",e=>{r?.mergeOutAndError?c+=e:d+=e,r?.printingStderr&&process.stderr.write(e)});let l=!1;const u=()=>{!l&&a.pid&&(l=!0,r?.verbose&&console.info(`treeKill(${a.pid})`),n(a.pid))};r?.killOnExit&&(process.on("beforeExit",u),process.on("SIGINT",u)),a.on("error",e=>{process.removeListener("beforeExit",u),process.removeListener("SIGINT",u),a.removeAllListeners("close"),s(e)}),a.on("close",(e,t)=>{process.removeListener("beforeExit",u),process.removeListener("SIGINT",u),void 0===a.pid?s(new Error("Process has no pid.")):o({pid:a.pid,stdout:c,stderr:d,status:e,signal:t})}),r?.input&&(a.stdin?.write(r.input),a.stdin?.end())}catch(e){s(e)}})}function k(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function E(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function A(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
2
2
  /**
3
3
  * [js-sha3]{@link https://github.com/emn178/js-sha3}
4
4
  *
@@ -6,5 +6,5 @@ import e from"node:fs";import t from"node:path";import n from"tree-kill";import
6
6
  * @author Chen, Yi-Cyuan [emn178@gmail.com]
7
7
  * @copyright Chen, Yi-Cyuan 2015-2023
8
8
  * @license MIT
9
- */const k=[..."0123456789abcdef"],A=[6,1536,393216,100663296],N=[0,8,16,24],R=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const P=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class _{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,s=this.blockCount,o=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<s+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<N[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<N[3&i++],t[i>>2]|=(128|63&a)<<N[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<N[3&i++],t[i>>2]|=(128|a>>6&63)<<N[3&i++],t[i>>2]|=(128|63&a)<<N[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<N[3&i++],t[i>>2]|=(128|a>>12&63)<<N[3&i++],t[i>>2]|=(128|a>>6&63)<<N[3&i++],t[i>>2]|=(128|63&a)<<N[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];S(o),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];S(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let s,o=0,i=0,a="";for(;i<n;){for(o=0;o<e&&i<n;++o,++i)s=t[o],a+=k[s>>4&15]+k[15&s]+k[s>>12&15]+k[s>>8&15]+k[s>>20&15]+k[s>>16&15]+k[s>>28&15]+k[s>>24&15];i%e===0&&(t=P(t),S(t),o=0)}return r&&(s=t[o],a+=k[s>>4&15]+k[15&s],r>1&&(a+=k[s>>12&15]+k[s>>8&15]),r>2&&(a+=k[s>>20&15]+k[s>>16&15])),a}}const S=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,m,f,h,g,b,y,v,w,$,E,k,A,N,P,_,S,x,j,T,O,D,C,B,I,W,L,F,V,J,z,U,Y,M,q,K,G,H,X,Q,Z,ee,te,ne,re,se,oe,ie,ae,ce,de,le;for(r=0;r<48;r+=2)s=e[0]^e[10]^e[20]^e[30]^e[40],o=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],d=e[5]^e[15]^e[25]^e[35]^e[45],l=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],m=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=m^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=s^(c<<1|d>>>31),n=o^(d<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(l<<1|u>>>31),n=a^(u<<1|l>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|m>>>31),n=d^(m<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(s<<1|o>>>31),n=u^(o<<1|s>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,f=e[0],h=e[1],q=e[11]<<4|e[10]>>>28,K=e[10]<<4|e[11]>>>28,S=e[20]<<3|e[21]>>>29,x=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,z=e[40]<<18|e[41]>>>14,U=e[41]<<18|e[40]>>>14,C=e[2]<<1|e[3]>>>31,B=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,G=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,j=e[33]<<13|e[32]>>>19,T=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,I=e[14]<<6|e[15]>>>26,W=e[15]<<6|e[14]>>>26,y=e[25]<<11|e[24]>>>21,v=e[24]<<11|e[25]>>>21,X=e[34]<<15|e[35]>>>17,Q=e[35]<<15|e[34]>>>17,O=e[45]<<29|e[44]>>>3,D=e[44]<<29|e[45]>>>3,A=e[6]<<28|e[7]>>>4,N=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,L=e[26]<<25|e[27]>>>7,F=e[27]<<25|e[26]>>>7,w=e[36]<<21|e[37]>>>11,$=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,M=e[9]<<27|e[8]>>>5,P=e[18]<<20|e[19]>>>12,_=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,V=e[38]<<8|e[39]>>>24,J=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,k=e[49]<<14|e[48]>>>18,e[0]=f^~g&y,e[1]=h^~b&v,e[10]=A^~P&S,e[11]=N^~_&x,e[20]=C^~I&L,e[21]=B^~W&F,e[30]=Y^~q&G,e[31]=M^~K&H,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&w,e[3]=b^~v&$,e[12]=P^~S&j,e[13]=_^~x&T,e[22]=I^~L&V,e[23]=W^~F&J,e[32]=q^~G&X,e[33]=K^~H&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~w&E,e[5]=v^~$&k,e[14]=S^~j&O,e[15]=x^~T&D,e[24]=L^~V&z,e[25]=F^~J&U,e[34]=G^~X&Z,e[35]=H^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=w^~E&f,e[7]=$^~k&h,e[16]=j^~O&A,e[17]=T^~D&N,e[26]=V^~z&C,e[27]=J^~U&B,e[36]=X^~Z&Y,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=E^~f&g,e[9]=k^~h&b,e[18]=O^~A&P,e[19]=D^~N&_,e[28]=z^~C&I,e[29]=U^~B&W,e[38]=Z^~Y&q,e[39]=ee^~M&K,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=R[r],e[1]^=R[r+1]},x=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,s])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==s&&(e.cause=s)}},t={instance:Uint8Array,from:e=>[btoa(T.decode(e))],create:([e])=>j.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},s={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},o={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,s,o,i].map(e=>[e.instance.name,e]))}(),j=new TextEncoder,T=new TextDecoder("utf-8");function O(e=void 0,t=x){return JSON.stringify(B(e,t))}function D(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const C=[];function B(e,t=x){const n=D(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=D(n);if(null!==o)return o;let i=s.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,s.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],s.set(n,i);break;case"object":if(null===n)r[i]=n,s.set(n,i);else if(Array.isArray(n)){const t=function(e){if(C.length<e){const t=C.length;C.length=e,C.fill(-2,t,e)}return C.slice(0,e)}(n.length);r[i]=t,s.set(n,i);for(const[r,s]of n.entries())t[r]=e(s)}else{const[o,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,s=t.get(r);if(void 0!==s)return[r,s.from(e)]}const r=Object.entries(e),s=r.length,o=Array.from({length:s+s});for(let e=0;e<s;e++){const t=r[e],n=e+e;o[n]=t[0],o[n+1]=t[1]}return["",o]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=o,r[i]=d,s.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function I(e,t){return function(e){return new _(512,A,512).update(e).hex()}(O([e,t]))}const W=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=I}={}){return function(n,r){let s,o,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-o>e)&&(i=r,s=n.call(this),o=a),s}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-o>e)&&(i=c,s=r?n.call(this,...a):n(...a),o=d),s}}}({getCacheKey:I});function L(e){return!!e&&"0"!==e&&"false"!==e}let F;class V{static{[F]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),m=Object.defineProperty,f=Object.create,h=[f(null),f(null)],g=t.length;function b(t,n,r){return function(s,o){n&&(o=s,s=e);for(var i=0;i<t.length;i++)o=t[i].apply(s,r?[o]:[]);return r?o:s}}function y(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function v(e,t,n,r,s,a,c,d,l,u,p){function f(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),v=t[3],w=!c,E=1===s,k=3===s,A=4===s,N=2===s;function R(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),P[t].call(s,o)}}if(!w){var P={},_=[],S=k?"get":A||E?"set":"value";if(l?(u||E?P={get:$(function(){return v(this)},r,"get"),set:function(e){t[4](this,e)}}:P[S]=v,u||$(P[S],r,N?"":S)):u||(P=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!==(i^s))throw Error("Decorating two elements with the same name ("+P[S].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var x=e,j=g.length-1;j>=0;j-=n?2:1){var T=y(g[j],"A decorator","be",!0),O=n?g[j-1]:void 0,D={},C={kind:["field","accessor","method","getter","setter","class"][s],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");y(t,"An initializer","be",!0),a.push(t)}.bind(null,D)};if(w)i=T.call(O,x,C),D.v=1,y(i,"class decorators","return")&&(x=i);else if(C.static=d,C.private=l,i=C.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?N?function(e){return f(e),P.value}:R("get",0,f):function(e){return e[r]}),N||k||(i.set=l?R("set",0,f):function(e,t){e[r]=t}),x=T.call(O,E?{get:P.get,set:P.set}:P[S],C),D.v=1,E){if("object"==typeof x&&x)(i=y(x.get,"accessor.get"))&&(P.get=i),(i=y(x.set,"accessor.set"))&&(P.set=i),(i=y(x.init,"accessor.init"))&&_.unshift(i);else if(void 0!==x)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(x,(u?"field":"method")+" decorators","return")&&(u?_.unshift(x):P[S]=x)}return s<2&&c.push(b(_,d,1),b(a,d,0)),u||w||(l?E?c.splice(-1,0,R("get",d),R("set",d)):c.push(N?P[S]:y.call.bind(P[S])):m(e,r,P)),x}function k(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return o=f(null==o?null:o),d=[],l=function(e){e&&d.push(b(e))},u=function(t,r){for(var o=0;o<n.length;o++){var i=n[o],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],m=!!i[3],f=16&l;v(t?e:e.prototype,i,f,m?"#"+p:E(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,m,r,t&&m?function(t){return w(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||k(e),{e:i,get c(){var n=[];return g&&[k(e=v(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[W,3,"isBunAvailable"],[W,3,"buildCommand"],[W,3,"rootDirPath"],[W,3,"dockerfile"],[W,3,"hasDockerfile"],[W,3,"hasSourceCode"],[W,3,"name"],[W,3,"dockerImageName"],[W,3,"env"],[W,3,"packageJson"],[W,3,"packageJsonPath"],[W,3,"hasPrisma"],[W,3,"hasVitest"],[W,3,"skipLaunchingServerForPlaywright"],[W,3,"dockerPackageJson"],[W,3,"binExists"]]).e}argv=void F(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let s=(n.env??[]).map(e=>t.resolve(r,e.toString()));const o=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof o){if(0===s.length&&(s.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&s.push(t.join(n,".env"))}s=s.flatMap(e=>o?[`${e}.${o}.local`,`${e}.local`,`${e}.${o}`,e]:[`${e}.local`,e])}s=s.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",s.join(", ")));const i=[],a={};for(const e of s){let s=0;for(const[n,o]of Object.entries(y(t.join(r,e))))n in a||(a[n]=o,s++);i.push([e,s]),n.verbose&&s>0&&console.info(`Read ${s} environment variables from ${e}`)}if(n.checkEnv){const e=Object.keys(y(t.join(r,n.checkEnv))).filter(e=>!(e in a));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...n}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!(this.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get skipLaunchingServerForPlaywright(){if(L(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const s=t.join(r,"node_modules",".bin");if(e.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const o=t.dirname(r);if(r===o)break;r=o}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}}function J(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new V(s,n,r)}async function z(n,r=!0,s){const o=function(n,r=!0,s){if(s??=process.cwd(),!e.existsSync(t.join(s,"package.json")))return;const o=new V(s,n,r);let i=o;if(!o.packageJson.workspaces&&t.dirname(s).endsWith("/packages")){const o=t.resolve(s,"..","..");e.existsSync(t.join(o,"package.json"))&&(i=new V(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await U(n,o.root,r):[o.self]}}async function U(n,r,s){const o=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return o;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&o.push(new V(r,n,s));return o}const Y=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),M=Y?"bun --bun run":"node",q=Y?"bun":"yarn",K=Y?"bun --bun run":"yarn",G={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=J(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(Y?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return H(s,n),!0;const[i,a,l]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!X.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(Q.some(t=>e.includes(t))||Z.some(t=>e.endsWith(t)))&&!ee.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(i)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!H(s,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function H(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const X=new Set(["CI","PWDEBUG","TMPDIR"]);const Q=["src/","public/"],Z=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],ee=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const te={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=J(e);t||(console.error(d.red("No project found.")),process.exit(1));if(L(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(d.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await p(r)}catch{}}(e)}};const ne=new Set;async function re(e){try{await p(e)}catch{}}async function se(e,t){try{const n=await async function(e,t){const{stdout:n}=await v("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await v("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}const oe=new m,ie={exitIfFailed:!0};async function ae(e,t,n,r=ie){const[s,o]=de(e,t);if(le(s,t),n.verbose&&le(o,t,"Start (raw)",!0),n.dryRun)return ue(s,0,r),0;const i=/http-get:\/\/127.0.0.1:(\d+)/.exec(o)?.[1];o.includes("wait-on")&&i&&(o.includes("docker run")&&(await async function(e,t){await se(["--filter",`publish=${e}`],t)}(Number(i),t),await async function(e,t){await se(["--filter",`name=${e}`],t)}(t.dockerImageName,t)),await async function(e){await re(e);const t=async()=>{ne.has(e)||(ne.add(e),await re(e))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,t)}(Number(i)));const a=await v(o,void 0,{cwd:t.dirPath,env:pe(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return ue(s,a.status,r),a.status??1}function ce(e,t,n,r=ie){return oe.runAndWaitForReturnValue(async()=>{const[s,o]=de(e,t);if(le(s,t,"Start (parallel)",!0),n.dryRun)return le(s,t,"Started (log)"),n.verbose&&le(o,t,"Started (raw)",!0),ue(s,0,r),0;const i=await v(o,void 0,{cwd:t.dirPath,env:pe(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});le(s,t,"Started (log)"),n.verbose&&le(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),ue(s,i.status,r),i.status??1})}function de(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",Y?"bun --bun run ":"yarn run ");Y&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=me(n.replaceAll("YARN ",`${K} `)),s=me(n.replaceAll("YARN playwright ",`${K} playwright `).replaceAll("YARN ",!Y&&t.binExists?"":`${K} `));return[`dotenv${t.env.WB_ENV?` --cascade-env=${t.env.WB_ENV||"development"}`:""} ${r}`,s]}function le(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function ue(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function pe(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function me(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const fe=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),he=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),ge=new Set([...he].filter(e=>!fe.has(e))),be={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(e){Y||(console.error(d.red("This command is only available on Bun.")),process.exit(1));const n=await z(e,!1);n||(console.error(d.red("No project found.")),process.exit(1));const r=e.files??[];let s,o,i;if(r.length>0){const e=[],n=[],a=[];for(const s of r){const r=t.resolve(String(s));if(r.endsWith("/test/fixtures")||r.includes("/test/fixtures/")||r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const o=t.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):fe.has(o)?e.push(r):he.has(o)&&n.push(r)}s=e.map(e=>`"${e}"`).join(" "),o=n.map(e=>`"${e}"`).join(" "),i=a.map(e=>`"${e}"`).join(" ")}else s="",o=`"**/{.*/,}*.{${[...ge].join(",")}}" "!**/test{-,/}fixtures/**"`,i=n.descendants.map(e=>`"${e.packageJsonPath}"`).join(" ");const a=e.fix&&e.format?"check --fix":e.fix?"lint --fix":e.format?"format --fix":"lint";let c;(s||0===r.length)&&(c=ce(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,e,{forceColor:!0})),e.format&&(o&&ce(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,e,{forceColor:!0}),i&&(await c,ce(`bun --bun sort-package-json ${i}`,n.self,e,{forceColor:!0})))}};function*ye(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ve={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(n){const r=await z(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const s of ye("optimizeForDockerBuild",r.descendants)){const r=s.packageJson,o=["dependencies","devDependencies"];for(const e of o){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(we(n,r),$e(r),Ee(r),n.dryRun)continue;const i=n.outside?t.join(s.dirPath,"dist"):s.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(o.spawnSync(q,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function we(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],s=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],s.push(e));console.info("Removed devDependencies:",s.join(", ")||"none")}function $e(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},s=[];for(const[e,o]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete r[e],s.push(e));console.info("Removed scripts:",s.join(", ")||"none")}function Ee(e){delete e.private,delete e.publishConfig,delete e.prettier}const ke=new class{deploy(e,t=""){return"PRISMA migrate deploy"+(t?` ${t}`:"")}deployForce(e){const t=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${t}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${t}/mount/prod.sqlite3*\n && litestream restore -config litestream.yml -o ${t}/mount/prod.sqlite3 ${t}/mount/prod.sqlite3 && ls -ahl ${t}/mount/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${M} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e,t=""){return`PRISMA migrate deploy${t?` ${t}`:""} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return"PRISMA migrate dev"+(t?` ${t}`:"")}reset(e,t=""){return`PRISMA migrate reset --force --skip-seed${t?` ${t}`:""} && ${this.seed(e)}`}restore(e,t){return`rm -Rf ${t}; litestream restore -config litestream.yml -o ${t} ${e.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(n,r,s=""){const o="file:";let i="";if(r)try{new URL(r),i=`DATABASE_URL=${r} `}catch{i=`DATABASE_URL=${o}${t.resolve(r)} `}else if(n.env.DATABASE_URL?.startsWith(o)){const r=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];for(const{dbPath:s,schemaPath:a}of r)if(e.existsSync(t.resolve(n.dirPath,a))){i=`DATABASE_URL=${o}${t.resolve(n.dirPath,s,n.env.DATABASE_URL.slice(5))} `;break}}return`${i}PRISMA studio${s?` ${s}`:""}`}},Ae={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}},Ne={},Re={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Pe).command(_e).command(Se).command(xe).command(je).command(Te).command(Oe).command(De).command(Ce).command(Be).command(Ie).demandCommand().strict(!1),handler(){}},Pe={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Ne,async handler(e){const t=await Le(e),n=Fe(e);for(const r of ye("prisma deploy",t))await ae(ke.deploy(r,n),r,e)}},_e={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Ne,async handler(e){const t=await Le(e);for(const n of ye("prisma deploy-force",t))await ae(ke.deployForce(n),n,e)}},Se={command:"litestream",describe:"Setup DB for Litestream",builder:Ne,async handler(e){const t=await Le(e);for(const n of ye("prisma litestream",t))await ae(ke.litestream(n),n,e)}},xe={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Ne,async handler(e){const t=await Le(e);for(const e of ye("prisma create-litestream-config",t))We(e)}},je={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Ne,async handler(e){const t=await Le(e),n=Fe(e);for(const r of ye("prisma migrate",t))await ae(ke.migrate(r,n),r,e)}},Te={command:"migrate-dev",describe:"Create a migration file",builder:Ne,async handler(e){const t=await Le(e),n=Fe(e);for(const r of ye("prisma migrate-dev",t))await ae(ke.migrateDev(r,n),r,e)}},Oe={command:"reset",describe:"Reset DB",builder:Ne,async handler(e){const t=await Le(e),n=Fe(e);for(const r of ye("prisma reset",t))await ae(ke.reset(r,n),r,e)}},De={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Ne,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Le(e);for(const n of ye("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ae(ke.restore(n,t),n,e)}}},Ce={command:"seed",describe:"Populate DB with seed data",builder:{...Ne,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Le(e);for(const n of ye("prisma seed",t))await ae(ke.seed(n,e.file),n,e)}},Be={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Ne,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await Le(e),n=Fe(e,["db-url-or-path","restored"]);for(const r of ye("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ae(ke.studio(r,t,n),r,e)}}},Ie={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await Le(e),n=[(e.args?.join(" ")??"").trimEnd(),Fe(e,["args"])].filter(Boolean).join(" ");for(const r of ye(`prisma ${n}`,t))await ae(`PRISMA ${n}`,r,e)}};function We(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},s=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(s.length>0)throw new Error(`Missing environment variables for Litestream: ${s.join(", ")}`);const o="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n retention: 8h\n retention-check-interval: ${o}\n sync-interval: 60s\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`)}}async function Le(e){const t=await z(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(d.red("No prisma project found.")),process.exit(1)),n}function Fe(e,t=[]){const n=[],r=Object.keys(Ae),s=Object.values(Ae).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),o=new Set([...t,...r,...s,"_","$0"]);for(const[t,r]of Object.entries(e))if(!o.has(t)){const s=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(s!==t&&void 0!==e[s])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}return n.join(" ")}const Ve={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=J(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${d.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await ae(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},Je={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await z(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of ye("setup",n.descendants)){const r=await f.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===h.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await ce(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await ae("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await ce("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await ce(`poetry env use ${n}`,t,e),await oe.promiseAll(),await ae("poetry run pip install --upgrade pip",t,e),await ae("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await ae(`${K} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ae(`${K} playwright install --with-deps`,r,e)}(e)}};function ze(e){return e.silent?" > /dev/null":""}async function Ue(e=3e3,t=100){for(let n=e;n<e+t;n++)if(await Ye(n))return n;throw new Error(`No available port found in range ${e}-${e+t-1}`)}async function Ye(e){return new Promise(t=>{const n=g();n.once("error",e=>{e.code,t(!1)}),n.once("listening",()=>{n.close(()=>{t(!0)})}),n.listen(e,"127.0.0.1")})}const Me=new class{buildDevImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",r=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,r)}`}start(e,t="",n=""){return function(e,t){const n=()=>{if(ne.has(e))return;ne.add(e),le(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ue(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it -p \${PORT:-8080}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class qe{buildDocker(e,t="development"){return Me.buildDevImage(e,t)}startDocker(e,t){const n=Number(e.env.PORT)||8080;return`${this.buildDocker(e)}${ze(t)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Me.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e,t,n)}"`}testE2E(e,t,{playwrightArgs:n="test test/e2e/",prismaDirectory:r,startCommand:s}){const o=e.env.WB_ENV,i=e.env.PORT||"8080",a=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",c=`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=${i}`,d=Ke(n,t.targets);if(e.skipLaunchingServerForPlaywright)return`${c} ${d}${a}`;return`${c} YARN concurrently --kill-others --raw --success first\n "${r?`rm -Rf ${r}/mount && `:""}${s} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i}\n && ${d}${a}"`}testE2EDev(e,t,{playwrightArgs:n="test test/e2e/",startCommand:r}){const s=e.env.WB_ENV,o=e.env.PORT||"8080",i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=${o}`,c=Ke(n,t.targets);return e.skipLaunchingServerForPlaywright?`${a} ${c}${i}`:`${a} YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${c}${i}"`}testUnit(e,t){const n=t.targets?.join(" ")||"test/unit/";return e.hasVitest?`WB_ENV=${e.env.WB_ENV} YARN vitest run ${n} --color --passWithNoTests --allowOnly`:e.isBunAvailable?`WB_ENV=${e.env.WB_ENV} bun test ${n}`:'echo "No tests."'}waitApp(e,t,n=e.env.PORT||3e3){return`wait-on -t 10000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${n} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${n}`}waitAndOpenApp(e,t,n=e.env.PORT||3e3){return`${this.waitApp(e,t,n)} || wait-on http-get://127.0.0.1:${n} && open-cli http://\${HOST:-localhost}:${n}`}}function Ke(e,t){const n="BUN playwright",r=t?.join(" ")||"test/e2e/";if(!e.startsWith("test ")||!t?.length)return`${n} ${e}`;const s=e.slice(5).trim(),o=s.length>0?s.split(/\s+/):[];return!o[0]||o[0].startsWith("-")?o.unshift(r):o[0]=r,`${n} test ${o.join(" ")}`}const Ge=new class extends qe{start(e,t){const n=e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:"",r=Number(e.env.PORT)||3e3;return`${n}YARN concurrently --raw --kill-others-on-fail\n "blitz dev -p ${r} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,r)}"`}startProduction(e,t,n){return`${e.env.WB_ENV?`APP_ENV=${e.env.WB_ENV} `:""}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[ke.migrate(e),e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}startTest(e,t){return[...ke.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...ke.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r}){const s=`blitz dev -p ${e.env.PORT||"8080"}${ze(t)}`;return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r??s})}async testStart(e,t){const n=await Ue();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev -p ${n}${ze(t)}" "${this.waitApp(e,t,n)}"`}};const He=new class extends qe{start(e,t){return`PORT=${Number(e.env.PORT)||3e3} YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)}${ze(t)} && ${Me.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand}${ze(t)} && NODE_ENV=production PORT=\${PORT:-${n}} ${M} dist/index.js ${t.normalizedArgsText??""}`}startTest(e,t){return`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}testE2E(e,t,n={}){const{startCommand:r=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}=n,s=e.env.PORT||"8080",o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${s} YARN concurrently --kill-others --raw --success first\n "${r} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s} && vitest run ${i} --color --passWithNoTests --allowOnly${o}"`}testE2EDev(e,t,n={}){const{startCommand:r}=n,s=e.env.PORT||"8080",o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${s} YARN concurrently --kill-others --raw --success first\n "${r??this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s} && vitest run ${i} --color --passWithNoTests --allowOnly${o}"`}async testStart(e,t){const n=await Ue();return`WB_ENV=${e.env.WB_ENV} PORT=${n} YARN concurrently --kill-others --raw --success first "${this.start(e,t)}" "${this.waitApp(e,t,n)}"`}};const Xe=new class extends qe{start(e,t){const n=Number(e.env.PORT)||3e3;return`YARN concurrently --raw --kill-others-on-fail\n "next dev --turbopack -p ${n} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?[ke.migrate(e)]:[],e.buildCommand,`PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}`].join(" && ")}"\n "${this.waitAndOpenApp(e,t,n)}"`}startTest(e,t){return[...e.hasPrisma?ke.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?ke.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")})}testE2EDev(e,t,{startCommand:n}){const r=`next dev --turbopack -p ${e.env.PORT||"8080"}${ze(t)}`;return super.testE2EDev(e,t,{startCommand:n??r})}async testStart(e,t){const n=await Ue();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbopack -p ${n}${ze(t)}" "${this.waitApp(e,t,n)}"`}};const Qe=new class extends qe{start(e,t){return`PORT=${Number(e.env.PORT)||3e3} YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}startDocker(e,t){return`${this.buildDocker(e)}${ze(t)} && ${Me.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${M} dist/index.js ${t.normalizedArgsText??""}`}startTest(){return"echo 'do nothing.'"}testE2E(){return"echo 'do nothing.'"}testE2EDev(){return"echo 'do nothing.'"}testStart(){return Promise.resolve("echo 'do nothing.'")}};const Ze=new class extends qe{start(e,t){const n=Number(e.env.PORT)||3e3;return`PORT=${n} YARN concurrently --raw --kill-others-on-fail\n "remix dev ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}startProduction(e,t,n){return`NODE_ENV=production YARN concurrently --raw --kill-others-on-fail\n "${ke.migrate(e)} && ${e.buildCommand} && PORT=${n} pm2-runtime start ${e.findFile("ecosystem.config.cjs")} ${t.normalizedArgsText??""}"\n "${this.waitAndOpenApp(e,t,n)}"`}startTest(e,t){return[...ke.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"prisma",startCommand:n.startCommand??[...ke.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${ze(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r=`remix dev${ze(t)}`}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}async testStart(e,t){const n=await Ue();return`WB_ENV=${e.env.WB_ENV} PORT=${n} YARN concurrently --kill-others --raw --success first "remix dev${ze(t)}" "${this.waitApp(e,t,n)}"`}},et=["express","fastify","elysia","hono"],tt={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug | test",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map(e=>`'${e}'`).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>`'${e}'`).join(" ")}(e);const t=await z(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let s;if(t.blitz)s=Ge;else if(t.next)s=Xe;else if(r["@remix-run/dev"])s=Ze;else if(et.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=He;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=Qe}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":{const r=rt(t,"development");await ae(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=rt(t,"staging"),o=Number(n.env.PORT)||8080;await ae(`${r}${s.startProduction(n,e,o)}`,n,e);break}case"docker":{const r=rt(t,"staging");await ae(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=rt(t,"staging");e.normalizedArgsText="'/bin/bash'",await ae(`${r}${s.startDocker(n,e)}`,n,e);break}case"test":{const r=`${rt(t,"test")}${s.startTest(n,e)}`;await ae(nt(r),n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function nt(e){return`${e.trimEnd()} > test.log 2>&1`}function rt(e,t){process.env.WB_ENV||=t;let n=`WB_ENV=${process.env.WB_ENV} `;return e.next&&(process.env.NEXT_PUBLIC_WB_ENV=process.env.WB_ENV,n+=`NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `),n}const st={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string",choices:["headless","headless-dev","headed","headed-dev","docker","docker-debug","debug","generate","trace"],default:"headless"},silent:{description:"Reduce redundant outputs",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},targets:{description:"Test target paths",type:"array"}},async handler(n){await async function(n){const r=await z(n);r||(console.error(d.red("No project found.")),process.exit(1));r.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const s=n.targets??[],o=0===s.length,i=s.some(e=>e.includes("/e2e")),a=s.some(e=>e.includes("/unit")),c=o||a,l=o||i;for(const o of r.descendants){const r=o.packageJson.dependencies??{},i=o.packageJson.devDependencies??{};let a;if(a=r.blitz?Ge:r.next?Xe:i["@remix-run/dev"]?Ze:et.some(e=>r[e])&&!r["firebase-functions"]?He:Qe,console.info(`Running "test" for ${o.name} ...`),c&&e.existsSync(t.join(o.dirPath,"test","unit"))){const e=s.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await ae(a.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const d=s.filter(e=>e.includes("/e2e")),u={...n,targets:d.length>0?d:void 0};switch(n.e2e){case"headless":await ae(a.testE2E(o,u,{}),o,n);continue;case"headless-dev":await ae(a.testE2EDev(o,u,{}),o,n);continue;case"docker":await ot(o,u,a);continue;case"docker-debug":{const e=d.length>0?d.join(" "):"test/e2e/";await ot(o,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]){const e=d.length>0?d.join(" "):"test/e2e/";switch(n.e2e){case"headed":await ae(a.testE2E(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"headed-dev":await ae(a.testE2EDev(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"debug":await ae(a.testE2E(o,u,{playwrightArgs:`test ${e} --debug`}),o,n);break;case"generate":{const e=o.env.PORT||"8080";await ae(a.testE2E(o,u,{playwrightArgs:`codegen http://localhost:${e}`}),o,n);break}case"trace":await ae("BUN playwright show-trace",o,n)}}}}(n)}};async function ot(e,t,n,r){process.env.WB_DOCKER??="1",await ae(`${n.buildDocker(e,"test")}${ze(t)}`,e,t),process.exitCode=await ae(n.testE2E(e,t,{playwrightArgs:r,startCommand:`${Me.stopAndStart(e,!0)}${ze(t)}`}),e,t,{exitIfFailed:!1}),await ae(Me.stop(e),e,t)}const it={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{},async handler(n){await async function(n){const r=await z(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of r.descendants){const r=s.packageJson.dependencies??{},o=s.packageJson.devDependencies??{};let i;if(i=r.blitz?Ge:r.next?Xe:o["@remix-run/dev"]?Ze:et.some(e=>r[e])&&!r["firebase-functions"]?He:Qe,console.info(`Running "test-on-ci" for ${s.name} ...`),await ce(Me.stopAll(),s,n),e.existsSync(t.join(s.dirPath,"test","unit"))&&await ce(i.testUnit(s,n).replaceAll(" --allowOnly",""),s,n),await ce(await i.testStart(s,n),s,n),await oe.promiseAll(),e.existsSync(t.join(s.dirPath,"test","e2e"))){s.hasDockerfile&&(process.env.WB_DOCKER??="1",await ae(`${i.buildDocker(s,"test")}${ze(n)}`,s,n));const e=s.hasDockerfile?{startCommand:Me.stopAndStart(s,!0)}:{};process.exitCode=await ae(i.testE2E(s,n,e).replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await ae(Me.stop(s),s,n)}}}(n)}};const at={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await z(n,!1);r||(console.error(d.red("No project found.")),process.exit(1));let s=!1;const o=r.descendants.map(async o=>{const i=[];for(o.packageJson.workspaces?o.hasSourceCode&&(o.packageJson.dependencies?.typescript||o.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit --Pretty"):((o.packageJson.dependencies?.typescript||o.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit --Pretty"),o.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await ce(i.join(" && "),o,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(o.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking.")),s=!0}}),i=await Promise.all(o);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.green(s?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found.")),process.exit(a)}},ct={...at,command:"tc"};await r(s(process.argv)).scriptName("wb").options(Ae).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(G).command(te).command(be).command(ve).command(Re).command(Ve).command(Je).command(tt).command(st).command(it).command(at).command(ct).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{n(process.pid),process.exit()});
10
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ByaXNtYS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9zZXR1cC50cyIsIi4uL3NyYy9zY3JpcHRzL2J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvZmluZFBvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlBhdGhzLCBlbnZWYXJDb3VudF1bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIG51bWJlcl1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyczogW3N0cmluZywgbnVtYmVyXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzLnB1c2goW2VudlBhdGgsIGNvdW50XSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiBjb3VudCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIFske2VudlBhdGhzLmpvaW4oJywgJyl9XTogWyR7bWlzc2luZ0tleXMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbZW52VmFycywgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCBlbnZWYXJzKTtcbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHRyZWVLaWxsIGZyb20gJ3RyZWUta2lsbCc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfVxuICpcbiAqIEB2ZXJzaW9uIDAuOS4zXG4gKiBAYXV0aG9yIENoZW4sIFlpLUN5dWFuIFtlbW4xNzhAZ21haWwuY29tXVxuICogQGNvcHlyaWdodCBDaGVuLCBZaS1DeXVhbiAyMDE1LTIwMjNcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5jb25zdCB0PVsuLi5cIjAxMjM0NTY3ODlhYmNkZWZcIl0scz1bNiwxNTM2LDM5MzIxNiwxMDA2NjMyOTZdLGk9WzAsOCwxNiwyNF0sZT1bMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF07ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbmV3IGgoNTEyLHMsNTEyKS51cGRhdGUodCkuaGV4KCl9Y29uc3Qgbj10PT57Y29uc3Qgcz1bXTtmb3IoY29uc3RbaSxlXW9mIHQuZW50cmllcygpKXNbaV09ZTtyZXR1cm4gc307Y2xhc3MgaHtibG9ja3M9W107cz1bXTtyZXNldD0hMDtmaW5hbGl6ZWQ9ITE7YmxvY2s9MDtzdGFydD0wO2xhc3RCeXRlSW5kZXg9MDtjb25zdHJ1Y3Rvcih0LHMsaSl7dGhpcy5wYWRkaW5nPXMsdGhpcy5vdXRwdXRCaXRzPWksdGhpcy5ibG9ja0NvdW50PTE2MDAtKHQ8PDEpPj41LHRoaXMuYnl0ZUNvdW50PXRoaXMuYmxvY2tDb3VudDw8Mix0aGlzLm91dHB1dEJsb2Nrcz1pPj41LHRoaXMuZXh0cmFCeXRlcz0oMzEmaSk+PjM7Zm9yKGxldCB0PTA7dDw1MDsrK3QpdGhpcy5zW3RdPTB9dXBkYXRlKHQpe2lmKHRoaXMuZmluYWxpemVkKXRocm93IG5ldyBFcnJvcihcImZpbmFsaXplIGFscmVhZHkgY2FsbGVkXCIpO2NvbnN0IHM9dGhpcy5ibG9ja3MsZT10aGlzLmJ5dGVDb3VudCxvPXQubGVuZ3RoLG49dGhpcy5ibG9ja0NvdW50LGg9dGhpcy5zO2xldCBsLGMsZj0wO2Zvcig7ZjxvOyl7aWYodGhpcy5yZXNldClmb3IodGhpcy5yZXNldD0hMSxzWzBdPXRoaXMuYmxvY2ssbD0xO2w8bisxOysrbClzW2xdPTA7Zm9yKGw9dGhpcy5zdGFydDtmPG8mJmw8ZTsrK2YpYz10LmNvZGVQb2ludEF0KGYpfHwwLGM8MTI4P3NbbD4+Ml18PWM8PGlbMyZsKytdOmM8MjA0OD8oc1tsPj4yXXw9KDE5MnxjPj42KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOmM8NTUyOTZ8fGM+PTU3MzQ0PyhzW2w+PjJdfD0oMjI0fGM+PjEyKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pOihjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyYodC5jb2RlUG9pbnRBdCgrK2YpfHwwKSksc1tsPj4yXXw9KDI0MHxjPj4xOCk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+MTImNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk7aWYodGhpcy5sYXN0Qnl0ZUluZGV4PWwsbD49ZSl7Zm9yKHRoaXMuc3RhcnQ9bC1lLHRoaXMuYmxvY2s9c1tuXSxsPTA7bDxuOysrbCloW2xdXj1zW2xdO3IoaCksdGhpcy5yZXNldD0hMH1lbHNlIHRoaXMuc3RhcnQ9bH1yZXR1cm4gdGhpc31maW5hbGl6ZSgpe2lmKHRoaXMuZmluYWxpemVkKXJldHVybjt0aGlzLmZpbmFsaXplZD0hMDtjb25zdCB0PXRoaXMuYmxvY2tzO2xldCBzPXRoaXMubGFzdEJ5dGVJbmRleDtjb25zdCBpPXRoaXMuYmxvY2tDb3VudCxlPXRoaXMucztpZih0W3M+PjJdfD10aGlzLnBhZGRpbmdbMyZzXSx0aGlzLmxhc3RCeXRlSW5kZXg9PT10aGlzLmJ5dGVDb3VudClmb3IodFswXT10W2ldLHM9MTtzPGkrMTsrK3MpdFtzXT0wO2Zvcih0W2ktMV18PTIxNDc0ODM2NDgscz0wO3M8aTsrK3MpZVtzXV49dFtzXTtyKGUpfWhleCgpe3RoaXMuZmluYWxpemUoKTtjb25zdCBzPXRoaXMuYmxvY2tDb3VudDtsZXQgaT10aGlzLnM7Y29uc3QgZT10aGlzLm91dHB1dEJsb2NrcyxvPXRoaXMuZXh0cmFCeXRlcztsZXQgaCxsPTAsYz0wLGY9XCJcIjtmb3IoO2M8ZTspe2ZvcihsPTA7bDxzJiZjPGU7KytsLCsrYyloPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdK3RbaD4+MTImMTVdK3RbaD4+OCYxNV0rdFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0rdFtoPj4yOCYxNV0rdFtoPj4yNCYxNV07YyVzPT09MCYmKGk9bihpKSxyKGkpLGw9MCl9cmV0dXJuIG8mJihoPWlbbF0sZis9dFtoPj40JjE1XSt0WzE1JmhdLG8+MSYmKGYrPXRbaD4+MTImMTVdK3RbaD4+OCYxNV0pLG8+MiYmKGYrPXRbaD4+MjAmMTVdK3RbaD4+MTYmMTVdKSksZn19Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgcyxpLG8sbixoLHIsbCxjLGYsYSx1LGQsYixrLHkseCxCLHAsQyx6LEksZyx3LEEsUCxFLGosbSxxLHYsRCxGLEcsSCxKLEssTCxNLE4sTyxRLFIsUyxULFUsVixXLFgsWSxaLCQsXyx0dCxzdCxpdCxldCxvdCxudCxodCxydCxsdCxjdCxmdDtmb3Iobz0wO288NDg7bys9MiluPXRbMF1edFsxMF1edFsyMF1edFszMF1edFs0MF0saD10WzFdXnRbMTFdXnRbMjFdXnRbMzFdXnRbNDFdLHI9dFsyXV50WzEyXV50WzIyXV50WzMyXV50WzQyXSxsPXRbM11edFsxM11edFsyM11edFszM11edFs0M10sYz10WzRdXnRbMTRdXnRbMjRdXnRbMzRdXnRbNDRdLGY9dFs1XV50WzE1XV50WzI1XV50WzM1XV50WzQ1XSxhPXRbNl1edFsxNl1edFsyNl1edFszNl1edFs0Nl0sdT10WzddXnRbMTddXnRbMjddXnRbMzddXnRbNDddLGQ9dFs4XV50WzE4XV50WzI4XV50WzM4XV50WzQ4XSxiPXRbOV1edFsxOV1edFsyOV1edFszOV1edFs0OV0scz1kXihyPDwxfGw+Pj4zMSksaT1iXihsPDwxfHI+Pj4zMSksdFswXV49cyx0WzFdXj1pLHRbMTBdXj1zLHRbMTFdXj1pLHRbMjBdXj1zLHRbMjFdXj1pLHRbMzBdXj1zLHRbMzFdXj1pLHRbNDBdXj1zLHRbNDFdXj1pLHM9bl4oYzw8MXxmPj4+MzEpLGk9aF4oZjw8MXxjPj4+MzEpLHRbMl1ePXMsdFszXV49aSx0WzEyXV49cyx0WzEzXV49aSx0WzIyXV49cyx0WzIzXV49aSx0WzMyXV49cyx0WzMzXV49aSx0WzQyXV49cyx0WzQzXV49aSxzPXJeKGE8PDF8dT4+PjMxKSxpPWxeKHU8PDF8YT4+PjMxKSx0WzRdXj1zLHRbNV1ePWksdFsxNF1ePXMsdFsxNV1ePWksdFsyNF1ePXMsdFsyNV1ePWksdFszNF1ePXMsdFszNV1ePWksdFs0NF1ePXMsdFs0NV1ePWkscz1jXihkPDwxfGI+Pj4zMSksaT1mXihiPDwxfGQ+Pj4zMSksdFs2XV49cyx0WzddXj1pLHRbMTZdXj1zLHRbMTddXj1pLHRbMjZdXj1zLHRbMjddXj1pLHRbMzZdXj1zLHRbMzddXj1pLHRbNDZdXj1zLHRbNDddXj1pLHM9YV4objw8MXxoPj4+MzEpLGk9dV4oaDw8MXxuPj4+MzEpLHRbOF1ePXMsdFs5XV49aSx0WzE4XV49cyx0WzE5XV49aSx0WzI4XV49cyx0WzI5XV49aSx0WzM4XV49cyx0WzM5XV49aSx0WzQ4XV49cyx0WzQ5XV49aSxrPXRbMF0seT10WzFdLFY9dFsxMV08PDR8dFsxMF0+Pj4yOCxXPXRbMTBdPDw0fHRbMTFdPj4+MjgsbT10WzIwXTw8M3x0WzIxXT4+PjI5LHE9dFsyMV08PDN8dFsyMF0+Pj4yOSxydD10WzMxXTw8OXx0WzMwXT4+PjIzLGx0PXRbMzBdPDw5fHRbMzFdPj4+MjMsUj10WzQwXTw8MTh8dFs0MV0+Pj4xNCxTPXRbNDFdPDwxOHx0WzQwXT4+PjE0LEg9dFsyXTw8MXx0WzNdPj4+MzEsSj10WzNdPDwxfHRbMl0+Pj4zMSx4PXRbMTNdPDwxMnx0WzEyXT4+PjIwLEI9dFsxMl08PDEyfHRbMTNdPj4+MjAsWD10WzIyXTw8MTB8dFsyM10+Pj4yMixZPXRbMjNdPDwxMHx0WzIyXT4+PjIyLHY9dFszM108PDEzfHRbMzJdPj4+MTksRD10WzMyXTw8MTN8dFszM10+Pj4xOSxjdD10WzQyXTw8Mnx0WzQzXT4+PjMwLGZ0PXRbNDNdPDwyfHRbNDJdPj4+MzAsc3Q9dFs1XTw8MzB8dFs0XT4+PjIsaXQ9dFs0XTw8MzB8dFs1XT4+PjIsSz10WzE0XTw8Nnx0WzE1XT4+PjI2LEw9dFsxNV08PDZ8dFsxNF0+Pj4yNixwPXRbMjVdPDwxMXx0WzI0XT4+PjIxLEM9dFsyNF08PDExfHRbMjVdPj4+MjEsWj10WzM0XTw8MTV8dFszNV0+Pj4xNywkPXRbMzVdPDwxNXx0WzM0XT4+PjE3LEY9dFs0NV08PDI5fHRbNDRdPj4+MyxHPXRbNDRdPDwyOXx0WzQ1XT4+PjMsQT10WzZdPDwyOHx0WzddPj4+NCxQPXRbN108PDI4fHRbNl0+Pj40LGV0PXRbMTddPDwyM3x0WzE2XT4+Pjksb3Q9dFsxNl08PDIzfHRbMTddPj4+OSxNPXRbMjZdPDwyNXx0WzI3XT4+PjcsTj10WzI3XTw8MjV8dFsyNl0+Pj43LHo9dFszNl08PDIxfHRbMzddPj4+MTEsST10WzM3XTw8MjF8dFszNl0+Pj4xMSxfPXRbNDddPDwyNHx0WzQ2XT4+PjgsdHQ9dFs0Nl08PDI0fHRbNDddPj4+OCxUPXRbOF08PDI3fHRbOV0+Pj41LFU9dFs5XTw8Mjd8dFs4XT4+PjUsRT10WzE4XTw8MjB8dFsxOV0+Pj4xMixqPXRbMTldPDwyMHx0WzE4XT4+PjEyLG50PXRbMjldPDw3fHRbMjhdPj4+MjUsaHQ9dFsyOF08PDd8dFsyOV0+Pj4yNSxPPXRbMzhdPDw4fHRbMzldPj4+MjQsUT10WzM5XTw8OHx0WzM4XT4+PjI0LGc9dFs0OF08PDE0fHRbNDldPj4+MTgsdz10WzQ5XTw8MTR8dFs0OF0+Pj4xOCx0WzBdPWtefngmcCx0WzFdPXlefkImQyx0WzEwXT1BXn5FJm0sdFsxMV09UF5+aiZxLHRbMjBdPUhefksmTSx0WzIxXT1KXn5MJk4sdFszMF09VF5+ViZYLHRbMzFdPVVeflcmWSx0WzQwXT1zdF5+ZXQmbnQsdFs0MV09aXRefm90Jmh0LHRbMl09eF5+cCZ6LHRbM109Ql5+QyZJLHRbMTJdPUVefm0mdix0WzEzXT1qXn5xJkQsdFsyMl09S15+TSZPLHRbMjNdPUxefk4mUSx0WzMyXT1WXn5YJlosdFszM109V15+WSYkLHRbNDJdPWV0Xn5udCZydCx0WzQzXT1vdF5+aHQmbHQsdFs0XT1wXn56JmcsdFs1XT1DXn5JJncsdFsxNF09bV5+diZGLHRbMTVdPXFefkQmRyx0WzI0XT1NXn5PJlIsdFsyNV09Tl5+USZTLHRbMzRdPVheflomXyx0WzM1XT1ZXn4kJnR0LHRbNDRdPW50Xn5ydCZjdCx0WzQ1XT1odF5+bHQmZnQsdFs2XT16Xn5nJmssdFs3XT1JXn53JnksdFsxNl09dl5+RiZBLHRbMTddPURefkcmUCx0WzI2XT1PXn5SJkgsdFsyN109UV5+UyZKLHRbMzZdPVpefl8mVCx0WzM3XT0kXn50dCZVLHRbNDZdPXJ0Xn5jdCZzdCx0WzQ3XT1sdF5+ZnQmaXQsdFs4XT1nXn5rJngsdFs5XT13Xn55JkIsdFsxOF09Rl5+QSZFLHRbMTldPUdeflAmaix0WzI4XT1SXn5IJkssdFsyOV09U15+SiZMLHRbMzhdPV9eflQmVix0WzM5XT10dF5+VSZXLHRbNDhdPWN0Xn5zdCZldCx0WzQ5XT1mdF5+aXQmb3QsdFswXV49ZVtvXSx0WzFdXj1lW28rMV19O2V4cG9ydHtvIGFzIHNoYTNfNTEyfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2guanMubWFwXG4iLCJjb25zdCBlPVwiXCIsdD1mdW5jdGlvbigpe2NvbnN0IGU9e2luc3RhbmNlOkVycm9yLGZyb206ZT0+e2NvbnN0IHQ9W2UubmFtZSxlLm1lc3NhZ2VdO3JldHVybiB2b2lkIDAhPT1lLnN0YWNrJiZ0LnB1c2goZS5zdGFjayksdm9pZCAwIT09ZS5jYXVzZSYmKHZvaWQgMD09PWUuc3RhY2smJnQucHVzaCh2b2lkIDApLHQucHVzaChlLmNhdXNlKSksdH0sc3R1YjooKT0+bmV3IEVycm9yLGh5ZHJhdGU6KGUsW3QsbixhLHNdKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHZvaWQgMD09PWE/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1hLHZvaWQgMCE9PXMmJihlLmNhdXNlPXMpfX0sdD17aW5zdGFuY2U6VWludDhBcnJheSxmcm9tOmU9PltidG9hKGEuZGVjb2RlKGUpKV0sY3JlYXRlOihbZV0pPT5uLmVuY29kZShhdG9iKGUpKX0scz17aW5zdGFuY2U6TWFwLGZyb206ZT0+Wy4uLmUuZW50cmllcygpXSxzdHViOigpPT5uZXcgTWFwLGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3RbbixhXW9mIHQpZS5zZXQobixhKX19LG89e2luc3RhbmNlOlNldCxmcm9tOmU9PlsuLi5lLnZhbHVlcygpXSxzdHViOigpPT5uZXcgU2V0LGh5ZHJhdGU6KGUsdCk9Pntmb3IoY29uc3QgbiBvZiB0KWUuYWRkKG4pfX0scj17aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSxjPXtpbnN0YW5jZTpSZWdFeHAsZnJvbTooe2ZsYWdzOmUsc291cmNlOnR9KT0+ZT9bdCxlXTpbdF0sY3JlYXRlOihbZSx0XSk9Pm5ldyBSZWdFeHAoZSx0KX0sZD17aW5zdGFuY2U6VVJMLGZyb206ZT0+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO2V4cG9ydHt0IGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVAsZSBhcyBQTEFJTl9PQkpFQ1RfTEFCRUx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcFxuIiwiaW1wb3J0e0dMT0JBTF9DT05TVFJVQ1RPUl9NQVAgYXMgdCxQTEFJTl9PQkpFQ1RfTEFCRUwgYXMgbn1mcm9tXCIuL2NvbnN0cnVjdG9ycy5qc1wiO2NvbnN0IGU9LTEscj0tMixvPS0zLGk9LTQscz0tNSxjPS02O2Z1bmN0aW9uIGYobj12b2lkIDAsZT10KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYShuLGUpKX1mdW5jdGlvbiB1KHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuLTE7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpe2lmKE51bWJlci5pc05hTih0KSlyZXR1cm4tMztpZighTnVtYmVyLmlzRmluaXRlKHQpKXJldHVybiB0PDA/LTU6LTR9cmV0dXJuIG51bGx9Y29uc3QgbD1bXTtmdW5jdGlvbiBhKGUscj10KXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87Y29uc3QgaT1bXSxzPW5ldyBNYXA7cmV0dXJuIGZ1bmN0aW9uIHQoZSl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2xldCBjPXMuZ2V0KGUpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7c3dpdGNoKGM9aS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VcIm51bWJlclwiOmNhc2VcInN0cmluZ1wiOmNhc2VcImJvb2xlYW5cIjppW2NdPWUscy5zZXQoZSxjKTticmVhaztjYXNlXCJiaWdpbnRcIjppW2NdPVstNixlLnRvU3RyaW5nKDE2KV0scy5zZXQoZSxjKTticmVhaztjYXNlXCJvYmplY3RcIjppZihudWxsPT09ZSlpW2NdPWUscy5zZXQoZSxjKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYobC5sZW5ndGg8dCl7Y29uc3Qgbj1sLmxlbmd0aDtsLmxlbmd0aD10LGwuZmlsbCgtMixuLHQpfXJldHVybiBsLnNsaWNlKDAsdCl9KGUubGVuZ3RoKTtpW2NdPW4scy5zZXQoZSxjKTtmb3IoY29uc3RbcixvXW9mIGUuZW50cmllcygpKW5bcl09dChvKX1lbHNle2NvbnN0W28sZl09ZnVuY3Rpb24odCxlKXtjb25zdCByPXQuY29uc3RydWN0b3I7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygcil7Y29uc3Qgbj1yLm5hbWUsbz1lLmdldChuKTtpZih2b2lkIDAhPT1vKXJldHVybltuLG8uZnJvbSh0KV19Y29uc3Qgbz1PYmplY3QuZW50cmllcyh0KSxpPW8ubGVuZ3RoLHM9QXJyYXkuZnJvbSh7bGVuZ3RoOmkraX0pO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IG49b1t0XSxlPXQrdDtzW2VdPW5bMF0sc1tlKzFdPW5bMV19cmV0dXJuW24sc119KGUsciksdT1mLmxlbmd0aCxsPUFycmF5LmZyb20oe2xlbmd0aDp1KzF9KTtsWzBdPW8saVtjXT1sLHMuc2V0KGUsYyk7Zm9yKGxldCBuPTA7bjx1O24rKylsW24rMV09dChmW25dKX19cmV0dXJuIGN9KGUpLGl9ZXhwb3J0e3IgYXMgQVJSQVlfSE9MRV9JTkRFWCxjIGFzIEJJR19JTlRfTEFCRUwsbyBhcyBOQU5fSU5ERVgscyBhcyBORUdfSU5GX0lOREVYLGkgYXMgUE9TX0lORl9JTkRFWCxlIGFzIFVOREVGSU5FRF9JTkRFWCxhIGFzIGxpc3RpZnksZiBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcFxuIiwiaW1wb3J0e3NoYTNfNTEyIGFzIHJ9ZnJvbVwiLi9oYXNoLmpzXCI7aW1wb3J0e3N0cmluZ2lmeSBhcyBufWZyb21cIi4vb3Nvbi9zdHJpbmdpZnkuanNcIjtmdW5jdGlvbiBvKG8sdCl7cmV0dXJuIHIobihbbyx0XSkpfWZ1bmN0aW9uIHQocixvKXtyZXR1cm4gbihbcixvXSl9ZnVuY3Rpb24gaSgpe3JldHVyblwiXCJ9ZXhwb3J0e2kgYXMgZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nLG8gYXMgZ2V0Q2FjaGVLZXlPZkhhc2gsdCBhcyBnZXRDYWNoZUtleU9mU3RyaW5naWZpZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q2FjaGVLZXkuanMubWFwXG4iLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkhhc2ggYXMgdCxnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcgYXMgZX1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1yKHtnZXRDYWNoZUtleTp0fSksYz1yKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gcih7Y2FjaGVEdXJhdGlvbjplPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxjKXtsZXQgcixvLGk7cmV0dXJuXCJnZXR0ZXJcIj09PWM/LmtpbmQ/ZnVuY3Rpb24oKXtjb25zdCBjPW4odGhpcyxbXSksYT1EYXRlLm5vdygpO3JldHVybihpIT09Y3x8YS1vPmUpJiYoaT1jLHI9dC5jYWxsKHRoaXMpLG89YSkscn06ZnVuY3Rpb24oLi4uYSl7Y29uc3QgdT1uKHRoaXMsYSksaD1EYXRlLm5vdygpO3JldHVybihpIT09dXx8aC1vPmUpJiYoaT11LHI9Yz90LmNhbGwodGhpcywuLi5hKTp0KC4uLmEpLG89aCkscn19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsciBhcyBtZW1vaXplT25lRmFjdG9yeSxjIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwXG4iLCJleHBvcnQgZnVuY3Rpb24gaXNDSShjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMubG9hZEVudikgcmV0dXJuIHByb2Nlc3MuZW52O1xuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBbZW52UGF0aCwgY291bnRdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICAgIC8vIE92ZXJ3cml0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXZlbiB0aG91Z2ggdGhpcyBiZWhhdmlvciBpcyBub24tc3RhbmRhcmRcbiAgICAvLyBiZWNhdXNlIGBidW4gd2IgLi4uYCB3aWxsIGxvYWQgLmVudiBhbmQgLmVudi5sb2NhbCBiZWZvcmUgYHdiYCBsb2FkcyBvdGhlciB2YXJpYWJsZXMuXG4gICAgcmV0dXJuIHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmVudlZhcnMgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImV4cG9ydCBjb25zdCBpc1J1bm5pbmdPbkJ1biA9XG4gIC8vIERldGVjdCBgYnVuIC0tYnVuIHJ1biB3YiAuLi5gLiBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICBwcm9jZXNzLnZlcnNpb25zLmJ1biB8fFxuICAvLyBEZXRlY3QgYGJ1biBydW4gd2IgLi4uYC5cbiAgcHJvY2Vzcy5hcmd2WzBdPy5lbmRzV2l0aCgnL2J1bicpIHx8XG4gIHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uZW5kc1dpdGgoJy9idW4nKTtcblxuZXhwb3J0IGNvbnN0IHJ1bnRpbWVXaXRoQXJncyA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ25vZGUnO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICd5YXJuJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICd5YXJuJztcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeUxpa2UsIEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBhcmd2LmNvbW1hbmQgPz8gKGlzUnVubmluZ09uQnVuID8gJ2J1biBydW4gYnVpbGQnIDogJ3lhcm4gYnVpbGQnKSB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgbGluZXMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKDIpLnRyaW0oKSlcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcy5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAna2lsbC1wb3J0LWlmLW5vbi1jaScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBub24tQ0kuJyxcbiAgYnVpbGRlcjoga2lsbFBvcnRJZk5vbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQga2lsbFBvcnRJZk5vbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0SWZOb25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXAga2lsbGluZyBwb3J0IGR1ZSB0byBDSTogJHtwcm9qZWN0LmVudi5DSX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3J0RW52ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPD0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBLaWxsaW5nIHRoZSBwb3J0OiAke3BvcnR9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHtcbiAga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQsXG4gIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQsXG4gIHN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZSxcbn0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gL2h0dHAtZ2V0OlxcL1xcLzEyNy4wLjAuMTooXFxkKykvLmV4ZWMocnVubmFibGVTY3JpcHQpPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQpIHtcbiAgICBpZiAocnVubmFibGVTY3JpcHQuaW5jbHVkZXMoJ2RvY2tlciBydW4nKSkge1xuICAgICAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChOdW1iZXIocG9ydCksIHByb2plY3QpO1xuICAgICAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKHByb2plY3QuZG9ja2VySW1hZ2VOYW1lLCBwcm9qZWN0KTtcbiAgICB9XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQoTnVtYmVyKHBvcnQpKTtcbiAgfVxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYFxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuICcgOiAneWFybiBydW4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gYnVpbGQtdHMgcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLnJlcGxhY2VBbGwoJ2J1biAtLWJ1biBydW4gYnVuIC0tYnVuIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC8vIEJlY2F1c2UgYnVuIGNhbiBydW4gc3JjL2luZGV4LnRzIGRpcmVjdGx5LlxuICAgICAgLnJlcGxhY2VBbGwoJ2Rpc3QvaW5kZXguanMnLCAnc3JjL2luZGV4LnRzJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oPzpZQVJOICk/dml0ZXN0IHJ1bi9nLCAnYnVuIHRlc3QnKVxuICAgICAgLy8gJy0tYWxsb3dPbmx5JyBpcyBzb21ldGltZXMgcmVtb3ZlZC5cbiAgICAgIC5yZXBsYWNlQWxsKC8gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyg/OiAtLWFsbG93T25seSk/L2csICcnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQoXG4gICAgbmV3U2NyaXB0XG4gICAgICAvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGB5YXJuIHBsYXl3cmlnaHRgIGluIGEgcHJvamVjdCBkZXBlbmRpbmcgb24gYGFydGlsbGVyeS1lbmdpbmUtcGxheXdyaWdodGAuXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICk7XG4gIC8vIEFkZCBjYXNjYWRlIG9wdGlvbiB3aGVuIFdCX0VOViBpcyBkZWZpbmVkXG4gIGNvbnN0IGNhc2NhZGVPcHRpb24gPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgIC0tY2FzY2FkZS1lbnY9JHtwcm9qZWN0LmVudi5XQl9FTlYgfHwgJ2RldmVsb3BtZW50J31gIDogJyc7XG4gIHJldHVybiBbYGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gJHtwcmludGFibGVTY3JpcHR9YCwgcnVubmFibGVTY3JpcHRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmlndXJlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgb3B0czogT3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52LkZPUkNFX0NPTE9SID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBiaW9tZUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc29uJywgJ2pzb25jJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3RzJywgJ3RzeCddKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhYmlvbWVFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZSBvbiBCdW4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoIWlzUnVubmluZ09uQnVuKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIG9uIEJ1bi4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBhcmd2LmZpbGVzID8/IFtdO1xuICAgIGxldCBiaW9tZUFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHByZXR0aWVyQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgc29ydFBhY2thZ2VKc29uQXJnc1RleHQ6IHN0cmluZztcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXI6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShTdHJpbmcoZmlsZSkpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwYWNrYWdlSnNvbkZpbGVQYXRocy5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlvbWVBcmdzVGV4dCA9ICcnO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGBcIioqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gYFwiJHtwLnBhY2thZ2VKc29uUGF0aH1cImApLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW9tZUNvbW1hbmQgPVxuICAgICAgYXJndi5maXggJiYgYXJndi5mb3JtYXQgPyAnY2hlY2sgLS1maXgnIDogYXJndi5maXggPyAnbGludCAtLWZpeCcgOiBhcmd2LmZvcm1hdCA/ICdmb3JtYXQgLS1maXgnIDogJ2xpbnQnO1xuICAgIGxldCBiaW9tZVByb21pc2U6IFByb21pc2U8bnVtYmVyPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmlvbWVBcmdzVGV4dCB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJpb21lUHJvbWlzZSA9IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgIGBidW4gLS1idW4gYmlvbWUgJHtiaW9tZUNvbW1hbmR9IC0tY29sb3JzPWZvcmNlIC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLWZpbGVzLWlnbm9yZS11bmtub3duPXRydWUgJHtiaW9tZUFyZ3NUZXh0fWAsXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGlmIChwcmV0dGllckFyZ3NUZXh0KSB7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBgYnVuIC0tYnVuIHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgJHtwcmV0dGllckFyZ3NUZXh0fWAsXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJnc1RleHQpIHtcbiAgICAgICAgYXdhaXQgYmlvbWVQcm9taXNlO1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJ1biAtLWJ1biBzb3J0LXBhY2thZ2UtanNvbiAke3NvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0fWAsIHByb2plY3RzLnNlbGYsIGFyZ3YsIHtcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdyYWlsd2F5JyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuc3RhcnRzV2l0aCh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAmJiBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXRlc3RyZWFtKF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtydW50aW1lV2l0aEFyZ3N9IC1lICdcbmNvbnN0IHsgUHJpc21hQ2xpZW50IH0gPSByZXF1aXJlKFwiQHByaXNtYS9jbGllbnRcIik7XG5uZXcgUHJpc21hQ2xpZW50KCkuJHF1ZXJ5UmF3XFxgUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDtcXGBcbiAgLmNhdGNoKChlcnJvcikgPT4geyBjb25zb2xlLmxvZyhcIkZhaWxlZCBkdWUgdG86XCIsIGVycm9yKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtcbidgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtvdXRwdXRQYXRofTsgbGl0ZXN0cmVhbSByZXN0b3JlIC1jb25maWcgbGl0ZXN0cmVhbS55bWwgLW8gJHtvdXRwdXRQYXRofSAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBQT1NTSUJMRV9QQVRIUyA9IFtcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbiAgICAgIF07XG4gICAgICBmb3IgKGNvbnN0IHsgZGJQYXRoLCBzY2hlbWFQYXRoIH0gb2YgUE9TU0lCTEVfUEFUSFMpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKSB7XG4gICAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICAgICAgZGJQYXRoLFxuICAgICAgICAgICAgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8ke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOiAnUnVuIHByaXNtYSBjb21tYW5kcycsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnU2V0dXAgREIgZm9yIExpdGVzdHJlYW0nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZScsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgYXJndi5vdXRwdXQgPz8gKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBvdXRwdXQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBQcmlzbWEgU3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6XG4gICAgICAgICAgPyAnZGIvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgICA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOiAnUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcycsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICBjb25zdCBkYlBhdGggPSBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgcmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCA9IHByb2plY3QuZW52LldCX0VOViA9PT0gJ3N0YWdpbmcnID8gJzVtJyA6ICcxaCc7XG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICByZXRlbnRpb246IDhoXG4gICAgICByZXRlbnRpb24tY2hlY2staW50ZXJ2YWw6ICR7cmV0ZW50aW9uQ2hlY2tJbnRlcnZhbH1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDYwc1xuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmtub3duT3B0aW9ucy5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHBhY2thZ2VzLnB1c2goJ2V4cGVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PlxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYClcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKS5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuLyoqXG4gKiBGaW5kcyBhbiBhdmFpbGFibGUgcG9ydCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBwb3J0IG51bWJlci5cbiAqIEBwYXJhbSBzdGFydFBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gKGRlZmF1bHQ6IDMwMDApXG4gKiBAcGFyYW0gbWF4QXR0ZW1wdHMgLSBNYXhpbXVtIG51bWJlciBvZiBwb3J0cyB0byB0cnkgKGRlZmF1bHQ6IDEwMClcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGF2YWlsYWJsZSBwb3J0IG51bWJlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEF2YWlsYWJsZVBvcnQoc3RhcnRQb3J0ID0gMzAwMCwgbWF4QXR0ZW1wdHMgPSAxMDApOiBQcm9taXNlPG51bWJlcj4ge1xuICBmb3IgKGxldCBwb3J0ID0gc3RhcnRQb3J0OyBwb3J0IDwgc3RhcnRQb3J0ICsgbWF4QXR0ZW1wdHM7IHBvcnQrKykge1xuICAgIGlmIChhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpIHtcbiAgICAgIHJldHVybiBwb3J0O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYE5vIGF2YWlsYWJsZSBwb3J0IGZvdW5kIGluIHJhbmdlICR7c3RhcnRQb3J0fS0ke3N0YXJ0UG9ydCArIG1heEF0dGVtcHRzIC0gMX1gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMTI3LjAuMC4xJyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkRGV2SW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCB1bmJ1ZmZlciA9IGZhbHNlLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3VuYnVmZmVyID8gJ3VuYnVmZmVyICcgOiAnJ30ke3RoaXMuc3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYWRkaXRpb25hbE9wdGlvbnMsXG4gICAgICBhZGRpdGlvbmFsQXJnc1xuICAgICl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtIC1pdCAtcCBcXCR7UE9SVDotODA4MH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVEZXZPcHRpb25zIHtcbiAgLy8gJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nO1xuICBzdGFydENvbW1hbmQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFRlc3RFMkVPcHRpb25zID0ge1xuICBwcmlzbWFEaXJlY3Rvcnk/OiBzdHJpbmc7XG59ICYgVGVzdEUyRURldk9wdGlvbnM7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbiA9ICdkZXZlbG9wbWVudCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkRGV2SW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICBhYnN0cmFjdCBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfVxuICAgICAgJiYgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICAgIFwiJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICAgICl9XCJcbiAgICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0L2UyZS8nLCBwcmlzbWFEaXJlY3RvcnksIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IGVudlByZWZpeCA9IGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD0ke3BvcnR9YDtcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IGJ1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBgJHtlbnZQcmVmaXh9ICR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBwcmlzbWFEaXJlY3RvcnkgPyBgcm0gLVJmICR7cHJpc21hRGlyZWN0b3J5fS9tb3VudCAmJiBgIDogJyc7XG4gICAgcmV0dXJuIGAke2VudlByZWZpeH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtyZXNldENvbW1hbmR9JHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdC9lMmUvJywgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZW52ID0gcHJvamVjdC5lbnYuV0JfRU5WO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgZW52UHJlZml4ID0gYFdCX0VOVj0ke2Vudn0gTkVYVF9QVUJMSUNfV0JfRU5WPSR7ZW52fSBBUFBfRU5WPSR7ZW52fSBQT1JUPSR7cG9ydH1gO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke2VudlByZWZpeH0gJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtlbnZQcmVmaXh9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1cImA7XG4gIH1cblxuICBhYnN0cmFjdCB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPjtcblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cz8uam9pbignICcpIHx8ICd0ZXN0L3VuaXQvJztcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlgO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGJ1biB0ZXN0ICR7dGVzdFRhcmdldH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAzMDAwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgOTAwMDAgLWkgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgMzAwMCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2LFxuICAgICAgcG9ydFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJnczogc3RyaW5nLCB0YXJnZXRzOiBUZXN0QXJndlsndGFyZ2V0cyddKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9ICdCVU4gcGxheXdyaWdodCc7XG4gIGNvbnN0IHRhcmdldCA9IHRhcmdldHM/LmpvaW4oJyAnKSB8fCAndGVzdC9lMmUvJztcbiAgaWYgKCFwbGF5d3JpZ2h0QXJncy5zdGFydHNXaXRoKCd0ZXN0ICcpIHx8ICF0YXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gJHtwbGF5d3JpZ2h0QXJnc31gO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKCd0ZXN0ICcubGVuZ3RoKS50cmltKCk7XG4gIGNvbnN0IHBhcnRzID0gcmVzdC5sZW5ndGggPiAwID8gcmVzdC5zcGxpdCgvXFxzKy8pIDogW107XG4gIGlmICghcGFydHNbMF0gfHwgcGFydHNbMF0uc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgcGFydHMudW5zaGlmdCh0YXJnZXQpO1xuICB9IGVsc2Uge1xuICAgIHBhcnRzWzBdID0gdGFyZ2V0O1xuICB9XG4gIHJldHVybiBgJHtiYXNlfSB0ZXN0ICR7cGFydHMuam9pbignICcpfWA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmluZFBvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYCR7YXBwRW52fVlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJibGl0eiBkZXYgLXAgJHtwb3J0fSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcHBFbnYgPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgQVBQX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYCA6ICcnO1xuICAgIHJldHVybiBgJHthcHBFbnZ9Tk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KSxcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIGBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAsXG4gICAgICBdLmpvaW4oJyAmJiAnKX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgXVxuICAgICAgLm1hcCgoY29tbWFuZCkgPT4gYCR7Y29tbWFuZC50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgIC5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3M6IG9wdGlvbnMucGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXVxuICAgICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgICAgLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydENvbW1hbmQgPSBgYmxpdHogZGV2IC1wICR7cG9ydH0ke3RvRGV2TnVsbChhcmd2KX1gO1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZDogc3RhcnRDb21tYW5kID8/IGRlZmF1bHRTdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGZpbmRBdmFpbGFibGVQb3J0KCk7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiYmxpdHogZGV2IC1wICR7cG9ydH0ke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kQXZhaWxhYmxlUG9ydCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbmRQb3J0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGBQT1JUPSR7cG9ydH0gWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0ke3RvRGV2TnVsbChhcmd2KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IDgwODApOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmRcbiAgICB9JHt0b0Rldk51bGwoYXJndil9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gUE9SVD1cXCR7UE9SVDotJHtwb3J0fX0gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcm9qZWN0Lmhhc1ByaXNtYSA/ICdwcmlzbWEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1nZW5lcmF0ZSAmJiAnIDogJyd9KCR7dGhpcy5zdGFydFByb2R1Y3Rpb24oXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndlxuICAgICl9KWA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCB7XG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcm9qZWN0Lmhhc1ByaXNtYSA/ICdwcmlzbWEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1nZW5lcmF0ZSAmJiAnIDogJyd9KCR7dGhpcy5zdGFydFByb2R1Y3Rpb24oXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICl9KWAsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIHZpdGVzdCBydW4gJHt0ZXN0VGFyZ2V0fSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRURldk9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBzdGFydENvbW1hbmQgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtcbiAgICAgIHByb2plY3QuZW52LldCX0VOVlxuICAgIH0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kID8/IHRoaXMuc3RhcnQocHJvamVjdCwgYXJndil9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiB2aXRlc3QgcnVuICR7dGVzdFRhcmdldH0gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoKTtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kQXZhaWxhYmxlUG9ydCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbmRQb3J0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJuZXh0IGRldiAtLXR1cmJvcGFjayAtcCAke3BvcnR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YCxcbiAgICAgIF0uam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICBdXG4gICAgICAubWFwKChjb21tYW5kKSA9PiBgJHtjb21tYW5kLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgeyBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBkZWZhdWx0U3RhcnRDb21tYW5kID0gYG5leHQgZGV2IC0tdHVyYm9wYWNrIC1wICR7cG9ydH0ke3RvRGV2TnVsbChhcmd2KX1gO1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgc3RhcnRDb21tYW5kOiBzdGFydENvbW1hbmQgPz8gZGVmYXVsdFN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoKTtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJuZXh0IGRldiAtLXR1cmJvcGFjayAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGBQT1JUPSR7cG9ydH0gWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0ke3RvRGV2TnVsbChhcmd2KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHtcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmluZFBvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcInJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpfSAmJiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKFxuICAgICAgICAnZWNvc3lzdGVtLmNvbmZpZy5janMnXG4gICAgICApfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICBdXG4gICAgICAubWFwKChjb21tYW5kKSA9PiBgJHtjb21tYW5kLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ3ByaXNtYScsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXVxuICAgICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgICAgLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSBgcmVtaXggZGV2JHt0b0Rldk51bGwoYXJndil9YCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoKTtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwicmVtaXggZGV2JHt0b0Rldk51bGwoYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnLCAnaG9ubyddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnU3RhcnQgYXBwJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdkZXZlbG9wbWVudCcpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDgwODA7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHBvcnQpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICd0ZXN0Jyk7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndil9YDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYWRkU2VydmVyTG9nUmVkaXJlY3Rpb24oc2NyaXB0KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGFkZFNlcnZlckxvZ1JlZGlyZWN0aW9uKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZFNjcmlwdCA9IHNjcmlwdC50cmltRW5kKCk7XG4gIHJldHVybiBgJHt0cmltbWVkU2NyaXB0fSA+IHRlc3QubG9nIDI+JjFgO1xufVxuXG5mdW5jdGlvbiBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LCB3YkVudjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSB3YkVudjtcbiAgbGV0IHByZWZpeCA9IGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIGlmIChkZXBzLm5leHQpIHtcbiAgICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19XQl9FTlYgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gICAgcHJlZml4ICs9IGBORVhUX1BVQkxJQ19XQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIH1cbiAgcmV0dXJuIHByZWZpeDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFMmUgdGVzdCBtb2RlOiBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4nLFxuICBidWlsZGVyOiB7IC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICBwcm9jZXNzLmVudi5DSSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAoYXJndi50YXJnZXRzID8/IFtdKSBhcyBzdHJpbmdbXTtcbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSB0ZXN0VGFyZ2V0cy5sZW5ndGggPT09IDA7XG5cbiAgLy8gRGV0ZWN0IHRlc3QgbW9kZXMgZnJvbSB0YXJnZXQgcGF0aHNcbiAgY29uc3QgaGFzRTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICBjb25zdCBoYXNVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgY29uc3Qgc2hvdWxkUnVuVW5pdCA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzO1xuICBjb25zdCBzaG91bGRSdW5FMmUgPSBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNFMmVUYXJnZXRzO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICBjb25zdCB1bml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IHVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyB1bml0VGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLCBwcm9qZWN0LCBhcmd2LCB7IHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgZTJlIHRlc3RzIGlmIG5vdCBuZWVkZWQgb3Igbm8gZTJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIXNob3VsZFJ1bkUyZSB8fCAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuXG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgZTJlQXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBlMmVBcmd2LCBzY3JpcHRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGNvbnN0IGUyZVRhcmdldCA9IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBlMmVBcmd2LCBzY3JpcHRzLCBgdGVzdCAke2UyZVRhcmdldH0gLS1kZWJ1Z2ApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIGNvbnN0IGUyZVRhcmdldCA9IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2UyZVRhcmdldH0gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2UyZVRhcmdldH0gLS1kZWJ1Z2AgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBwcm9jZXNzLmVudi5XQl9ET0NLRVIgPz89ICcxJztcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQ6IGAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsXG4gICAgfSksXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB0ZXN0T25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0LW9uLWNpJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3Qgb24gQ0kgd2l0aCBubyBvcHRpb25zLicsXG4gIGJ1aWxkZXI6IHRlc3RPbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdE9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdE9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmVudi5DSSB8fD0gJzEnO1xuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0LW9uLWNpXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBpZiAocHJvamVjdC5oYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIHByb2Nlc3MuZW52LldCX0RPQ0tFUiA/Pz0gJzEnO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0YXJ0Q29tbWFuZDogZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9O1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwgb3B0aW9ucykucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICAgIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICAgICkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoa2lsbFBvcnRJZk5vbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJzZXQiLCJhc3luYyIsInNwYXduQXN5bmMiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic3Rkb3V0Iiwic2V0RW5jb2RpbmciLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJwcmludGluZ1N0ZG91dCIsInByb2Nlc3MiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsInBpZCIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsInRyZWVLaWxsIiwia2lsbE9uRXhpdCIsImVycm9yIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJjb2RlIiwic2lnbmFsIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJzdGF0dXMiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImxlbmd0aCIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJuYW1lIiwibWVzc2FnZSIsInN0YWNrIiwicHVzaCIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwibWFwIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJOdW1iZXIiLCJpc05hTiIsImlzRmluaXRlIiwidG9TdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiaXNDSSIsImNpRW52IiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwidGVzdCIsImZzIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJlbnYiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlycyIsImNvdW50Iiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicHJpc21hIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0Iiwidml0ZXN0Iiwic2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQiLCJDSSIsImNvbmZpZ1BhdGgiLCJkb2NrZXJQYWNrYWdlSnNvbiIsImRpcm5hbWUiLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImN1cnJlbnRQYXRoIiwiYmluUGF0aCIsIlBBVEgiLCJwYXJlbnRQYXRoIiwiZmlsZU5hbWUiLCJmaW5kIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJ0aGlzUHJvamVjdCIsInJvb3RQcm9qZWN0Iiwid29ya3NwYWNlcyIsImVuZHNXaXRoIiwicm9vdCIsInNlbGYiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsImRlc2NlbmRhbnRzIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwicHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJoYW5kbGVyIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ0cmltIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJzdGRpbyIsImVuY29kaW5nIiwic3BsaXQiLCJsaW5lIiwicmVwbGFjZSIsImluY2x1ZGVQYXR0ZXJucyIsInNvbWUiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImdyZWVuIiwiZHJ5UnVuIiwid3JpdGVGaWxlIiwiYnVpbGRJZk5lZWRlZCIsInJldCIsInNoZWxsIiwiZXhpdENvZGUiLCJraWxsUG9ydElmTm9uQ2lDb21tYW5kIiwiYnVpbGRlciIsImV4aXQiLCJwb3J0RW52IiwiUE9SVCIsInBvcnQiLCJpc0ludGVnZXIiLCJraWxsUG9ydFByb2Nlc3MiLCJraWxsUG9ydElmTm9uQ2kiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyIsInJlbW92ZURvY2tlckNvbnRhaW5lcnMiLCJmaWx0ZXJBcmdzIiwiY29udGFpbmVySWRzIiwiaWQiLCJCb29sZWFuIiwibGlzdERvY2tlckNvbnRhaW5lcklkcyIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJwcmludGFibGVTY3JpcHQiLCJydW5uYWJsZVNjcmlwdCIsIm5vcm1hbGl6ZVNjcmlwdCIsInByaW50U3RhcnQiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwiZXhlYyIsInN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQiLCJpbWFnZU5hbWUiLCJzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUiLCJraWxsRnVuYyIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiY29uZmlndXJlRW52IiwidGltZW91dCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJvdXQiLCJuZXdTY3JpcHQiLCJibGl0eiIsImZpeEJ1bkNvbW1hbmQiLCJub3JtYWxpemVkU2NyaXB0IiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsIm5ld0VudiIsImNpIiwiZm9yY2VDb2xvciIsIkZPUkNFX0NPTE9SIiwiYmlvbWVFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwiZmlsZXMiLCJiaW9tZUFyZ3NUZXh0IiwicHJldHRpZXJBcmdzVGV4dCIsInNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0IiwiZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lIiwiZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsImZpbGUiLCJTdHJpbmciLCJleHRlbnNpb24iLCJleHRuYW1lIiwiYmlvbWVDb21tYW5kIiwiYmlvbWVQcm9taXNlIiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwic3RhcnRzV2l0aCIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwicHJpc21hU2NyaXB0cyIsImRlcGxveSIsImFkZGl0aW9uYWxPcHRpb25zIiwiZGVwbG95Rm9yY2UiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiRklMRV9TQ0hFTUEiLCJEQVRBQkFTRV9VUkwiLCJQT1NTSUJMRV9QQVRIUyIsInNjaGVtYVBhdGgiLCJkYlBhdGgiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImRlZmF1bHQiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGl0ZXN0cmVhbUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnIiwib3V0cHV0IiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJyZXF1aXJlZEVudlZhcnMiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZIiwibWlzc2luZ0VudlZhcnMiLCJyZXRlbnRpb25DaGVja0ludGVydmFsIiwibGl0ZXN0cmVhbUNvbmZpZyIsIndyaXRlRmlsZVN5bmMiLCJyZWFzb24iLCJmaWx0ZXJlZCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsIml0ZW0iLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJzaWxlbnQiLCJmaW5kQXZhaWxhYmxlUG9ydCIsInN0YXJ0UG9ydCIsIm1heEF0dGVtcHRzIiwiaXNQb3J0QXZhaWxhYmxlIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib25jZSIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsInN0b3BBbGwiLCJCYXNlU2NyaXB0cyIsImJ1aWxkRG9ja2VyIiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJ3YWl0QW5kT3BlbkFwcCIsInRlc3RFMkUiLCJwbGF5d3JpZ2h0QXJncyIsInByaXNtYURpcmVjdG9yeSIsInN0YXJ0Q29tbWFuZCIsImVudlByZWZpeCIsInBsYXl3cmlnaHRDb21tYW5kIiwiYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZCIsInRhcmdldHMiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ0ZXN0VGFyZ2V0Iiwid2FpdEFwcCIsImJhc2UiLCJ0YXJnZXQiLCJyZXN0IiwicGFydHMiLCJ1bnNoaWZ0IiwiYmxpdHpTY3JpcHRzIiwiYXBwRW52Iiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRUZXN0Iiwic3VwZXIiLCJkZWZhdWx0U3RhcnRDb21tYW5kIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImFyZyIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsImNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzIiwiYWRkU2VydmVyTG9nUmVkaXJlY3Rpb24iLCJ3YkVudiIsIk5FWFRfUFVCTElDX1dCX0VOViIsInRlc3RDb21tYW5kIiwiZTJlIiwiY2hvaWNlcyIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJoYXNFMmVUYXJnZXRzIiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5Vbml0Iiwic2hvdWxkUnVuRTJlIiwidW5pdFRhcmdldHMiLCJ1bml0QXJndiIsInVuaXRUaW1lb3V0IiwiZTJlVGFyZ2V0cyIsImUyZUFyZ3YiLCJ0ZXN0T25Eb2NrZXIiLCJlMmVUYXJnZXQiLCJXQl9ET0NLRVIiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsImNvbW1hbmRzIiwidHlwZXNjcmlwdCIsInB5cmlnaHQiLCJuZXh0RGlyUGF0aCIsInJtU3luYyIsImZvcmNlIiwiZXhpdENvZGVzIiwiYWxsIiwiZmluYWxFeGl0Q29kZSIsInRjQ29tbWFuZCIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInRvVXBwZXJDYXNlIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwicGFja2FnZUpzb25EaXIiLCJ1cmwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJoZWxwIl0sIm1hcHBpbmdzIjoiNGVBeUhBLE1BQU1BLEVBQWdCLElBQUlDLElBRTFCLFNBQVNDLEVBQVlDLEdBQ25CLE1B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QyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHLElBQUk5RCxFQUFFLEVBQUVBLEVBQUUsR0FBR0EsR0FBRyxFQUFFbEIsRUFBRUosRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlNLEVBQUVOLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNEIsRUFBRTVCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJd0IsRUFBRXhCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJeUIsRUFBRXpCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJMEIsRUFBRTFCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJK0IsRUFBRS9CLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJZ0MsRUFBRWhDLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJaUMsRUFBRWpDLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJa0MsRUFBRWxDLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQyxFQUFFZ0MsR0FBR0wsR0FBRyxFQUFFSixJQUFJLElBQUl0QixFQUFFZ0MsR0FBR1YsR0FBRyxFQUFFSSxJQUFJLElBQUk1QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVHLEdBQUdxQixHQUFHLEVBQUVDLElBQUksSUFBSXhCLEVBQUVJLEdBQUdvQixHQUFHLEVBQUVELElBQUksSUFBSXpCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRTJCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJOUIsRUFBRXNCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJL0IsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFd0IsR0FBR1EsR0FBRyxFQUFFQyxJQUFJLElBQUloQyxFQUFFd0IsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUlqQyxFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtD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
9
+ */const $=[..."0123456789abcdef"],P=[6,1536,393216,100663296],S=[0,8,16,24],R=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const x=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class j{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,o=this.blockCount,s=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<o+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<S[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<S[3&i++],t[i>>2]|=(128|63&a)<<S[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<S[3&i++],t[i>>2]|=(128|a>>6&63)<<S[3&i++],t[i>>2]|=(128|63&a)<<S[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<S[3&i++],t[i>>2]|=(128|a>>12&63)<<S[3&i++],t[i>>2]|=(128|a>>6&63)<<S[3&i++],t[i>>2]|=(128|63&a)<<S[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];D(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];D(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=$[o>>4&15]+$[15&o]+$[o>>12&15]+$[o>>8&15]+$[o>>20&15]+$[o>>16&15]+$[o>>28&15]+$[o>>24&15];i%e===0&&(t=x(t),D(t),s=0)}return r&&(o=t[s],a+=$[o>>4&15]+$[15&o],r>1&&(a+=$[o>>12&15]+$[o>>8&15]),r>2&&(a+=$[o>>20&15]+$[o>>16&15])),a}}const D=function(e){let t,n,r,o,s,i,a,c,d,l,u,p,f,m,h,g,v,b,y,w,k,E,A,$,P,S,x,j,D,N,T,_,O,I,C,L,B,F,J,z,W,U,M,Y,V,q,K,G,H,Q,X,Z,ee,te,ne,re,oe,se,ie,ae,ce,de,le;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],d=e[5]^e[15]^e[25]^e[35]^e[45],l=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|d>>>31),n=s^(d<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(l<<1|u>>>31),n=a^(u<<1|l>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=d^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,m=e[0],h=e[1],q=e[11]<<4|e[10]>>>28,K=e[10]<<4|e[11]>>>28,j=e[20]<<3|e[21]>>>29,D=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,U=e[40]<<18|e[41]>>>14,M=e[41]<<18|e[40]>>>14,I=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,v=e[12]<<12|e[13]>>>20,G=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,N=e[33]<<13|e[32]>>>19,T=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,L=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,b=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,_=e[45]<<29|e[44]>>>3,O=e[44]<<29|e[45]>>>3,$=e[6]<<28|e[7]>>>4,P=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,w=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,S=e[18]<<20|e[19]>>>12,x=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,z=e[38]<<8|e[39]>>>24,W=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,A=e[49]<<14|e[48]>>>18,e[0]=m^~g&b,e[1]=h^~v&y,e[10]=$^~S&j,e[11]=P^~x&D,e[20]=I^~L&F,e[21]=C^~B&J,e[30]=Y^~q&G,e[31]=V^~K&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~b&w,e[3]=v^~y&k,e[12]=S^~j&N,e[13]=x^~D&T,e[22]=L^~F&z,e[23]=B^~J&W,e[32]=q^~G&Q,e[33]=K^~H&X,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=b^~w&E,e[5]=y^~k&A,e[14]=j^~N&_,e[15]=D^~T&O,e[24]=F^~z&U,e[25]=J^~W&M,e[34]=G^~Q&Z,e[35]=H^~X&ee,e[44]=se^~ae&de,e[45]=ie^~ce&le,e[6]=w^~E&m,e[7]=k^~A&h,e[16]=N^~_&$,e[17]=T^~O&P,e[26]=z^~U&I,e[27]=W^~M&C,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=E^~m&g,e[9]=A^~h&v,e[18]=_^~$&S,e[19]=O^~P&x,e[28]=U^~I&L,e[29]=M^~C&B,e[38]=Z^~Y&q,e[39]=ee^~V&K,e[48]=de^~te&re,e[49]=le^~ne&oe,e[0]^=R[r],e[1]^=R[r+1]},N=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,o])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==o&&(e.cause=o)}},t={instance:Uint8Array,from:e=>[btoa(_.decode(e))],create:([e])=>T.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},o={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},s={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,o,s,i].map(e=>[e.instance.name,e]))}(),T=new TextEncoder,_=new TextDecoder("utf-8");function O(e=void 0,t=N){return JSON.stringify(L(e,t))}function I(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const C=[];function L(e,t=N){const n=I(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=I(n);if(null!==s)return s;let i=o.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,o.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],o.set(n,i);break;case"object":if(null===n)r[i]=n,o.set(n,i);else if(Array.isArray(n)){const t=function(e){if(C.length<e){const t=C.length;C.length=e,C.fill(-2,t,e)}return C.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=s,r[i]=d,o.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function B(e,t){return function(e){return new j(512,P,512).update(e).hex()}(O([e,t]))}const F=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=B}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=d),o}}}({getCacheKey:B});function J(e){return!!e&&"0"!==e&&"false"!==e}let z;class W{static{[z]=function(e,t,n,r,o){var s,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,m=Object.create,h=[m(null),m(null)],g=t.length;function v(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function b(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function y(e,t,n,r,o,a,c,d,l,u,p){function m(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),y=t[3],w=!c,k=1===o,A=3===o,$=4===o,P=2===o;function S(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),R[t].call(o,s)}}if(!w){var R={},x=[],j=A?"get":$||k?"set":"value";if(l?(u||k?R={get:E(function(){return y(this)},r,"get"),set:function(e){t[4](this,e)}}:R[j]=y,u||E(R[j],r,P?"":j)):u||(R=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+R[j].name+") is not supported yet");h[+d][r]=o<3?1:o}}for(var D=e,N=g.length-1;N>=0;N-=n?2:1){var T=b(g[N],"A decorator","be",!0),_=n?g[N-1]:void 0,O={},I={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");b(t,"An initializer","be",!0),a.push(t)}.bind(null,O)};if(w)i=T.call(_,D,I),O.v=1,b(i,"class decorators","return")&&(D=i);else if(I.static=d,I.private=l,i=I.access={has:l?p.bind():function(e){return r in e}},$||(i.get=l?P?function(e){return m(e),R.value}:S("get",0,m):function(e){return e[r]}),P||A||(i.set=l?S("set",0,m):function(e,t){e[r]=t}),D=T.call(_,k?{get:R.get,set:R.set}:R[j],I),O.v=1,k){if("object"==typeof D&&D)(i=b(D.get,"accessor.get"))&&(R.get=i),(i=b(D.set,"accessor.set"))&&(R.set=i),(i=b(D.init,"accessor.init"))&&x.unshift(i);else if(void 0!==D)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else b(D,(u?"field":"method")+" decorators","return")&&(u?x.unshift(D):R[j]=D)}return o<2&&c.push(v(x,d,1),v(a,d,0)),u||w||(l?k?c.splice(-1,0,S("get",d),S("set",d)):c.push(P?R[j]:b.call.bind(R[j])):f(e,r,R)),D}function w(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=m(null==s?null:s),d=[],l=function(e){e&&d.push(v(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],f=!!i[3],m=16&l;y(t?e:e.prototype,i,m,f?"#"+p:A(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return k(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||w(e),{e:i,get c(){var n=[];return g&&[w(e=y(e,[t],r,e.name,5,n)),v(n,1)]}}}(this,[],[[F,3,"isBunAvailable"],[F,3,"buildCommand"],[F,3,"rootDirPath"],[F,3,"dockerfile"],[F,3,"hasDockerfile"],[F,3,"hasSourceCode"],[F,3,"name"],[F,3,"dockerImageName"],[F,3,"env"],[F,3,"packageJson"],[F,3,"packageJsonPath"],[F,3,"hasPrisma"],[F,3,"hasVitest"],[F,3,"skipLaunchingServerForPlaywright"],[F,3,"dockerPackageJson"],[F,3,"binExists"]]).e}argv=void z(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let o=(n.env??[]).map(e=>t.resolve(r,e.toString()));const s=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===o.length&&(o.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&o.push(t.join(n,".env"))}o=o.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}o=o.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const i=[],a={};for(const e of o){let o=0;for(const[n,s]of Object.entries(y(t.join(r,e))))n in a||(a[n]=s,o++);i.push([e,o]),n.verbose&&o>0&&console.info(`Read ${o} environment variables from ${e}`)}if(n.checkEnv){const e=Object.keys(y(t.join(r,n.checkEnv))).filter(e=>!(e in a));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...process.env,...n}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!(this.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get skipLaunchingServerForPlaywright(){if(J(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}}function U(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new W(o,n,r)}async function M(n,r=!0,o){const s=function(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new W(o,n,r);let i=s;if(!s.packageJson.workspaces&&t.dirname(o).endsWith("/packages")){const s=t.resolve(o,"..","..");e.existsSync(t.join(s,"package.json"))&&(i=new W(s,n,r))}return{root:i,self:s}}(n,r,o);if(s)return{...s,descendants:s.root===s.self?await Y(n,s.root,r):[s.self]}}async function Y(n,r,o){const s=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return s;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new W(r,n,o));return s}const V=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),q=V?"bun --bun run":"node",K=V?"bun":"yarn",G=V?"bun --bun run":"yarn",H={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const o=U(n,!0,r);if(!o)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(V?"bun run build":"yarn build")},!e.existsSync(t.join(o.rootDirPath,".git")))return Q(o,n),!0;const[i,a,l]=await async function(n,r){const o=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(o,"last-build");await e.promises.mkdir(o,{recursive:!0});const a=c("sha256"),d=s.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!X.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const o=s.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(Z.some(t=>e.includes(t))||ee.some(t=>e.endsWith(t)))&&!te.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=s.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(o,n);if(i)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!Q(o,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function Q(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=s.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const X=new Set(["CI","PWDEBUG","TMPDIR"]);const Z=["src/","public/"],ee=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],te=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ne={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=U(e);t||(console.error(d.red("No project found.")),process.exit(1));if(J(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(d.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await f(r)}catch{}}(e)}};const re=new m,oe={exitIfFailed:!0};async function se(e,t,n,r=oe){const[o,s]=ae(e,t);if(ce(o,t),n.verbose&&ce(s,t,"Start (raw)",!0),n.dryRun)return de(o,0,r),0;const i=await w(s,void 0,{cwd:t.dirPath,env:le(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return de(o,i.status,r),i.status??1}function ie(e,t,n,r=oe){return re.runAndWaitForReturnValue(async()=>{const[o,s]=ae(e,t);if(ce(o,t,"Start (parallel)",!0),n.dryRun)return ce(o,t,"Started (log)"),n.verbose&&ce(s,t,"Started (raw)",!0),de(o,0,r),0;const i=await w(s,void 0,{cwd:t.dirPath,env:le(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});ce(o,t,"Started (log)"),n.verbose&&ce(s,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),de(o,i.status,r),i.status??1})}function ae(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",V?"bun --bun run ":"yarn run ");V&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=ue(n.replaceAll("YARN ",`${G} `)),o=ue(n.replaceAll("YARN playwright ",`${G} playwright `).replaceAll("YARN ",!V&&t.binExists?"":`${G} `)),s=t.env.WB_ENV?` --cascade-env=${t.env.WB_ENV||"development"}`:"";return[`${G} dotenv${s} -- ${r}`,o]}function ce(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function de(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function le(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function ue(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const pe=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),fe=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),me=new Set([...fe].filter(e=>!pe.has(e))),he={command:"lint [files...]",describe:"Lint code on Bun",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(e){V||(console.error(d.red("This command is only available on Bun.")),process.exit(1));const n=await M(e,!1);n||(console.error(d.red("No project found.")),process.exit(1));const r=e.files??[];let o,s,i;if(r.length>0){const e=[],n=[],a=[];for(const o of r){const r=t.resolve(String(o));if(r.endsWith("/test/fixtures")||r.includes("/test/fixtures/")||r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const s=t.extname(r).slice(1);r.endsWith("/package.json")?a.push(r):pe.has(s)?e.push(r):fe.has(s)&&n.push(r)}o=e.map(e=>`"${e}"`).join(" "),s=n.map(e=>`"${e}"`).join(" "),i=a.map(e=>`"${e}"`).join(" ")}else o="",s=`"**/{.*/,}*.{${[...me].join(",")}}" "!**/test{-,/}fixtures/**"`,i=n.descendants.map(e=>`"${e.packageJsonPath}"`).join(" ");const a=e.fix&&e.format?"check --fix":e.fix?"lint --fix":e.format?"format --fix":"lint";let c;(o||0===r.length)&&(c=ie(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${o}`,n.self,e,{forceColor:!0})),e.format&&(s&&ie(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${s}`,n.self,e,{forceColor:!0}),i&&(await c,ie(`bun --bun sort-package-json ${i}`,n.self,e,{forceColor:!0})))}};function*ge(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ve={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(n){const r=await M(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of ge("optimizeForDockerBuild",r.descendants)){const r=o.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(be(n,r),ye(r),we(r),n.dryRun)continue;const i=n.outside?t.join(o.dirPath,"dist"):o.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(s.spawnSync(K,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function be(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],o=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],o.push(e));console.info("Removed devDependencies:",o.join(", ")||"none")}function ye(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},o=[];for(const[e,s]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>s.includes(e)||s.trim()===e.trim()))&&(delete r[e],o.push(e));console.info("Removed scripts:",o.join(", ")||"none")}function we(e){delete e.private,delete e.publishConfig,delete e.prettier}const ke=new class{deploy(e,t=""){return"PRISMA migrate deploy"+(t?` ${t}`:"")}deployForce(e){const t=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${t}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${t}/mount/prod.sqlite3*\n && litestream restore -config litestream.yml -o ${t}/mount/prod.sqlite3 ${t}/mount/prod.sqlite3 && ls -ahl ${t}/mount/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}litestream(e){return`${q} -e '\nconst { PrismaClient } = require("@prisma/client");\nnew PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\`\n .catch((error) => { console.log("Failed due to:", error); process.exit(1); });\n'`}migrate(e,t=""){return`PRISMA migrate deploy${t?` ${t}`:""} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return"PRISMA migrate dev"+(t?` ${t}`:"")}reset(e,t=""){return`PRISMA migrate reset --force --skip-seed${t?` ${t}`:""} && ${this.seed(e)}`}restore(e,t){return`rm -Rf ${t}; litestream restore -config litestream.yml -o ${t} ${e.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(n,r,o=""){const s="file:";let i="";if(r)try{new URL(r),i=`DATABASE_URL=${r} `}catch{i=`DATABASE_URL=${s}${t.resolve(r)} `}else if(n.env.DATABASE_URL?.startsWith(s)){const r=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];for(const{dbPath:o,schemaPath:a}of r)if(e.existsSync(t.resolve(n.dirPath,a))){i=`DATABASE_URL=${s}${t.resolve(n.dirPath,o,n.env.DATABASE_URL.slice(5))} `;break}}return`${i}PRISMA studio${o?` ${o}`:""}`}},Ee={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"},"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}},Ae={},$e={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Pe).command(Se).command(Re).command(xe).command(je).command(De).command(Ne).command(Te).command(_e).command(Oe).command(Ie).demandCommand().strict(!1),handler(){}},Pe={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Ae,async handler(e){const t=await Le(e),n=Be(e);for(const r of ge("prisma deploy",t))await se(ke.deploy(r,n),r,e)}},Se={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Ae,async handler(e){const t=await Le(e);for(const n of ge("prisma deploy-force",t))await se(ke.deployForce(n),n,e)}},Re={command:"litestream",describe:"Setup DB for Litestream",builder:Ae,async handler(e){const t=await Le(e);for(const n of ge("prisma litestream",t))await se(ke.litestream(n),n,e)}},xe={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Ae,async handler(e){const t=await Le(e);for(const e of ge("prisma create-litestream-config",t))Ce(e)}},je={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Ae,async handler(e){const t=await Le(e),n=Be(e);for(const r of ge("prisma migrate",t))await se(ke.migrate(r,n),r,e)}},De={command:"migrate-dev",describe:"Create a migration file",builder:Ae,async handler(e){const t=await Le(e),n=Be(e);for(const r of ge("prisma migrate-dev",t))await se(ke.migrateDev(r,n),r,e)}},Ne={command:"reset",describe:"Reset DB",builder:Ae,async handler(e){const t=await Le(e),n=Be(e);for(const r of ge("prisma reset",t))await se(ke.reset(r,n),r,e)}},Te={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Ae,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Le(e);for(const n of ge("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await se(ke.restore(n,t),n,e)}}},_e={command:"seed",describe:"Populate DB with seed data",builder:{...Ae,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Le(e);for(const n of ge("prisma seed",t))await se(ke.seed(n,e.file),n,e)}},Oe={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Ae,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await Le(e),n=Be(e,["db-url-or-path","restored"]);for(const r of ge("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await se(ke.studio(r,t,n),r,e)}}},Ie={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await Le(e),n=[(e.args?.join(" ")??"").trimEnd(),Be(e,["args"])].filter(Boolean).join(" ");for(const r of ge(`prisma ${n}`,t))await se(`PRISMA ${n}`,r,e)}};function Ce(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw new Error(`Missing environment variables for Litestream: ${o.join(", ")}`);const s="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n retention: 8h\n retention-check-interval: ${s}\n sync-interval: 60s\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`)}}async function Le(e){const t=await M(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(d.red("No prisma project found.")),process.exit(1)),n}function Be(e,t=[]){const n=[],r=Object.keys(Ee),o=Object.values(Ee).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),s=new Set([...t,...r,...o,"_","$0"]);for(const[t,r]of Object.entries(e))if(!s.has(t)){const o=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(o!==t&&void 0!==e[o])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}return n.join(" ")}const Fe={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=U(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let o=0;o<e.retry;o++)if(o>0&&console.info(`\n${d.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await se(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},Je={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await M(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of ge("setup",n.descendants)){const r=await h.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===g.platform()){const n=["pstree"];t.hasDockerfile&&n.push("expect"),await ie(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await se("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await ie("poetry config virtualenvs.in-project true",t,e);const[,n]=s.execSync("asdf current python").toString().trim().split(/\s+/);await ie(`poetry env use ${n}`,t,e),await re.promiseAll(),await se("poetry run pip install --upgrade pip",t,e),await se("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await se(`${G} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await se(`${G} playwright install --with-deps`,r,e)}(e)}};function ze(e){return e.silent?" > /dev/null":""}const We=new Set;async function Ue(e,t){await async function(e){return new Promise(t=>{const n=v();n.once("error",e=>{e.code,t(!1)}),n.once("listening",()=>{n.close(()=>{t(!0)})}),n.listen(e,"127.0.0.1")})}(e)||await Me(e,t);const n=async()=>{We.has(e)||(We.add(e),await Me(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}async function Me(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await w("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await w("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await f(e)}catch{}}async function Ye(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await Ue(n,t),n}const Ve=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t=!1,n="",r=""){return`${this.stop(e)} && ${t?"unbuffer ":""}${this.start(e,n,r)}`}start(e,t="",n=""){return function(e,t){const n=()=>{if(We.has(e))return;We.add(e),ce(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});de(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e),`docker run --rm -it --publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class qe{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Ve.buildImage(e,t)}startProductionProtected(e,t){return[...e.hasPrisma?ke.migrate(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].filter(Boolean).map(e=>`${e} ${ze(t)}`.trim()).join(" && ")}async startDev(e,t){return await Ye(e.env.PORT,e),this.shouldWaitAndOpenApp?`YARN concurrently --raw --kill-others-on-fail\n "${this.startDevProtected(e,t)}"\n "${this.waitAndOpenApp(e)}"`:this.startDevProtected(e,t)}async startProduction(e,t){return await Ye(e.env.PORT,e),this.shouldWaitAndOpenApp?`YARN concurrently --raw --kill-others-on-fail\n "${this.startProductionProtected(e,t)}"\n "${this.waitAndOpenApp(e)}"`:this.startProductionProtected(e,t)}async startTest(e,t){return await Ye(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Ye(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && YARN concurrently --raw --kill-others-on-fail\n "${Ve.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e)}"`:`${this.buildDocker(e,"development")}\n && ${Ve.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}testE2EDev(e,t,n){return this.testE2EPrivate(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EPrivate(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EPrivate(e,t,Ve.stopAndStart(e,!0),n)}async testStart(e,t){return await Ye(e.env.PORT,e),`YARN concurrently --kill-others --raw --success first "${this.startDevProtected(e,t)}" "${this.waitApp(e)}"`}async testE2EPrivate(e,t,n,{playwrightArgs:r="test test/e2e/"}){const o=await Ye(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=function(e,t){const n="BUN playwright",r=t?.join(" ")||"test/e2e/";if(!e.startsWith("test ")||!t?.length)return`${n} ${e}`;const o=e.slice(5).trim(),s=o.length>0?o.split(/\s+/):[];!s[0]||s[0].startsWith("-")?s.unshift(r):s[0]=r;return`${n} test ${s.join(" ")}`}(r,t.targets);return e.skipLaunchingServerForPlaywright?`${i}${s}`:`YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${i}${s}"`}testUnit(e,t){const n=t.targets?.join(" ")||"test/unit/";return e.hasVitest?`YARN vitest run ${n} --color --passWithNoTests --allowOnly`:e.isBunAvailable?`bun test ${n}`:'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}const Ke=new class extends qe{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const Ge=new class extends qe{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}};const He=new class extends qe{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const Qe=new class extends qe{constructor(){super(!1)}startDevProtected(e,t){throw new Error("This method should not be called.")}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${q} dist/index.js ${t.normalizedArgsText??""} | tee server.log`)}startTest(){return Promise.resolve("echo 'do nothing.'")}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,"development")} && ${Ve.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const Xe=new class extends qe{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}},Ze=["express","fastify","elysia","hono"],et={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug | test",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map(e=>`'${e}'`).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>`'${e}'`).join(" ")}(e);const t=await M(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=Ke;else if(t.next)o=He;else if(r["@remix-run/dev"])o=Xe;else if(Ze.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=Ge;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=Qe}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":await se(await o.startDev(n,e),n,e);break;case"staging":await se(await o.startProduction(n,e),n,e);break;case"docker":await se(await o.startDocker(n,e),n,e);break;case"docker-debug":e.normalizedArgsText="'/bin/bash'",await se(await o.startDocker(n,e),n,e);break;case"test":{const t=await o.startTest(n,e);await se(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},tt={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests.",builder:{e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string",choices:["headless","headless-dev","headed","headed-dev","docker","docker-debug","debug","generate","trace"],default:"headless"},silent:{description:"Reduce redundant outputs",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"},targets:{description:"Test target paths",type:"array"}},async handler(n){await async function(n){const r=await M(n);r||(console.error(d.red("No project found.")),process.exit(1));r.descendants.length>1&&(process.env.CI="1");process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const o=n.targets??[],s=0===o.length,i=o.some(e=>e.includes("/e2e")),a=o.some(e=>e.includes("/unit")),c=s||a,l=s||i;for(const s of r.descendants){const r=s.packageJson.dependencies??{},i=s.packageJson.devDependencies??{};let a;if(a=r.blitz?Ke:r.next?He:i["@remix-run/dev"]?Xe:Ze.some(e=>r[e])&&!r["firebase-functions"]?Ge:Qe,console.info(`Running "test" for ${s.name} ...`),c&&e.existsSync(t.join(s.dirPath,"test","unit"))){const e=o.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await se(a.testUnit(s,t),s,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(s.dirPath,"test","e2e")))continue;const d=o.filter(e=>e.includes("/e2e")),u={...n,targets:d.length>0?d:void 0};switch(n.e2e){case"headless":await se(await a.testE2EProduction(s,u,{}),s,n);continue;case"headless-dev":await se(await a.testE2EDev(s,u,{}),s,n);continue;case"docker":await nt(s,u,a);continue;case"docker-debug":{const e=d.length>0?d.join(" "):"test/e2e/";await nt(s,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]){const e=d.length>0?d.join(" "):"test/e2e/";switch(n.e2e){case"headed":await se(await a.testE2EProduction(s,u,{playwrightArgs:`test ${e} --headed`}),s,n);break;case"headed-dev":await se(await a.testE2EDev(s,u,{playwrightArgs:`test ${e} --headed`}),s,n);break;case"debug":await se(await a.testE2EProduction(s,u,{playwrightArgs:`test ${e} --debug`}),s,n);break;case"generate":await se(await a.testE2EProduction(s,u,{playwrightArgs:`codegen http://localhost:${s.env.PORT}`}),s,n);break;case"trace":await se("BUN playwright show-trace",s,n)}}}}(n)}};async function nt(e,t,n,r){e.env.WB_DOCKER||="1",await se(`${n.buildDocker(e,"test")}${ze(t)}`,e,t),process.exitCode=await se(await n.testE2EDocker(e,t,{playwrightArgs:r}),e,t,{exitIfFailed:!1}),await se(Ve.stop(e),e,t)}const rt={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await M(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const o of r.descendants){const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;if(i=r.blitz?Ke:r.next?He:s["@remix-run/dev"]?Xe:Ze.some(e=>r[e])&&!r["firebase-functions"]?Ge:Qe,console.info(`Running "test-on-ci" for ${o.name} ...`),await ie(Ve.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await ie(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),await ie(await i.testStart(o,n),o,n),await re.promiseAll(),e.existsSync(t.join(o.dirPath,"test","e2e"))){o.hasDockerfile&&(o.env.WB_DOCKER||="1",await se(`${i.buildDocker(o,"test")}${ze(n)}`,o,n));const e=o.hasDockerfile?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await se(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),await se(Ve.stop(o),o,n)}}}(n)}};const ot={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await M(n,!1);r||(console.error(d.red("No project found.")),process.exit(1));let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit --Pretty"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit --Pretty"),s.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await ie(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found.")),process.exit(a)}},st={...ot,command:"tc"};await r(o(process.argv)).scriptName("wb").options(Ee).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(H).command(ne).command(he).command(ve).command($e).command(Fe).command(Je).command(et).command(tt).command(rt).command(ot).command(st).demandCommand().strict().version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).help().argv;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{n(process.pid),process.exit()});
10
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy9zY3JpcHRzL3J1bi50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9wcmlzbWEudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcG9ydC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyQ291bnRdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBudW1iZXJdW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnM6IFtzdHJpbmcsIG51bWJlcl1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpKSB7XG4gICAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlycy5wdXNoKFtlbnZQYXRoLCBjb3VudF0pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgY291bnQgPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkpO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzXTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwgZW52VmFycyk7XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyB7fTtcbiAgY2FjaGVkRW52VmFycy5zZXQoZmlsZVBhdGgsIHBhcnNlZCk7XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0cmVlS2lsbCBmcm9tICd0cmVlLWtpbGwnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBiYXNlZCBvbiBTcGF3blN5bmNSZXR1cm5zIGJ1dCB3aXRob3V0IG91dHB1dCBhbmQgZXJyb3IgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGV4dGVuZGluZyB2YXJpb3VzIE5vZGUuanMgc3Bhd24gb3B0aW9ucyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICAvKiogSW5wdXQgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MncyBzdGRpbiAqL1xuICBpbnB1dD86IHN0cmluZztcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBvdXRwdXQgd2lsbCBiZSBtZXJnZWQgaW50byBzdGRvdXQgKi9cbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGUgc3Bhd25lZCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBwcm9jZXNzIGV4aXRzICovXG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgZW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcgb2YgcHJvY2VzcyBvcGVyYXRpb25zICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3Rkb3V0IGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZG91dD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3RkZXJyPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09PTAmJihpPW4oaSkscihpKSxsPTApfXJldHVybiBvJiYoaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSxvPjEmJihmKz10W2g+PjEyJjE1XSt0W2g+PjgmMTVdKSxvPjImJihmKz10W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSkpLGZ9fWNvbnN0IHI9ZnVuY3Rpb24odCl7bGV0IHMsaSxvLG4saCxyLGwsYyxmLGEsdSxkLGIsayx5LHgsQixwLEMseixJLGcsdyxBLFAsRSxqLG0scSx2LEQsRixHLEgsSixLLEwsTSxOLE8sUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sdHQsc3QsaXQsZXQsb3QsbnQsaHQscnQsbHQsY3QsZnQ7Zm9yKG89MDtvPDQ4O28rPTIpbj10WzBdXnRbMTBdXnRbMjBdXnRbMzBdXnRbNDBdLGg9dFsxXV50WzExXV50WzIxXV50WzMxXV50WzQxXSxyPXRbMl1edFsxMl1edFsyMl1edFszMl1edFs0Ml0sbD10WzNdXnRbMTNdXnRbMjNdXnRbMzNdXnRbNDNdLGM9dFs0XV50WzE0XV50WzI0XV50WzM0XV50WzQ0XSxmPXRbNV1edFsxNV1edFsyNV1edFszNV1edFs0NV0sYT10WzZdXnRbMTZdXnRbMjZdXnRbMzZdXnRbNDZdLHU9dFs3XV50WzE3XV50WzI3XV50WzM3XV50WzQ3XSxkPXRbOF1edFsxOF1edFsyOF1edFszOF1edFs0OF0sYj10WzldXnRbMTldXnRbMjldXnRbMzldXnRbNDldLHM9ZF4ocjw8MXxsPj4+MzEpLGk9Yl4obDw8MXxyPj4+MzEpLHRbMF1ePXMsdFsxXV49aSx0WzEwXV49cyx0WzExXV49aSx0WzIwXV49cyx0WzIxXV49aSx0WzMwXV49cyx0WzMxXV49aSx0WzQwXV49cyx0WzQxXV49aSxzPW5eKGM8PDF8Zj4+PjMxKSxpPWheKGY8PDF8Yz4+PjMxKSx0WzJdXj1zLHRbM11ePWksdFsxMl1ePXMsdFsxM11ePWksdFsyMl1ePXMsdFsyM11ePWksdFszMl1ePXMsdFszM11ePWksdFs0Ml1ePXMsdFs0M11ePWkscz1yXihhPDwxfHU+Pj4zMSksaT1sXih1PDwxfGE+Pj4zMSksdFs0XV49cyx0WzVdXj1pLHRbMTRdXj1zLHRbMTVdXj1pLHRbMjRdXj1zLHRbMjVdXj1pLHRbMzRdXj1zLHRbMzVdXj1pLHRbNDRdXj1zLHRbNDVdXj1pLHM9Y14oZDw8MXxiPj4+MzEpLGk9Zl4oYjw8MXxkPj4+MzEpLHRbNl1ePXMsdFs3XV49aSx0WzE2XV49cyx0WzE3XV49aSx0WzI2XV49cyx0WzI3XV49aSx0WzM2XV49cyx0WzM3XV49aSx0WzQ2XV49cyx0WzQ3XV49aSxzPWFeKG48PDF8aD4+PjMxKSxpPXVeKGg8PDF8bj4+PjMxKSx0WzhdXj1zLHRbOV1ePWksdFsxOF1ePXMsdFsxOV1ePWksdFsyOF1ePXMsdFsyOV1ePWksdFszOF1ePXMsdFszOV1ePWksdFs0OF1ePXMsdFs0OV1ePWksaz10WzBdLHk9dFsxXSxWPXRbMTFdPDw0fHRbMTBdPj4+MjgsVz10WzEwXTw8NHx0WzExXT4+PjI4LG09dFsyMF08PDN8dFsyMV0+Pj4yOSxxPXRbMjFdPDwzfHRbMjBdPj4+MjkscnQ9dFszMV08PDl8dFszMF0+Pj4yMyxsdD10WzMwXTw8OXx0WzMxXT4+PjIzLFI9dFs0MF08PDE4fHRbNDFdPj4+MTQsUz10WzQxXTw8MTh8dFs0MF0+Pj4xNCxIPXRbMl08PDF8dFszXT4+PjMxLEo9dFszXTw8MXx0WzJdPj4+MzEseD10WzEzXTw8MTJ8dFsxMl0+Pj4yMCxCPXRbMTJdPDwxMnx0WzEzXT4+PjIwLFg9dFsyMl08PDEwfHRbMjNdPj4+MjIsWT10WzIzXTw8MTB8dFsyMl0+Pj4yMix2PXRbMzNdPDwxM3x0WzMyXT4+PjE5LEQ9dFszMl08PDEzfHRbMzNdPj4+MTksY3Q9dFs0Ml08PDJ8dFs0M10+Pj4zMCxmdD10WzQzXTw8Mnx0WzQyXT4+PjMwLHN0PXRbNV08PDMwfHRbNF0+Pj4yLGl0PXRbNF08PDMwfHRbNV0+Pj4yLEs9dFsxNF08PDZ8dFsxNV0+Pj4yNixMPXRbMTVdPDw2fHRbMTRdPj4+MjYscD10WzI1XTw8MTF8dFsyNF0+Pj4yMSxDPXRbMjRdPDwxMXx0WzI1XT4+PjIxLFo9dFszNF08PDE1fHRbMzVdPj4+MTcsJD10WzM1XTw8MTV8dFszNF0+Pj4xNyxGPXRbNDVdPDwyOXx0WzQ0XT4+PjMsRz10WzQ0XTw8Mjl8dFs0NV0+Pj4zLEE9dFs2XTw8Mjh8dFs3XT4+PjQsUD10WzddPDwyOHx0WzZdPj4+NCxldD10WzE3XTw8MjN8dFsxNl0+Pj45LG90PXRbMTZdPDwyM3x0WzE3XT4+PjksTT10WzI2XTw8MjV8dFsyN10+Pj43LE49dFsyN108PDI1fHRbMjZdPj4+Nyx6PXRbMzZdPDwyMXx0WzM3XT4+PjExLEk9dFszN108PDIxfHRbMzZdPj4+MTEsXz10WzQ3XTw8MjR8dFs0Nl0+Pj44LHR0PXRbNDZdPDwyNHx0WzQ3XT4+PjgsVD10WzhdPDwyN3x0WzldPj4+NSxVPXRbOV08PDI3fHRbOF0+Pj41LEU9dFsxOF08PDIwfHRbMTldPj4+MTIsaj10WzE5XTw8MjB8dFsxOF0+Pj4xMixudD10WzI5XTw8N3x0WzI4XT4+PjI1LGh0PXRbMjhdPDw3fHRbMjldPj4+MjUsTz10WzM4XTw8OHx0WzM5XT4+PjI0LFE9dFszOV08PDh8dFszOF0+Pj4yNCxnPXRbNDhdPDwxNHx0WzQ5XT4+PjE4LHc9dFs0OV08PDE0fHRbNDhdPj4+MTgsdFswXT1rXn54JnAsdFsxXT15Xn5CJkMsdFsxMF09QV5+RSZtLHRbMTFdPVBefmomcSx0WzIwXT1IXn5LJk0sdFsyMV09Sl5+TCZOLHRbMzBdPVReflYmWCx0WzMxXT1VXn5XJlksdFs0MF09c3RefmV0Jm50LHRbNDFdPWl0Xn5vdCZodCx0WzJdPXhefnAmeix0WzNdPUJefkMmSSx0WzEyXT1FXn5tJnYsdFsxM109al5+cSZELHRbMjJdPUtefk0mTyx0WzIzXT1MXn5OJlEsdFszMl09Vl5+WCZaLHRbMzNdPVdeflkmJCx0WzQyXT1ldF5+bnQmcnQsdFs0M109b3Refmh0Jmx0LHRbNF09cF5+eiZnLHRbNV09Q15+SSZ3LHRbMTRdPW1efnYmRix0WzE1XT1xXn5EJkcsdFsyNF09TV5+TyZSLHRbMjVdPU5eflEmUyx0WzM0XT1YXn5aJl8sdFszNV09WV5+JCZ0dCx0WzQ0XT1udF5+cnQmY3QsdFs0NV09aHRefmx0JmZ0LHRbNl09el5+ZyZrLHRbN109SV5+dyZ5LHRbMTZdPXZefkYmQSx0WzE3XT1EXn5HJlAsdFsyNl09T15+UiZILHRbMjddPVFeflMmSix0WzM2XT1aXn5fJlQsdFszN109JF5+dHQmVSx0WzQ2XT1ydF5+Y3Qmc3QsdFs0N109bHRefmZ0Jml0LHRbOF09Z15+ayZ4LHRbOV09d15+eSZCLHRbMThdPUZefkEmRSx0WzE5XT1HXn5QJmosdFsyOF09Ul5+SCZLLHRbMjldPVNefkomTCx0WzM4XT1fXn5UJlYsdFszOV09dHReflUmVyx0WzQ4XT1jdF5+c3QmZXQsdFs0OV09ZnRefml0Jm90LHRbMF1ePWVbb10sdFsxXV49ZVtvKzFdfTtleHBvcnR7byBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiY29uc3QgZT1cIlwiLHQ9ZnVuY3Rpb24oKXtjb25zdCBlPXtpbnN0YW5jZTpFcnJvcixmcm9tOmU9Pntjb25zdCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gdm9pZCAwIT09ZS5zdGFjayYmdC5wdXNoKGUuc3RhY2spLHZvaWQgMCE9PWUuY2F1c2UmJih2b2lkIDA9PT1lLnN0YWNrJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9Pm5ldyBFcnJvcixoeWRyYXRlOihlLFt0LG4sYSxzXSk9PntlLm5hbWU9dCxlLm1lc3NhZ2U9bix2b2lkIDA9PT1hP2RlbGV0ZSBlLnN0YWNrOmUuc3RhY2s9YSx2b2lkIDAhPT1zJiYoZS5jYXVzZT1zKX19LHQ9e2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShhLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+bi5lbmNvZGUoYXRvYihlKSl9LHM9e2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0W24sYV1vZiB0KWUuc2V0KG4sYSl9fSxvPXtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0IG4gb2YgdCllLmFkZChuKX19LHI9e2luc3RhbmNlOkRhdGUsZnJvbTplPT5bZS50b0pTT04oKV0sY3JlYXRlOihbZV0pPT5uZXcgRGF0ZShlKX0sYz17aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LGQ9e2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX07cmV0dXJuIG5ldyBNYXAoW2UsdCxzLG8scixjLGRdLm1hcChlPT5bZS5pbnN0YW5jZS5uYW1lLGVdKSl9KCksbj1uZXcgVGV4dEVuY29kZXIsYT1uZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtleHBvcnR7dCBhcyBHTE9CQUxfQ09OU1RSVUNUT1JfTUFQLGUgYXMgUExBSU5fT0JKRUNUX0xBQkVMfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0cnVjdG9ycy5qcy5tYXBcbiIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIHQsUExBSU5fT0JKRUNUX0xBQkVMIGFzIG59ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtjb25zdCBlPS0xLHI9LTIsbz0tMyxpPS00LHM9LTUsYz0tNjtmdW5jdGlvbiBmKG49dm9pZCAwLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFjaUVudiAmJiBjaUVudiAhPT0gJzAnICYmIGNpRW52ICE9PSAnZmFsc2UnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi91dGlscy9jaS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmd2OiBFbnZSZWFkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRFbnY6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aEJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlyUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpclBhdGg6IHN0cmluZywgYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICB0aGlzLmxvYWRFbnYgPSBsb2FkRW52O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGlzQnVuQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyhefFxcbilidW5cXHMvLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgICAvLyBPdmVyd3JpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGV2ZW4gdGhvdWdoIHRoaXMgYmVoYXZpb3IgaXMgbm9uLXN0YW5kYXJkXG4gICAgLy8gYmVjYXVzZSBgYnVuIHdiIC4uLmAgd2lsbCBsb2FkIC5lbnYgYW5kIC5lbnYubG9jYWwgYmVmb3JlIGB3YmAgbG9hZHMgb3RoZXIgdmFyaWFibGVzLlxuICAgIHJldHVybiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZWYXJzIH07XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5wcmlzbWEgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnByaXNtYSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICAgIHJldHVybiAvXFxid2ViU2VydmVyXFxiLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICBsZXQgYmluRm91bmQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFBhdGggPSB0aGlzLmRpclBhdGg7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhiaW5QYXRoKSkge1xuICAgICAgICB0aGlzLmVudi5QQVRIID0gYCR7YmluUGF0aH06JHt0aGlzLmVudi5QQVRIfWA7XG4gICAgICAgIGJpbkZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYmluRm91bmQ7XG4gIH1cblxuICBmaW5kRmlsZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZmlsZVBhdGggPSB0aGlzLnBhdGhCeU5hbWUuZ2V0KGZpbGVOYW1lKTtcbiAgICBpZiAoZmlsZVBhdGgpIHJldHVybiBmaWxlUGF0aDtcblxuICAgIGZpbGVQYXRoID0gW2ZpbGVOYW1lLCBwYXRoLmpvaW4oJy4uJywgJy4uJywgZmlsZU5hbWUpXVxuICAgICAgLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgcCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlTmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoQnlOYW1lLnNldChmaWxlTmFtZSwgZmlsZVBhdGgpO1xuICAgIHJldHVybiBmaWxlUGF0aDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcblxuICByZXR1cm4ge1xuICAgIC4uLnJvb3RBbmRTZWxmUHJvamVjdHMsXG4gICAgZGVzY2VuZGFudHM6XG4gICAgICByb290QW5kU2VsZlByb2plY3RzLnJvb3QgPT09IHJvb3RBbmRTZWxmUHJvamVjdHMuc2VsZlxuICAgICAgICA/IGF3YWl0IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCByb290QW5kU2VsZlByb2plY3RzLnJvb3QsIGxvYWRFbnYpXG4gICAgICAgIDogW3Jvb3RBbmRTZWxmUHJvamVjdHMuc2VsZl0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICBjb25zdCB0aGlzUHJvamVjdCA9IG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICBsZXQgcm9vdFByb2plY3QgPSB0aGlzUHJvamVjdDtcbiAgaWYgKCF0aGlzUHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHBhdGguZGlybmFtZShkaXJQYXRoKS5lbmRzV2l0aCgnL3BhY2thZ2VzJykpIHtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJvb3RQcm9qZWN0ID0gbmV3IFByb2plY3Qocm9vdERpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gcHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIHByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gcHJvamVjdHM7XG59XG4iLCJleHBvcnQgY29uc3QgaXNSdW5uaW5nT25CdW4gPVxuICAvLyBEZXRlY3QgYGJ1biAtLWJ1biBydW4gd2IgLi4uYC4gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgcHJvY2Vzcy52ZXJzaW9ucy5idW4gfHxcbiAgLy8gRGV0ZWN0IGBidW4gcnVuIHdiIC4uLmAuXG4gIHByb2Nlc3MuYXJndlswXT8uZW5kc1dpdGgoJy9idW4nKSB8fFxuICBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmVuZHNXaXRoKCcvYnVuJyk7XG5cbmV4cG9ydCBjb25zdCBydW50aW1lV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICdub2RlJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAneWFybic7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXJXaXRoUnVuID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGJ1aWxkIGNvbW1hbmQgKGRlZmF1bHQ6IHlhcm58YnVuIGJ1aWxkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdjJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXJndiA9IHsgLi4uYXJndiwgY29tbWFuZDogYXJndi5jb21tYW5kID8/IChpc1J1bm5pbmdPbkJ1biA/ICdidW4gcnVuIGJ1aWxkJyA6ICd5YXJuIGJ1aWxkJykgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKHJ1bm5hYmxlU2NyaXB0LCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChwcmludGFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChydW5uYWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbChcbiAgICAgICdQUklTTUEgZ2VuZXJhdGUgJyxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUgJyA6ICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cyAnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLS1jYXNjYWRlLWVudj0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIFtgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCwgcnVubmFibGVTY3JpcHRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmlndXJlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgb3B0czogT3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52LkZPUkNFX0NPTE9SID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmaXg6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpeCB0aGUgbGludGluZyBlcnJvcnMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgZm9ybWF0OiB7XG4gICAgZGVzY3JpcHRpb246ICdGb3JtYXQgdGhlIGNvZGUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBiaW9tZUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc29uJywgJ2pzb25jJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3RzJywgJ3RzeCddKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhYmlvbWVFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZSBvbiBCdW4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoIWlzUnVubmluZ09uQnVuKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIG9uIEJ1bi4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBhcmd2LmZpbGVzID8/IFtdO1xuICAgIGxldCBiaW9tZUFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHByZXR0aWVyQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgc29ydFBhY2thZ2VKc29uQXJnc1RleHQ6IHN0cmluZztcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXI6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShTdHJpbmcoZmlsZSkpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwYWNrYWdlSnNvbkZpbGVQYXRocy5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlvbWVBcmdzVGV4dCA9ICcnO1xuICAgICAgcHJldHRpZXJBcmdzVGV4dCA9IGBcIioqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gYFwiJHtwLnBhY2thZ2VKc29uUGF0aH1cImApLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW9tZUNvbW1hbmQgPVxuICAgICAgYXJndi5maXggJiYgYXJndi5mb3JtYXQgPyAnY2hlY2sgLS1maXgnIDogYXJndi5maXggPyAnbGludCAtLWZpeCcgOiBhcmd2LmZvcm1hdCA/ICdmb3JtYXQgLS1maXgnIDogJ2xpbnQnO1xuICAgIGxldCBiaW9tZVByb21pc2U6IFByb21pc2U8bnVtYmVyPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmlvbWVBcmdzVGV4dCB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJpb21lUHJvbWlzZSA9IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgIGBidW4gLS1idW4gYmlvbWUgJHtiaW9tZUNvbW1hbmR9IC0tY29sb3JzPWZvcmNlIC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLWZpbGVzLWlnbm9yZS11bmtub3duPXRydWUgJHtiaW9tZUFyZ3NUZXh0fWAsXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGlmIChwcmV0dGllckFyZ3NUZXh0KSB7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBgYnVuIC0tYnVuIHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgJHtwcmV0dGllckFyZ3NUZXh0fWAsXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHsgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJnc1RleHQpIHtcbiAgICAgICAgYXdhaXQgYmlvbWVQcm9taXNlO1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJ1biAtLWJ1biBzb3J0LXBhY2thZ2UtanNvbiAke3NvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0fWAsIHByb2plY3RzLnNlbGYsIGFyZ3YsIHtcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdyYWlsd2F5JyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuc3RhcnRzV2l0aCh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAmJiBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXRlc3RyZWFtKF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtydW50aW1lV2l0aEFyZ3N9IC1lICdcbmNvbnN0IHsgUHJpc21hQ2xpZW50IH0gPSByZXF1aXJlKFwiQHByaXNtYS9jbGllbnRcIik7XG5uZXcgUHJpc21hQ2xpZW50KCkuJHF1ZXJ5UmF3XFxgUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDtcXGBcbiAgLmNhdGNoKChlcnJvcikgPT4geyBjb25zb2xlLmxvZyhcIkZhaWxlZCBkdWUgdG86XCIsIGVycm9yKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtcbidgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtvdXRwdXRQYXRofTsgbGl0ZXN0cmVhbSByZXN0b3JlIC1jb25maWcgbGl0ZXN0cmVhbS55bWwgLW8gJHtvdXRwdXRQYXRofSAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBQT1NTSUJMRV9QQVRIUyA9IFtcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbiAgICAgIF07XG4gICAgICBmb3IgKGNvbnN0IHsgZGJQYXRoLCBzY2hlbWFQYXRoIH0gb2YgUE9TU0lCTEVfUEFUSFMpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKSB7XG4gICAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICAgICAgZGJQYXRoLFxuICAgICAgICAgICAgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8ke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOiAnUnVuIHByaXNtYSBjb21tYW5kcycsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnU2V0dXAgREIgZm9yIExpdGVzdHJlYW0nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZScsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgYXJndi5vdXRwdXQgPz8gKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBvdXRwdXQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBQcmlzbWEgU3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6XG4gICAgICAgICAgPyAnZGIvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgICA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOiAnUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcycsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICBjb25zdCBkYlBhdGggPSBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgcmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCA9IHByb2plY3QuZW52LldCX0VOViA9PT0gJ3N0YWdpbmcnID8gJzVtJyA6ICcxaCc7XG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICByZXRlbnRpb246IDhoXG4gICAgICByZXRlbnRpb24tY2hlY2staW50ZXJ2YWw6ICR7cmV0ZW50aW9uQ2hlY2tJbnRlcnZhbH1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDYwc1xuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmtub3duT3B0aW9ucy5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHBhY2thZ2VzLnB1c2goJ2V4cGVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PlxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYClcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKS5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEoYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpKSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBXZSBzaG91bGQgc3RvcCBEb2NrZXIgY29udGFpbmVycyBmaXJzdCBiZWNhdXNlIGBraWxsLXBvcnRgIG1heSBmYWlsIHRvIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMuXG4gIGF3YWl0IHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydCwgcHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZShpbWFnZU5hbWU6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgbmFtZT0ke2ltYWdlTmFtZX1gXSwgcHJvamVjdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IH0gZnJvbSAnLi9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBDaGVja3MgdGhlIGdpdmVuIHBvcnQgYW5kIGtpbGxzIGFueSBwcm9jZXNzIHVzaW5nIGl0LlxuICogTm90ZSB3YiBhbHdheXMgcmVxdWlyZXMgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHJhd1BvcnQ6IHVua25vd24sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHJhd1BvcnQpO1xuICBpZiAoIXBvcnQpIHRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIHBvcnQgKCR7cG9ydH0pIGlzIGludmFsaWQuYCk7XG5cbiAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydCwgcHJvamVjdCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBvcnQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gY2hlY2tcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHBvcnQgaXMgYXZhaWxhYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMTI3LjAuMC4xJyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkSW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCB1bmJ1ZmZlciA9IGZhbHNlLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3VuYnVmZmVyID8gJ3VuYnVmZmVyICcgOiAnJ30ke3RoaXMuc3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYWRkaXRpb25hbE9wdGlvbnMsXG4gICAgICBhZGRpdGlvbmFsQXJnc1xuICAgICl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtIC1pdCAtLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcC5cbiAqIE5vdGUgdGhhdCBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNjcmlwdHMge1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwID0gc2hvdWxkV2FpdEFuZE9wZW5BcHA7XG4gIH1cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkSW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpLnNwbGl0KCcmJicpIDogW10pLFxuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3RoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndil9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpfVwiYDtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3RoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KX1cImA7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICAgIFwiJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICAgICl9XCJcbiAgICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCl9XCJgO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcml2YXRlKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByaXZhdGUocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVEb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJpdmF0ZShwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0KX1cImA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRlc3RFMkVQcml2YXRlKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9XCJgO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHM/LmpvaW4oJyAnKSB8fCAndGVzdC91bml0Lyc7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBgWUFSTiB2aXRlc3QgcnVuICR7dGVzdFRhcmdldH0gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seWA7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYGJ1biB0ZXN0ICR7dGVzdFRhcmdldH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgOTAwMDAgLWkgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3M6IHN0cmluZywgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSAnQlVOIHBsYXl3cmlnaHQnO1xuICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzPy5qb2luKCcgJykgfHwgJ3Rlc3QvZTJlLyc7XG4gIGlmICghcGxheXdyaWdodEFyZ3Muc3RhcnRzV2l0aCgndGVzdCAnKSB8fCAhdGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9ICR7cGxheXdyaWdodEFyZ3N9YDtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgndGVzdCAnLmxlbmd0aCkudHJpbSgpO1xuICBjb25zdCBwYXJ0cyA9IHJlc3QubGVuZ3RoID4gMCA/IHJlc3Quc3BsaXQoL1xccysvKSA6IFtdO1xuICBpZiAoIXBhcnRzWzBdIHx8IHBhcnRzWzBdLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIHBhcnRzLnVuc2hpZnQodGFyZ2V0KTtcbiAgfSBlbHNlIHtcbiAgICBwYXJ0c1swXSA9IHRhcmdldDtcbiAgfVxuICByZXR1cm4gYCR7YmFzZX0gdGVzdCAke3BhcnRzLmpvaW4oJyAnKX1gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERldihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFMmUgdGVzdCBtb2RlOiBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4nLFxuICBidWlsZGVyOiB7IC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICBwcm9jZXNzLmVudi5DSSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAoYXJndi50YXJnZXRzID8/IFtdKSBhcyBzdHJpbmdbXTtcbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSB0ZXN0VGFyZ2V0cy5sZW5ndGggPT09IDA7XG5cbiAgLy8gRGV0ZWN0IHRlc3QgbW9kZXMgZnJvbSB0YXJnZXQgcGF0aHNcbiAgY29uc3QgaGFzRTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICBjb25zdCBoYXNVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgY29uc3Qgc2hvdWxkUnVuVW5pdCA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzO1xuICBjb25zdCBzaG91bGRSdW5FMmUgPSBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNFMmVUYXJnZXRzO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICBjb25zdCB1bml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IHVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyB1bml0VGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLCBwcm9qZWN0LCBhcmd2LCB7IHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgZTJlIHRlc3RzIGlmIG5vdCBuZWVkZWQgb3Igbm8gZTJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIXNob3VsZFJ1bkUyZSB8fCAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuXG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgZTJlQXJndiwgc2NyaXB0cyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBlMmVUYXJnZXQgPSBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgZTJlQXJndiwgc2NyaXB0cywgYHRlc3QgJHtlMmVUYXJnZXR9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBjb25zdCBlMmVUYXJnZXQgPSBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2UyZVRhcmdldH0gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2UyZVRhcmdldH0gLS1kZWJ1Z2AgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBgY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICB9KSxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuQ0kgfHw9ICcxJztcbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmlwdCA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgOiBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHt9KTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5weXJpZ2h0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpXG4gICAgICApIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gICAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KGZpbmFsRXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHRyZWVLaWxsIGZyb20gJ3RyZWUta2lsbCc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICB0cmVlS2lsbChwcm9jZXNzLnBpZCk7XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52Iiwic2V0IiwiYXN5bmMiLCJzcGF3bkFzeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiUHJvbWlzZSIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInN0ZG91dCIsInNldEVuY29kaW5nIiwic3RkZXJyIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJwcm9jZXNzIiwid3JpdGUiLCJtZXJnZU91dEFuZEVycm9yIiwicHJpbnRpbmdTdGRlcnIiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJwaWQiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJ0cmVlS2lsbCIsImtpbGxPbkV4aXQiLCJlcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiY29kZSIsInNpZ25hbCIsInVuZGVmaW5lZCIsIkVycm9yIiwic3RhdHVzIiwiaW5wdXQiLCJzdGRpbiIsImVuZCIsInQiLCJzIiwiaSIsImUiLCJuIiwiZW50cmllcyIsImgiLCJibG9ja3MiLCJyZXNldCIsImZpbmFsaXplZCIsImJsb2NrIiwic3RhcnQiLCJsYXN0Qnl0ZUluZGV4IiwiY29uc3RydWN0b3IiLCJ0aGlzIiwicGFkZGluZyIsIm91dHB1dEJpdHMiLCJibG9ja0NvdW50IiwiYnl0ZUNvdW50Iiwib3V0cHV0QmxvY2tzIiwiZXh0cmFCeXRlcyIsInVwZGF0ZSIsIm8iLCJsZW5ndGgiLCJsIiwiYyIsImYiLCJjb2RlUG9pbnRBdCIsInIiLCJmaW5hbGl6ZSIsImhleCIsImEiLCJ1IiwiZCIsImIiLCJrIiwieSIsIngiLCJCIiwicCIsIkMiLCJ6IiwiSSIsImciLCJ3IiwiQSIsIlAiLCJFIiwiaiIsIm0iLCJxIiwidiIsIkQiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiJCIsIl8iLCJ0dCIsInN0IiwiaXQiLCJldCIsIm90IiwibnQiLCJodCIsInJ0IiwibHQiLCJjdCIsImZ0IiwiaW5zdGFuY2UiLCJmcm9tIiwibmFtZSIsIm1lc3NhZ2UiLCJzdGFjayIsInB1c2giLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsIlJlZ0V4cCIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIm1hcCIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJKU09OIiwic3RyaW5naWZ5IiwiTnVtYmVyIiwiaXNOYU4iLCJpc0Zpbml0ZSIsInRvU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsbCIsInNsaWNlIiwiT2JqZWN0IiwiY2FjaGVEdXJhdGlvbiIsIlBPU0lUSVZFX0lORklOSVRZIiwiZ2V0Q2FjaGVLZXkiLCJraW5kIiwibm93IiwiY2FsbCIsImlzQ0kiLCJjaUVudiIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsIm1lbW9pemVPbmUiLCJhcmd2IiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsInRlc3QiLCJmcyIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJyb290RGlyUGF0aCIsImJ1aWxkQ29tbWFuZCIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImJ1aWxkIiwiaW5jbHVkZXMiLCJleGlzdHNTeW5jIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJyZXBsYWNlQWxsIiwiZW52IiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwiZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMiLCJjb3VudCIsImtleSIsInZhbHVlIiwiY2hlY2tFbnYiLCJtaXNzaW5nS2V5cyIsImtleXMiLCJleHBhbmQiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImRlcGVuZGVuY2llcyIsInByaXNtYSIsImRldkRlcGVuZGVuY2llcyIsImhhc1ZpdGVzdCIsInZpdGVzdCIsInNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0IiwiQ0kiLCJjb25maWdQYXRoIiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyIiwicGFja2FnZU1hbmFnZXJXaXRoUnVuIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJkZXNjcmliZSIsImRlc2NyaXB0aW9uIiwidHlwZSIsImFsaWFzIiwiaGFuZGxlciIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJlbmNvZGluZyIsInNwbGl0IiwibGluZSIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwia2lsbFBvcnRJZk5vbkNpQ29tbWFuZCIsImJ1aWxkZXIiLCJleGl0IiwicG9ydEVudiIsIlBPUlQiLCJwb3J0IiwiaXNJbnRlZ2VyIiwia2lsbFBvcnRQcm9jZXNzIiwia2lsbFBvcnRJZk5vbkNpIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsInByaW50YWJsZVNjcmlwdCIsInJ1bm5hYmxlU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJjb25maWd1cmVFbnYiLCJ0aW1lb3V0IiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImJsaXR6IiwiZml4QnVuQ29tbWFuZCIsImNhc2NhZGVPcHRpb24iLCJub3JtYWxpemVkU2NyaXB0IiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsIm5ld0VudiIsImNpIiwiZm9yY2VDb2xvciIsIkZPUkNFX0NPTE9SIiwiYmlvbWVFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwiZmlsZXMiLCJiaW9tZUFyZ3NUZXh0IiwicHJldHRpZXJBcmdzVGV4dCIsInNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0IiwiZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lIiwiZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsImZpbGUiLCJTdHJpbmciLCJleHRlbnNpb24iLCJleHRuYW1lIiwiYmlvbWVDb21tYW5kIiwiYmlvbWVQcm9taXNlIiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwic3RhcnRzV2l0aCIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwicHJpc21hU2NyaXB0cyIsImRlcGxveSIsImFkZGl0aW9uYWxPcHRpb25zIiwiZGVwbG95Rm9yY2UiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiRklMRV9TQ0hFTUEiLCJEQVRBQkFTRV9VUkwiLCJQT1NTSUJMRV9QQVRIUyIsInNjaGVtYVBhdGgiLCJkYlBhdGgiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImRlZmF1bHQiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGl0ZXN0cmVhbUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnIiwib3V0cHV0IiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJCb29sZWFuIiwicmVxdWlyZWRFbnZWYXJzIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSIsIm1pc3NpbmdFbnZWYXJzIiwicmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCIsImxpdGVzdHJlYW1Db25maWciLCJ3cml0ZUZpbGVTeW5jIiwicmVhc29uIiwiZmlsdGVyZWQiLCJrbm93bk9wdGlvbnMiLCJzaGFyZWRPcHRpb25LZXlzIiwic2hhcmVkT3B0aW9uQWxpYXNlcyIsIm9wdGlvbiIsImFsbEtub3duT3B0aW9ucyIsImtlYmFiQ2FzZUtleSIsIm1hdGNoIiwidG9Mb3dlckNhc2UiLCJpdGVtIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJjbWRBbmRBcmdzIiwibGFzdFN0YXR1cyIsInllbGxvdyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGxhdGZvcm0iLCJwYWNrYWdlcyIsImlzRmlsZSIsInZlcnNpb24iLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwidG9EZXZOdWxsIiwic2lsZW50Iiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJzZXJ2ZXIiLCJjcmVhdGVTZXJ2ZXIiLCJvbmNlIiwiZXJyIiwiY2xvc2UiLCJsaXN0ZW4iLCJpc1BvcnRBdmFpbGFibGUiLCJraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MiLCJraWxsRnVuYyIsImZpbHRlckFyZ3MiLCJjb250YWluZXJJZHMiLCJpZCIsImxpc3REb2NrZXJDb250YWluZXJJZHMiLCJyZW1vdmVEb2NrZXJDb250YWluZXJzIiwic3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCIsImNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIiwicmF3UG9ydCIsImRvY2tlclNjcmlwdHMiLCJidWlsZEltYWdlIiwic3RvcEFuZFN0YXJ0IiwidW5idWZmZXIiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJzaG91bGRXYWl0QW5kT3BlbkFwcCIsImJ1aWxkRG9ja2VyIiwic3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkIiwiY21kIiwic3RhcnREZXYiLCJzdGFydERldlByb3RlY3RlZCIsIndhaXRBbmRPcGVuQXBwIiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRUZXN0Iiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJ0ZXN0RTJFRGV2IiwidGVzdEUyRVByaXZhdGUiLCJ0ZXN0RTJFUHJvZHVjdGlvbiIsInRlc3RFMkVEb2NrZXIiLCJ0ZXN0U3RhcnQiLCJ3YWl0QXBwIiwic3RhcnRDb21tYW5kIiwicGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0Q29tbWFuZCIsInRhcmdldHMiLCJiYXNlIiwidGFyZ2V0IiwicmVzdCIsInBhcnRzIiwidW5zaGlmdCIsImJ1aWxkUGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0VW5pdCIsInRlc3RUYXJnZXQiLCJibGl0elNjcmlwdHMiLCJzdXBlciIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJuZXh0U2NyaXB0cyIsInBsYWluQXBwU2NyaXB0cyIsIl8xIiwiXzIiLCJyZW1peFNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiYXJnIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJuZXh0IiwidGVzdENvbW1hbmQiLCJlMmUiLCJjaG9pY2VzIiwidGVzdFRhcmdldHMiLCJzaG91bGRSdW5BbGxUZXN0cyIsImhhc0UyZVRhcmdldHMiLCJoYXNVbml0VGFyZ2V0cyIsInNob3VsZFJ1blVuaXQiLCJzaG91bGRSdW5FMmUiLCJ1bml0VGFyZ2V0cyIsInVuaXRBcmd2IiwidW5pdFRpbWVvdXQiLCJlMmVUYXJnZXRzIiwiZTJlQXJndiIsInRlc3RPbkRvY2tlciIsImUyZVRhcmdldCIsIldCX0RPQ0tFUiIsInRlc3RPbkNpQ29tbWFuZCIsInRlc3RPbkNpIiwidHlwZUNoZWNrQ29tbWFuZCIsInJlbW92ZWROZXh0RGlyIiwiY29tbWFuZHMiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJleGl0Q29kZXMiLCJhbGwiLCJmaW5hbEV4aXRDb2RlIiwidGNDb21tYW5kIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJtaWRkbGV3YXJlIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwidG9VcHBlckNhc2UiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiXSwibWFwcGluZ3MiOiJtaEJBMEhBLE1BQU1BLEVBQWdCLElBQUlDLElBRTFCLFNBQVNDLEVBQVlDLEdBQ25CLE1BQU1DLEVBQVNKLEVBQWNLLElBQUlGLEdBQ2pDLEdBQUlDLEVBQVEsT0FBT0EsRUFFbkIsTUFBTUUsRUFBU0MsRUFBTyxDQUFFQyxLQUFNQSxFQUFLQyxRQUFRTixHQUFXTyxXQUFZLENBQUEsSUFBTUosUUFBVSxDQUFBLEVBRWxGLE9BREFOLEVBQWNXLElBQUlSLEVBQVVHLEdBQ3JCQSxDQUNULENDL0RPTSxlQUFlQyxFQUNwQkMsRUFDQUMsRUFDQUMsR0FFQSxPQUFPLElBQUlDLFFBQVEsQ0FBQ1IsRUFBU1MsS0FDM0IsSUFDRSxNQUFNQyxFQUFPQyxFQUFNTixFQUFTQyxHQUFRLEdBQUlDLEdBQVcsSUFHbkRHLEVBQUtFLFFBQVFDLGNBQWMsUUFFM0JILEVBQUtJLFFBQVFELGNBQWMsUUFFM0IsSUFBSUQsRUFBUyxHQUNURSxFQUFTLEdBQ2JKLEVBQUtFLFFBQVFHLEdBQUcsT0FBU0MsSUFDdkJKLEdBQVVJLEVBQ05ULEdBQVNVLGdCQUNYQyxRQUFRTixPQUFPTyxNQUFNSCxLQUd6Qk4sRUFBS0ksUUFBUUMsR0FBRyxPQUFTQyxJQUNuQlQsR0FBU2EsaUJBQ1hSLEdBQVVJLEVBRVZGLEdBQVVFLEVBRVJULEdBQVNjLGdCQUNYSCxRQUFRSixPQUFPSyxNQUFNSCxLQUl6QixJQUFJTSxHQUFVLEVBQ2QsTUFBTUMsRUFBY0EsTUFDZEQsR0FBWVosRUFBS2MsTUFFckJGLEdBQVUsRUFDTmYsR0FBU2tCLFNBQ1hDLFFBQVFDLEtBQUssWUFBWWpCLEVBQUtjLFFBRWhDSSxFQUFTbEIsRUFBS2MsT0FFWmpCLEdBQVNzQixh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RU0sR0FBRyxHQUFHLE1BQU1vQixDQUFDLEVBQUUsTUFBTUUsRUFBRSxTQUFTNUIsR0FBRyxJQUFJQyxFQUFFQyxFQUFFb0IsRUFBRWxCLEVBQUVFLEVBQUVzQixFQUFFSixFQUFFQyxFQUFFQyxFQUFFSyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHLElBQUk5RCxFQUFFLEVBQUVBLEVBQUUsR0FBR0EsR0FBRyxFQUFFbEIsRUFBRUosRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlNLEVBQUVOLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNEIsRUFBRTVCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJd0IsRUFBRXhCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJeUIsRUFBRXpCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJMEIsRUFBRTFCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJK0IsRUFBRS9CLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJZ0MsRUFBRWhDLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJaUMsRUFBRWpDLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJa0MsRUFBRWxDLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQyxFQUFFZ0MsR0FBR0wsR0FBRyxFQUFFSixJQUFJLElBQUl0QixFQUFFZ0MsR0FBR1YsR0FBRyxFQUFFSSxJQUFJLElBQUk1QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVHLEdBQUdxQixHQUFHLEVBQUVDLElBQUksSUFBSXhCLEVBQUVJLEdBQUdvQixHQUFHLEVBQUVELElBQUksSUFBSXpCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRTJCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJOUIsRUFBRXNCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJL0IsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVB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