@willbooster/wb 10.6.12 → 10.6.14

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 +10 -10
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 v(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 y(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 k(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 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 k(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 E=[..."0123456789abcdef"],N=[6,1536,393216,100663296],A=[0,8,16,24],P=[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,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<<A[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<A[3&i++],t[i>>2]|=(128|a>>12&63)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[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];R(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];R(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+=E[s>>4&15]+E[15&s]+E[s>>12&15]+E[s>>8&15]+E[s>>20&15]+E[s>>16&15]+E[s>>28&15]+E[s>>24&15];i%e===0&&(t=x(t),R(t),o=0)}return r&&(s=t[o],a+=E[s>>4&15]+E[15&s],r>1&&(a+=E[s>>12&15]+E[s>>8&15]),r>2&&(a+=E[s>>20&15]+E[s>>16&15])),a}}const R=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,m,f,h,g,b,v,y,w,$,k,E,N,A,x,j,R,S,O,D,T,_,B,C,I,W,V,F,J,z,Y,L,U,M,q,G,H,K,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,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,S=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,Y=e[40]<<18|e[41]>>>14,L=e[41]<<18|e[40]>>>14,B=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,H=e[22]<<10|e[23]>>>22,K=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=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,v=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,X=e[34]<<15|e[35]>>>17,Q=e[35]<<15|e[34]>>>17,T=e[45]<<29|e[44]>>>3,_=e[44]<<29|e[45]>>>3,N=e[6]<<28|e[7]>>>4,A=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,V=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,U=e[8]<<27|e[9]>>>5,M=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,j=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,J=e[38]<<8|e[39]>>>24,z=e[39]<<8|e[38]>>>24,k=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=f^~g&v,e[1]=h^~b&y,e[10]=N^~x&R,e[11]=A^~j&S,e[20]=B^~I&V,e[21]=C^~W&F,e[30]=U^~q&H,e[31]=M^~G&K,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~v&w,e[3]=b^~y&$,e[12]=x^~R&O,e[13]=j^~S&D,e[22]=I^~V&J,e[23]=W^~F&z,e[32]=q^~H&X,e[33]=G^~K&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=v^~w&k,e[5]=y^~$&E,e[14]=R^~O&T,e[15]=S^~D&_,e[24]=V^~J&Y,e[25]=F^~z&L,e[34]=H^~X&Z,e[35]=K^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=w^~k&f,e[7]=$^~E&h,e[16]=O^~T&N,e[17]=D^~_&A,e[26]=J^~Y&B,e[27]=z^~L&C,e[36]=X^~Z&U,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=k^~f&g,e[9]=E^~h&b,e[18]=T^~N&x,e[19]=_^~A&j,e[28]=Y^~B&I,e[29]=L^~C&W,e[38]=Z^~U&q,e[39]=ee^~M&G,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=P[r],e[1]^=P[r+1]},S=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(D.decode(e))],create:([e])=>O.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]))}(),O=new TextEncoder,D=new TextDecoder("utf8");function T(e=void 0,t=S){return JSON.stringify(C(e,t))}function _(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 B=[];function C(e,t=S){const n=_(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=_(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(B.length<e){const t=B.length;B.length=e,B.fill(-2,t,e)}return B.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 j(512,N,512).update(e).hex()}(T([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 V(e){return!!e&&"0"!==e&&"false"!==e}let F;class J{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 v(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,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]),y=t[3],w=!c,k=1===s,E=3===s,N=4===s,A=2===s;function P(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),x[t].call(s,o)}}if(!w){var x={},j=[],R=E?"get":N||k?"set":"value";if(l?(u||k?x={get:$(function(){return y(this)},r,"get"),set:function(e){t[4](this,e)}}:x[R]=y,u||$(x[R],r,A?"":R)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!==(i^s))throw Error("Decorating two elements with the same name ("+x[R].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var S=e,O=g.length-1;O>=0;O-=n?2:1){var D=v(g[O],"A decorator","be",!0),T=n?g[O-1]:void 0,_={},B={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");v(t,"An initializer","be",!0),a.push(t)}.bind(null,_)};if(w)i=D.call(T,S,B),_.v=1,v(i,"class decorators","return")&&(S=i);else if(B.static=d,B.private=l,i=B.access={has:l?p.bind():function(e){return r in e}},N||(i.get=l?A?function(e){return f(e),x.value}:P("get",0,f):function(e){return e[r]}),A||E||(i.set=l?P("set",0,f):function(e,t){e[r]=t}),S=D.call(T,k?{get:x.get,set:x.set}:x[R],B),_.v=1,k){if("object"==typeof S&&S)(i=v(S.get,"accessor.get"))&&(x.get=i),(i=v(S.set,"accessor.set"))&&(x.set=i),(i=v(S.init,"accessor.init"))&&j.unshift(i);else if(void 0!==S)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else v(S,(u?"field":"method")+" decorators","return")&&(u?j.unshift(S):x[R]=S)}return s<2&&c.push(b(j,d,1),b(a,d,0)),u||w||(l?k?c.splice(-1,0,P("get",d),P("set",d)):c.push(A?x[R]:v.call.bind(x[R])):m(e,r,x)),S}function E(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;y(t?e:e.prototype,i,f,m?"#"+p:k(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||E(e),{e:i,get c(){var n=[];return g&&[E(e=y(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(v(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(v(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(V(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 z(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new J(s,n,r)}async function Y(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 J(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 J(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await L(n,o.root,r):[o.self]}}async function L(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 J(r,n,s));return o}const U=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),M=U?"bun --bun run":"node",q=U?"bun":"yarn",G=U?"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 s=z(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(U?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return K(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(!K(s,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function K(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=z(e);t||(console.error(d.red("No project found.")),process.exit(1));if(V(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 y("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 y("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 y(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 y(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 ",U?"bun --bun run ":"yarn run ");U&&(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 ",`${G} `)),s=me(n.replaceAll("YARN playwright ",`${G} playwright `).replaceAll("YARN ",!U&&t.binExists?"":`${G} `));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){U||(console.error(d.red("This command is only available on Bun.")),process.exit(1));const n=await Y(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*ve(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ye={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 Y(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const s of ve("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),ke(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 ke(e){delete e.private,delete e.publishConfig,delete e.prettier}const Ee=new class{deploy(e,t=""){return"PRISMA migrate deploy"+(t?` ${t}`:"")}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ls -ahl ${n}/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,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}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}`:""}`}},Ne={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={},Pe={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(xe).command(Re).command(Se).command(Oe).command(De).command(Te).command(_e).command(Be).command(Ce).command(Ie).demandCommand().strict(!1),handler(){}},xe={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ve("prisma deploy",t))await ae(Ee.deploy(r,n),r,e)}},je={...Ae,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Re={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:je,async handler(e){const t=await We(e);for(const n of ve("prisma deploy-force",t))await ae(Ee.deployForce(n,e.backupPath),n,e)}},Se={command:"litestream",describe:"Setup DB for Litestream",builder:Ae,async handler(e){const t=await We(e);for(const n of ve("prisma litestream",t))await ae(Ee.litestream(n),n,e)}},Oe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ve("prisma migrate",t))await ae(Ee.migrate(r,n),r,e)}},De={command:"migrate-dev",describe:"Create a migration file",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ve("prisma migrate-dev",t))await ae(Ee.migrateDev(r,n),r,e)}},Te={command:"reset",describe:"Reset DB",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ve("prisma reset",t))await ae(Ee.reset(r,n),r,e)}},_e={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...je,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await We(e);for(const n of ve("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ae(Ee.restore(n,e.backupPath,t),n,e)}}},Be={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 We(e);for(const n of ve("prisma seed",t))await ae(Ee.seed(n,e.file),n,e)}},Ce={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 We(e),n=Ve(e,["db-url-or-path","restored"]);for(const r of ve("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ae(Ee.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 We(e),n=[(e.args?.join(" ")??"").trimEnd(),Ve(e,["args"])].filter(Boolean).join(" ");for(const r of ve(`prisma ${n}`,t))await ae(`PRISMA ${n}`,r,e)}};async function We(e){const t=await Y(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 Ve(e,t=[]){const n=[],r=Object.keys(Ne),s=Object.values(Ne).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 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=z(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 Y(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of ve("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(`${G} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ae(`${G} playwright install --with-deps`,r,e)}(e)}};function ze(e){return e.silent?" > /dev/null":""}async function Ye(e=3e3,t=100){for(let n=e;n<e+t;n++)if(await Le(n))return n;throw new Error(`No available port found in range ${e}-${e+t-1}`)}async function Le(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 Ue=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 Me{buildDocker(e,t="development"){return Ue.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 "${Ue.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=qe(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=qe(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 qe(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 Me{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 "${[Ee.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[...Ee.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??[...Ee.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 Ye();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 Me{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)} && ${Ue.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 Ye();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 Ke=new class extends Me{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?[Ee.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?Ee.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?Ee.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 Ye();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 Xe=new class extends Me{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)} && ${Ue.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 Qe=new class extends Me{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 "${Ee.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[...Ee.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??[...Ee.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 Ye();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)}"`}},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 Y(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=Ke;else if(r["@remix-run/dev"])s=Qe;else if(Ze.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=Xe}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":{const r=tt(t,"development");await ae(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=tt(t,"staging"),o=Number(n.env.PORT)||8080;await ae(`${r}${s.startProduction(n,e,o)}`,n,e);break}case"docker":{const r=tt(t,"staging");await ae(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=tt(t,"staging");e.normalizedArgsText="'/bin/bash'",await ae(`${r}${s.startDocker(n,e)}`,n,e);break}case"test":{const r=tt(t,"test");await ae(`${r}${s.startTest(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function tt(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 nt={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 Y(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?Ke:i["@remix-run/dev"]?Qe:Ze.some(e=>r[e])&&!r["firebase-functions"]?He:Xe,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 rt(o,u,a);continue;case"docker-debug":{const e=d.length>0?d.join(" "):"test/e2e/";await rt(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 rt(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:`${Ue.stopAndStart(e,!0)}${ze(t)}`}),e,t,{exitIfFailed:!1}),await ae(Ue.stop(e),e,t)}const st={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{},async handler(n){await async function(n){const r=await Y(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?Ke:o["@remix-run/dev"]?Qe:Ze.some(e=>r[e])&&!r["firebase-functions"]?He:Xe,console.info(`Running "test-on-ci" for ${s.name} ...`),await ce(Ue.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:Ue.stopAndStart(s,!0)}:{};process.exitCode=await ae(i.testE2E(s,n,e).replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await ae(Ue.stop(s),s,n)}}}(n)}};const ot={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await Y(n,!1);r||(console.error(d.red("No project found.")),process.exit(1));const s=r.descendants.map(async s=>{const o=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&o.push("BUN tsc --noEmit --Pretty"),s.packageJson.devDependencies?.pyright&&o.push("YARN pyright"));o.length>0;){const i=await ce(o.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),a=t.join(s.dirPath,".next");if(!i||!e.existsSync(a))return i;e.rmSync(a,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking."))}}),o=await Promise.all(s);let i=0;for(const[e,t]of o.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),i=t}i&&process.exit(i)}},it={...ot,command:"tc"};await r(s(process.argv)).scriptName("wb").options(Ne).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(te).command(be).command(ye).command(Pe).command(Fe).command(Je).command(et).command(nt).command(st).command(ot).command(it).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+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBldmVuIHRob3VnaCB0aGlzIGJlaGF2aW9yIGlzIG5vbi1zdGFuZGFyZFxuICAgIC8vIGJlY2F1c2UgYGJ1biB3YiAuLi5gIHdpbGwgbG9hZCAuZW52IGFuZCAuZW52LmxvY2FsIGJlZm9yZSBgd2JgIGxvYWRzIG90aGVyIHZhcmlhYmxlcy5cbiAgICByZXR1cm4geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJywgJ3Rlc3QvZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBsaW5lcyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gbGluZXNcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoMikudHJpbSgpKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQge1xuICBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCxcbiAgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCxcbiAgc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSAvaHR0cC1nZXQ6XFwvXFwvMTI3LjAuMC4xOihcXGQrKS8uZXhlYyhydW5uYWJsZVNjcmlwdCk/LlsxXTtcbiAgaWYgKHJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCd3YWl0LW9uJykgJiYgcG9ydCkge1xuICAgIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnZG9ja2VyIHJ1bicpKSB7XG4gICAgICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KE51bWJlcihwb3J0KSwgcHJvamVjdCk7XG4gICAgICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUocHJvamVjdC5kb2NrZXJJbWFnZU5hbWUsIHByb2plY3QpO1xuICAgIH1cbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcHJpbnRhYmxlU2NyaXB0LCBydW5uYWJsZVNjcmlwdF0gPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhydW5uYWJsZVNjcmlwdCwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogW3N0cmluZywgc3RyaW5nXSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLS1jYXNjYWRlLWVudj0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIFtgZG90ZW52JHtjYXNjYWRlT3B0aW9ufSAke3ByaW50YWJsZVNjcmlwdH1gLCBydW5uYWJsZVNjcmlwdF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz5cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb25maWd1cmVFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBvcHRzOiBPcHRpb25zKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGlmIChvcHRzLmZvcmNlQ29sb3IpIHtcbiAgICBuZXdFbnYuRk9SQ0VfQ09MT1IgPSAnMyc7XG4gIH1cbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuZnVuY3Rpb24gZml4QnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNDM1OVxuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnbmV4dCBkZXYnKSB8fFxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzgyMjJcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydjanMnLCAnY3RzJywgJ2pzJywgJ2pzb24nLCAnanNvbmMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlIG9uIEJ1bicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmICghaXNSdW5uaW5nT25CdW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgb24gQnVuLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGFyZ3YuZmlsZXMgPz8gW107XG4gICAgbGV0IGJpb21lQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgcHJldHRpZXJBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBzb3J0UGFja2FnZUpzb25BcmdzVGV4dDogc3RyaW5nO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWU6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllcjogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKFN0cmluZyhmaWxlKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJpb21lQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHBhY2thZ2VKc29uRmlsZVBhdGhzLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gJyc7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gYFwiKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBgXCIke3AucGFja2FnZUpzb25QYXRofVwiYCkuam9pbignICcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpb21lQ29tbWFuZCA9XG4gICAgICBhcmd2LmZpeCAmJiBhcmd2LmZvcm1hdCA/ICdjaGVjayAtLWZpeCcgOiBhcmd2LmZpeCA/ICdsaW50IC0tZml4JyA6IGFyZ3YuZm9ybWF0ID8gJ2Zvcm1hdCAtLWZpeCcgOiAnbGludCc7XG4gICAgbGV0IGJpb21lUHJvbWlzZTogUHJvbWlzZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChiaW9tZUFyZ3NUZXh0IHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYmlvbWVQcm9taXNlID0gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgYGJ1biAtLWJ1biBiaW9tZSAke2Jpb21lQ29tbWFuZH0gLS1jb2xvcnM9Zm9yY2UgLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZSAke2Jpb21lQXJnc1RleHR9YCxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgaWYgKHByZXR0aWVyQXJnc1RleHQpIHtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGBidW4gLS1idW4gcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSAke3ByZXR0aWVyQXJnc1RleHR9YCxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzVGV4dCkge1xuICAgICAgICBhd2FpdCBiaW9tZVByb21pc2U7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnVuIC0tYnVuIHNvcnQtcGFja2FnZS1qc29uICR7c29ydFBhY2thZ2VKc29uQXJnc1RleHR9YCwgcHJvamVjdHMuc2VsZiwgYXJndiwge1xuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnYmlvbWUnLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95JHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9YDtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyo7IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgJiYgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKlxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICR7YmFja3VwUGF0aH0gJiYgbHMgLWFobCAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGl0ZXN0cmVhbShfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cnVudGltZVdpdGhBcmdzfSAtZSAnXG5jb25zdCB7IFByaXNtYUNsaWVudCB9ID0gcmVxdWlyZShcIkBwcmlzbWEvY2xpZW50XCIpO1xubmV3IFByaXNtYUNsaWVudCgpLiRxdWVyeVJhd1xcYFBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7XFxgXG4gIC5jYXRjaCgoZXJyb3IpID0+IHsgY29uc29sZS5sb2coXCJGYWlsZWQgZHVlIHRvOlwiLCBlcnJvcik7IHByb2Nlc3MuZXhpdCgxKTsgfSk7XG4nYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2JHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ30gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzOyBHT09HTEVfQVBQTElDQVRJT05fQ1JFREVOVElBTFM9Z2NwLXNhLWtleS5qc29uIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke291dHB1dFBhdGh9ICR7YmFja3VwUGF0aH1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uc2VlZCkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgUE9TU0lCTEVfUEFUSFMgPSBbXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG4gICAgICBdO1xuICAgICAgZm9yIChjb25zdCB7IGRiUGF0aCwgc2NoZW1hUGF0aCB9IG9mIFBPU1NJQkxFX1BBVEhTKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSkge1xuICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgIHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGRiUGF0aCxcbiAgICAgICAgICAgIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvJHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcbiIsImltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnYmFja3VwLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdiJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZXBsb3lGb3JjZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXI6IGRlcGxveUZvcmNlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95Rm9yY2UocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnU2V0dXAgREIgZm9yIExpdGVzdHJlYW0nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5kZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgYXJndi5vdXRwdXQgPz8gKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIFByaXNtYSBTdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydkYi11cmwtb3ItcGF0aCcsICdyZXN0b3JlZCddKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHpcbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6ICdQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcHJpc21hIGFzIGlzJyxcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGBwcmlzbWEgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7ZnVsbENvbW1hbmR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5wcmlzbWEgPz8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnByaXNtYVxuICApO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByaXNtYSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIHByaXNtYSBjb21tYW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5rbm93bk9wdGlvbnMuam9pbignICcpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj5cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IGAnJHthcmd9J2ApXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSkubWFwKChhcmcpID0+IGAnJHthcmd9J2ApLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbi8qKlxuICogRmluZHMgYW4gYXZhaWxhYmxlIHBvcnQgc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gcG9ydCBudW1iZXIuXG4gKiBAcGFyYW0gc3RhcnRQb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIChkZWZhdWx0OiAzMDAwKVxuICogQHBhcmFtIG1heEF0dGVtcHRzIC0gTWF4aW11bSBudW1iZXIgb2YgcG9ydHMgdG8gdHJ5IChkZWZhdWx0OiAxMDApXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhdmFpbGFibGUgcG9ydCBudW1iZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBdmFpbGFibGVQb3J0KHN0YXJ0UG9ydCA9IDMwMDAsIG1heEF0dGVtcHRzID0gMTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgZm9yIChsZXQgcG9ydCA9IHN0YXJ0UG9ydDsgcG9ydCA8IHN0YXJ0UG9ydCArIG1heEF0dGVtcHRzOyBwb3J0KyspIHtcbiAgICBpZiAoYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpKSB7XG4gICAgICByZXR1cm4gcG9ydDtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBObyBhdmFpbGFibGUgcG9ydCBmb3VuZCBpbiByYW5nZSAke3N0YXJ0UG9ydH0tJHtzdGFydFBvcnQgKyBtYXhBdHRlbXB0cyAtIDF9YCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5hc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgJzEyNy4wLjAuMScpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZERldkltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgdW5idWZmZXIgPSBmYWxzZSwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt1bmJ1ZmZlciA/ICd1bmJ1ZmZlciAnIDogJyd9JHt0aGlzLnN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFkZGl0aW9uYWxPcHRpb25zLFxuICAgICAgYWRkaXRpb25hbEFyZ3NcbiAgICApfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAtaXQgLXAgXFwke1BPUlQ6LTgwODB9OjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIGNvbnRhaW5lciBscyAtcSAtZiBuYW1lPSR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9KSAyPiAvZGV2L251bGwpYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFRGV2T3B0aW9ucyB7XG4gIC8vICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJ1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZztcbiAgc3RhcnRDb21tYW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBUZXN0RTJFT3B0aW9ucyA9IHtcbiAgcHJpc21hRGlyZWN0b3J5Pzogc3RyaW5nO1xufSAmIFRlc3RFMkVEZXZPcHRpb25zO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb24gPSAnZGV2ZWxvcG1lbnQnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZERldkltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgYWJzdHJhY3Qgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICBhYnN0cmFjdCBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgODA4MDtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0ke3RvRGV2TnVsbChhcmd2KX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgICApfVwiXG4gICAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdC9lMmUvJywgcHJpc21hRGlyZWN0b3J5LCBzdGFydENvbW1hbmQgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCBlbnZQcmVmaXggPSBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9JHtwb3J0fWA7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7ZW52UHJlZml4fSAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gcHJpc21hRGlyZWN0b3J5ID8gYHJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgYCA6ICcnO1xuICAgIHJldHVybiBgJHtlbnZQcmVmaXh9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7cmVzZXRDb21tYW5kfSR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IGVudlByZWZpeCA9IGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD0ke3BvcnR9YDtcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IGJ1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBgJHtlbnZQcmVmaXh9ICR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7ZW52UHJlZml4fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgYWJzdHJhY3QgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHM/LmpvaW4oJyAnKSB8fCAndGVzdC91bml0Lyc7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIHZpdGVzdCBydW4gJHt0ZXN0VGFyZ2V0fSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5YDtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBidW4gdGVzdCAke3Rlc3RUYXJnZXR9YDtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgMzAwMCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8IDMwMDApOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndixcbiAgICAgIHBvcnRcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3M6IHN0cmluZywgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSAnQlVOIHBsYXl3cmlnaHQnO1xuICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzPy5qb2luKCcgJykgfHwgJ3Rlc3QvZTJlLyc7XG4gIGlmICghcGxheXdyaWdodEFyZ3Muc3RhcnRzV2l0aCgndGVzdCAnKSB8fCAhdGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9ICR7cGxheXdyaWdodEFyZ3N9YDtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgndGVzdCAnLmxlbmd0aCkudHJpbSgpO1xuICBjb25zdCBwYXJ0cyA9IHJlc3QubGVuZ3RoID4gMCA/IHJlc3Quc3BsaXQoL1xccysvKSA6IFtdO1xuICBpZiAoIXBhcnRzWzBdIHx8IHBhcnRzWzBdLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIHBhcnRzLnVuc2hpZnQodGFyZ2V0KTtcbiAgfSBlbHNlIHtcbiAgICBwYXJ0c1swXSA9IHRhcmdldDtcbiAgfVxuICByZXR1cm4gYCR7YmFzZX0gdGVzdCAke3BhcnRzLmpvaW4oJyAnKX1gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kQXZhaWxhYmxlUG9ydCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbmRQb3J0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGAke2FwcEVudn1ZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiYmxpdHogZGV2IC1wICR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fU5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4ucHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSxcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgIF1cbiAgICAgIC5tYXAoKGNvbW1hbmQpID0+IGAke2NvbW1hbmQudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4ucHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAgIC5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBkZWZhdWx0U3RhcnRDb21tYW5kID0gYGJsaXR6IGRldiAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9YDtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQ6IHN0YXJ0Q29tbWFuZCA/PyBkZWZhdWx0U3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcImJsaXR6IGRldiAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgUE9SVD0ke3BvcnR9IFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9JHt0b0Rldk51bGwoYXJndil9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSA4MDgwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uIFBPUlQ9XFwke1BPUlQ6LSR7cG9ydH19ICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5oYXNQcmlzbWEgPyAncHJpc21hIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtZ2VuZXJhdGUgJiYgJyA6ICcnfSgke3RoaXMuc3RhcnRQcm9kdWN0aW9uKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3ZcbiAgICApfSlgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJvamVjdC5oYXNQcmlzbWEgPyAncHJpc21hIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtZ2VuZXJhdGUgJiYgJyA6ICcnfSgke3RoaXMuc3RhcnRQcm9kdWN0aW9uKFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApfSlgLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cyAmJiBhcmd2LnRhcmdldHMubGVuZ3RoID4gMCA/IGFyZ3YudGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiB2aXRlc3QgcnVuICR7dGVzdFRhcmdldH0gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVEZXZPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgc3RhcnRDb21tYW5kIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cyAmJiBhcmd2LnRhcmdldHMubGVuZ3RoID4gMCA/IGFyZ3YudGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7XG4gICAgICBwcm9qZWN0LmVudi5XQl9FTlZcbiAgICB9IFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZCA/PyB0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGZpbmRBdmFpbGFibGVQb3J0KCk7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIiR7dGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwibmV4dCBkZXYgLS10dXJib3BhY2sgLXAgJHtwb3J0fSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIGBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAsXG4gICAgICBdLmpvaW4oJyAmJiAnKX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpIDogW10pLFxuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgXVxuICAgICAgLm1hcCgoY29tbWFuZCkgPT4gYCR7Y29tbWFuZC50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgIC5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3M6IG9wdGlvbnMucGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpIDogW10pLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXVxuICAgICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgICAgLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIHsgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0Q29tbWFuZCA9IGBuZXh0IGRldiAtLXR1cmJvcGFjayAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9YDtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHN0YXJ0Q29tbWFuZDogc3RhcnRDb21tYW5kID8/IGRlZmF1bHRTdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGZpbmRBdmFpbGFibGVQb3J0KCk7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwibmV4dCBkZXYgLS10dXJib3BhY2sgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgUE9SVD0ke3BvcnR9IFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9JHt0b0Rldk51bGwoYXJndil9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7XG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgIH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kQXZhaWxhYmxlUG9ydCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbmRQb3J0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJyZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgXVxuICAgICAgLm1hcCgoY29tbWFuZCkgPT4gYCR7Y29tbWFuZC50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgIC5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3M6IG9wdGlvbnMucGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdwcmlzbWEnLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4ucHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAgIC5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gYHJlbWl4IGRldiR7dG9EZXZOdWxsKGFyZ3YpfWAgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGZpbmRBdmFpbGFibGVQb3J0KCk7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcInJlbWl4IGRldiR7dG9EZXZOdWxsKGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnZGV2ZWxvcG1lbnQnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCBwb3J0KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAndGVzdCcpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Piwgd2JFbnY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gd2JFbnY7XG4gIGxldCBwcmVmaXggPSBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICBpZiAoZGVwcy5uZXh0KSB7XG4gICAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAgIHByZWZpeCArPSBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICB9XG4gIHJldHVybiBwcmVmaXg7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRTJlIHRlc3QgbW9kZTogaGVhZGxlc3MgKGRlZmF1bHQpIHwgaGVhZGxlc3MtZGV2IHwgaGVhZGVkIHwgaGVhZGVkLWRldiB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IGRlYnVnIHwgZ2VuZXJhdGUgfCB0cmFjZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8XG4gIEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuPjtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuJyxcbiAgYnVpbGRlcjogeyAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxKSB7XG4gICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgcHJvY2Vzcy5lbnYuQ0kgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKGFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwO1xuXG4gIC8vIERldGVjdCB0ZXN0IG1vZGVzIGZyb20gdGFyZ2V0IHBhdGhzXG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1blVuaXQgPSBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cztcbiAgY29uc3Qgc2hvdWxkUnVuRTJlID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cztcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiB1bmRlZmluZWQgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgZTJlQXJndiwgc2NyaXB0cyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBlMmVUYXJnZXQgPSBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgZTJlQXJndiwgc2NyaXB0cywgYHRlc3QgJHtlMmVUYXJnZXR9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBjb25zdCBlMmVUYXJnZXQgPSBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0tZGVidWdgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYGNvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuV0JfRE9DS0VSID8/PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kOiBgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKX0ke3RvRGV2TnVsbChhcmd2KX1gLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgdGVzdE9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuQ0kgfHw9ICcxJztcbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5XQl9ET0NLRVIgPz89ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gICAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbmFsRXhpdENvZGUpIHByb2Nlc3MuZXhpdChmaW5hbEV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0cmVlS2lsbCBmcm9tICd0cmVlLWtpbGwnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRJZk5vbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJjYWNoZWRFbnZWYXJzIiwiTWFwIiwicmVhZEVudkZpbGUiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInBhdGgiLCJyZXNvbHZlIiwicHJvY2Vzc0VudiIsInNldCIsImFzeW5jIiwic3Bhd25Bc3luYyIsImNvbW1hbmQiLCJhcmdzIiwib3B0aW9ucyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzdGRvdXQiLCJzZXRFbmNvZGluZyIsInN0ZGVyciIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0IiwicHJvY2VzcyIsIndyaXRlIiwibWVyZ2VPdXRBbmRFcnJvciIsInByaW50aW5nU3RkZXJyIiwic3RvcHBlZCIsInN0b3BQcm9jZXNzIiwicGlkIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwidHJlZUtpbGwiLCJraWxsT25FeGl0IiwiZXJyb3IiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImNvZGUiLCJzaWduYWwiLCJ1bmRlZmluZWQiLCJFcnJvciIsInN0YXR1cyIsImlucHV0Iiwic3RkaW4iLCJlbmQiLCJ0IiwicyIsImkiLCJlIiwibiIsImVudHJpZXMiLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsImNvbnN0cnVjdG9yIiwidGhpcyIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibGVuZ3RoIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm5hbWUiLCJtZXNzYWdlIiwic3RhY2siLCJwdXNoIiwiY2F1c2UiLCJzdHViIiwiaHlkcmF0ZSIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiZGVjb2RlIiwiY3JlYXRlIiwiZW5jb2RlIiwiYXRvYiIsIlNldCIsInZhbHVlcyIsImFkZCIsIkRhdGUiLCJ0b0pTT04iLCJSZWdFeHAiLCJmbGFncyIsInNvdXJjZSIsIlVSTCIsImhyZWYiLCJtYXAiLCJUZXh0RW5jb2RlciIsIlRleHREZWNvZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsIk51bWJlciIsImlzTmFOIiwiaXNGaW5pdGUiLCJ0b1N0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImZpbGwiLCJzbGljZSIsIk9iamVjdCIsImNhY2hlRHVyYXRpb24iLCJQT1NJVElWRV9JTkZJTklUWSIsImdldENhY2hlS2V5Iiwia2luZCIsIm5vdyIsImNhbGwiLCJpc0NJIiwiY2lFbnYiLCJQcm9qZWN0IiwiX2luaXRQcm90byIsIl9hcHBseURlY3MiLCJtZW1vaXplT25lIiwiYXJndiIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJ0ZXN0IiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImVudiIsImVudlZhcnMiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImN3ZCIsImVudlBhdGhzIiwiZW52UGF0aCIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZsYXRNYXAiLCJmaWx0ZXIiLCJyZWxhdGl2ZSIsImVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzIiwiY291bnQiLCJrZXkiLCJ2YWx1ZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJrZXlzIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwicGFyc2UiLCJwYWNrYWdlSnNvblBhdGgiLCJoYXNQcmlzbWEiLCJkZXBlbmRlbmNpZXMiLCJwcmlzbWEiLCJkZXZEZXBlbmRlbmNpZXMiLCJoYXNWaXRlc3QiLCJ2aXRlc3QiLCJza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCIsIkNJIiwiY29uZmlnUGF0aCIsImRvY2tlclBhY2thZ2VKc29uIiwiZGlybmFtZSIsImJpbkV4aXN0cyIsImJpbkZvdW5kIiwiY3VycmVudFBhdGgiLCJiaW5QYXRoIiwiUEFUSCIsInBhcmVudFBhdGgiLCJmaWxlTmFtZSIsImZpbmQiLCJmaW5kU2VsZlByb2plY3QiLCJmaW5kRGVzY2VuZGFudFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwiZW5kc1dpdGgiLCJyb290Iiwic2VsZiIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwiZGVzY2VuZGFudHMiLCJnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMiLCJwcm9qZWN0cyIsIndvcmtzcGFjZSIsImdsb2JQYXR0ZXJuIiwicGFja2FnZURpcnMiLCJ3b3Jrc3BhY2VQYXRoIiwid3MiLCJnbG9iYnkiLCJkb3QiLCJvbmx5RGlyZWN0b3JpZXMiLCJzdWJQYWNrYWdlRGlyUGF0aCIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJhbGlhcyIsImhhbmRsZXIiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInRyaW0iLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiaGFzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInN0ZGlvIiwiZW5jb2RpbmciLCJzcGxpdCIsImxpbmUiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwic29tZSIsInBhdHRlcm4iLCJpbmNsdWRlU3VmZml4Iiwic3VmZml4IiwiZXhjbHVkZVBhdHRlcm5zIiwiY29weSIsImRpZ2VzdCIsInVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdCIsImNhY2hlZENvbnRlbnRIYXNoIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRGaWxlIiwiY2FuU2tpcEJ1aWxkIiwiZ3JlZW4iLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJidWlsZGVyIiwiZXhpdCIsInBvcnRFbnYiLCJQT1JUIiwicG9ydCIsImlzSW50ZWdlciIsImtpbGxQb3J0UHJvY2VzcyIsImtpbGxQb3J0SWZOb25DaSIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzIiwicmVtb3ZlRG9ja2VyQ29udGFpbmVycyIsImZpbHRlckFyZ3MiLCJjb250YWluZXJJZHMiLCJpZCIsIkJvb2xlYW4iLCJsaXN0RG9ja2VyQ29udGFpbmVySWRzIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsInByaW50YWJsZVNjcmlwdCIsInJ1bm5hYmxlU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJleGVjIiwic3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCIsImltYWdlTmFtZSIsInN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZSIsImtpbGxGdW5jIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJjb25maWd1cmVFbnYiLCJ0aW1lb3V0IiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImJsaXR6IiwiZml4QnVuQ29tbWFuZCIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJwcmVmaXgiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiRk9SQ0VfQ09MT1IiLCJiaW9tZUV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwibGludENvbW1hbmQiLCJmaXgiLCJmb3JtYXQiLCJmaWxlcyIsImJpb21lQXJnc1RleHQiLCJwcmV0dGllckFyZ3NUZXh0Iiwic29ydFBhY2thZ2VKc29uQXJnc1RleHQiLCJmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUiLCJmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllciIsInBhY2thZ2VKc29uRmlsZVBhdGhzIiwiZmlsZSIsIlN0cmluZyIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJiaW9tZUNvbW1hbmQiLCJiaW9tZVByb21pc2UiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJzdGFydHNXaXRoIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwiZGV2RGVwcyIsIm5hbWVXb3Jkc1RvQmVSZW1vdmVkIiwicmVtb3ZlZERlcHMiLCJ3b3JkIiwibmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsInJlbW92ZWRTY3JpcHRzIiwiY29udGVudCIsInByaXZhdGUiLCJwdWJsaXNoQ29uZmlnIiwicHJldHRpZXIiLCJwcmlzbWFTY3JpcHRzIiwiZGVwbG95IiwiYWRkaXRpb25hbE9wdGlvbnMiLCJkZXBsb3lGb3JjZSIsImJhY2t1cFBhdGgiLCJkaXJOYW1lIiwibGl0ZXN0cmVhbSIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInJlc3RvcmUiLCJvdXRwdXRQYXRoIiwic2NyaXB0UGF0aCIsInN0dWRpbyIsImRiVXJsT3JQYXRoIiwiRklMRV9TQ0hFTUEiLCJEQVRBQkFTRV9VUkwiLCJQT1NTSUJMRV9QQVRIUyIsInNjaGVtYVBhdGgiLCJkYlBhdGgiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImRlZmF1bHQiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGl0ZXN0cmVhbUNvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmRQcmlzbWFQcm9qZWN0cyIsInVua25vd25PcHRpb25zIiwiZXh0cmFjdFVua25vd25PcHRpb25zIiwiZGVwbG95Rm9yY2VCdWlsZGVyIiwiZGVtYW5kT3B0aW9uIiwib3V0cHV0IiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJmaWx0ZXJlZCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsIml0ZW0iLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJzaWxlbnQiLCJmaW5kQXZhaWxhYmxlUG9ydCIsInN0YXJ0UG9ydCIsIm1heEF0dGVtcHRzIiwiaXNQb3J0QXZhaWxhYmxlIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib25jZSIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsInN0b3BBbGwiLCJCYXNlU2NyaXB0cyIsImJ1aWxkRG9ja2VyIiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJ3YWl0QW5kT3BlbkFwcCIsInRlc3RFMkUiLCJwbGF5d3JpZ2h0QXJncyIsInByaXNtYURpcmVjdG9yeSIsInN0YXJ0Q29tbWFuZCIsImVudlByZWZpeCIsInBsYXl3cmlnaHRDb21tYW5kIiwiYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZCIsInRhcmdldHMiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ0ZXN0VGFyZ2V0Iiwid2FpdEFwcCIsImJhc2UiLCJ0YXJnZXQiLCJyZXN0IiwicGFydHMiLCJ1bnNoaWZ0IiwiYmxpdHpTY3JpcHRzIiwiYXBwRW52Iiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRUZXN0Iiwic3VwZXIiLCJkZWZhdWx0U3RhcnRDb21tYW5kIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImFyZyIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsImNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzIiwid2JFbnYiLCJORVhUX1BVQkxJQ19XQl9FTlYiLCJ0ZXN0Q29tbWFuZCIsImUyZSIsImNob2ljZXMiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkFsbFRlc3RzIiwiaGFzRTJlVGFyZ2V0cyIsImhhc1VuaXRUYXJnZXRzIiwic2hvdWxkUnVuVW5pdCIsInNob3VsZFJ1bkUyZSIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwidGVzdE9uRG9ja2VyIiwiZTJlVGFyZ2V0IiwiV0JfRE9DS0VSIiwidGVzdE9uQ2lDb21tYW5kIiwidGVzdE9uQ2kiLCJ0eXBlQ2hlY2tDb21tYW5kIiwiY29tbWFuZHMiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJleGl0Q29kZXMiLCJhbGwiLCJmaW5hbEV4aXRDb2RlIiwidGNDb21tYW5kIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJtaWRkbGV3YXJlIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwidG9VcHBlckNhc2UiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiXSwibWFwcGluZ3MiOiI0ZUF5SEEsTUFBTUEsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtDLFFBQVFOLEdBQVdPLFdBQVksQ0FBQSxJQUFNSixRQUFVLENBQUEsRUFFbEYsT0FEQU4sRUFBY1csSUFBSVIsRUFBVUcsR0FDckJBLENBQ1QsQ0M5RE9NLGVBQWVDLEVBQ3BCQyxFQUNBQyxFQUNBQyxHQUVBLE9B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
9
+ */const E=[..."0123456789abcdef"],N=[6,1536,393216,100663296],A=[0,8,16,24],P=[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,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<<A[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<A[3&i++],t[i>>2]|=(128|a>>12&63)<<A[3&i++],t[i>>2]|=(128|a>>6&63)<<A[3&i++],t[i>>2]|=(128|63&a)<<A[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];R(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];R(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+=E[s>>4&15]+E[15&s]+E[s>>12&15]+E[s>>8&15]+E[s>>20&15]+E[s>>16&15]+E[s>>28&15]+E[s>>24&15];i%e===0&&(t=x(t),R(t),o=0)}return r&&(s=t[o],a+=E[s>>4&15]+E[15&s],r>1&&(a+=E[s>>12&15]+E[s>>8&15]),r>2&&(a+=E[s>>20&15]+E[s>>16&15])),a}}const R=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,m,f,h,g,b,y,v,w,$,k,E,N,A,x,j,R,S,O,D,T,_,B,C,I,W,V,F,J,z,Y,L,U,M,q,G,H,K,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,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,S=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,Y=e[40]<<18|e[41]>>>14,L=e[41]<<18|e[40]>>>14,B=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,b=e[12]<<12|e[13]>>>20,H=e[22]<<10|e[23]>>>22,K=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=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,T=e[45]<<29|e[44]>>>3,_=e[44]<<29|e[45]>>>3,N=e[6]<<28|e[7]>>>4,A=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,V=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,U=e[8]<<27|e[9]>>>5,M=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,j=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,J=e[38]<<8|e[39]>>>24,z=e[39]<<8|e[38]>>>24,k=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=f^~g&y,e[1]=h^~b&v,e[10]=N^~x&R,e[11]=A^~j&S,e[20]=B^~I&V,e[21]=C^~W&F,e[30]=U^~q&H,e[31]=M^~G&K,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&w,e[3]=b^~v&$,e[12]=x^~R&O,e[13]=j^~S&D,e[22]=I^~V&J,e[23]=W^~F&z,e[32]=q^~H&X,e[33]=G^~K&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~w&k,e[5]=v^~$&E,e[14]=R^~O&T,e[15]=S^~D&_,e[24]=V^~J&Y,e[25]=F^~z&L,e[34]=H^~X&Z,e[35]=K^~Q&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=w^~k&f,e[7]=$^~E&h,e[16]=O^~T&N,e[17]=D^~_&A,e[26]=J^~Y&B,e[27]=z^~L&C,e[36]=X^~Z&U,e[37]=Q^~ee&M,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=k^~f&g,e[9]=E^~h&b,e[18]=T^~N&x,e[19]=_^~A&j,e[28]=Y^~B&I,e[29]=L^~C&W,e[38]=Z^~U&q,e[39]=ee^~M&G,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=P[r],e[1]^=P[r+1]},S=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(D.decode(e))],create:([e])=>O.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]))}(),O=new TextEncoder,D=new TextDecoder("utf8");function T(e=void 0,t=S){return JSON.stringify(C(e,t))}function _(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 B=[];function C(e,t=S){const n=_(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=_(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(B.length<e){const t=B.length;B.length=e,B.fill(-2,t,e)}return B.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 j(512,N,512).update(e).hex()}(T([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 V(e){return!!e&&"0"!==e&&"false"!==e}let F;class J{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,k=1===s,E=3===s,N=4===s,A=2===s;function P(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),x[t].call(s,o)}}if(!w){var x={},j=[],R=E?"get":N||k?"set":"value";if(l?(u||k?x={get:$(function(){return v(this)},r,"get"),set:function(e){t[4](this,e)}}:x[R]=v,u||$(x[R],r,A?"":R)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=h[+d][r])&&7!==(i^s))throw Error("Decorating two elements with the same name ("+x[R].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var S=e,O=g.length-1;O>=0;O-=n?2:1){var D=y(g[O],"A decorator","be",!0),T=n?g[O-1]:void 0,_={},B={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,_)};if(w)i=D.call(T,S,B),_.v=1,y(i,"class decorators","return")&&(S=i);else if(B.static=d,B.private=l,i=B.access={has:l?p.bind():function(e){return r in e}},N||(i.get=l?A?function(e){return f(e),x.value}:P("get",0,f):function(e){return e[r]}),A||E||(i.set=l?P("set",0,f):function(e,t){e[r]=t}),S=D.call(T,k?{get:x.get,set:x.set}:x[R],B),_.v=1,k){if("object"==typeof S&&S)(i=y(S.get,"accessor.get"))&&(x.get=i),(i=y(S.set,"accessor.set"))&&(x.set=i),(i=y(S.init,"accessor.init"))&&j.unshift(i);else if(void 0!==S)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(S,(u?"field":"method")+" decorators","return")&&(u?j.unshift(S):x[R]=S)}return s<2&&c.push(b(j,d,1),b(a,d,0)),u||w||(l?k?c.splice(-1,0,P("get",d),P("set",d)):c.push(A?x[R]:y.call.bind(x[R])):m(e,r,x)),S}function E(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:k(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||E(e),{e:i,get c(){var n=[];return g&&[E(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(V(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 z(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new J(s,n,r)}async function Y(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 J(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 J(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await L(n,o.root,r):[o.self]}}async function L(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 J(r,n,s));return o}const U=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),M=U?"bun --bun run":"node",q=U?"bun":"yarn",G=U?"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 s=z(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(U?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return K(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(!K(s,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function K(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=z(e);t||(console.error(d.red("No project found.")),process.exit(1));if(V(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 ",U?"bun --bun run ":"yarn run ");U&&(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 ",`${G} `)),s=me(n.replaceAll("YARN playwright ",`${G} playwright `).replaceAll("YARN ",!U&&t.binExists?"":`${G} `));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){U||(console.error(d.red("This command is only available on Bun.")),process.exit(1));const n=await Y(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 Y(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),ke(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 ke(e){delete e.private,delete e.publishConfig,delete e.prettier}const Ee=new class{deploy(e,t=""){return"PRISMA migrate deploy"+(t?` ${t}`:"")}deployForce(e,t){const n=e.packageJson.dependencies?.blitz?"db":"prisma";return`rm -Rf ${n}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${n}/mount/prod.sqlite3*\n && litestream restore -o ${n}/mount/prod.sqlite3 ${t} && ls -ahl ${n}/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,n){return`rm -Rf ${e.packageJson.dependencies?.blitz?"db":"prisma"}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${n} ${t}`}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}`:""}`}},Ne={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={},Pe={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(xe).command(Re).command(Se).command(Oe).command(De).command(Te).command(_e).command(Be).command(Ce).command(Ie).demandCommand().strict(!1),handler(){}},xe={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ye("prisma deploy",t))await ae(Ee.deploy(r,n),r,e)}},je={...Ae,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Re={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:je,async handler(e){const t=await We(e);for(const n of ye("prisma deploy-force",t))await ae(Ee.deployForce(n,e.backupPath),n,e)}},Se={command:"litestream",describe:"Setup DB for Litestream",builder:Ae,async handler(e){const t=await We(e);for(const n of ye("prisma litestream",t))await ae(Ee.litestream(n),n,e)}},Oe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ye("prisma migrate",t))await ae(Ee.migrate(r,n),r,e)}},De={command:"migrate-dev",describe:"Create a migration file",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ye("prisma migrate-dev",t))await ae(Ee.migrateDev(r,n),r,e)}},Te={command:"reset",describe:"Reset DB",builder:Ae,async handler(e){const t=await We(e),n=Ve(e);for(const r of ye("prisma reset",t))await ae(Ee.reset(r,n),r,e)}},_e={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...je,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await We(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(Ee.restore(n,e.backupPath,t),n,e)}}},Be={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 We(e);for(const n of ye("prisma seed",t))await ae(Ee.seed(n,e.file),n,e)}},Ce={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 We(e),n=Ve(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(Ee.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 We(e),n=[(e.args?.join(" ")??"").trimEnd(),Ve(e,["args"])].filter(Boolean).join(" ");for(const r of ye(`prisma ${n}`,t))await ae(`PRISMA ${n}`,r,e)}};async function We(e){const t=await Y(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 Ve(e,t=[]){const n=[],r=Object.keys(Ne),s=Object.values(Ne).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 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=z(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 Y(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(`${G} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ae(`${G} playwright install --with-deps`,r,e)}(e)}};function ze(e){return e.silent?" > /dev/null":""}async function Ye(e=3e3,t=100){for(let n=e;n<e+t;n++)if(await Le(n))return n;throw new Error(`No available port found in range ${e}-${e+t-1}`)}async function Le(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 Ue=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 Me{buildDocker(e,t="development"){return Ue.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 "${Ue.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=qe(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=qe(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 qe(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 Me{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 "${[Ee.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[...Ee.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??[...Ee.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 Ye();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 Me{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)} && ${Ue.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 Ye();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 Ke=new class extends Me{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?[Ee.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?Ee.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?Ee.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 Ye();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 Xe=new class extends Me{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)} && ${Ue.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 Qe=new class extends Me{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 "${Ee.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[...Ee.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??[...Ee.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 Ye();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)}"`}},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 Y(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=Ke;else if(r["@remix-run/dev"])s=Qe;else if(Ze.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=Xe}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":{const r=tt(t,"development");await ae(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=tt(t,"staging"),o=Number(n.env.PORT)||8080;await ae(`${r}${s.startProduction(n,e,o)}`,n,e);break}case"docker":{const r=tt(t,"staging");await ae(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=tt(t,"staging");e.normalizedArgsText="'/bin/bash'",await ae(`${r}${s.startDocker(n,e)}`,n,e);break}case"test":{const r=tt(t,"test");await ae(`${r}${s.startTest(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function tt(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 nt={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 Y(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?Ke:i["@remix-run/dev"]?Qe:Ze.some(e=>r[e])&&!r["firebase-functions"]?He:Xe,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 rt(o,u,a);continue;case"docker-debug":{const e=d.length>0?d.join(" "):"test/e2e/";await rt(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 rt(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:`${Ue.stopAndStart(e,!0)}${ze(t)}`}),e,t,{exitIfFailed:!1}),await ae(Ue.stop(e),e,t)}const st={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{},async handler(n){await async function(n){const r=await Y(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?Ke:o["@remix-run/dev"]?Qe:Ze.some(e=>r[e])&&!r["firebase-functions"]?He:Xe,console.info(`Running "test-on-ci" for ${s.name} ...`),await ce(Ue.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:Ue.stopAndStart(s,!0)}:{};process.exitCode=await ae(i.testE2E(s,n,e).replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await ae(Ue.stop(s),s,n)}}}(n)}};const ot={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await Y(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)}},it={...ot,command:"tc"};await r(s(process.argv)).scriptName("wb").options(Ne).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(te).command(be).command(ve).command(Pe).command(Fe).command(Je).command(et).command(nt).command(st).command(ot).command(it).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+W2UuaHJlZl0sY3JlYXRlOihbZV0pPT5uZXcgVVJMKGUpfTtyZXR1cm4gbmV3IE1hcChbZSx0LHMsbyxyLGMsZF0ubWFwKGU9PltlLmluc3RhbmNlLm5hbWUsZV0pKX0oKSxuPW5ldyBUZXh0RW5jb2RlcixhPW5ldyBUZXh0RGVjb2RlcihcInV0ZjhcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBldmVuIHRob3VnaCB0aGlzIGJlaGF2aW9yIGlzIG5vbi1zdGFuZGFyZFxuICAgIC8vIGJlY2F1c2UgYGJ1biB3YiAuLi5gIHdpbGwgbG9hZCAuZW52IGFuZCAuZW52LmxvY2FsIGJlZm9yZSBgd2JgIGxvYWRzIG90aGVyIHZhcmlhYmxlcy5cbiAgICByZXR1cm4geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJywgJ3Rlc3QvZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBsaW5lcyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gbGluZXNcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoMikudHJpbSgpKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQge1xuICBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCxcbiAgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCxcbiAgc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgW3ByaW50YWJsZVNjcmlwdCwgcnVubmFibGVTY3JpcHRdID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHBvcnQgPSAvaHR0cC1nZXQ6XFwvXFwvMTI3LjAuMC4xOihcXGQrKS8uZXhlYyhydW5uYWJsZVNjcmlwdCk/LlsxXTtcbiAgaWYgKHJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCd3YWl0LW9uJykgJiYgcG9ydCkge1xuICAgIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnZG9ja2VyIHJ1bicpKSB7XG4gICAgICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KE51bWJlcihwb3J0KSwgcHJvamVjdCk7XG4gICAgICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUocHJvamVjdC5kb2NrZXJJbWFnZU5hbWUsIHByb2plY3QpO1xuICAgIH1cbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcHJpbnRhYmxlU2NyaXB0LCBydW5uYWJsZVNjcmlwdF0gPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhydW5uYWJsZVNjcmlwdCwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogW3N0cmluZywgc3RyaW5nXSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLS1jYXNjYWRlLWVudj0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIFtgZG90ZW52JHtjYXNjYWRlT3B0aW9ufSAke3ByaW50YWJsZVNjcmlwdH1gLCBydW5uYWJsZVNjcmlwdF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz5cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb25maWd1cmVFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBvcHRzOiBPcHRpb25zKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGlmIChvcHRzLmZvcmNlQ29sb3IpIHtcbiAgICBuZXdFbnYuRk9SQ0VfQ09MT1IgPSAnMyc7XG4gIH1cbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuZnVuY3Rpb24gZml4QnVuQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy8xNDM1OVxuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnbmV4dCBkZXYnKSB8fFxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzgyMjJcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwbGF5d3JpZ2h0JykgfHxcbiAgICAvLyBcImJ1biAtLWJ1biBwcmlzbWEgZ2VuZXJhdGVcIiBkb2Vzbid0IHdvcmtcbiAgICBjb21tYW5kLmluY2x1ZGVzKCdwcmlzbWEnKSB8fFxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnKVxuICAgID8gY29tbWFuZC5yZXBsYWNlQWxsKCdidW4gLS1idW4nLCAnYnVuJylcbiAgICA6IGNvbW1hbmQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydjanMnLCAnY3RzJywgJ2pzJywgJ2pzb24nLCAnanNvbmMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlIG9uIEJ1bicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmICghaXNSdW5uaW5nT25CdW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgb24gQnVuLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGFyZ3YuZmlsZXMgPz8gW107XG4gICAgbGV0IGJpb21lQXJnc1RleHQ6IHN0cmluZztcbiAgICBsZXQgcHJldHRpZXJBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBzb3J0UGFja2FnZUpzb25BcmdzVGV4dDogc3RyaW5nO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWU6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllcjogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKFN0cmluZyhmaWxlKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJpb21lQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlQ2hlY2tlZEJ5QmlvbWUubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzVGV4dCA9IHBhY2thZ2VKc29uRmlsZVBhdGhzLm1hcCgoZikgPT4gYFwiJHtmfVwiYCkuam9pbignICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW9tZUFyZ3NUZXh0ID0gJyc7XG4gICAgICBwcmV0dGllckFyZ3NUZXh0ID0gYFwiKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBgXCIke3AucGFja2FnZUpzb25QYXRofVwiYCkuam9pbignICcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpb21lQ29tbWFuZCA9XG4gICAgICBhcmd2LmZpeCAmJiBhcmd2LmZvcm1hdCA/ICdjaGVjayAtLWZpeCcgOiBhcmd2LmZpeCA/ICdsaW50IC0tZml4JyA6IGFyZ3YuZm9ybWF0ID8gJ2Zvcm1hdCAtLWZpeCcgOiAnbGludCc7XG4gICAgbGV0IGJpb21lUHJvbWlzZTogUHJvbWlzZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChiaW9tZUFyZ3NUZXh0IHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYmlvbWVQcm9taXNlID0gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgYGJ1biAtLWJ1biBiaW9tZSAke2Jpb21lQ29tbWFuZH0gLS1jb2xvcnM9Zm9yY2UgLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZSAke2Jpb21lQXJnc1RleHR9YCxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgaWYgKHByZXR0aWVyQXJnc1RleHQpIHtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGBidW4gLS1idW4gcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSAke3ByZXR0aWVyQXJnc1RleHR9YCxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzVGV4dCkge1xuICAgICAgICBhd2FpdCBiaW9tZVByb21pc2U7XG4gICAgICAgIHZvaWQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnVuIC0tYnVuIHNvcnQtcGFja2FnZS1qc29uICR7c29ydFBhY2thZ2VKc29uQXJnc1RleHR9YCwgcHJvamVjdHMuc2VsZiwgYXJndiwge1xuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnYmlvbWUnLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95JHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9YDtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyo7IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgJiYgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKlxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICR7YmFja3VwUGF0aH0gJiYgbHMgLWFobCAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAmJiBBTExPV19UT19TS0lQX1NFRUQ9MCBQUklTTUEgbWlncmF0ZSBkZXBsb3lgO1xuICB9XG5cbiAgbGl0ZXN0cmVhbShfOiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cnVudGltZVdpdGhBcmdzfSAtZSAnXG5jb25zdCB7IFByaXNtYUNsaWVudCB9ID0gcmVxdWlyZShcIkBwcmlzbWEvY2xpZW50XCIpO1xubmV3IFByaXNtYUNsaWVudCgpLiRxdWVyeVJhd1xcYFBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7XFxgXG4gIC5jYXRjaCgoZXJyb3IpID0+IHsgY29uc29sZS5sb2coXCJGYWlsZWQgZHVlIHRvOlwiLCBlcnJvcik7IHByb2Nlc3MuZXhpdCgxKTsgfSk7XG4nYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2JHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ30gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzOyBHT09HTEVfQVBQTElDQVRJT05fQ1JFREVOVElBTFM9Z2NwLXNhLWtleS5qc29uIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke291dHB1dFBhdGh9ICR7YmFja3VwUGF0aH1gO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uc2VlZCkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgUE9TU0lCTEVfUEFUSFMgPSBbXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG4gICAgICBdO1xuICAgICAgZm9yIChjb25zdCB7IGRiUGF0aCwgc2NoZW1hUGF0aCB9IG9mIFBPU1NJQkxFX1BBVEhTKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSkge1xuICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgIHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGRiUGF0aCxcbiAgICAgICAgICAgIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvJHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIC8vIFRoaXMgb3B0aW9uIGlzIGZvciBkZWJ1Z2dpbmcgbWFpbmx5LlxuICAnd29ya2luZy1kaXInOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICAnZHJ5LXJ1bic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogWydkcnknLCAnZCddLFxuICB9LFxufSBhcyBjb25zdDtcbiIsImltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnYmFja3VwLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdiJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZXBsb3lGb3JjZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXI6IGRlcGxveUZvcmNlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95Rm9yY2UocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnU2V0dXAgREIgZm9yIExpdGVzdHJlYW0nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5kZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgYXJndi5vdXRwdXQgPz8gKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgsIG91dHB1dCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIFByaXNtYSBTdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydkYi11cmwtb3ItcGF0aCcsICdyZXN0b3JlZCddKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHpcbiAgICAgICAgICA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICAgIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJ1xuICAgICAgICA6IGFyZ3YuZGJVcmxPclBhdGg/LnRvU3RyaW5nKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6ICdQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcHJpc21hIGFzIGlzJyxcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGBwcmlzbWEgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7ZnVsbENvbW1hbmR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5wcmlzbWEgPz8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnByaXNtYVxuICApO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByaXNtYSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIHByaXNtYSBjb21tYW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5rbm93bk9wdGlvbnMuam9pbignICcpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgICBwYWNrYWdlcy5wdXNoKCdleHBlY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXJncyhcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj5cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKV1cbiAgICAubWFwKChhcmcpID0+IGAnJHthcmd9J2ApXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSkubWFwKChhcmcpID0+IGAnJHthcmd9J2ApLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbi8qKlxuICogRmluZHMgYW4gYXZhaWxhYmxlIHBvcnQgc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gcG9ydCBudW1iZXIuXG4gKiBAcGFyYW0gc3RhcnRQb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIChkZWZhdWx0OiAzMDAwKVxuICogQHBhcmFtIG1heEF0dGVtcHRzIC0gTWF4aW11bSBudW1iZXIgb2YgcG9ydHMgdG8gdHJ5IChkZWZhdWx0OiAxMDApXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhdmFpbGFibGUgcG9ydCBudW1iZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBdmFpbGFibGVQb3J0KHN0YXJ0UG9ydCA9IDMwMDAsIG1heEF0dGVtcHRzID0gMTAwKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgZm9yIChsZXQgcG9ydCA9IHN0YXJ0UG9ydDsgcG9ydCA8IHN0YXJ0UG9ydCArIG1heEF0dGVtcHRzOyBwb3J0KyspIHtcbiAgICBpZiAoYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpKSB7XG4gICAgICByZXR1cm4gcG9ydDtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBObyBhdmFpbGFibGUgcG9ydCBmb3VuZCBpbiByYW5nZSAke3N0YXJ0UG9ydH0tJHtzdGFydFBvcnQgKyBtYXhBdHRlbXB0cyAtIDF9YCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5hc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgJzEyNy4wLjAuMScpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZERldkltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgdW5idWZmZXIgPSBmYWxzZSwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt1bmJ1ZmZlciA/ICd1bmJ1ZmZlciAnIDogJyd9JHt0aGlzLnN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFkZGl0aW9uYWxPcHRpb25zLFxuICAgICAgYWRkaXRpb25hbEFyZ3NcbiAgICApfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAtaXQgLXAgXFwke1BPUlQ6LTgwODB9OjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIGNvbnRhaW5lciBscyAtcSAtZiBuYW1lPSR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9KSAyPiAvZGV2L251bGwpYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFRGV2T3B0aW9ucyB7XG4gIC8vICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJ1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZztcbiAgc3RhcnRDb21tYW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBUZXN0RTJFT3B0aW9ucyA9IHtcbiAgcHJpc21hRGlyZWN0b3J5Pzogc3RyaW5nO1xufSAmIFRlc3RFMkVEZXZPcHRpb25zO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb24gPSAnZGV2ZWxvcG1lbnQnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZERldkltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgYWJzdHJhY3Qgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICBhYnN0cmFjdCBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgODA4MDtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0ke3RvRGV2TnVsbChhcmd2KX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgICApfVwiXG4gICAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdC9lMmUvJywgcHJpc21hRGlyZWN0b3J5LCBzdGFydENvbW1hbmQgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCBlbnZQcmVmaXggPSBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9JHtwb3J0fWA7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7ZW52UHJlZml4fSAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gcHJpc21hRGlyZWN0b3J5ID8gYHJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgYCA6ICcnO1xuICAgIHJldHVybiBgJHtlbnZQcmVmaXh9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7cmVzZXRDb21tYW5kfSR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IGVudlByZWZpeCA9IGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD0ke3BvcnR9YDtcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IGJ1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBgJHtlbnZQcmVmaXh9ICR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7ZW52UHJlZml4fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgYWJzdHJhY3QgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHM/LmpvaW4oJyAnKSB8fCAndGVzdC91bml0Lyc7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIHZpdGVzdCBydW4gJHt0ZXN0VGFyZ2V0fSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5YDtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBidW4gdGVzdCAke3Rlc3RUYXJnZXR9YDtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgMzAwMCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8IDMwMDApOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYXJndixcbiAgICAgIHBvcnRcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3M6IHN0cmluZywgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSAnQlVOIHBsYXl3cmlnaHQnO1xuICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzPy5qb2luKCcgJykgfHwgJ3Rlc3QvZTJlLyc7XG4gIGlmICghcGxheXdyaWdodEFyZ3Muc3RhcnRzV2l0aCgndGVzdCAnKSB8fCAhdGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9ICR7cGxheXdyaWdodEFyZ3N9YDtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgndGVzdCAnLmxlbmd0aCkudHJpbSgpO1xuICBjb25zdCBwYXJ0cyA9IHJlc3QubGVuZ3RoID4gMCA/IHJlc3Quc3BsaXQoL1xccysvKSA6IFtdO1xuICBpZiAoIXBhcnRzWzBdIHx8IHBhcnRzWzBdLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIHBhcnRzLnVuc2hpZnQodGFyZ2V0KTtcbiAgfSBlbHNlIHtcbiAgICBwYXJ0c1swXSA9IHRhcmdldDtcbiAgfVxuICByZXR1cm4gYCR7YmFzZX0gdGVzdCAke3BhcnRzLmpvaW4oJyAnKX1gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kQXZhaWxhYmxlUG9ydCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbmRQb3J0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGAke2FwcEVudn1ZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiYmxpdHogZGV2IC1wICR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fU5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4ucHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSxcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgIF1cbiAgICAgIC5tYXAoKGNvbW1hbmQpID0+IGAke2NvbW1hbmQudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4ucHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAgIC5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBkZWZhdWx0U3RhcnRDb21tYW5kID0gYGJsaXR6IGRldiAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9YDtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQ6IHN0YXJ0Q29tbWFuZCA/PyBkZWZhdWx0U3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcImJsaXR6IGRldiAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgUE9SVD0ke3BvcnR9IFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9JHt0b0Rldk51bGwoYXJndil9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSA4MDgwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uIFBPUlQ9XFwke1BPUlQ6LSR7cG9ydH19ICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5oYXNQcmlzbWEgPyAncHJpc21hIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtZ2VuZXJhdGUgJiYgJyA6ICcnfSgke3RoaXMuc3RhcnRQcm9kdWN0aW9uKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3ZcbiAgICApfSlgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgc3RhcnRDb21tYW5kID0gYCR7cHJvamVjdC5oYXNQcmlzbWEgPyAncHJpc21hIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtZ2VuZXJhdGUgJiYgJyA6ICcnfSgke3RoaXMuc3RhcnRQcm9kdWN0aW9uKFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApfSlgLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cyAmJiBhcmd2LnRhcmdldHMubGVuZ3RoID4gMCA/IGFyZ3YudGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiB2aXRlc3QgcnVuICR7dGVzdFRhcmdldH0gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVEZXZPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgc3RhcnRDb21tYW5kIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cyAmJiBhcmd2LnRhcmdldHMubGVuZ3RoID4gMCA/IGFyZ3YudGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7XG4gICAgICBwcm9qZWN0LmVudi5XQl9FTlZcbiAgICB9IFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZCA/PyB0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGZpbmRBdmFpbGFibGVQb3J0KCk7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIiR7dGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwibmV4dCBkZXYgLS10dXJib3BhY2sgLXAgJHtwb3J0fSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBbcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpXSA6IFtdKSxcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIGBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAsXG4gICAgICBdLmpvaW4oJyAmJiAnKX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpIDogW10pLFxuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgXVxuICAgICAgLm1hcCgoY29tbWFuZCkgPT4gYCR7Y29tbWFuZC50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgIC5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3M6IG9wdGlvbnMucGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdkYicsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpIDogW10pLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXVxuICAgICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgICAgLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIHsgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0Q29tbWFuZCA9IGBuZXh0IGRldiAtLXR1cmJvcGFjayAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9YDtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHN0YXJ0Q29tbWFuZDogc3RhcnRDb21tYW5kID8/IGRlZmF1bHRTdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGZpbmRBdmFpbGFibGVQb3J0KCk7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwibmV4dCBkZXYgLS10dXJib3BhY2sgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgUE9SVD0ke3BvcnR9IFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9JHt0b0Rldk51bGwoYXJndil9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7XG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgIH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kQXZhaWxhYmxlUG9ydCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbmRQb3J0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJyZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KX0gJiYgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZShcbiAgICAgICAgJ2Vjb3N5c3RlbS5jb25maWcuY2pzJ1xuICAgICAgKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgXVxuICAgICAgLm1hcCgoY29tbWFuZCkgPT4gYCR7Y29tbWFuZC50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgIC5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3M6IG9wdGlvbnMucGxheXdyaWdodEFyZ3MsXG4gICAgICBwcmlzbWFEaXJlY3Rvcnk6ICdwcmlzbWEnLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4ucHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAgIC5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kID0gYHJlbWl4IGRldiR7dG9EZXZOdWxsKGFyZ3YpfWAgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfSk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGZpbmRBdmFpbGFibGVQb3J0KCk7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcInJlbWl4IGRldiR7dG9EZXZOdWxsKGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ1N0YXJ0IGFwcCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHx8XG4gICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICApIHtcbiAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwic3RhcnRcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgICBzd2l0Y2ggKGFyZ3YubW9kZSA/PyAnZGV2Jykge1xuICAgICAgICBjYXNlICdkZXYnOlxuICAgICAgICBjYXNlICdkZXZlbG9wbWVudCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnZGV2ZWxvcG1lbnQnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCBwb3J0KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA9IGAnL2Jpbi9iYXNoJ2A7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAndGVzdCcpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Piwgd2JFbnY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gd2JFbnY7XG4gIGxldCBwcmVmaXggPSBgV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICBpZiAoZGVwcy5uZXh0KSB7XG4gICAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuICAgIHByZWZpeCArPSBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7cHJvY2Vzcy5lbnYuV0JfRU5WfSBgO1xuICB9XG4gIHJldHVybiBwcmVmaXg7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRTJlIHRlc3QgbW9kZTogaGVhZGxlc3MgKGRlZmF1bHQpIHwgaGVhZGxlc3MtZGV2IHwgaGVhZGVkIHwgaGVhZGVkLWRldiB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IGRlYnVnIHwgZ2VuZXJhdGUgfCB0cmFjZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8XG4gIEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuPjtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuJyxcbiAgYnVpbGRlcjogeyAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxKSB7XG4gICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgcHJvY2Vzcy5lbnYuQ0kgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKGFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwO1xuXG4gIC8vIERldGVjdCB0ZXN0IG1vZGVzIGZyb20gdGFyZ2V0IHBhdGhzXG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1blVuaXQgPSBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNVbml0VGFyZ2V0cztcbiAgY29uc3Qgc2hvdWxkUnVuRTJlID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cztcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiB1bmRlZmluZWQgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHt9KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgZTJlQXJndiwgc2NyaXB0cyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBlMmVUYXJnZXQgPSBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIocHJvamVjdCwgZTJlQXJndiwgc2NyaXB0cywgYHRlc3QgJHtlMmVUYXJnZXR9IC0tZGVidWdgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBjb25zdCBlMmVUYXJnZXQgPSBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0tZGVidWdgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYGNvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuV0JfRE9DS0VSID8/PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgc3RhcnRDb21tYW5kOiBgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKX0ke3RvRGV2TnVsbChhcmd2KX1gLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgdGVzdE9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuQ0kgfHw9ICcxJztcbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5XQl9ET0NLRVIgPz89ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5weXJpZ2h0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgICAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpXG4gICAgICApIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gICAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KGZpbmFsRXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHRyZWVLaWxsIGZyb20gJ3RyZWUta2lsbCc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnd2InKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLm1pZGRsZXdhcmUoKGFyZ3YpID0+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gYXJndlsnd29ya2luZy1kaXInXTtcbiAgICBpZiAod29ya2luZ0Rpcikge1xuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyKTtcbiAgICAgIHByb2Nlc3MuY2hkaXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICB0cmVlS2lsbChwcm9jZXNzLnBpZCk7XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52Iiwic2V0IiwiYXN5bmMiLCJzcGF3bkFzeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiUHJvbWlzZSIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInN0ZG91dCIsInNldEVuY29kaW5nIiwic3RkZXJyIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJwcm9jZXNzIiwid3JpdGUiLCJtZXJnZU91dEFuZEVycm9yIiwicHJpbnRpbmdTdGRlcnIiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJwaWQiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJ0cmVlS2lsbCIsImtpbGxPbkV4aXQiLCJlcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiY29kZSIsInNpZ25hbCIsInVuZGVmaW5lZCIsIkVycm9yIiwic3RhdHVzIiwiaW5wdXQiLCJzdGRpbiIsImVuZCIsInQiLCJzIiwiaSIsImUiLCJuIiwiZW50cmllcyIsImgiLCJibG9ja3MiLCJyZXNldCIsImZpbmFsaXplZCIsImJsb2NrIiwic3RhcnQiLCJsYXN0Qnl0ZUluZGV4IiwiY29uc3RydWN0b3IiLCJ0aGlzIiwicGFkZGluZyIsIm91dHB1dEJpdHMiLCJibG9ja0NvdW50IiwiYnl0ZUNvdW50Iiwib3V0cHV0QmxvY2tzIiwiZXh0cmFCeXRlcyIsInVwZGF0ZSIsIm8iLCJsZW5ndGgiLCJsIiwiYyIsImYiLCJjb2RlUG9pbnRBdCIsInIiLCJmaW5hbGl6ZSIsImhleCIsImEiLCJ1IiwiZCIsImIiLCJrIiwieSIsIngiLCJCIiwicCIsIkMiLCJ6IiwiSSIsImciLCJ3IiwiQSIsIlAiLCJFIiwiaiIsIm0iLCJxIiwidiIsIkQiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiJCIsIl8iLCJ0dCIsInN0IiwiaXQiLCJldCIsIm90IiwibnQiLCJodCIsInJ0IiwibHQiLCJjdCIsImZ0IiwiaW5zdGFuY2UiLCJmcm9tIiwibmFtZSIsIm1lc3NhZ2UiLCJzdGFjayIsInB1c2giLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsIlJlZ0V4cCIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIm1hcCIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJKU09OIiwic3RyaW5naWZ5IiwiTnVtYmVyIiwiaXNOYU4iLCJpc0Zpbml0ZSIsInRvU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsbCIsInNsaWNlIiwiT2JqZWN0IiwiY2FjaGVEdXJhdGlvbiIsIlBPU0lUSVZFX0lORklOSVRZIiwiZ2V0Q2FjaGVLZXkiLCJraW5kIiwibm93IiwiY2FsbCIsImlzQ0kiLCJjaUVudiIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsIm1lbW9pemVPbmUiLCJhcmd2IiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsInRlc3QiLCJmcyIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJyb290RGlyUGF0aCIsImJ1aWxkQ29tbWFuZCIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImJ1aWxkIiwiaW5jbHVkZXMiLCJleGlzdHNTeW5jIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJyZXBsYWNlQWxsIiwiZW52IiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwiZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMiLCJjb3VudCIsImtleSIsInZhbHVlIiwiY2hlY2tFbnYiLCJtaXNzaW5nS2V5cyIsImtleXMiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImRlcGVuZGVuY2llcyIsInByaXNtYSIsImRldkRlcGVuZGVuY2llcyIsImhhc1ZpdGVzdCIsInZpdGVzdCIsInNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0IiwiQ0kiLCJjb25maWdQYXRoIiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyIiwicGFja2FnZU1hbmFnZXJXaXRoUnVuIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJkZXNjcmliZSIsImRlc2NyaXB0aW9uIiwidHlwZSIsImFsaWFzIiwiaGFuZGxlciIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJlbmNvZGluZyIsInNwbGl0IiwibGluZSIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwia2lsbFBvcnRJZk5vbkNpQ29tbWFuZCIsImJ1aWxkZXIiLCJleGl0IiwicG9ydEVudiIsIlBPUlQiLCJwb3J0IiwiaXNJbnRlZ2VyIiwia2lsbFBvcnRQcm9jZXNzIiwia2lsbFBvcnRJZk5vbkNpIiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMiLCJyZW1vdmVEb2NrZXJDb250YWluZXJzIiwiZmlsdGVyQXJncyIsImNvbnRhaW5lcklkcyIsImlkIiwiQm9vbGVhbiIsImxpc3REb2NrZXJDb250YWluZXJJZHMiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZGVmYXVsdE9wdGlvbnMiLCJleGl0SWZGYWlsZWQiLCJydW5XaXRoU3Bhd24iLCJzY3JpcHQiLCJvcHRzIiwicHJpbnRhYmxlU2NyaXB0IiwicnVubmFibGVTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsImV4ZWMiLCJzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0IiwiaW1hZ2VOYW1lIiwic3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lIiwia2lsbEZ1bmMiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImNvbmZpZ3VyZUVudiIsInRpbWVvdXQiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiYmxpdHoiLCJmaXhCdW5Db21tYW5kIiwibm9ybWFsaXplZFNjcmlwdCIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJuZXdFbnYiLCJjaSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsImJpb21lRXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJmaWxlIiwiU3RyaW5nIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImJpb21lQ29tbWFuZCIsImJpb21lUHJvbWlzZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsInN0YXJ0c1dpdGgiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYVNjcmlwdHMiLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsImRlcGxveUZvcmNlIiwiYmFja3VwUGF0aCIsImRpck5hbWUiLCJsaXRlc3RyZWFtIiwibWlncmF0ZSIsInNlZWQiLCJtaWdyYXRlRGV2IiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJGSUxFX1NDSEVNQSIsIkRBVEFCQVNFX1VSTCIsIlBPU1NJQkxFX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiZGVmYXVsdCIsInByaXNtYUNvbW1hbmQiLCJ5YXJncyIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXRlc3RyZWFtQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJkZXBsb3lGb3JjZUJ1aWxkZXIiLCJkZW1hbmRPcHRpb24iLCJvdXRwdXQiLCJyZXN0b3JlZCIsImZ1bGxDb21tYW5kIiwidHJpbUVuZCIsImZpbHRlcmVkIiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwiaXRlbSIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJ5ZWxsb3ciLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvcyIsInBsYXRmb3JtIiwicGFja2FnZXMiLCJpc0ZpbGUiLCJ2ZXJzaW9uIiwicHJvbWlzZUFsbCIsInBsYXl3cmlnaHQiLCJzZXR1cCIsInRvRGV2TnVsbCIsInNpbGVudCIsImZpbmRBdmFpbGFibGVQb3J0Iiwic3RhcnRQb3J0IiwibWF4QXR0ZW1wdHMiLCJpc1BvcnRBdmFpbGFibGUiLCJzZXJ2ZXIiLCJjcmVhdGVTZXJ2ZXIiLCJvbmNlIiwiZXJyIiwiY2xvc2UiLCJsaXN0ZW4iLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGREZXZJbWFnZSIsInN0b3BBbmRTdGFydCIsInVuYnVmZmVyIiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3Bhd25TeW5jT25FeGl0Iiwic3RvcEFsbCIsIkJhc2VTY3JpcHRzIiwiYnVpbGREb2NrZXIiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsIndhaXRBbmRPcGVuQXBwIiwidGVzdEUyRSIsInBsYXl3cmlnaHRBcmdzIiwicHJpc21hRGlyZWN0b3J5Iiwic3RhcnRDb21tYW5kIiwiZW52UHJlZml4IiwicGxheXdyaWdodENvbW1hbmQiLCJidWlsZFBsYXl3cmlnaHRDb21tYW5kIiwidGFyZ2V0cyIsInRlc3RFMkVEZXYiLCJ0ZXN0VW5pdCIsInRlc3RUYXJnZXQiLCJ3YWl0QXBwIiwiYmFzZSIsInRhcmdldCIsInJlc3QiLCJwYXJ0cyIsInVuc2hpZnQiLCJibGl0elNjcmlwdHMiLCJhcHBFbnYiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFRlc3QiLCJzdXBlciIsImRlZmF1bHRTdGFydENvbW1hbmQiLCJ0ZXN0U3RhcnQiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJyZW1peFNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiYXJnIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJuZXh0IiwiY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ3YkVudiIsIk5FWFRfUFVCTElDX1dCX0VOViIsInRlc3RDb21tYW5kIiwiZTJlIiwiY2hvaWNlcyIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJoYXNFMmVUYXJnZXRzIiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5Vbml0Iiwic2hvdWxkUnVuRTJlIiwidW5pdFRhcmdldHMiLCJ1bml0QXJndiIsInVuaXRUaW1lb3V0IiwiZTJlVGFyZ2V0cyIsImUyZUFyZ3YiLCJ0ZXN0T25Eb2NrZXIiLCJlMmVUYXJnZXQiLCJXQl9ET0NLRVIiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsImNvbW1hbmRzIiwidHlwZXNjcmlwdCIsInB5cmlnaHQiLCJuZXh0RGlyUGF0aCIsInJtU3luYyIsImZvcmNlIiwiZXhpdENvZGVzIiwiYWxsIiwiZmluYWxFeGl0Q29kZSIsInRjQ29tbWFuZCIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInRvVXBwZXJDYXNlIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwicGFja2FnZUpzb25EaXIiLCJ1cmwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJoZWxwIl0sIm1hcHBpbmdzIjoiNGVBeUhBLE1BQU1BLEVBQWdCLElBQUlDLElBRTFCLFNBQVNDLEVBQVlDLEdBQ25CLE1BQU1DLEVBQVNKLEVBQWNLLElBQUlGLEdBQ2pDLEdBQUlDLEVBQVEsT0FBT0EsRUFFbkIsTUFBTUUsRUFBU0MsRUFBTyxDQUFFQyxLQUFNQSxFQUFLQyxRQUFRTixHQUFXTyxXQUFZLENBQUEsSUFBTUosUUFBVSxDQUFBLEVBRWxGLE9BREFOLEVBQWNXLElBQUlSLEVBQVVHLEdBQ3JCQSxDQUNULENDOURPTSxlQUFlQyxFQUNwQkMsRUFDQUMsRUFDQUMsR0FFQSxPQUFPLElBQUlDLFFBQVEsQ0FBQ1IsRUFBU1MsS0FDM0IsSUFDRSxNQUFNQyxFQUFPQyxFQUFNTixFQUFTQyxHQUFRLEdBQUlDLEdBQVcsSUFHbkRHLEVBQUtFLFFBQVFDLGNBQWMsUUFFM0JILEVBQUtJLFFBQVFELGNBQWMsUUFFM0IsSUFBSUQsRUFBUyxHQUNURSxFQUFTLEdBQ2JKLEVBQUtFLFFBQVFHLEdBQUcsT0FBU0MsSUFDdkJKLEdBQVVJLEVBQ05ULEdBQVNVLGdCQUNYQyxRQUFRTixPQUFPTyxNQUFNSCxLQUd6Qk4sRUFBS0ksUUFBUUMsR0FBRyxPQUFTQyxJQUNuQlQsR0FBU2EsaUJBQ1hSLEdBQVVJLEVBRVZGLEdBQVVFLEVBRVJULEdBQVNjLGdCQUNYSCxRQUFRSixPQUFPSyxNQUFNSCxLQUl6QixJQUFJTSxHQUFVLEVBQ2QsTUFBTUMsRUFBY0EsTUFDZEQsR0FBWVosRUFBS2MsTUFFckJGLEdBQVUsRUFDTmYsR0FBU2tCLFNBQ1hDLFFBQVFDLEtBQUssWUFBWWpCLEVBQUtjLFFBRWhDSSxFQUFTbEIsRUFBS2MsT0FFWmpCLEdBQVNzQixhQUNYWCxRQUFRSCxHQUFHLGFBQWNRLEdBQ3pCTCxRQUFRSCxHQUFHLFNBQVVRLElBR3ZC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RyxJQUFJQyxFQUFFQyxFQUFFb0IsRUFBRWxCLEVBQUVFLEVBQUVzQixFQUFFSixFQUFFQyxFQUFFQyxFQUFFSyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHLElBQUk5RCxFQUFFLEVBQUVBLEVBQUUsR0FBR0EsR0FBRyxFQUFFbEIsRUFBRUosRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlNLEVBQUVOLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNEIsRUFBRTVCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJd0IsRUFBRXhCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJeUIsRUFBRXpCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJMEIsRUFBRTFCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJK0IsRUFBRS9CLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJZ0MsRUFBRWhDLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJaUMsRUFBRWpDLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJa0MsRUFBRWxDLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQyxFQUFFZ0MsR0FBR0wsR0FBRyxFQUFFSixJQUFJLElBQUl0QixFQUFFZ0MsR0FBR1YsR0FBRyxFQUFFSSxJQUFJLElBQUk1QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVHLEdBQUdxQixHQUFHLEVBQUVDLElBQUksSUFBSXhCLEVBQUVJLEdBQUdvQixHQUFHLEVBQUVELElBQUksSUFBSXpCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRTJCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJOUIsRUFBRXNCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJL0IsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFd0IsR0FBR1EsR0FBRyxF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LEdBQ0hsa0IsUUFBUyxZQ2xFTDZiLEVBQU1pSixFQUFRamtCLFFBQVErSixPQUN6Qm1hLFdBQVcsTUFDWDdrQixRQUFRd2IsSUFDUnNKLFdBQVlwYSxJQUNYLE1BQU1xYSxFQUFhcmEsRUFBSyxlQUN4QixHQUFJcWEsRUFBWSxDQUNkLE1BQU1uYSxFQUFVcEwsRUFBS0MsUUFBUXNsQixHQUM3QnBrQixRQUFRcWtCLE1BQU1wYSxFQUNoQixFdEMwR0csU0FBOENzQixHQUUvQ0EsRUFBUXlDLE1BQVF6QyxFQUFRK1ksbUJBQzFCL1ksRUFBUXlDLEtBQU96QyxFQUFReUMsS0FBS3FFLFFBQVEsR0FBRzlHLEVBQVErWSxvQkFBcUIsSUFFakVqWixXQUFXLG1DQUFvQyxJQUUvQ0EsV0FBVyxzQkFBdUIsSUFDbENBLFdBQVcsaUJBQWtCLEtBRWxDLElBQUssTUFBTW9CLEtBQU92RCxPQUFPMkQsS0FBS3RCLEdBQVUsQ0FDdEMsTUFBTWdaLEVBQVc5WCxFQUFJK1gsZUFFbkJELEVBQVM5TCxXQUFXLFNBQ3BCOEwsRUFBUzlMLFdBQVcsVUFDcEI4TCxFQUFTOUwsV0FBVyxXQUNQLGdCQUFiOEwsR0FDYSxhQUFiQSxXQUdPaFosRUFBUWtCLEVBRW5CLENBQ0YsQ3NDL0hJZ1ksQ0FBcUN6a0IsUUFBUXNMLE9BRTlDbk0sUUFBUThRLEdBQ1I5USxRQUFRd1UsSUFDUnhVLFFBQVFpWSxJQUNSalksUUFBUW1aLElBQ1JuWixRQUFRNGIsSUFDUjViLFFBQVE4ZCxJQUNSOWQsUUFBUW1lLElBQ1JuZSxRQUFRNGdCLElBQ1I1Z0IsUUFBUStpQixJQUNSL2lCLFFBQVFna0IsSUFDUmhrQixRQUFRa2tCLElBQ1Jsa0IsUUFBUTZrQixJQUNSckksZ0JBQ0FDLFNBQ0FrQyxRQUdILFdBQ0UsSUFBSTRHLEVBQWlCN2xCLEVBQUs4TyxRQUFRLElBQUl4RixnQkFBZ0J3YyxLQUFLQyxVQUMzRCxNQUFRdGEsRUFBR1MsV0FBV2xNLEVBQUsyTCxLQUFLa2EsRUFBZ0Isa0JBQzlDQSxFQUFpQjdsQixFQUFLOE8sUUFBUStXLEdBS2hDLE9BSG9CbGMsS0FBS3VFLE1BQU16QyxFQUFHQyxhQUFhMUwsRUFBSzJMLEtBQUtrYSxFQUFnQixnQkFBaUIsU0FHdkU1RyxPQUNyQixDQVpXK0csSUFDUkMsT0FBTy9hLEtBYVYsSUFBSyxNQUFNL0ksSUFBVSxDQUFDLFNBQVUsVUFBVyxXQUN6Q2hCLFFBQVFILEdBQUdtQixFQUFRLEtBQ2pCTixFQUFTVixRQUFRTSxLQUNqQk4sUUFBUTZUIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzIsMyw0LDUsNl19