@willbooster/wb 10.5.2 → 10.5.3

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 +2 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6,5 +6,5 @@ import e from"node:fs";import t from"node:path";import n from"yargs";import{hide
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"],A=[6,1536,393216,100663296],N=[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 R{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,s=this.blockCount,o=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<s+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<N[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<N[3&i++],t[i>>2]|=(128|63&a)<<N[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<N[3&i++],t[i>>2]|=(128|a>>6&63)<<N[3&i++],t[i>>2]|=(128|63&a)<<N[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<N[3&i++],t[i>>2]|=(128|a>>12&63)<<N[3&i++],t[i>>2]|=(128|a>>6&63)<<N[3&i++],t[i>>2]|=(128|63&a)<<N[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];j(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];j(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),j(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 j=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,A,N,x,R,j,O,S,D,T,_,B,C,I,W,V,J,z,F,Y,L,U,M,G,q,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],G=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,j=e[20]<<3|e[21]>>>29,O=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,S=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,A=e[6]<<28|e[7]>>>4,N=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,V=e[26]<<25|e[27]>>>7,J=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,R=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,z=e[38]<<8|e[39]>>>24,F=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]=A^~x&j,e[11]=N^~R&O,e[20]=B^~I&V,e[21]=C^~W&J,e[30]=U^~G&H,e[31]=M^~q&K,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&w,e[3]=b^~v&$,e[12]=x^~j&S,e[13]=R^~O&D,e[22]=I^~V&z,e[23]=W^~J&F,e[32]=G^~H&X,e[33]=q^~K&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~w&k,e[5]=v^~$&E,e[14]=j^~S&T,e[15]=O^~D&_,e[24]=V^~z&Y,e[25]=J^~F&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]=S^~T&A,e[17]=D^~_&N,e[26]=z^~Y&B,e[27]=F^~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^~A&x,e[19]=_^~N&R,e[28]=Y^~B&I,e[29]=L^~C&W,e[38]=Z^~U&G,e[39]=ee^~M&q,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=P[r],e[1]^=P[r+1]},O=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])=>S.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]))}(),S=new TextEncoder,D=new TextDecoder("utf8");function T(e=void 0,t=O){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=O){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 R(512,A,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});let V;class J{static{[V]=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,A=4===s,N=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={},R=[],j=E?"get":A||k?"set":"value";if(l?(u||k?x={get:$(function(){return v(this)},r,"get"),set:function(e){t[4](this,e)}}:x[j]=v,u||$(x[j],r,N?"":j)):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[j].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var O=e,S=g.length-1;S>=0;S-=n?2:1){var D=y(g[S],"A decorator","be",!0),T=n?g[S-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,O,B),_.v=1,y(i,"class decorators","return")&&(O=i);else if(B.static=d,B.private=l,i=B.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?N?function(e){return f(e),x.value}:P("get",0,f):function(e){return e[r]}),N||E||(i.set=l?P("set",0,f):function(e,t){e[r]=t}),O=D.call(T,k?{get:x.get,set:x.set}:x[j],B),_.v=1,k){if("object"==typeof O&&O)(i=y(O.get,"accessor.get"))&&(x.get=i),(i=y(O.set,"accessor.set"))&&(x.set=i),(i=y(O.init,"accessor.init"))&&R.unshift(i);else if(void 0!==O)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(O,(u?"field":"method")+" decorators","return")&&(u?R.unshift(O):x[j]=O)}return s<2&&c.push(b(R,d,1),b(a,d,0)),u||w||(l?k?c.splice(-1,0,P("get",d),P("set",d)):c.push(N?x[j]:y.call.bind(x[j])):m(e,r,x)),O}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,"dockerPackageJson"],[W,3,"binExists"]]).e}argv=void V(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 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 F(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 Y(n,o.root,r):[o.self]}}async function Y(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 d(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 L=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),U=L?"bun --bun run":"node",M=L?"bun":"yarn",G=L?"bun --bun run":"yarn",q={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const o=z(n,!0,r);if(!o)return console.error(c.red("No project found.")),!0;if(n={...n,command:n.command??(L?"bun run build":"yarn build")},!e.existsSync(t.join(o.rootDirPath,".git")))return H(o,n),!0;const[i,d,l]=await async function(n,r){const o=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(o,"last-build");await e.promises.mkdir(o,{recursive:!0});const c=a("sha256"),d=s.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();c.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!K.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));c.update(l),await async function(e,t,n){return new Promise(r=>{const o=s.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(X.some(t=>e.includes(t))||Q.some(t=>e.endsWith(t)))&&!Z.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=s.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,c);const u=c.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(o,n);if(i)return console.info(c.green(`Skip to run '${n.command}' 💫`)),!1;if(!H(o,n))return;n.dryRun||await e.promises.writeFile(d,l,"utf8");return!0}(n)}};function H(e,t){if(console.info(c.green(`Run '${t.command}'`)),!t.dryRun){const n=s.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const K=new Set(["CI","PWDEBUG","TMPDIR"]);const X=["src/","public/"],Q=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],Z=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ee=new Set;async function te(e){try{await u(e)}catch{}}const ne=new p,re={exitIfFailed:!0};async function se(e,t,n,r=re){const[s,o]=ie(e,t);if(ae(s,t),n.verbose&&ae(o,t,"Start (raw)",!0),n.dryRun)return ce(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){await te(e);const t=async()=>{ee.has(e)||(ee.add(e),await te(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:de(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return ce(s,a.status,r),a.status??1}function oe(e,t,n,r=re){return ne.runAndWaitForReturnValue(async()=>{const[s,o]=ie(e,t);if(ae(s,t,"Start (parallel)",!0),n.dryRun)return ae(s,t,"Started (log)"),n.verbose&&ae(o,t,"Started (raw)",!0),ce(s,0,r),0;const i=await v(o,void 0,{cwd:t.dirPath,env:de(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});ae(s,t,"Started (log)"),n.verbose&&ae(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),ce(s,i.status,r),i.status??1})}function ie(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 ",L?"bun --bun run ":"yarn run ");L&&(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=le(n.replaceAll("YARN ",`${G} `)),s=le(n.replaceAll("YARN playwright ",`${G} playwright `).replaceAll("YARN ",!L&&t.binExists?"":`${G} `));return[`dotenv${t.env.WB_ENV?` --cascade-env=${t.env.NODE_ENV||"development"}`:""} ${r}`,s]}function ae(e,t,n="Start",r=!1){console.info("\n"+(r?c.gray:c.cyan)(c.bold(`${n}:`),e)+c.gray(` at ${t.dirPath}`))}function ce(e,t,n){0===t?console.info(c.green(c.bold("Finished:"),e)):(console.info(c.red(c.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function de(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function le(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const ue=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),pe=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),me=new Set([...pe].filter(e=>!ue.has(e))),fe={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){L||(console.error(c.red("This command is only available on Bun.")),process.exit(1));const n=await F(e,!1);n||(console.error(c.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):ue.has(o)?e.push(r):pe.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=`"**/{.*/,}*.{${[...me].join(",")}}" "!**/test{-,/}fixtures/**"`,i=n.descendants.map(e=>`"${e.packageJsonPath}"`).join(" ");const a=e.fix&&e.format?"check --fix":e.fix?"lint --fix":e.format?"format --fix":"lint";let d;(s||0===r.length)&&(d=oe(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,e,{forceColor:!0})),e.format&&(o&&oe(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,e,{forceColor:!0}),i&&(await d,oe(`bun --bun sort-package-json ${i}`,n.self,e,{forceColor:!0})))}};function*he(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ge={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 F(n);r||(console.error(c.red("No project found.")),process.exit(1));for(const s of he("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(be(n,r),ye(r),ve(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||(s.spawnSync(M,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function be(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","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 ye(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.includes(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 ve(e){delete e.private,delete e.publishConfig,delete e.prettier}const we=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`${U} -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}`:""}`}},$e={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"]}},ke={},Ee={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Ae).command(Pe).command(xe).command(Re).command(je).command(Oe).command(Se).command(De).command(Te).command(_e).demandCommand().strict(!1),handler(){}},Ae={command:"deploy",describe:"Apply migration to DB without initializing it",builder:ke,async handler(e){const t=await Be(e),n=Ce(e);for(const r of he("prisma deploy",t))await se(we.deploy(r,n),r,e)}},Ne={...ke,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Pe={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Ne,async handler(e){const t=await Be(e);for(const n of he("prisma deploy-force",t))await se(we.deployForce(n,e.backupPath),n,e)}},xe={command:"litestream",describe:"Setup DB for Litestream",builder:ke,async handler(e){const t=await Be(e);for(const n of he("prisma litestream",t))await se(we.litestream(n),n,e)}},Re={command:"migrate",describe:"Apply migration to DB with initializing it",builder:ke,async handler(e){const t=await Be(e),n=Ce(e);for(const r of he("prisma migrate",t))await se(we.migrate(r,n),r,e)}},je={command:"migrate-dev",describe:"Create a migration file",builder:ke,async handler(e){const t=await Be(e),n=Ce(e);for(const r of he("prisma migrate-dev",t))await se(we.migrateDev(r,n),r,e)}},Oe={command:"reset",describe:"Reset DB",builder:ke,async handler(e){const t=await Be(e),n=Ce(e);for(const r of he("prisma reset",t))await se(we.reset(r,n),r,e)}},Se={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Ne,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Be(e);for(const n of he("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await se(we.restore(n,e.backupPath,t),n,e)}}},De={command:"seed",describe:"Populate DB with seed data",builder:{...ke,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Be(e);for(const n of he("prisma seed",t))await se(we.seed(n,e.file),n,e)}},Te={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...ke,"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 Be(e),n=Ce(e,["db-url-or-path","restored"]);for(const r of he("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await se(we.studio(r,t,n),r,e)}}},_e={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await Be(e),n=[(e.args?.join(" ")??"").trimEnd(),Ce(e,["args"])].filter(Boolean).join(" ");for(const r of he(`prisma ${n}`,t))await se(`PRISMA ${n}`,r,e)}};async function Be(e){const t=await F(e);t||(console.error(c.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(c.red("No prisma project found.")),process.exit(1)),n}function Ce(e,t=[]){const n=[],r=Object.keys($e),s=Object.values($e).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 Ie={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(c.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${c.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await se(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},We={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await F(e,!1,t);n||(console.error(c.red("No project found.")),process.exit(1));for(const t of he("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 oe(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await se("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await oe("poetry config virtualenvs.in-project true",t,e);const[,n]=s.execSync("asdf current python").toString().trim().split(/\s+/);await oe(`poetry env use ${n}`,t,e),await ne.promiseAll(),await se("poetry run pip install --upgrade pip",t,e),await se("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await se(`${G} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await se(`${G} playwright install --with-deps`,r,e)}(e)}};function Ve(e){return e.silent?" > /dev/null":""}async function Je(e=3e3,t=100){for(let n=e;n<e+t;n++)if(await ze(n))return n;throw new Error(`No available port found in range ${e}-${e+t-1}`)}async function ze(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 Fe=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(ee.has(e))return;ee.add(e),ae(e,t);const{status:n}=i(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ce(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 Ye{buildDocker(e,t="development"){return Fe.buildDevImage(e,t)}startDocker(e,t){const n=Number(e.env.PORT)||8080;return`${this.buildDocker(e)}${Ve(t)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Fe.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=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=${i} YARN concurrently --kill-others --raw --success first\n "rm -Rf ${r}/mount && ${s} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i}\n && BUN playwright ${"test test/e2e/"===n?`test ${c}`:n}${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=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=${o} 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 && BUN playwright ${"test test/e2e/"===n?`test ${a}`:n}${i}"`}testUnit(e,t){const n=t.targets&&t.targets.length>0?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}`}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}`}}const Le=new class extends Ye{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 "${[we.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){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r}){const s=`blitz dev -p ${e.env.PORT||"8080"}${Ve(t)}`;return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r??s})}async testStart(e,t){const n=await Je();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev -p ${n}${Ve(t)}" "${this.waitApp(e,t,n)}"`}};const Ue=new class extends Ye{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)}${Ve(t)} && ${Fe.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand}${Ve(t)} && NODE_ENV=production PORT=\${PORT:-${n}} ${U} dist/index.js ${t.normalizedArgsText??""}`}startTest(e,t){return`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}testE2E(e,t,{startCommand:n=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}){const r=e.env.PORT||"8080",s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",o=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${r} YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${r} && vitest run ${o} --color --passWithNoTests --allowOnly${s}"`}testE2EDev(e,t,{startCommand:n}){const r=e.env.PORT||"8080",s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",o=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${r} YARN concurrently --kill-others --raw --success first\n "${n??this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${r} && vitest run ${o} --color --passWithNoTests --allowOnly${s}"`}async testStart(e,t){const n=await Je();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 Me=new class extends Ye{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?[we.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){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?we.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?we.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")})}testE2EDev(e,t,{startCommand:n}){const r=`next dev --turbopack -p ${e.env.PORT||"8080"}${Ve(t)}`;return super.testE2EDev(e,t,{startCommand:n??r})}async testStart(e,t){const n=await Je();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbopack -p ${n}${Ve(t)}" "${this.waitApp(e,t,n)}"`}};const Ge=new class extends Ye{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)}${Ve(t)} && ${Fe.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${U} 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 Ye{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 "${we.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){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"prisma",startCommand:n.startCommand??[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r=`remix dev${Ve(t)}`}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}async testStart(e,t){const n=await Je();return`WB_ENV=${e.env.WB_ENV} PORT=${n} YARN concurrently --kill-others --raw --success first "remix dev${Ve(t)}" "${this.waitApp(e,t,n)}"`}},He=["express","fastify","elysia","hono"],Ke={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 F(e);t||(console.error(c.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=Le;else if(t.next)s=Me;else if(r["@remix-run/dev"])s=qe;else if(He.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=Ue;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=Ge}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":{const r=Xe(t,"development");await se(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=Xe(t,"staging"),o=Number(n.env.PORT)||8080;await se(`${r}${s.startProduction(n,e,o)}`,n,e);break}case"docker":{const r=Xe(t,"staging");await se(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=Xe(t,"staging");e.normalizedArgsText="'/bin/bash'",await se(`${r}${s.startDocker(n,e)}`,n,e);break}case"test":{const r=Xe(t,"test");await se(`${r}${s.startTest(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function Xe(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 Qe={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 F(n);r||(console.error(c.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")),d=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?Le:r.next?Me:i["@remix-run/dev"]?qe:He.some(e=>r[e])&&!r["firebase-functions"]?Ue:Ge,console.info(`Running "test" for ${o.name} ...`),d&&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 se(a.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const c=s.filter(e=>e.includes("/e2e")),u={...n,targets:c.length>0?c:void 0};switch(n.e2e){case"headless":await se(a.testE2E(o,u,{}),o,n);continue;case"headless-dev":await se(a.testE2EDev(o,u,{}),o,n);continue;case"docker":await Ze(o,u,a);continue;case"docker-debug":{const e=c.length>0?c.join(" "):"test/e2e/";await Ze(o,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]){const e=c.length>0?c.join(" "):"test/e2e/";switch(n.e2e){case"headed":await se(a.testE2E(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"headed-dev":await se(a.testE2EDev(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"debug":await se(a.testE2E(o,u,{playwrightArgs:`test ${e} --debug`}),o,n);break;case"generate":{const e=o.env.PORT||"8080";await se(a.testE2E(o,u,{playwrightArgs:`codegen http://localhost:${e}`}),o,n);break}case"trace":await se("BUN playwright show-trace",o,n)}}}}(n)}};async function Ze(e,t,n,r){process.env.WB_DOCKER??="1",await se(`${n.buildDocker(e,"test")}${Ve(t)}`,e,t),process.exitCode=await se(n.testE2E(e,t,{playwrightArgs:r,startCommand:`${Fe.stopAndStart(e,!0)}${Ve(t)}`}),e,t,{exitIfFailed:!1}),await se(Fe.stop(e),e,t)}const et={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{},async handler(n){await async function(n){const r=await F(n);r||(console.error(c.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";for(const s of r.descendants){const r=s.packageJson.dependencies??{},o=s.packageJson.devDependencies??{};let i;if(i=r.blitz?Le:r.next?Me:o["@remix-run/dev"]?qe:He.some(e=>r[e])&&!r["firebase-functions"]?Ue:Ge,console.info(`Running "test-on-ci" for ${s.name} ...`),await oe(Fe.stopAll(),s,n),e.existsSync(t.join(s.dirPath,"test","unit"))&&await oe(i.testUnit(s,n).replaceAll(" --allowOnly",""),s,n),await oe(await i.testStart(s,n),s,n),await ne.promiseAll(),e.existsSync(t.join(s.dirPath,"test","e2e"))){s.hasDockerfile&&(process.env.WB_DOCKER??="1",await se(`${i.buildDocker(s,"test")}${Ve(n)}`,s,n));const e=s.hasDockerfile?{startCommand:Fe.stopAndStart(s,!0)}:{};process.exitCode=await se(i.testE2E(s,n,e).replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await se(Fe.stop(s),s,n)}}}(n)}};const tt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await F(n,!1);r||(console.error(c.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 oe(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(c.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(c.yellow('Please try "yarn gen-code" if you face unknown type errors.')),i=t}i&&process.exit(i)}},nt={...tt,command:"tc"};await n(r(process.argv)).scriptName("wb").options($e).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(q).command(fe).command(ge).command(Ee).command(Ie).command(We).command(Ke).command(Qe).command(et).command(tt).command(nt).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,()=>process.exit());
10
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9maW5kUG9ydC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhckNvdW50XVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgbnVtYmVyXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzOiBbc3RyaW5nLCBudW1iZXJdW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMucHVzaChbZW52UGF0aCwgY291bnRdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpKTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIE9iamVjdC5hc3NpZ24ocHJvY2Vzcy5lbnYsIGVudlZhcnMpO1xuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+PjUsdGhpcy5ieXRlQ291bnQ9dGhpcy5ibG9ja0NvdW50PDwyLHRoaXMub3V0cHV0QmxvY2tzPWk+PjUsdGhpcy5leHRyYUJ5dGVzPSgzMSZpKT4+Mztmb3IobGV0IHQ9MDt0PDUwOysrdCl0aGlzLnNbdF09MH11cGRhdGUodCl7aWYodGhpcy5maW5hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKFwiZmluYWxpemUgYWxyZWFkeSBjYWxsZWRcIik7Y29uc3Qgcz10aGlzLmJsb2NrcyxlPXRoaXMuYnl0ZUNvdW50LG89dC5sZW5ndGgsbj10aGlzLmJsb2NrQ291bnQsaD10aGlzLnM7bGV0IGwsYyxmPTA7Zm9yKDtmPG87KXtpZih0aGlzLnJlc2V0KWZvcih0aGlzLnJlc2V0PSExLHNbMF09dGhpcy5ibG9jayxsPTE7bDxuKzE7KytsKXNbbF09MDtmb3IobD10aGlzLnN0YXJ0O2Y8byYmbDxlOysrZiljPXQuY29kZVBvaW50QXQoZil8fDAsYzwxMjg/c1tsPj4yXXw9Yzw8aVszJmwrK106YzwyMDQ4PyhzW2w+PjJdfD0oMTkyfGM+PjYpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6Yzw1NTI5Nnx8Yz49NTczNDQ/KHNbbD4+Ml18PSgyMjR8Yz4+MTIpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6KGM9NjU1MzYrKCgxMDIzJmMpPDwxMHwxMDIzJih0LmNvZGVQb2ludEF0KCsrZil8fDApKSxzW2w+PjJdfD0oMjQwfGM+PjE4KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj4xMiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTtpZih0aGlzLmxhc3RCeXRlSW5kZXg9bCxsPj1lKXtmb3IodGhpcy5zdGFydD1sLWUsdGhpcy5ibG9jaz1zW25dLGw9MDtsPG47KytsKWhbbF1ePXNbbF07cihoKSx0aGlzLnJlc2V0PSEwfWVsc2UgdGhpcy5zdGFydD1sfXJldHVybiB0aGlzfWZpbmFsaXplKCl7aWYodGhpcy5maW5hbGl6ZWQpcmV0dXJuO3RoaXMuZmluYWxpemVkPSEwO2NvbnN0IHQ9dGhpcy5ibG9ja3M7bGV0IHM9dGhpcy5sYXN0Qnl0ZUluZGV4O2NvbnN0IGk9dGhpcy5ibG9ja0NvdW50LGU9dGhpcy5zO2lmKHRbcz4+Ml18PXRoaXMucGFkZGluZ1szJnNdLHRoaXMubGFzdEJ5dGVJbmRleD09PXRoaXMuYnl0ZUNvdW50KWZvcih0WzBdPXRbaV0scz0xO3M8aSsxOysrcyl0W3NdPTA7Zm9yKHRbaS0xXXw9MjE0NzQ4MzY0OCxzPTA7czxpOysrcyllW3NdXj10W3NdO3IoZSl9aGV4KCl7dGhpcy5maW5hbGl6ZSgpO2NvbnN0IHM9dGhpcy5ibG9ja0NvdW50O2xldCBpPXRoaXMucztjb25zdCBlPXRoaXMub3V0cHV0QmxvY2tzLG89dGhpcy5leHRyYUJ5dGVzO2xldCBoLGw9MCxjPTAsZj1cIlwiO2Zvcig7YzxlOyl7Zm9yKGw9MDtsPHMmJmM8ZTsrK2wsKytjKWg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0rdFtoPj4xMiYxNV0rdFtoPj44JjE1XSt0W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSt0W2g+PjI4JjE1XSt0W2g+PjI0JjE1XTtjJXM9PT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9O3JldHVybiBuZXcgTWFwKFtlLHQscyxvLHIsYyxkXS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtleHBvcnR7dCBhcyBHTE9CQUxfQ09OU1RSVUNUT1JfTUFQLGUgYXMgUExBSU5fT0JKRUNUX0xBQkVMfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0cnVjdG9ycy5qcy5tYXBcbiIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIHQsUExBSU5fT0JKRUNUX0xBQkVMIGFzIG59ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtjb25zdCBlPS0xLHI9LTIsbz0tMyxpPS00LHM9LTUsYz0tNjtmdW5jdGlvbiBmKG49dm9pZCAwLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBldmVuIHRob3VnaCB0aGlzIGJlaGF2aW9yIGlzIG5vbi1zdGFuZGFyZFxuICAgIC8vIGJlY2F1c2UgYGJ1biB3YiAuLi5gIHdpbGwgbG9hZCAuZW52IGFuZCAuZW52LmxvY2FsIGJlZm9yZSBgd2JgIGxvYWRzIG90aGVyIHZhcmlhYmxlcy5cbiAgICByZXR1cm4geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvdW5kUHJvamVjdHMgPSB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcblxuICByZXR1cm4ge1xuICAgIC4uLnJvb3RBbmRTZWxmUHJvamVjdHMsXG4gICAgZGVzY2VuZGFudHM6XG4gICAgICByb290QW5kU2VsZlByb2plY3RzLnJvb3QgPT09IHJvb3RBbmRTZWxmUHJvamVjdHMuc2VsZlxuICAgICAgICA/IGF3YWl0IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCByb290QW5kU2VsZlByb2plY3RzLnJvb3QsIGxvYWRFbnYpXG4gICAgICAgIDogW3Jvb3RBbmRTZWxmUHJvamVjdHMuc2VsZl0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICBjb25zdCB0aGlzUHJvamVjdCA9IG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICBsZXQgcm9vdFByb2plY3QgPSB0aGlzUHJvamVjdDtcbiAgaWYgKCF0aGlzUHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHBhdGguZGlybmFtZShkaXJQYXRoKS5lbmRzV2l0aCgnL3BhY2thZ2VzJykpIHtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJvb3RQcm9qZWN0ID0gbmV3IFByb2plY3Qocm9vdERpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gcHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIHByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gcHJvamVjdHM7XG59XG4iLCJleHBvcnQgY29uc3QgaXNSdW5uaW5nT25CdW4gPVxuICAvLyBEZXRlY3QgYGJ1biAtLWJ1biBydW4gd2IgLi4uYC4gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgcHJvY2Vzcy52ZXJzaW9ucy5idW4gfHxcbiAgLy8gRGV0ZWN0IGBidW4gcnVuIHdiIC4uLmAuXG4gIHByb2Nlc3MuYXJndlswXT8uZW5kc1dpdGgoJy9idW4nKSB8fFxuICBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmVuZHNXaXRoKCcvYnVuJyk7XG5cbmV4cG9ydCBjb25zdCBydW50aW1lV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICdub2RlJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAneWFybic7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXJXaXRoUnVuID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGJ1aWxkIGNvbW1hbmQgKGRlZmF1bHQ6IHlhcm58YnVuIGJ1aWxkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdjJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXJndiA9IHsgLi4uYXJndiwgY29tbWFuZDogYXJndi5jb21tYW5kID8/IChpc1J1bm5pbmdPbkJ1biA/ICdidW4gcnVuIGJ1aWxkJyA6ICd5YXJuIGJ1aWxkJykgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnZGlmZicsICctLW5hbWUtb25seSddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZXRyeU9wdGlvbnMgPSB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn07XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gL2h0dHAtZ2V0OlxcL1xcLzEyNy4wLjAuMTooXFxkKykvLmV4ZWMocnVubmFibGVTY3JpcHQpPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQgJiYgIXJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcHJpbnRhYmxlU2NyaXB0LCBydW5uYWJsZVNjcmlwdF0gPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhydW5uYWJsZVNjcmlwdCwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogW3N0cmluZywgc3RyaW5nXSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLS1jYXNjYWRlLWVudj0ke3Byb2plY3QuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCd9YCA6ICcnO1xuICByZXR1cm4gW2Bkb3RlbnYke2Nhc2NhZGVPcHRpb259ICR7cHJpbnRhYmxlU2NyaXB0fWAsIHJ1bm5hYmxlU2NyaXB0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIG9wdHM6IE9wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnYuQ0kgPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0Vudi5GT1JDRV9DT0xPUiA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanNvbicsICdqc29uYycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIWJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUgb24gQnVuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKCFpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBCdW4uJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXJndi5maWxlcyA/PyBbXTtcbiAgICBsZXQgYmlvbWVBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBwcmV0dGllckFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGUpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmlvbWVBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcGFja2FnZUpzb25GaWxlUGF0aHMubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJnc1RleHQgPSAnJztcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBgXCIqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IGBcIiR7cC5wYWNrYWdlSnNvblBhdGh9XCJgKS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlvbWVDb21tYW5kID1cbiAgICAgIGFyZ3YuZml4ICYmIGFyZ3YuZm9ybWF0ID8gJ2NoZWNrIC0tZml4JyA6IGFyZ3YuZml4ID8gJ2xpbnQgLS1maXgnIDogYXJndi5mb3JtYXQgPyAnZm9ybWF0IC0tZml4JyA6ICdsaW50JztcbiAgICBsZXQgYmlvbWVQcm9taXNlOiBQcm9taXNlPG51bWJlcj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGJpb21lQXJnc1RleHQgfHwgZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBiaW9tZVByb21pc2UgPSBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICBgYnVuIC0tYnVuIGJpb21lICR7YmlvbWVDb21tYW5kfSAtLWNvbG9ycz1mb3JjZSAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1maWxlcy1pZ25vcmUtdW5rbm93bj10cnVlICR7YmlvbWVBcmdzVGV4dH1gLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBpZiAocHJldHRpZXJBcmdzVGV4dCkge1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgICAgYGJ1biAtLWJ1biBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlICR7cHJldHRpZXJBcmdzVGV4dH1gLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0KSB7XG4gICAgICAgIGF3YWl0IGJpb21lUHJvbWlzZTtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBidW4gLS1idW4gc29ydC1wYWNrYWdlLWpzb24gJHtzb3J0UGFja2FnZUpzb25BcmdzVGV4dH1gLCBwcm9qZWN0cy5zZWxmLCBhcmd2LCB7XG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFhcmd2Lm91dHNpZGUpIHtcbiAgICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICAgIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqOyBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlICYmIHJtIC1SZiAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMypcbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtbyAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlMyAke2JhY2t1cFBhdGh9ICYmIGxzIC1haGwgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpdGVzdHJlYW0oXzogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3J1bnRpbWVXaXRoQXJnc30gLWUgJ1xuY29uc3QgeyBQcmlzbWFDbGllbnQgfSA9IHJlcXVpcmUoXCJAcHJpc21hL2NsaWVudFwiKTtcbm5ldyBQcmlzbWFDbGllbnQoKS4kcXVlcnlSYXdcXGBQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMO1xcYFxuICAuY2F0Y2goKGVycm9yKSA9PiB7IGNvbnNvbGUubG9nKFwiRmFpbGVkIGR1ZSB0bzpcIiwgZXJyb3IpOyBwcm9jZXNzLmV4aXQoMSk7IH0pO1xuJ2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95JHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1zZWVkJHthZGRpdGlvbmFsT3B0aW9ucyA/IGAgJHthZGRpdGlvbmFsT3B0aW9uc31gIDogJyd9ICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIGJhY2t1cFBhdGg6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vcmVzdG9yZWQuc3FsaXRlMzsgR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTPWdjcC1zYS1rZXkuanNvbiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtvdXRwdXRQYXRofSAke2JhY2t1cFBhdGh9YDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IFBPU1NJQkxFX1BBVEhTID0gW1xuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gICAgICAgIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuICAgICAgXTtcbiAgICAgIGZvciAoY29uc3QgeyBkYlBhdGgsIHNjaGVtYVBhdGggfSBvZiBQT1NTSUJMRV9QQVRIUykge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpIHtcbiAgICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgICBkYlBhdGgsXG4gICAgICAgICAgICBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOiAnUnVuIHByaXNtYSBjb21tYW5kcycsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2JhY2t1cC1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVwbG95Rm9yY2VCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UgPGJhY2t1cC1wYXRoPicsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyOiBkZXBsb3lGb3JjZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ1NldHVwIERCIGZvciBMaXRlc3RyZWFtJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmxpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4uZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSByZXN0b3JlZCBkYXRhYmFzZS4gRGVmYXVsdHMgdG8gXCI8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgYXJndi5iYWNrdXBQYXRoLCBvdXRwdXQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBQcmlzbWEgU3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6XG4gICAgICAgICAgPyAnZGIvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgICA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOiAnUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHByaXNtYSBhcyBpcycsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChgcHJpc21hICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmlsdGVyKFxuICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWFcbiAgKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcmlzbWEgcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBwcmlzbWEgY29tbWFuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3Y6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCB1bmtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBCdWlsZCBsaXN0IG9mIGtub3duIG9wdGlvbnMgZnJvbSBzaGFyZWQgb3B0aW9ucyBidWlsZGVyc1xuICBjb25zdCBzaGFyZWRPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpO1xuICBjb25zdCBzaGFyZWRPcHRpb25BbGlhc2VzID0gT2JqZWN0LnZhbHVlcyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgICAuZmxhdE1hcCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoJ2FsaWFzJyBpbiBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0aW9uLmFsaWFzKSA/IG9wdGlvbi5hbGlhcyA6IFtvcHRpb24uYWxpYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGFsbEtub3duT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgIC4uLmtub3duT3B0aW9ucyxcbiAgICAuLi5zaGFyZWRPcHRpb25LZXlzLFxuICAgIC4uLnNoYXJlZE9wdGlvbkFsaWFzZXMsXG4gICAgLy8gSW50ZXJuYWwgeWFyZ3MgcHJvcGVydGllc1xuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVua25vd25PcHRpb25zLmpvaW4oJyAnKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cCcsXG4gIGRlc2NyaWJlOiAnU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgc2V0dXAoYXJndik7XG4gIH0sXG59O1xuXG4vLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdzZXR1cCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5yZWFkZGlyKHByb2plY3QuZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGlmIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290KSB7XG4gICAgICBpZiAob3MucGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSBbJ3BzdHJlZSddO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgICAgcGFja2FnZXMucHVzaCgnZXhwZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG4vKipcbiAqIEZpbmRzIGFuIGF2YWlsYWJsZSBwb3J0IHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIHBvcnQgbnVtYmVyLlxuICogQHBhcmFtIHN0YXJ0UG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSAoZGVmYXVsdDogMzAwMClcbiAqIEBwYXJhbSBtYXhBdHRlbXB0cyAtIE1heGltdW0gbnVtYmVyIG9mIHBvcnRzIHRvIHRyeSAoZGVmYXVsdDogMTAwKVxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXZhaWxhYmxlIHBvcnQgbnVtYmVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQXZhaWxhYmxlUG9ydChzdGFydFBvcnQgPSAzMDAwLCBtYXhBdHRlbXB0cyA9IDEwMCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGZvciAobGV0IHBvcnQgPSBzdGFydFBvcnQ7IHBvcnQgPCBzdGFydFBvcnQgKyBtYXhBdHRlbXB0czsgcG9ydCsrKSB7XG4gICAgaWYgKGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KSkge1xuICAgICAgcmV0dXJuIHBvcnQ7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgTm8gYXZhaWxhYmxlIHBvcnQgZm91bmQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9LSR7c3RhcnRQb3J0ICsgbWF4QXR0ZW1wdHMgLSAxfWApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBvcnQgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gY2hlY2tcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHBvcnQgaXMgYXZhaWxhYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICcxMjcuMC4wLjEnKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGREZXZJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIHVuYnVmZmVyID0gZmFsc2UsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dW5idWZmZXIgPyAndW5idWZmZXIgJyA6ICcnfSR7dGhpcy5zdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBhZGRpdGlvbmFsT3B0aW9ucyxcbiAgICAgIGFkZGl0aW9uYWxBcmdzXG4gICAgKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgcmV0dXJuIGBkb2NrZXIgcnVuIC0tcm0gLWl0IC1wIFxcJHtQT1JUOi04MDgwfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCB0eXBlIFRlc3RFMkVEZXZPcHRpb25zID0ge1xuICAvLyAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCdcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG4gIHN0YXJ0Q29tbWFuZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRlc3RFMkVPcHRpb25zID0ge1xuICBwcmlzbWFEaXJlY3Rvcnk/OiBzdHJpbmc7XG59ICYgVGVzdEUyRURldk9wdGlvbnM7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbiA9ICdkZXZlbG9wbWVudCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkRGV2SW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICBhYnN0cmFjdCBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgYWJzdHJhY3Qgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG5cbiAgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfVxuICAgICAgJiYgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICAgIFwiJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICAgICl9XCJcbiAgICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0L2UyZS8nLCBwcmlzbWFEaXJlY3RvcnksIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcInJtIC1SZiAke3ByaXNtYURpcmVjdG9yeX0vbW91bnQgJiYgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiBCVU4gcGxheXdyaWdodCAke3BsYXl3cmlnaHRBcmdzID09PSAndGVzdCB0ZXN0L2UyZS8nID8gYHRlc3QgJHt0ZXN0VGFyZ2V0fWAgOiBwbGF5d3JpZ2h0QXJnc30ke3N1ZmZpeH1cImA7XG4gIH1cblxuICB0ZXN0RTJFRGV2KFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycsIHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudiA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgcmV0dXJuIGBXQl9FTlY9JHtlbnZ9IE5FWFRfUFVCTElDX1dCX0VOVj0ke2Vudn0gQVBQX0VOVj0ke2Vudn0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJncyA9PT0gJ3Rlc3QgdGVzdC9lMmUvJyA/IGB0ZXN0ICR7dGVzdFRhcmdldH1gIDogcGxheXdyaWdodEFyZ3N9JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgYWJzdHJhY3QgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvdW5pdC8nO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiB2aXRlc3QgcnVuICR7dGVzdFRhcmdldH0gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seWA7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gYnVuIHRlc3QgJHt0ZXN0VGFyZ2V0fWA7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8IDMwMDApOiBzdHJpbmcge1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAzMDAwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3YsXG4gICAgICBwb3J0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kQXZhaWxhYmxlUG9ydCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbmRQb3J0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGAke2FwcEVudn1ZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiYmxpdHogZGV2IC1wICR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgYXBwRW52ID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYEFQUF9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGAgOiAnJztcbiAgICByZXR1cm4gYCR7YXBwRW52fU5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDgwODA7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICBdXG4gICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgIC5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4ucHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAgIC5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBkZWZhdWx0U3RhcnRDb21tYW5kID0gYGJsaXR6IGRldiAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9YDtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRURldihwcm9qZWN0LCBhcmd2LCB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQ6IHN0YXJ0Q29tbWFuZCA/PyBkZWZhdWx0U3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcImJsaXR6IGRldiAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgUE9SVD0ke3BvcnR9IFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCl9JHt0b0Rldk51bGwoYXJndil9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgZmFsc2UsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQgPSA4MDgwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kXG4gICAgfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiBOT0RFX0VOVj1wcm9kdWN0aW9uIFBPUlQ9XFwke1BPUlQ6LSR7cG9ydH19ICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5oYXNQcmlzbWEgPyAncHJpc21hIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtZ2VuZXJhdGUgJiYgJyA6ICcnfSgke3RoaXMuc3RhcnRQcm9kdWN0aW9uKFxuICAgICAgcHJvamVjdCxcbiAgICAgIGFyZ3ZcbiAgICApfSlgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHtcbiAgICAgIHN0YXJ0Q29tbWFuZCA9IGAke3Byb2plY3QuaGFzUHJpc21hID8gJ3ByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlICYmICcgOiAnJ30oJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKX0pYCxcbiAgICB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cyAmJiBhcmd2LnRhcmdldHMubGVuZ3RoID4gMCA/IGFyZ3YudGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiB2aXRlc3QgcnVuICR7dGVzdFRhcmdldH0gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIHsgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke1xuICAgICAgcHJvamVjdC5lbnYuV0JfRU5WXG4gICAgfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3RcbiAgICAgIFwiJHtzdGFydENvbW1hbmQgPz8gdGhpcy5zdGFydChwcm9qZWN0LCBhcmd2KX0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIHZpdGVzdCBydW4gJHt0ZXN0VGFyZ2V0fSAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzIC0tYWxsb3dPbmx5JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmluZFBvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgb3ZlcnJpZGUgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIm5leHQgZGV2IC0tdHVyYm9wYWNrIC1wICR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgUE9SVD0ke3BvcnR9IHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLFxuICAgICAgXS5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDgwODA7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICBdXG4gICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgIC5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAnZGInLFxuICAgICAgc3RhcnRDb21tYW5kOlxuICAgICAgICBvcHRpb25zLnN0YXJ0Q29tbWFuZCA/P1xuICAgICAgICBbXG4gICAgICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gcHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0KS5zcGxpdCgnJiYnKSA6IFtdKSxcbiAgICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICAgIF1cbiAgICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAgIC5qb2luKCcgJiYgJyksXG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydENvbW1hbmQgPSBgbmV4dCBkZXYgLS10dXJib3BhY2sgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfWA7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBzdGFydENvbW1hbmQ6IHN0YXJ0Q29tbWFuZCA/PyBkZWZhdWx0U3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdCBcIm5leHQgZGV2IC0tdHVyYm9wYWNrIC1wICR7cG9ydH0ke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFBPUlQ9JHtwb3J0fSBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke1xuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICB9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFJlbWl4IGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBSZW1peFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwicmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCl9ICYmICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoXG4gICAgICAgICdlY29zeXN0ZW0uY29uZmlnLmNqcydcbiAgICAgICl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDgwODA7XG4gICAgcmV0dXJuIGBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBgcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpfWAsXG4gICAgICBdXG4gICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgIC5qb2luKCcgJiYgJyl9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzOiBvcHRpb25zLnBsYXl3cmlnaHRBcmdzLFxuICAgICAgcHJpc21hRGlyZWN0b3J5OiAncHJpc21hJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCA9IGByZW1peCBkZXYke3RvRGV2TnVsbChhcmd2KX1gIH06IFRlc3RFMkVEZXZPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBmaW5kQXZhaWxhYmxlUG9ydCgpO1xuICAgIHJldHVybiBgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJyZW1peCBkZXYke3RvRGV2TnVsbChhcmd2KX1cIiBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IHRlc3QnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdTdGFydCBhcHAnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ2RldmVsb3BtZW50Jyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnQocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgODA4MDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwgcG9ydCl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnREb2NrZXIocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdzdGFnaW5nJyk7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3Rlc3QnKTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydFRlc3QocHJvamVjdCwgYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFydCBtb2RlOiAke2FyZ3YubW9kZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sIHdiRW52OiBzdHJpbmcpOiBzdHJpbmcge1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9IHdiRW52O1xuICBsZXQgcHJlZml4ID0gYFdCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgaWYgKGRlcHMubmV4dCkge1xuICAgIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1dCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcbiAgICBwcmVmaXggKz0gYE5FWFRfUFVCTElDX1dCX0VOVj0ke3Byb2Nlc3MuZW52LldCX0VOVn0gYDtcbiAgfVxuICByZXR1cm4gcHJlZml4O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0UyZSB0ZXN0IG1vZGU6IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLicsXG4gIGJ1aWxkZXI6IHsgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMDtcblxuICAvLyBEZXRlY3QgdGVzdCBtb2RlcyBmcm9tIHRhcmdldCBwYXRoc1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5Vbml0ID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHM7XG4gIGNvbnN0IHNob3VsZFJ1bkUyZSA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHM7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBpZiAoc2hvdWxkUnVuVW5pdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogdW5kZWZpbmVkIH07XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZTJlVGFyZ2V0ID0gZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgY29uc3QgZTJlVGFyZ2V0ID0gZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2UyZVRhcmdldH0gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGBjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52LldCX0RPQ0tFUiA/Pz0gJzEnO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIHN0YXJ0Q29tbWFuZDogYCR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgdHJ1ZSl9JHt0b0Rldk51bGwoYXJndil9YCxcbiAgICB9KSxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxKSB7XG4gICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgcHJvY2Vzcy5lbnYuQ0kgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgPz89ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5XQl9ET0NLRVIgPz89ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGFydENvbW1hbmQ6IGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0cy50ZXN0RTJFKHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCAtLVByZXR0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gICAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbmFsRXhpdENvZGUpIHByb2Nlc3MuZXhpdChmaW5hbEV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG59XG4iXSwibmFtZXMiOlsiY2FjaGVkRW52VmFycyIsIk1hcCIsInJlYWRFbnZGaWxlIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJwYXJzZWQiLCJjb25maWciLCJwYXRoIiwicmVzb2x2ZSIsInByb2Nlc3NFbnYiLCJzZXQiLCJhc3luYyIsInNwYXduQXN5bmMiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic3Rkb3V0Iiwic2V0RW5jb2RpbmciLCJzdGRlcnIiLCJvbiIsImRhdGEiLCJwcmludGluZ1N0ZG91dCIsInByb2Nlc3MiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsInBpZCIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsInRyZWVLaWxsIiwia2lsbE9uRXhpdCIsImVycm9yIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJjb2RlIiwic2lnbmFsIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJzdGF0dXMiLCJpbnB1dCIsInN0ZGluIiwiZW5kIiwidCIsInMiLCJpIiwiZSIsIm4iLCJlbnRyaWVzIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImxlbmd0aCIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJuYW1lIiwibWVzc2FnZSIsInN0YWNrIiwicHVzaCIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwibWFwIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJOdW1iZXIiLCJpc05hTiIsImlzRmluaXRlIiwidG9TdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwidGVzdCIsImZzIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInJvb3REaXJQYXRoIiwiYnVpbGRDb21tYW5kIiwicGFja2FnZUpzb24iLCJzY3JpcHRzIiwiYnVpbGQiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsInJlcGxhY2VBbGwiLCJlbnYiLCJlbnZWYXJzIiwiZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMiLCJjd2QiLCJlbnZQYXRocyIsImVudlBhdGgiLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwiTk9ERV9FTlYiLCJhdXRvQ2FzY2FkZUVudiIsIldCX0VOViIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlycyIsImNvdW50Iiwia2V5IiwidmFsdWUiLCJjaGVja0VudiIsIm1pc3NpbmdLZXlzIiwia2V5cyIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicHJpc21hIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0Iiwidml0ZXN0IiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsImZpbmRTZWxmUHJvamVjdCIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInJvb3QiLCJzZWxmIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJkZXNjZW5kYW50cyIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyIiwicGFja2FnZU1hbmFnZXJXaXRoUnVuIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJkZXNjcmliZSIsImRlc2NyaXB0aW9uIiwidHlwZSIsImFsaWFzIiwiaGFuZGxlciIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwic3RkaW8iLCJlbmNvZGluZyIsInNwbGl0IiwicmVwbGFjZSIsImluY2x1ZGVQYXR0ZXJucyIsInNvbWUiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImdyZWVuIiwiZHJ5UnVuIiwid3JpdGVGaWxlIiwiYnVpbGRJZk5lZWRlZCIsInJldCIsInNoZWxsIiwiZXhpdENvZGUiLCJraWxsZWQiLCJraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZGVmYXVsdE9wdGlvbnMiLCJleGl0SWZGYWlsZWQiLCJydW5XaXRoU3Bhd24iLCJzY3JpcHQiLCJvcHRzIiwicHJpbnRhYmxlU2NyaXB0IiwicnVubmFibGVTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsImV4ZWMiLCJraWxsRnVuYyIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiY29uZmlndXJlRW52IiwidGltZW91dCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJvdXQiLCJuZXdTY3JpcHQiLCJibGl0eiIsImZpeEJ1bkNvbW1hbmQiLCJub3JtYWxpemVkU2NyaXB0IiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsImV4aXQiLCJuZXdFbnYiLCJjaSIsIkNJIiwiZm9yY2VDb2xvciIsIkZPUkNFX0NPTE9SIiwiYmlvbWVFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwiZmlsZXMiLCJiaW9tZUFyZ3NUZXh0IiwicHJldHRpZXJBcmdzVGV4dCIsInNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0IiwiZmlsZVBhdGhzVG9CZUNoZWNrZWRCeUJpb21lIiwiZmlsZVBhdGhzVG9CZUZvcm1hdHRlZEJ5UHJldHRpZXIiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsImZpbGUiLCJTdHJpbmciLCJleHRlbnNpb24iLCJleHRuYW1lIiwiYmlvbWVDb21tYW5kIiwiYmlvbWVQcm9taXNlIiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwic3RhcnRzV2l0aCIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwicHJpc21hU2NyaXB0cyIsImRlcGxveSIsImFkZGl0aW9uYWxPcHRpb25zIiwiZGVwbG95Rm9yY2UiLCJiYWNrdXBQYXRoIiwiZGlyTmFtZSIsImxpdGVzdHJlYW0iLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJyZXN0b3JlIiwib3V0cHV0UGF0aCIsInNjcmlwdFBhdGgiLCJzdHVkaW8iLCJkYlVybE9yUGF0aCIsIkZJTEVfU0NIRU1BIiwiREFUQUJBU0VfVVJMIiwiUE9TU0lCTEVfUEFUSFMiLCJzY2hlbWFQYXRoIiwiZGJQYXRoIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJkZWZhdWx0IiwiYnVpbGRlciIsInByaXNtYUNvbW1hbmQiLCJ5YXJncyIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXRlc3RyZWFtQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInNlZWRDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZFByaXNtYVByb2plY3RzIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJkZXBsb3lGb3JjZUJ1aWxkZXIiLCJkZW1hbmRPcHRpb24iLCJvdXRwdXQiLCJyZXN0b3JlZCIsImZ1bGxDb21tYW5kIiwidHJpbUVuZCIsIkJvb2xlYW4iLCJmaWx0ZXJlZCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwibWF0Y2giLCJ0b0xvd2VyQ2FzZSIsIml0ZW0iLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwbGF0Zm9ybSIsInBhY2thZ2VzIiwiaXNGaWxlIiwidmVyc2lvbiIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJzaWxlbnQiLCJmaW5kQXZhaWxhYmxlUG9ydCIsInN0YXJ0UG9ydCIsIm1heEF0dGVtcHRzIiwiaXNQb3J0QXZhaWxhYmxlIiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib25jZSIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkRGV2SW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJ1bmJ1ZmZlciIsImFkZGl0aW9uYWxBcmdzIiwic3RvcCIsInNwYXduU3luY09uRXhpdCIsInN0b3BBbGwiLCJCYXNlU2NyaXB0cyIsImJ1aWxkRG9ja2VyIiwic3RhcnREb2NrZXIiLCJQT1JUIiwibm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Iiwibm9ybWFsaXplZEFyZ3NUZXh0Iiwid2FpdEFuZE9wZW5BcHAiLCJ0ZXN0RTJFIiwicGxheXdyaWdodEFyZ3MiLCJwcmlzbWFEaXJlY3RvcnkiLCJzdGFydENvbW1hbmQiLCJ0ZXN0VGFyZ2V0IiwidGFyZ2V0cyIsInRlc3RFMkVEZXYiLCJ0ZXN0VW5pdCIsIndhaXRBcHAiLCJibGl0elNjcmlwdHMiLCJhcHBFbnYiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFRlc3QiLCJzdXBlciIsImRlZmF1bHRTdGFydENvbW1hbmQiLCJ0ZXN0U3RhcnQiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJyZW1peFNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiYXJnIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJuZXh0IiwiY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ3YkVudiIsIk5FWFRfUFVCTElDX1dCX0VOViIsInRlc3RDb21tYW5kIiwiZTJlIiwiY2hvaWNlcyIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJoYXNFMmVUYXJnZXRzIiwidGFyZ2V0IiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5Vbml0Iiwic2hvdWxkUnVuRTJlIiwidW5pdFRhcmdldHMiLCJ1bml0QXJndiIsInVuaXRUaW1lb3V0IiwiZTJlVGFyZ2V0cyIsImUyZUFyZ3YiLCJ0ZXN0T25Eb2NrZXIiLCJlMmVUYXJnZXQiLCJXQl9ET0NLRVIiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInR5cGVDaGVja0NvbW1hbmQiLCJjb21tYW5kcyIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwibmV4dERpclBhdGgiLCJybVN5bmMiLCJmb3JjZSIsImV4aXRDb2RlcyIsImFsbCIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCJdLCJtYXBwaW5ncyI6IjRlQXlIQSxNQUFNQSxFQUFnQixJQUFJQyxJQUUxQixTQUFTQyxFQUFZQyxHQUNuQixNQUFNQyxFQUFTSixFQUFjSyxJQUFJRixHQUNqQyxHQUFJQyxFQUFRLE9BQU9BLEVBRW5CLE1BQU1FLEVBQVNDLEVBQU8sQ0FBRUMsS0FBTUEsRUFBS0MsUUFBUU4sR0FBV08sV0FBWSxDQUFBLElBQU1KLFFBQVUsQ0FBQSxFQUVsRixPQURBTixFQUFjVyxJQUFJUixFQUFVRyxHQUNyQkEsQ0FDVCxDQzlET00sZUFBZUMsRUFD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R0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBRyxJQUFJOUQsRUFBRSxFQUFFQSxFQUFFLEdBQUdBLEdBQUcsRUFBRWxCLEVBQUVKLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJTSxFQUFFTixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTRCLEVBQUU1QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXdCLEVBQUV4QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXlCLEVBQUV6QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTBCLEVBQUUxQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSStCLEVBQUUvQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSWdDLEVBQUVoQyxFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSWlDLEVBQUVqQyxFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSWtDLEVBQUVsQyxFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUMsRUFBRWdDLEdBQUdMLEdBQUcsRUFBRUosSUFBSSxJQUFJdEIsRUFBRWdDLEdBQUdWLEdBQUcsRUFBRUksSUFBSSxJQUFJNUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFRyxHQUFHcUIsR0FBRyxFQUFFQyxJQUFJLElBQUl4QixFQUFFSSxHQUFHb0IsR0FBRyxFQUFFRCxJQUFJLElBQUl6QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUUyQixHQUFHRyxHQUFHLEVBQUVDLElBQUksSUFBSTlCLEVBQUVzQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSS9CLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXdCLEdBQUdRLEdBQUcsRUFBRUMsSUFBSSxJQUFJaEMsRUFBRXdCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJakMsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFOEIsR0FBRzNCLEdBQUcsRUFBRUUsSUFBSSxJQUFJSixFQUFFOEIsR0FBRzFCLEdBQUcsRUFBRUYsSUFBSSxJQUFJSixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxF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
9
+ */const E=[..."0123456789abcdef"],A=[6,1536,393216,100663296],N=[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 R{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,s=this.blockCount,o=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<s+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<N[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<N[3&i++],t[i>>2]|=(128|63&a)<<N[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<N[3&i++],t[i>>2]|=(128|a>>6&63)<<N[3&i++],t[i>>2]|=(128|63&a)<<N[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<N[3&i++],t[i>>2]|=(128|a>>12&63)<<N[3&i++],t[i>>2]|=(128|a>>6&63)<<N[3&i++],t[i>>2]|=(128|63&a)<<N[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];j(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];j(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),j(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 j=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,A,N,x,R,j,O,S,D,T,_,B,C,I,W,V,J,z,F,Y,L,U,M,G,q,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],G=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,j=e[20]<<3|e[21]>>>29,O=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,S=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,A=e[6]<<28|e[7]>>>4,N=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,V=e[26]<<25|e[27]>>>7,J=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,R=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,z=e[38]<<8|e[39]>>>24,F=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]=A^~x&j,e[11]=N^~R&O,e[20]=B^~I&V,e[21]=C^~W&J,e[30]=U^~G&H,e[31]=M^~q&K,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~y&w,e[3]=b^~v&$,e[12]=x^~j&S,e[13]=R^~O&D,e[22]=I^~V&z,e[23]=W^~J&F,e[32]=G^~H&X,e[33]=q^~K&Q,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=y^~w&k,e[5]=v^~$&E,e[14]=j^~S&T,e[15]=O^~D&_,e[24]=V^~z&Y,e[25]=J^~F&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]=S^~T&A,e[17]=D^~_&N,e[26]=z^~Y&B,e[27]=F^~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^~A&x,e[19]=_^~N&R,e[28]=Y^~B&I,e[29]=L^~C&W,e[38]=Z^~U&G,e[39]=ee^~M&q,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=P[r],e[1]^=P[r+1]},O=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])=>S.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]))}(),S=new TextEncoder,D=new TextDecoder("utf8");function T(e=void 0,t=O){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=O){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 R(512,A,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});let V;class J{static{[V]=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,A=4===s,N=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={},R=[],j=E?"get":A||k?"set":"value";if(l?(u||k?x={get:$(function(){return v(this)},r,"get"),set:function(e){t[4](this,e)}}:x[j]=v,u||$(x[j],r,N?"":j)):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[j].name+") is not supported yet");h[+d][r]=s<3?1:s}}for(var O=e,S=g.length-1;S>=0;S-=n?2:1){var D=y(g[S],"A decorator","be",!0),T=n?g[S-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,O,B),_.v=1,y(i,"class decorators","return")&&(O=i);else if(B.static=d,B.private=l,i=B.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?N?function(e){return f(e),x.value}:P("get",0,f):function(e){return e[r]}),N||E||(i.set=l?P("set",0,f):function(e,t){e[r]=t}),O=D.call(T,k?{get:x.get,set:x.set}:x[j],B),_.v=1,k){if("object"==typeof O&&O)(i=y(O.get,"accessor.get"))&&(x.get=i),(i=y(O.set,"accessor.set"))&&(x.set=i),(i=y(O.init,"accessor.init"))&&R.unshift(i);else if(void 0!==O)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else y(O,(u?"field":"method")+" decorators","return")&&(u?R.unshift(O):x[j]=O)}return s<2&&c.push(b(R,d,1),b(a,d,0)),u||w||(l?k?c.splice(-1,0,P("get",d),P("set",d)):c.push(N?x[j]:y.call.bind(x[j])):m(e,r,x)),O}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,"dockerPackageJson"],[W,3,"binExists"]]).e}argv=void V(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 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 F(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 Y(n,o.root,r):[o.self]}}async function Y(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 d(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 L=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),U=L?"bun --bun run":"node",M=L?"bun":"yarn",G=L?"bun --bun run":"yarn",q={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const o=z(n,!0,r);if(!o)return console.error(c.red("No project found.")),!0;if(n={...n,command:n.command??(L?"bun run build":"yarn build")},!e.existsSync(t.join(o.rootDirPath,".git")))return H(o,n),!0;const[i,d,l]=await async function(n,r){const o=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(o,"last-build");await e.promises.mkdir(o,{recursive:!0});const c=a("sha256"),d=s.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();c.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!K.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));c.update(l),await async function(e,t,n){return new Promise(r=>{const o=s.spawnSync("git",["diff","--name-only"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(X.some(t=>e.includes(t))||Q.some(t=>e.endsWith(t)))&&!Z.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=s.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,c);const u=c.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(o,n);if(i)return console.info(c.green(`Skip to run '${n.command}' 💫`)),!1;if(!H(o,n))return;n.dryRun||await e.promises.writeFile(d,l,"utf8");return!0}(n)}};function H(e,t){if(console.info(c.green(`Run '${t.command}'`)),!t.dryRun){const n=s.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const K=new Set(["CI","PWDEBUG","TMPDIR"]);const X=["src/","public/"],Q=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],Z=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ee=new Set;async function te(e){try{await u(e)}catch{}}const ne=new p,re={exitIfFailed:!0};async function se(e,t,n,r=re){const[s,o]=ie(e,t);if(ae(s,t),n.verbose&&ae(o,t,"Start (raw)",!0),n.dryRun)return ce(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){await te(e);const t=async()=>{ee.has(e)||(ee.add(e),await te(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:de(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return ce(s,a.status,r),a.status??1}function oe(e,t,n,r=re){return ne.runAndWaitForReturnValue(async()=>{const[s,o]=ie(e,t);if(ae(s,t,"Start (parallel)",!0),n.dryRun)return ae(s,t,"Started (log)"),n.verbose&&ae(o,t,"Started (raw)",!0),ce(s,0,r),0;const i=await v(o,void 0,{cwd:t.dirPath,env:de(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});ae(s,t,"Started (log)"),n.verbose&&ae(o,t,"Started (raw)",!0);const a=i.stdout.trim();return a&&(process.stdout.write(a),process.stdout.write("\n")),ce(s,i.status,r),i.status??1})}function ie(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 ",L?"bun --bun run ":"yarn run ");L&&(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=le(n.replaceAll("YARN ",`${G} `)),s=le(n.replaceAll("YARN playwright ",`${G} playwright `).replaceAll("YARN ",!L&&t.binExists?"":`${G} `));return[`dotenv${t.env.WB_ENV?` --cascade-env=${t.env.NODE_ENV||"development"}`:""} ${r}`,s]}function ae(e,t,n="Start",r=!1){console.info("\n"+(r?c.gray:c.cyan)(c.bold(`${n}:`),e)+c.gray(` at ${t.dirPath}`))}function ce(e,t,n){0===t?console.info(c.green(c.bold("Finished:"),e)):(console.info(c.red(c.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function de(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function le(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const ue=new Set(["cjs","cts","js","json","jsonc","jsx","mjs","mts","ts","tsx"]),pe=new Set(["cjs","cts","htm","html","js","json","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),me=new Set([...pe].filter(e=>!ue.has(e))),fe={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){L||(console.error(c.red("This command is only available on Bun.")),process.exit(1));const n=await F(e,!1);n||(console.error(c.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):ue.has(o)?e.push(r):pe.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=`"**/{.*/,}*.{${[...me].join(",")}}" "!**/test{-,/}fixtures/**"`,i=n.descendants.map(e=>`"${e.packageJsonPath}"`).join(" ");const a=e.fix&&e.format?"check --fix":e.fix?"lint --fix":e.format?"format --fix":"lint";let d;(s||0===r.length)&&(d=oe(`bun --bun biome ${a} --colors=force --no-errors-on-unmatched --files-ignore-unknown=true ${s}`,n.self,e,{forceColor:!0})),e.format&&(o&&oe(`bun --bun prettier --cache --color --no-error-on-unmatched-pattern --write ${o}`,n.self,e,{forceColor:!0}),i&&(await d,oe(`bun --bun sort-package-json ${i}`,n.self,e,{forceColor:!0})))}};function*he(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const ge={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 F(n);r||(console.error(c.red("No project found.")),process.exit(1));for(const s of he("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(be(n,r),ye(r),ve(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||(s.spawnSync(M,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function be(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],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 ye(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 ve(e){delete e.private,delete e.publishConfig,delete e.prettier}const we=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`${U} -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}`:""}`}},$e={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"]}},ke={},Ee={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Ae).command(Pe).command(xe).command(Re).command(je).command(Oe).command(Se).command(De).command(Te).command(_e).demandCommand().strict(!1),handler(){}},Ae={command:"deploy",describe:"Apply migration to DB without initializing it",builder:ke,async handler(e){const t=await Be(e),n=Ce(e);for(const r of he("prisma deploy",t))await se(we.deploy(r,n),r,e)}},Ne={...ke,"backup-path":{description:"Whether to skip actual command execution",demandOption:!0,type:"string",alias:"b"}},Pe={command:"deploy-force <backup-path>",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Ne,async handler(e){const t=await Be(e);for(const n of he("prisma deploy-force",t))await se(we.deployForce(n,e.backupPath),n,e)}},xe={command:"litestream",describe:"Setup DB for Litestream",builder:ke,async handler(e){const t=await Be(e);for(const n of he("prisma litestream",t))await se(we.litestream(n),n,e)}},Re={command:"migrate",describe:"Apply migration to DB with initializing it",builder:ke,async handler(e){const t=await Be(e),n=Ce(e);for(const r of he("prisma migrate",t))await se(we.migrate(r,n),r,e)}},je={command:"migrate-dev",describe:"Create a migration file",builder:ke,async handler(e){const t=await Be(e),n=Ce(e);for(const r of he("prisma migrate-dev",t))await se(we.migrateDev(r,n),r,e)}},Oe={command:"reset",describe:"Reset DB",builder:ke,async handler(e){const t=await Be(e),n=Ce(e);for(const r of he("prisma reset",t))await se(we.reset(r,n),r,e)}},Se={command:"restore <backup-path>",describe:"Restore DB from Litestream's backup",builder:{...Ne,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Be(e);for(const n of he("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await se(we.restore(n,e.backupPath,t),n,e)}}},De={command:"seed",describe:"Populate DB with seed data",builder:{...ke,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Be(e);for(const n of he("prisma seed",t))await se(we.seed(n,e.file),n,e)}},Te={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...ke,"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 Be(e),n=Ce(e,["db-url-or-path","restored"]);for(const r of he("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await se(we.studio(r,t,n),r,e)}}},_e={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await Be(e),n=[(e.args?.join(" ")??"").trimEnd(),Ce(e,["args"])].filter(Boolean).join(" ");for(const r of he(`prisma ${n}`,t))await se(`PRISMA ${n}`,r,e)}};async function Be(e){const t=await F(e);t||(console.error(c.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(c.red("No prisma project found.")),process.exit(1)),n}function Ce(e,t=[]){const n=[],r=Object.keys($e),s=Object.values($e).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 Ie={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(c.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${c.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await se(n.join(" "),t,e,{exitIfFailed:!1}),0===r)return;process.exit(r)}},We={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await F(e,!1,t);n||(console.error(c.red("No project found.")),process.exit(1));for(const t of he("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 oe(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await se("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await oe("poetry config virtualenvs.in-project true",t,e);const[,n]=s.execSync("asdf current python").toString().trim().split(/\s+/);await oe(`poetry env use ${n}`,t,e),await ne.promiseAll(),await se("poetry run pip install --upgrade pip",t,e),await se("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await se(`${G} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await se(`${G} playwright install --with-deps`,r,e)}(e)}};function Ve(e){return e.silent?" > /dev/null":""}async function Je(e=3e3,t=100){for(let n=e;n<e+t;n++)if(await ze(n))return n;throw new Error(`No available port found in range ${e}-${e+t-1}`)}async function ze(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 Fe=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(ee.has(e))return;ee.add(e),ae(e,t);const{status:n}=i(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ce(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 Ye{buildDocker(e,t="development"){return Fe.buildDevImage(e,t)}startDocker(e,t){const n=Number(e.env.PORT)||8080;return`${this.buildDocker(e)}${Ve(t)}\n && YARN concurrently --raw --kill-others-on-fail\n "${Fe.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=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`WB_ENV=${o} NEXT_PUBLIC_WB_ENV=${o} APP_ENV=${o} PORT=${i} YARN concurrently --kill-others --raw --success first\n "rm -Rf ${r}/mount && ${s} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i}\n && BUN playwright ${"test test/e2e/"===n?`test ${c}`:n}${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=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`WB_ENV=${s} NEXT_PUBLIC_WB_ENV=${s} APP_ENV=${s} PORT=${o} 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 && BUN playwright ${"test test/e2e/"===n?`test ${a}`:n}${i}"`}testUnit(e,t){const n=t.targets&&t.targets.length>0?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}`}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}`}}const Le=new class extends Ye{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 "${[we.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){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r}){const s=`blitz dev -p ${e.env.PORT||"8080"}${Ve(t)}`;return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r??s})}async testStart(e,t){const n=await Je();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "blitz dev -p ${n}${Ve(t)}" "${this.waitApp(e,t,n)}"`}};const Ue=new class extends Ye{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)}${Ve(t)} && ${Fe.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t,n=8080){return`NODE_ENV=production ${e.buildCommand}${Ve(t)} && NODE_ENV=production PORT=\${PORT:-${n}} ${U} dist/index.js ${t.normalizedArgsText??""}`}startTest(e,t){return`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}testE2E(e,t,{startCommand:n=`${e.hasPrisma?"prisma migrate reset --force --skip-generate && ":""}(${this.startProduction(e,t)})`}){const r=e.env.PORT||"8080",s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",o=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${r} YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${r} && vitest run ${o} --color --passWithNoTests --allowOnly${s}"`}testE2EDev(e,t,{startCommand:n}){const r=e.env.PORT||"8080",s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",o=t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/";return`NODE_ENV=production WB_ENV=${e.env.WB_ENV} PORT=${r} YARN concurrently --kill-others --raw --success first\n "${n??this.start(e,t)} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${r} && vitest run ${o} --color --passWithNoTests --allowOnly${s}"`}async testStart(e,t){const n=await Je();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 Me=new class extends Ye{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?[we.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){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...e.hasPrisma?we.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"db",startCommand:n.startCommand??[...e.hasPrisma?we.reset(e).split("&&"):[],e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")})}testE2EDev(e,t,{startCommand:n}){const r=`next dev --turbopack -p ${e.env.PORT||"8080"}${Ve(t)}`;return super.testE2EDev(e,t,{startCommand:n??r})}async testStart(e,t){const n=await Je();return`WB_ENV=${e.env.WB_ENV} YARN concurrently --kill-others --raw --success first "next dev --turbopack -p ${n}${Ve(t)}" "${this.waitApp(e,t,n)}"`}};const Ge=new class extends Ye{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)}${Ve(t)} && ${Fe.stopAndStart(e,!1,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProduction(e,t){return`NODE_ENV=production ${e.buildCommand} && NODE_ENV=production ${U} 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 Ye{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 "${we.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){const n=Number(e.env.PORT)||8080;return`YARN concurrently --raw --kill-others-on-fail\n "${[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")}"\n "${this.waitApp(e,t,n)}"`}testE2E(e,t,n){return super.testE2E(e,t,{playwrightArgs:n.playwrightArgs,prismaDirectory:"prisma",startCommand:n.startCommand??[...we.reset(e).split("&&"),e.buildCommand,`pm2-runtime start ${e.findFile("ecosystem.config.cjs")}`].map(e=>`${e.trim()}${Ve(t)}`).join(" && ")})}testE2EDev(e,t,{playwrightArgs:n,startCommand:r=`remix dev${Ve(t)}`}){return super.testE2EDev(e,t,{playwrightArgs:n,startCommand:r})}async testStart(e,t){const n=await Je();return`WB_ENV=${e.env.WB_ENV} PORT=${n} YARN concurrently --kill-others --raw --success first "remix dev${Ve(t)}" "${this.waitApp(e,t,n)}"`}},He=["express","fastify","elysia","hono"],Ke={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 F(e);t||(console.error(c.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=Le;else if(t.next)s=Me;else if(r["@remix-run/dev"])s=qe;else if(He.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=Ue;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=Ge}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":{const r=Xe(t,"development");await se(`${r}${s.start(n,e)}`,n,e);break}case"staging":{const r=Xe(t,"staging"),o=Number(n.env.PORT)||8080;await se(`${r}${s.startProduction(n,e,o)}`,n,e);break}case"docker":{const r=Xe(t,"staging");await se(`${r}${s.startDocker(n,e)}`,n,e);break}case"docker-debug":{const r=Xe(t,"staging");e.normalizedArgsText="'/bin/bash'",await se(`${r}${s.startDocker(n,e)}`,n,e);break}case"test":{const r=Xe(t,"test");await se(`${r}${s.startTest(n,e)}`,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}};function Xe(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 Qe={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 F(n);r||(console.error(c.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")),d=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?Le:r.next?Me:i["@remix-run/dev"]?qe:He.some(e=>r[e])&&!r["firebase-functions"]?Ue:Ge,console.info(`Running "test" for ${o.name} ...`),d&&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 se(a.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const c=s.filter(e=>e.includes("/e2e")),u={...n,targets:c.length>0?c:void 0};switch(n.e2e){case"headless":await se(a.testE2E(o,u,{}),o,n);continue;case"headless-dev":await se(a.testE2EDev(o,u,{}),o,n);continue;case"docker":await Ze(o,u,a);continue;case"docker-debug":{const e=c.length>0?c.join(" "):"test/e2e/";await Ze(o,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]){const e=c.length>0?c.join(" "):"test/e2e/";switch(n.e2e){case"headed":await se(a.testE2E(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"headed-dev":await se(a.testE2EDev(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"debug":await se(a.testE2E(o,u,{playwrightArgs:`test ${e} --debug`}),o,n);break;case"generate":{const e=o.env.PORT||"8080";await se(a.testE2E(o,u,{playwrightArgs:`codegen http://localhost:${e}`}),o,n);break}case"trace":await se("BUN playwright show-trace",o,n)}}}}(n)}};async function Ze(e,t,n,r){process.env.WB_DOCKER??="1",await se(`${n.buildDocker(e,"test")}${Ve(t)}`,e,t),process.exitCode=await se(n.testE2E(e,t,{playwrightArgs:r,startCommand:`${Fe.stopAndStart(e,!0)}${Ve(t)}`}),e,t,{exitIfFailed:!1}),await se(Fe.stop(e),e,t)}const et={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{},async handler(n){await async function(n){const r=await F(n);r||(console.error(c.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";for(const s of r.descendants){const r=s.packageJson.dependencies??{},o=s.packageJson.devDependencies??{};let i;if(i=r.blitz?Le:r.next?Me:o["@remix-run/dev"]?qe:He.some(e=>r[e])&&!r["firebase-functions"]?Ue:Ge,console.info(`Running "test-on-ci" for ${s.name} ...`),await oe(Fe.stopAll(),s,n),e.existsSync(t.join(s.dirPath,"test","unit"))&&await oe(i.testUnit(s,n).replaceAll(" --allowOnly",""),s,n),await oe(await i.testStart(s,n),s,n),await ne.promiseAll(),e.existsSync(t.join(s.dirPath,"test","e2e"))){s.hasDockerfile&&(process.env.WB_DOCKER??="1",await se(`${i.buildDocker(s,"test")}${Ve(n)}`,s,n));const e=s.hasDockerfile?{startCommand:Fe.stopAndStart(s,!0)}:{};process.exitCode=await se(i.testE2E(s,n,e).replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await se(Fe.stop(s),s,n)}}}(n)}};const tt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await F(n,!1);r||(console.error(c.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 oe(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(c.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(c.yellow('Please try "yarn gen-code" if you face unknown type errors.')),i=t}i&&process.exit(i)}},nt={...tt,command:"tc"};await n(r(process.argv)).scriptName("wb").options($e).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(q).command(fe).command(ge).command(Ee).command(Ie).command(We).command(Ke).command(Qe).command(et).command(tt).command(nt).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,()=>process.exit());
10
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9maW5kUG9ydC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhckNvdW50XVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgbnVtYmVyXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcHJvY2Vzcy5lbnYuV0JfRU5WIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cHJvY2Vzcy5lbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cHJvY2Vzcy5lbnYuTk9ERV9FTlZ9YCk7XG4gICAgY29uc29sZS5pbmZvKCdSZWFkaW5nIGVudiBmaWxlczonLCBlbnZQYXRocy5qb2luKCcsICcpKTtcbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRFbnZWYXJDb3VudFBhaXJzOiBbc3RyaW5nLCBudW1iZXJdW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBlbnZWYXJzKSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMucHVzaChbZW52UGF0aCwgY291bnRdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYXJndi5jaGVja0Vudikge1xuICAgIGNvbnN0IGV4YW1wbGVLZXlzID0gT2JqZWN0LmtleXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgYXJndi5jaGVja0VudikpKTtcbiAgICBjb25zdCBtaXNzaW5nS2V5cyA9IGV4YW1wbGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhKGtleSBpbiBlbnZWYXJzKSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBlbnZQYXRoQW5kRW52VmFyQ291bnRQYWlyc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIE9iamVjdC5hc3NpZ24ocHJvY2Vzcy5lbnYsIGVudlZhcnMpO1xuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHJlZUtpbGwgZnJvbSAndHJlZS1raWxsJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+PjUsdGhpcy5ieXRlQ291bnQ9dGhpcy5ibG9ja0NvdW50PDwyLHRoaXMub3V0cHV0QmxvY2tzPWk+PjUsdGhpcy5leHRyYUJ5dGVzPSgzMSZpKT4+Mztmb3IobGV0IHQ9MDt0PDUwOysrdCl0aGlzLnNbdF09MH11cGRhdGUodCl7aWYodGhpcy5maW5hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKFwiZmluYWxpemUgYWxyZWFkeSBjYWxsZWRcIik7Y29uc3Qgcz10aGlzLmJsb2NrcyxlPXRoaXMuYnl0ZUNvdW50LG89dC5sZW5ndGgsbj10aGlzLmJsb2NrQ291bnQsaD10aGlzLnM7bGV0IGwsYyxmPTA7Zm9yKDtmPG87KXtpZih0aGlzLnJlc2V0KWZvcih0aGlzLnJlc2V0PSExLHNbMF09dGhpcy5ibG9jayxsPTE7bDxuKzE7KytsKXNbbF09MDtmb3IobD10aGlzLnN0YXJ0O2Y8byYmbDxlOysrZiljPXQuY29kZVBvaW50QXQoZil8fDAsYzwxMjg/c1tsPj4yXXw9Yzw8aVszJmwrK106YzwyMDQ4PyhzW2w+PjJdfD0oMTkyfGM+PjYpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6Yzw1NTI5Nnx8Yz49NTczNDQ/KHNbbD4+Ml18PSgyMjR8Yz4+MTIpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6KGM9NjU1MzYrKCgxMDIzJmMpPDwxMHwxMDIzJih0LmNvZGVQb2ludEF0KCsrZil8fDApKSxzW2w+PjJdfD0oMjQwfGM+PjE4KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj4xMiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTtpZih0aGlzLmxhc3RCeXRlSW5kZXg9bCxsPj1lKXtmb3IodGhpcy5zdGFydD1sLWUsdGhpcy5ibG9jaz1zW25dLGw9MDtsPG47KytsKWhbbF1ePXNbbF07cihoKSx0aGlzLnJlc2V0PSEwfWVsc2UgdGhpcy5zdGFydD1sfXJldHVybiB0aGlzfWZpbmFsaXplKCl7aWYodGhpcy5maW5hbGl6ZWQpcmV0dXJuO3RoaXMuZmluYWxpemVkPSEwO2NvbnN0IHQ9dGhpcy5ibG9ja3M7bGV0IHM9dGhpcy5sYXN0Qnl0ZUluZGV4O2NvbnN0IGk9dGhpcy5ibG9ja0NvdW50LGU9dGhpcy5zO2lmKHRbcz4+Ml18PXRoaXMucGFkZGluZ1szJnNdLHRoaXMubGFzdEJ5dGVJbmRleD09PXRoaXMuYnl0ZUNvdW50KWZvcih0WzBdPXRbaV0scz0xO3M8aSsxOysrcyl0W3NdPTA7Zm9yKHRbaS0xXXw9MjE0NzQ4MzY0OCxzPTA7czxpOysrcyllW3NdXj10W3NdO3IoZSl9aGV4KCl7dGhpcy5maW5hbGl6ZSgpO2NvbnN0IHM9dGhpcy5ibG9ja0NvdW50O2xldCBpPXRoaXMucztjb25zdCBlPXRoaXMub3V0cHV0QmxvY2tzLG89dGhpcy5leHRyYUJ5dGVzO2xldCBoLGw9MCxjPTAsZj1cIlwiO2Zvcig7YzxlOyl7Zm9yKGw9MDtsPHMmJmM8ZTsrK2wsKytjKWg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0rdFtoPj4xMiYxNV0rdFtoPj44JjE1XSt0W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSt0W2g+PjI4JjE1XSt0W2g+PjI0JjE1XTtjJXM9PT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9O3JldHVybiBuZXcgTWFwKFtlLHQscyxvLHIsYyxkXS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtleHBvcnR7dCBhcyBHTE9CQUxfQ09OU1RSVUNUT1JfTUFQLGUgYXMgUExBSU5fT0JKRUNUX0xBQkVMfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0cnVjdG9ycy5qcy5tYXBcbiIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIHQsUExBSU5fT0JKRUNUX0xBQkVMIGFzIG59ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtjb25zdCBlPS0xLHI9LTIsbz0tMyxpPS00LHM9LTUsYz0tNjtmdW5jdGlvbiBmKG49dm9pZCAwLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgLy8gT3ZlcndyaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBldmVuIHRob3VnaCB0aGlzIGJlaGF2aW9yIGlzIG5vbi1zdGFuZGFyZFxuICAgIC8vIGJlY2F1c2UgYGJ1biB3YiAuLi5gIHdpbGwgbG9hZCAuZW52IGFuZCAuZW52LmxvY2FsIGJlZm9yZSBgd2JgIGxvYWRzIG90aGVyIHZhcmlhYmxlcy5cbiAgICByZXR1cm4geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvdW5kUHJvamVjdHMgPSB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcblxuICByZXR1cm4ge1xuICAgIC4uLnJvb3RBbmRTZWxmUHJvamVjdHMsXG4gICAgZGVzY2VuZGFudHM6XG4gICAgICByb290QW5kU2VsZlByb2plY3RzLnJvb3QgPT09IHJvb3RBbmRTZWxmUHJvamVjdHMuc2VsZlxuICAgICAgICA/IGF3YWl0IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCByb290QW5kU2VsZlByb2plY3RzLnJvb3QsIGxvYWRFbnYpXG4gICAgICAgIDogW3Jvb3RBbmRTZWxmUHJvamVjdHMuc2VsZl0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICBjb25zdCB0aGlzUHJvamVjdCA9IG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICBsZXQgcm9vdFByb2plY3QgPSB0aGlzUHJvamVjdDtcbiAgaWYgKCF0aGlzUHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHBhdGguZGlybmFtZShkaXJQYXRoKS5lbmRzV2l0aCgnL3BhY2thZ2VzJykpIHtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJvb3RQcm9qZWN0ID0gbmV3IFByb2plY3Qocm9vdERpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gcHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIHByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gcHJvamVjdHM7XG59XG4iLCJleHBvcnQgY29uc3QgaXNSdW5uaW5nT25CdW4gPVxuICAvLyBEZXRlY3QgYGJ1biAtLWJ1biBydW4gd2IgLi4uYC4gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgcHJvY2Vzcy52ZXJzaW9ucy5idW4gfHxcbiAgLy8gRGV0ZWN0IGBidW4gcnVuIHdiIC4uLmAuXG4gIHByb2Nlc3MuYXJndlswXT8uZW5kc1dpdGgoJy9idW4nKSB8fFxuICBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmVuZHNXaXRoKCcvYnVuJyk7XG5cbmV4cG9ydCBjb25zdCBydW50aW1lV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICdub2RlJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAneWFybic7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXJXaXRoUnVuID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGJ1aWxkIGNvbW1hbmQgKGRlZmF1bHQ6IHlhcm58YnVuIGJ1aWxkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdjJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXJndiA9IHsgLi4uYXJndiwgY29tbWFuZDogYXJndi5jb21tYW5kID8/IChpc1J1bm5pbmdPbkJ1biA/ICdidW4gcnVuIGJ1aWxkJyA6ICd5YXJuIGJ1aWxkJykgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnZGlmZicsICctLW5hbWUtb25seSddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZXRyeU9wdGlvbnMgPSB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn07XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NIYW5kbGluZ0Vycm9ycyhwb3J0KTtcbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMocG9ydCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0hhbmRsaW5nRXJyb3JzKHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IFtwcmludGFibGVTY3JpcHQsIHJ1bm5hYmxlU2NyaXB0XSA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHByaW50YWJsZVNjcmlwdCwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gL2h0dHAtZ2V0OlxcL1xcLzEyNy4wLjAuMTooXFxkKykvLmV4ZWMocnVubmFibGVTY3JpcHQpPy5bMV07XG4gIGlmIChydW5uYWJsZVNjcmlwdC5pbmNsdWRlcygnd2FpdC1vbicpICYmIHBvcnQgJiYgIXJ1bm5hYmxlU2NyaXB0LmluY2x1ZGVzKCdkb2NrZXIgcnVuJykpIHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChOdW1iZXIocG9ydCkpO1xuICB9XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMocnVubmFibGVTY3JpcHQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcHJpbnRhYmxlU2NyaXB0LCBydW5uYWJsZVNjcmlwdF0gPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KHByaW50YWJsZVNjcmlwdCwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KHJ1bm5hYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChwcmludGFibGVTY3JpcHQsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhydW5uYWJsZVNjcmlwdCwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIHByaW50U3RhcnQocHJpbnRhYmxlU2NyaXB0LCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQocnVubmFibGVTY3JpcHQsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQocHJpbnRhYmxlU2NyaXB0LCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogW3N0cmluZywgc3RyaW5nXSB7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLS1jYXNjYWRlLWVudj0ke3Byb2plY3QuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCd9YCA6ICcnO1xuICByZXR1cm4gW2Bkb3RlbnYke2Nhc2NhZGVPcHRpb259ICR7cHJpbnRhYmxlU2NyaXB0fWAsIHJ1bm5hYmxlU2NyaXB0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPlxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIG9wdHM6IE9wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnYuQ0kgPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0Vudi5GT1JDRV9DT0xPUiA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanNvbicsICdqc29uYycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIWJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUgb24gQnVuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKCFpc1J1bm5pbmdPbkJ1bikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBCdW4uJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXJndi5maWxlcyA/PyBbXTtcbiAgICBsZXQgYmlvbWVBcmdzVGV4dDogc3RyaW5nO1xuICAgIGxldCBwcmV0dGllckFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0OiBzdHJpbmc7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGUpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnNsaWNlKDEpO1xuICAgICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmlvbWVBcmdzVGV4dCA9IGZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZS5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBmaWxlUGF0aHNUb0JlRm9ybWF0dGVkQnlQcmV0dGllci5tYXAoKGYpID0+IGBcIiR7Zn1cImApLmpvaW4oJyAnKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0ID0gcGFja2FnZUpzb25GaWxlUGF0aHMubWFwKChmKSA9PiBgXCIke2Z9XCJgKS5qb2luKCcgJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJnc1RleHQgPSAnJztcbiAgICAgIHByZXR0aWVyQXJnc1RleHQgPSBgXCIqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJnc1RleHQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IGBcIiR7cC5wYWNrYWdlSnNvblBhdGh9XCJgKS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlvbWVDb21tYW5kID1cbiAgICAgIGFyZ3YuZml4ICYmIGFyZ3YuZm9ybWF0ID8gJ2NoZWNrIC0tZml4JyA6IGFyZ3YuZml4ID8gJ2xpbnQgLS1maXgnIDogYXJndi5mb3JtYXQgPyAnZm9ybWF0IC0tZml4JyA6ICdsaW50JztcbiAgICBsZXQgYmlvbWVQcm9taXNlOiBQcm9taXNlPG51bWJlcj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGJpb21lQXJnc1RleHQgfHwgZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBiaW9tZVByb21pc2UgPSBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICBgYnVuIC0tYnVuIGJpb21lICR7YmlvbWVDb21tYW5kfSAtLWNvbG9ycz1mb3JjZSAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1maWxlcy1pZ25vcmUtdW5rbm93bj10cnVlICR7YmlvbWVBcmdzVGV4dH1gLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBpZiAocHJldHRpZXJBcmdzVGV4dCkge1xuICAgICAgICB2b2lkIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgICAgYGJ1biAtLWJ1biBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlICR7cHJldHRpZXJBcmdzVGV4dH1gLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3NUZXh0KSB7XG4gICAgICAgIGF3YWl0IGJpb21lUHJvbWlzZTtcbiAgICAgICAgdm9pZCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBidW4gLS1idW4gc29ydC1wYWNrYWdlLWpzb24gJHtzb3J0UGFja2FnZUpzb25BcmdzVGV4dH1gLCBwcm9qZWN0cy5zZWxmLCBhcmd2LCB7XG4gICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24qIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nLCBwcm9qZWN0czogUHJvamVjdFtdKTogR2VuZXJhdG9yPFByb2plY3QsIHZvaWQsIHVua25vd24+IHtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiJHtjb21tYW5kTmFtZX1cIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgeWllbGQgcHJvamVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICBjb25zdCBrZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldID8/IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3Y6IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFhcmd2Lm91dHNpZGUpIHtcbiAgICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuICAgIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRldkRlcHMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdiaW9tZScsXG4gICAgJ2NvbmN1cnJlbnRseScsXG4gICAgJ2NvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgJ2VzbGludCcsXG4gICAgJ2h1c2t5JyxcbiAgICAnaW1hZ2VtaW4nLFxuICAgICdqZXN0JyxcbiAgICAna2lsbC1wb3J0JyxcbiAgICAnbGludC1zdGFnZWQnLFxuICAgICdvcGVuLWNsaScsXG4gICAgJ3BsYXl3cmlnaHQnLFxuICAgICdwcmV0dGllcicsXG4gICAgJ3BpbnN0JyxcbiAgICAncmFpbHdheScsXG4gICAgJ3NlbWFudGljLXJlbGVhc2UnLFxuICAgICdzb3J0LXBhY2thZ2UtanNvbicsXG4gICAgJ3dhaXQtb24nLFxuICAgICd2aXRlc3QnLFxuICBdO1xuICBjb25zdCByZW1vdmVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRldkRlcHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzVG9CZVJlbW92ZWQuc29tZSgod29yZCkgPT4gbmFtZS5pbmNsdWRlcyh3b3JkKSkgfHxcbiAgICAgIChuYW1lLmluY2x1ZGVzKCd3aWxsYm9vc3RlcicpICYmIG5hbWUuaW5jbHVkZXMoJ2NvbmZpZycpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGRldkRlcHNbbmFtZV07XG4gICAgICByZW1vdmVkRGVwcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZGV2RGVwZW5kZW5jaWVzOicsIHJlbW92ZWREZXBzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsnY2hlY2snLCAnZGVwbG95JywgJ2Zvcm1hdCcsICdsaW50JywgJ3N0YXJ0JywgJ3Rlc3QnXTtcbiAgY29uc3QgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ3BpbnN0ICcsICdodXNreSAnXTtcbiAgY29uc3Qgc2NyaXB0cyA9IChwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdCByZW1vdmVkU2NyaXB0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBuYW1lLnN0YXJ0c1dpdGgod29yZCkpIHx8XG4gICAgICAvLyBTdXBwb3J0IFwiaHVza3lcIiBzaW5jZSBodXNreSB2OSByZXF1aXJlcyBgXCJwb3N0aW5zdGFsbFwiOiBcImh1c2t5XCJgXG4gICAgICBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cy5zb21lKCh3b3JkKSA9PiBjb250ZW50LmluY2x1ZGVzKHdvcmQpIHx8IGNvbnRlbnQudHJpbSgpID09PSB3b3JkLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzY3JpcHRzW25hbWVdO1xuICAgICAgcmVtb3ZlZFNjcmlwdHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIHNjcmlwdHM6JywgcmVtb3ZlZFNjcmlwdHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByaXZhdGU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJldHRpZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCwgYmFja3VwUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICAgIC8vIERvbid0IHNraXAgXCJtaWdyYXRlIGRlcGxveVwiIGJlY2F1c2UgcmVzdG9yZWQgZGF0YWJhc2UgbWF5IGJlIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgc2NoZW1hLlxuICAgIHJldHVybiBgcm0gLVJmICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzKjsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAmJiBybSAtUmYgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMqXG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLW8gJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTMgJHtiYWNrdXBQYXRofSAmJiBscyAtYWhsICR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXRlc3RyZWFtKF86IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtydW50aW1lV2l0aEFyZ3N9IC1lICdcbmNvbnN0IHsgUHJpc21hQ2xpZW50IH0gPSByZXF1aXJlKFwiQHByaXNtYS9jbGllbnRcIik7XG5uZXcgUHJpc21hQ2xpZW50KCkuJHF1ZXJ5UmF3XFxgUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDtcXGBcbiAgLmNhdGNoKChlcnJvcikgPT4geyBjb25zb2xlLmxvZyhcIkZhaWxlZCBkdWUgdG86XCIsIGVycm9yKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtcbidgO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfSAmJiBQUklTTUEgZ2VuZXJhdGUgJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCR7YWRkaXRpb25hbE9wdGlvbnMgPyBgICR7YWRkaXRpb25hbE9wdGlvbnN9YCA6ICcnfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBiYWNrdXBQYXRoOiBzdHJpbmcsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgICByZXR1cm4gYHJtIC1SZiAke2Rpck5hbWV9L3Jlc3RvcmVkLnNxbGl0ZTM7IEdPT0dMRV9BUFBMSUNBVElPTl9DUkVERU5USUFMUz1nY3Atc2Eta2V5Lmpzb24gbGl0ZXN0cmVhbSByZXN0b3JlIC1vICR7b3V0cHV0UGF0aH0gJHtiYWNrdXBQYXRofWA7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBQT1NTSUJMRV9QQVRIUyA9IFtcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgICAgICAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICAgICAgICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbiAgICAgIF07XG4gICAgICBmb3IgKGNvbnN0IHsgZGJQYXRoLCBzY2hlbWFQYXRoIH0gb2YgUE9TU0lCTEVfUEFUSFMpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKSB7XG4gICAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICAgICAgZGJQYXRoLFxuICAgICAgICAgICAgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8ke2FkZGl0aW9uYWxPcHRpb25zID8gYCAke2FkZGl0aW9uYWxPcHRpb25zfWAgOiAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBkZXNjcmliZTogJ1J1biBwcmlzbWEgY29tbWFuZHMnLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdiYWNrdXAtcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2tpcCBhY3R1YWwgY29tbWFuZCBleGVjdXRpb24nLFxuICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2InLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlcGxveUZvcmNlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlIDxiYWNrdXAtcGF0aD4nLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcjogZGVwbG95Rm9yY2VCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0LCBhcmd2LmJhY2t1cFBhdGgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBEQiBmb3IgTGl0ZXN0cmVhbScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBsaXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmRlcGxveUZvcmNlQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZSA8YmFja3VwLXBhdGg+JyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICBhcmd2Lm91dHB1dCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXN0b3JlKHByb2plY3QsIGFyZ3YuYmFja3VwUGF0aCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmtub3duT3B0aW9ucy5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICAgIHBhY2thZ2VzLnB1c2goJ2V4cGVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBub3JtYWxpemVkQXJnc1RleHQ/OiBzdHJpbmc7XG4gIG5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PlxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYClcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKS5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZXZOdWxsKGFyZ3Y6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gKGFyZ3YgYXMgeyBzaWxlbnQ6IGJvb2xlYW4gfSkuc2lsZW50ID8gYCA+IC9kZXYvbnVsbGAgOiAnJztcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuLyoqXG4gKiBGaW5kcyBhbiBhdmFpbGFibGUgcG9ydCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBwb3J0IG51bWJlci5cbiAqIEBwYXJhbSBzdGFydFBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20gKGRlZmF1bHQ6IDMwMDApXG4gKiBAcGFyYW0gbWF4QXR0ZW1wdHMgLSBNYXhpbXVtIG51bWJlciBvZiBwb3J0cyB0byB0cnkgKGRlZmF1bHQ6IDEwMClcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGF2YWlsYWJsZSBwb3J0IG51bWJlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEF2YWlsYWJsZVBvcnQoc3RhcnRQb3J0ID0gMzAwMCwgbWF4QXR0ZW1wdHMgPSAxMDApOiBQcm9taXNlPG51bWJlcj4ge1xuICBmb3IgKGxldCBwb3J0ID0gc3RhcnRQb3J0OyBwb3J0IDwgc3RhcnRQb3J0ICsgbWF4QXR0ZW1wdHM7IHBvcnQrKykge1xuICAgIGlmIChhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpIHtcbiAgICAgIHJldHVybiBwb3J0O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYE5vIGF2YWlsYWJsZSBwb3J0IGZvdW5kIGluIHJhbmdlICR7c3RhcnRQb3J0fS0ke3N0YXJ0UG9ydCArIG1heEF0dGVtcHRzIC0gMX1gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzUG9ydEF2YWlsYWJsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG5cbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMTI3LjAuMC4xJyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkRGV2SW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCB1bmJ1ZmZlciA9IGZhbHNlLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3VuYnVmZmVyID8gJ3VuYnVmZmVyICcgOiAnJ30ke3RoaXMuc3RhcnQoXG4gICAgICBwcm9qZWN0LFxuICAgICAgYWRkaXRpb25hbE9wdGlvbnMsXG4gICAgICBhZGRpdGlvbmFsQXJnc1xuICAgICl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtIC1pdCAtcCBcXCR7UE9SVDotODA4MH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5leHBvcnQgdHlwZSBUZXN0RTJFRGV2T3B0aW9ucyA9IHtcbiAgLy8gJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nO1xuICBzdGFydENvbW1hbmQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBUZXN0RTJFT3B0aW9ucyA9IHtcbiAgcHJpc21hRGlyZWN0b3J5Pzogc3RyaW5nO1xufSAmIFRlc3RFMkVEZXZPcHRpb25zO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb24gPSAnZGV2ZWxvcG1lbnQnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZERldkltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgYWJzdHJhY3Qgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcblxuICBhYnN0cmFjdCBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuXG4gIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgODA4MDtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0ke3RvRGV2TnVsbChhcmd2KX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgICApfVwiXG4gICAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzID0gJ3Rlc3QgdGVzdC9lMmUvJywgcHJpc21hRGlyZWN0b3J5LCBzdGFydENvbW1hbmQgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCJybSAtUmYgJHtwcmlzbWFEaXJlY3Rvcnl9L21vdW50ICYmICR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgQlVOIHBsYXl3cmlnaHQgJHtwbGF5d3JpZ2h0QXJncyA9PT0gJ3Rlc3QgdGVzdC9lMmUvJyA/IGB0ZXN0ICR7dGVzdFRhcmdldH1gIDogcGxheXdyaWdodEFyZ3N9JHtzdWZmaXh9XCJgO1xuICB9XG5cbiAgdGVzdEUyRURldihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgcGxheXdyaWdodEFyZ3MgPSAndGVzdCB0ZXN0L2UyZS8nLCBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgIHJldHVybiBgV0JfRU5WPSR7ZW52fSBORVhUX1BVQkxJQ19XQl9FTlY9JHtlbnZ9IEFQUF9FTlY9JHtlbnZ9IFBPUlQ9JHtwb3J0fSBZQVJOIGNvbmN1cnJlbnRseSAtLWtpbGwtb3RoZXJzIC0tcmF3IC0tc3VjY2VzcyBmaXJzdFxuICAgICAgXCIke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxXCJcbiAgICAgIFwid2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmIEJVTiBwbGF5d3JpZ2h0ICR7cGxheXdyaWdodEFyZ3MgPT09ICd0ZXN0IHRlc3QvZTJlLycgPyBgdGVzdCAke3Rlc3RUYXJnZXR9YCA6IHBsYXl3cmlnaHRBcmdzfSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIGFic3RyYWN0IHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L3VuaXQvJztcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IFlBUk4gdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHlgO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9IGJ1biB0ZXN0ICR7dGVzdFRhcmdldH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAzMDAwKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgMzAwMCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2LFxuICAgICAgcG9ydFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuLi8uLi91dGlscy9maW5kUG9ydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCAzMDAwO1xuICAgIHJldHVybiBgJHthcHBFbnZ9WUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcImJsaXR6IGRldiAtcCAke3BvcnR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFwcEVudiA9IHByb2plY3QuZW52LldCX0VOViA/IGBBUFBfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfSBgIDogJyc7XG4gICAgcmV0dXJuIGAke2FwcEVudn1OT0RFX0VOVj1wcm9kdWN0aW9uIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCIke1tcbiAgICAgICAgcHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YCxcbiAgICAgIF0uam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgXVxuICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAuam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLnByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJyksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kIH06IFRlc3RFMkVEZXZPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3QgZGVmYXVsdFN0YXJ0Q29tbWFuZCA9IGBibGl0eiBkZXYgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfWA7XG4gICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVEZXYocHJvamVjdCwgYXJndiwgeyBwbGF5d3JpZ2h0QXJncywgc3RhcnRDb21tYW5kOiBzdGFydENvbW1hbmQgPz8gZGVmYXVsdFN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoKTtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJibGl0eiBkZXYgLXAgJHtwb3J0fSR7dG9EZXZOdWxsKGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmluZFBvcnQuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RFMkVEZXZPcHRpb25zLCBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFBPUlQ9JHtwb3J0fSBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QpfSR7dG9EZXZOdWxsKGFyZ3YpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgcHJvamVjdCxcbiAgICAgIGZhbHNlLFxuICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0ID0gODA4MCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7XG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZFxuICAgIH0ke3RvRGV2TnVsbChhcmd2KX0gJiYgTk9ERV9FTlY9cHJvZHVjdGlvbiBQT1JUPVxcJHtQT1JUOi0ke3BvcnR9fSAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuaGFzUHJpc21hID8gJ3ByaXNtYSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLWdlbmVyYXRlICYmICcgOiAnJ30oJHt0aGlzLnN0YXJ0UHJvZHVjdGlvbihcbiAgICAgIHByb2plY3QsXG4gICAgICBhcmd2XG4gICAgKX0pYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7XG4gICAgICBzdGFydENvbW1hbmQgPSBgJHtwcm9qZWN0Lmhhc1ByaXNtYSA/ICdwcmlzbWEgbWlncmF0ZSByZXNldCAtLWZvcmNlIC0tc2tpcC1nZW5lcmF0ZSAmJiAnIDogJyd9KCR7dGhpcy5zdGFydFByb2R1Y3Rpb24oXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICl9KWAsXG4gICAgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVCB8fCAnODA4MCc7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke3N1ZmZpeH1cImA7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCB7IHN0YXJ0Q29tbWFuZCB9OiBUZXN0RTJFRGV2T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0ZXN0VGFyZ2V0ID0gYXJndi50YXJnZXRzICYmIGFyZ3YudGFyZ2V0cy5sZW5ndGggPiAwID8gYXJndi50YXJnZXRzLmpvaW4oJyAnKSA6ICd0ZXN0L2UyZS8nO1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBXQl9FTlY9JHtcbiAgICAgIHByb2plY3QuZW52LldCX0VOVlxuICAgIH0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kID8/IHRoaXMuc3RhcnQocHJvamVjdCwgYXJndil9ICYmIGV4aXQgMVwiXG4gICAgICBcIndhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiB2aXRlc3QgcnVuICR7dGVzdFRhcmdldH0gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyAtLWFsbG93T25seSR7c3VmZml4fVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoKTtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwiJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfVwiIFwiJHt0aGlzLndhaXRBcHAocHJvamVjdCwgYXJndiwgcG9ydCl9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kQXZhaWxhYmxlUG9ydCB9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbmRQb3J0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEUyRURldk9wdGlvbnMsIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIG92ZXJyaWRlIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvamVjdC5lbnYuUE9SVCkgfHwgMzAwMDtcbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgXCJuZXh0IGRldiAtLXR1cmJvcGFjayAtcCAke3BvcnR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgTk9ERV9FTlY9cHJvZHVjdGlvbiBZQVJOIGNvbmN1cnJlbnRseSAtLXJhdyAtLWtpbGwtb3RoZXJzLW9uLWZhaWxcbiAgICAgIFwiJHtbXG4gICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYFBPUlQ9JHtwb3J0fSBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YCxcbiAgICAgIF0uam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpIDogW10pLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgXVxuICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAuam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ2RiJyxcbiAgICAgIHN0YXJ0Q29tbWFuZDpcbiAgICAgICAgb3B0aW9ucy5zdGFydENvbW1hbmQgPz9cbiAgICAgICAgW1xuICAgICAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksXG4gICAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgICBdXG4gICAgICAgICAgLm1hcCgoYykgPT4gYCR7Yy50cmltKCl9JHt0b0Rldk51bGwoYXJndil9YClcbiAgICAgICAgICAuam9pbignICYmICcpLFxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgeyBzdGFydENvbW1hbmQgfTogVGVzdEUyRURldk9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUIHx8ICc4MDgwJztcbiAgICBjb25zdCBkZWZhdWx0U3RhcnRDb21tYW5kID0gYG5leHQgZGV2IC0tdHVyYm9wYWNrIC1wICR7cG9ydH0ke3RvRGV2TnVsbChhcmd2KX1gO1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgc3RhcnRDb21tYW5kOiBzdGFydENvbW1hbmQgPz8gZGVmYXVsdFN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoKTtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCJuZXh0IGRldiAtLXR1cmJvcGFjayAtcCAke3BvcnR9JHt0b0Rldk51bGwoYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGBQT1JUPSR7cG9ydH0gWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0KX0ke3RvRGV2TnVsbChhcmd2KX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgIHByb2plY3QsXG4gICAgICBmYWxzZSxcbiAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICApfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOT0RFX0VOVj1wcm9kdWN0aW9uICR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIE5PREVfRU5WPXByb2R1Y3Rpb24gJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHtcbiAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgfWA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBlY2hvICdkbyBub3RoaW5nLidgO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZWNobyAnZG8gbm90aGluZy4nYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRBdmFpbGFibGVQb3J0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmluZFBvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFRGV2T3B0aW9ucywgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBvdmVycmlkZSBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDMwMDA7XG4gICAgcmV0dXJuIGBQT1JUPSR7cG9ydH0gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcInJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYE5PREVfRU5WPXByb2R1Y3Rpb24gWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7cHJpc21hU2NyaXB0cy5taWdyYXRlKHByb2plY3QpfSAmJiAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBQT1JUPSR7cG9ydH0gcG0yLXJ1bnRpbWUgc3RhcnQgJHtwcm9qZWN0LmZpbmRGaWxlKFxuICAgICAgICAnZWNvc3lzdGVtLmNvbmZpZy5janMnXG4gICAgICApfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9qZWN0LmVudi5QT1JUKSB8fCA4MDgwO1xuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7W1xuICAgICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYHBtMi1ydW50aW1lIHN0YXJ0ICR7cHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKX1gLFxuICAgICAgXVxuICAgICAgICAubWFwKChjKSA9PiBgJHtjLnRyaW0oKX0ke3RvRGV2TnVsbChhcmd2KX1gKVxuICAgICAgICAuam9pbignICYmICcpfVwiXG4gICAgICBcIiR7dGhpcy53YWl0QXBwKHByb2plY3QsIGFyZ3YsIHBvcnQpfVwiYDtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkUocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VwZXIudGVzdEUyRShwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJnczogb3B0aW9ucy5wbGF5d3JpZ2h0QXJncyxcbiAgICAgIHByaXNtYURpcmVjdG9yeTogJ3ByaXNtYScsXG4gICAgICBzdGFydENvbW1hbmQ6XG4gICAgICAgIG9wdGlvbnMuc3RhcnRDb21tYW5kID8/XG4gICAgICAgIFtcbiAgICAgICAgICAuLi5wcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QpLnNwbGl0KCcmJicpLFxuICAgICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICAgIGBwbTItcnVudGltZSBzdGFydCAke3Byb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyl9YCxcbiAgICAgICAgXVxuICAgICAgICAgIC5tYXAoKGMpID0+IGAke2MudHJpbSgpfSR7dG9EZXZOdWxsKGFyZ3YpfWApXG4gICAgICAgICAgLmpvaW4oJyAmJiAnKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICB7IHBsYXl3cmlnaHRBcmdzLCBzdGFydENvbW1hbmQgPSBgcmVtaXggZGV2JHt0b0Rldk51bGwoYXJndil9YCB9OiBUZXN0RTJFRGV2T3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci50ZXN0RTJFRGV2KHByb2plY3QsIGFyZ3YsIHsgcGxheXdyaWdodEFyZ3MsIHN0YXJ0Q29tbWFuZCB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoKTtcbiAgICByZXR1cm4gYFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn0gUE9SVD0ke3BvcnR9IFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0IFwicmVtaXggZGV2JHt0b0Rldk51bGwoYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0LCBhcmd2LCBwb3J0KX1cImA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnLCAnaG9ubyddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnU3RhcnQgYXBwJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICdkZXZlbG9wbWVudCcpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0KHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0YWdpbmcnOiB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlndXJlRW52aXJvbm1lbnRWYXJpYWJsZXMoZGVwcywgJ3N0YWdpbmcnKTtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHByb2plY3QuZW52LlBPUlQpIHx8IDgwODA7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnRQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHBvcnQpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwcmVmaXh9JHtzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzLCAnc3RhZ2luZycpO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJlZml4fSR7c2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzKGRlcHMsICd0ZXN0Jyk7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3ByZWZpeH0ke3NjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjb25maWd1cmVFbnZpcm9ubWVudFZhcmlhYmxlcyhkZXBzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LCB3YkVudjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSB3YkVudjtcbiAgbGV0IHByZWZpeCA9IGBXQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIGlmIChkZXBzLm5leHQpIHtcbiAgICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19XQl9FTlYgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gICAgcHJlZml4ICs9IGBORVhUX1BVQkxJQ19XQl9FTlY9JHtwcm9jZXNzLmVudi5XQl9FTlZ9IGA7XG4gIH1cbiAgcmV0dXJuIHByZWZpeDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFMmUgdGVzdCBtb2RlOiBoZWFkbGVzcyAoZGVmYXVsdCkgfCBoZWFkbGVzcy1kZXYgfCBoZWFkZWQgfCBoZWFkZWQtZGV2IHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgZGVidWcgfCBnZW5lcmF0ZSB8IHRyYWNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4nLFxuICBidWlsZGVyOiB7IC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICBwcm9jZXNzLmVudi5DSSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAoYXJndi50YXJnZXRzID8/IFtdKSBhcyBzdHJpbmdbXTtcbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSB0ZXN0VGFyZ2V0cy5sZW5ndGggPT09IDA7XG5cbiAgLy8gRGV0ZWN0IHRlc3QgbW9kZXMgZnJvbSB0YXJnZXQgcGF0aHNcbiAgY29uc3QgaGFzRTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICBjb25zdCBoYXNVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgY29uc3Qgc2hvdWxkUnVuVW5pdCA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzO1xuICBjb25zdCBzaG91bGRSdW5FMmUgPSBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNFMmVUYXJnZXRzO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICBjb25zdCB1bml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IHVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyB1bml0VGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLCBwcm9qZWN0LCBhcmd2LCB7IHRpbWVvdXQ6IGFyZ3YudW5pdFRpbWVvdXQgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgZTJlIHRlc3RzIGlmIG5vdCBuZWVkZWQgb3Igbm8gZTJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIXNob3VsZFJ1bkUyZSB8fCAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuXG4gICAgc3dpdGNoIChhcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgZTJlQXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge30pLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBlMmVBcmd2LCBzY3JpcHRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGNvbnN0IGUyZVRhcmdldCA9IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgICAgIGF3YWl0IHRlc3RPbkRvY2tlcihwcm9qZWN0LCBlMmVBcmd2LCBzY3JpcHRzLCBgdGVzdCAke2UyZVRhcmdldH0gLS1kZWJ1Z2ApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIGNvbnN0IGUyZVRhcmdldCA9IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2UyZVRhcmdldH0gLS1oZWFkZWRgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgdGVzdCAke2UyZVRhcmdldH0gLS1kZWJ1Z2AgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQgfHwgJzgwODAnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBlMmVBcmd2LCB7IHBsYXl3cmlnaHRBcmdzOiBgY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBwcm9jZXNzLmVudi5XQl9ET0NLRVIgPz89ICcxJztcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICBzY3JpcHRzLnRlc3RFMkUocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBzdGFydENvbW1hbmQ6IGAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIHRydWUpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsXG4gICAgfSksXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB0ZXN0T25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0LW9uLWNpJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3Qgb24gQ0kgd2l0aCBubyBvcHRpb25zLicsXG4gIGJ1aWxkZXI6IHRlc3RPbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdE9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdE9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAocHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSkge1xuICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgIHByb2Nlc3MuZW52LkNJID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SID8/PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRE9DS0VSID8/PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBvcHRpb25zID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc3RhcnRDb21tYW5kOiBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCB0cnVlKSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdHMudGVzdEUyRShwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQgLS1QcmV0dHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICAgICkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0IC0tUHJldHR5Jyk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICAgIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5hbEV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4gcHJvY2Vzcy5leGl0KCkpO1xufVxuIl0sIm5hbWVzIjpbImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52Iiwic2V0IiwiYXN5bmMiLCJzcGF3bkFzeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiUHJvbWlzZSIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInN0ZG91dCIsInNldEVuY29kaW5nIiwic3RkZXJyIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJwcm9jZXNzIiwid3JpdGUiLCJtZXJnZU91dEFuZEVycm9yIiwicHJpbnRpbmdTdGRlcnIiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJwaWQiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJ0cmVlS2lsbCIsImtpbGxPbkV4aXQiLCJlcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiY29kZSIsInNpZ25hbCIsInVuZGVmaW5lZCIsIkVycm9yIiwic3RhdHVzIiwiaW5wdXQiLCJzdGRpbiIsImVuZCIsInQiLCJzIiwiaSIsImUiLCJuIiwiZW50cmllcyIsImgiLCJibG9ja3MiLCJyZXNldCIsImZpbmFsaXplZCIsImJsb2NrIiwic3RhcnQiLCJsYXN0Qnl0ZUluZGV4IiwiY29uc3RydWN0b3IiLCJ0aGlzIiwicGFkZGluZyIsIm91dHB1dEJpdHMiLCJibG9ja0NvdW50IiwiYnl0ZUNvdW50Iiwib3V0cHV0QmxvY2tzIiwiZXh0cmFCeXRlcyIsInVwZGF0ZSIsIm8iLCJsZW5ndGgiLCJsIiwiYyIsImYiLCJjb2RlUG9pbnRBdCIsInIiLCJmaW5hbGl6ZSIsImhleCIsImEiLCJ1IiwiZCIsImIiLCJrIiwieSIsIngiLCJCIiwicCIsIkMiLCJ6IiwiSSIsImciLCJ3IiwiQSIsIlAiLCJFIiwiaiIsIm0iLCJxIiwidiIsIkQiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiJCIsIl8iLCJ0dCIsInN0IiwiaXQiLCJldCIsIm90IiwibnQiLCJodCIsInJ0IiwibHQiLCJjdCIsImZ0IiwiaW5zdGFuY2UiLCJmcm9tIiwibmFtZSIsIm1lc3NhZ2UiLCJzdGFjayIsInB1c2giLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsIlJlZ0V4cCIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIm1hcCIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJKU09OIiwic3RyaW5naWZ5IiwiTnVtYmVyIiwiaXNOYU4iLCJpc0Zpbml0ZSIsInRvU3RyaW5nIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsbCIsInNsaWNlIiwiT2JqZWN0IiwiY2FjaGVEdXJhdGlvbiIsIlBPU0lUSVZFX0lORklOSVRZIiwiZ2V0Q2FjaGVLZXkiLCJraW5kIiwibm93IiwiY2FsbCIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsIm1lbW9pemVPbmUiLCJhcmd2IiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsInRlc3QiLCJmcyIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJyb290RGlyUGF0aCIsImJ1aWxkQ29tbWFuZCIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImJ1aWxkIiwiaW5jbHVkZXMiLCJleGlzdHNTeW5jIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJyZXBsYWNlQWxsIiwiZW52IiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwiZW52UGF0aEFuZEVudlZhckNvdW50UGFpcnMiLCJjb3VudCIsImtleSIsInZhbHVlIiwiY2hlY2tFbnYiLCJtaXNzaW5nS2V5cyIsImtleXMiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYXJzZSIsInBhY2thZ2VKc29uUGF0aCIsImhhc1ByaXNtYSIsImRlcGVuZGVuY2llcyIsInByaXNtYSIsImRldkRlcGVuZGVuY2llcyIsImhhc1ZpdGVzdCIsInZpdGVzdCIsImRvY2tlclBhY2thZ2VKc29uIiwiZGlybmFtZSIsImJpbkV4aXN0cyIsImJpbkZvdW5kIiwiY3VycmVudFBhdGgiLCJiaW5QYXRoIiwiUEFUSCIsInBhcmVudFBhdGgiLCJmaWxlTmFtZSIsImZpbmQiLCJmaW5kU2VsZlByb2plY3QiLCJmaW5kRGVzY2VuZGFudFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwiZW5kc1dpdGgiLCJyb290Iiwic2VsZiIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwiZGVzY2VuZGFudHMiLCJnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMiLCJwcm9qZWN0cyIsIndvcmtzcGFjZSIsImdsb2JQYXR0ZXJuIiwicGFja2FnZURpcnMiLCJ3b3Jrc3BhY2VQYXRoIiwid3MiLCJnbG9iYnkiLCJkb3QiLCJvbmx5RGlyZWN0b3JpZXMiLCJzdWJQYWNrYWdlRGlyUGF0aCIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJhbGlhcyIsImhhbmRsZXIiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInRyaW0iLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiaGFzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInN0ZGlvIiwiZW5jb2RpbmciLCJzcGxpdCIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSGFuZGxpbmdFcnJvcnMiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsInByaW50YWJsZVNjcmlwdCIsInJ1bm5hYmxlU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJleGVjIiwia2lsbEZ1bmMiLCJraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCIsImNvbmZpZ3VyZUVudiIsInRpbWVvdXQiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiYmxpdHoiLCJmaXhCdW5Db21tYW5kIiwibm9ybWFsaXplZFNjcmlwdCIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJleGl0IiwibmV3RW52IiwiY2kiLCJDSSIsImZvcmNlQ29sb3IiLCJGT1JDRV9DT0xPUiIsImJpb21lRXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwiYmlvbWVBcmdzVGV4dCIsInByZXR0aWVyQXJnc1RleHQiLCJzb3J0UGFja2FnZUpzb25BcmdzVGV4dCIsImZpbGVQYXRoc1RvQmVDaGVja2VkQnlCaW9tZSIsImZpbGVQYXRoc1RvQmVGb3JtYXR0ZWRCeVByZXR0aWVyIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJmaWxlIiwiU3RyaW5nIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImJpb21lQ29tbWFuZCIsImJpb21lUHJvbWlzZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsInN0YXJ0c1dpdGgiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYVNjcmlwdHMiLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsImRlcGxveUZvcmNlIiwiYmFja3VwUGF0aCIsImRpck5hbWUiLCJsaXRlc3RyZWFtIiwibWlncmF0ZSIsInNlZWQiLCJtaWdyYXRlRGV2IiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJGSUxFX1NDSEVNQSIsIkRBVEFCQVNFX1VSTCIsIlBPU1NJQkxFX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiZGVmYXVsdCIsImJ1aWxkZXIiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwibGl0ZXN0cmVhbUNvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmRQcmlzbWFQcm9qZWN0cyIsInVua25vd25PcHRpb25zIiwiZXh0cmFjdFVua25vd25PcHRpb25zIiwiZGVwbG95Rm9yY2VCdWlsZGVyIiwiZGVtYW5kT3B0aW9uIiwib3V0cHV0IiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJCb29sZWFuIiwiZmlsdGVyZWQiLCJrbm93bk9wdGlvbnMiLCJzaGFyZWRPcHRpb25LZXlzIiwic2hhcmVkT3B0aW9uQWxpYXNlcyIsIm9wdGlvbiIsImFsbEtub3duT3B0aW9ucyIsImtlYmFiQ2FzZUtleSIsIm1hdGNoIiwidG9Mb3dlckNhc2UiLCJpdGVtIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJjbWRBbmRBcmdzIiwibGFzdFN0YXR1cyIsInllbGxvdyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGxhdGZvcm0iLCJwYWNrYWdlcyIsImlzRmlsZSIsInZlcnNpb24iLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwidG9EZXZOdWxsIiwic2lsZW50IiwiZmluZEF2YWlsYWJsZVBvcnQiLCJzdGFydFBvcnQiLCJtYXhBdHRlbXB0cyIsImlzUG9ydEF2YWlsYWJsZSIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsIm9uY2UiLCJlcnIiLCJjbG9zZSIsImxpc3RlbiIsImRvY2tlclNjcmlwdHMiLCJidWlsZERldkltYWdlIiwic3RvcEFuZFN0YXJ0IiwidW5idWZmZXIiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJidWlsZERvY2tlciIsInN0YXJ0RG9ja2VyIiwiUE9SVCIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsIndhaXRBbmRPcGVuQXBwIiwidGVzdEUyRSIsInBsYXl3cmlnaHRBcmdzIiwicHJpc21hRGlyZWN0b3J5Iiwic3RhcnRDb21tYW5kIiwidGVzdFRhcmdldCIsInRhcmdldHMiLCJ0ZXN0RTJFRGV2IiwidGVzdFVuaXQiLCJ3YWl0QXBwIiwiYmxpdHpTY3JpcHRzIiwiYXBwRW52Iiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRUZXN0Iiwic3VwZXIiLCJkZWZhdWx0U3RhcnRDb21tYW5kIiwidGVzdFN0YXJ0IiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwicmVtaXhTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImFyZyIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsImNvbmZpZ3VyZUVudmlyb25tZW50VmFyaWFibGVzIiwid2JFbnYiLCJORVhUX1BVQkxJQ19XQl9FTlYiLCJ0ZXN0Q29tbWFuZCIsImUyZSIsImNob2ljZXMiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkFsbFRlc3RzIiwiaGFzRTJlVGFyZ2V0cyIsInRhcmdldCIsImhhc1VuaXRUYXJnZXRzIiwic2hvdWxkUnVuVW5pdCIsInNob3VsZFJ1bkUyZSIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwidGVzdE9uRG9ja2VyIiwiZTJlVGFyZ2V0IiwiV0JfRE9DS0VSIiwidGVzdE9uQ2lDb21tYW5kIiwidGVzdE9uQ2kiLCJ0eXBlQ2hlY2tDb21tYW5kIiwiY29tbWFuZHMiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJleGl0Q29kZXMiLCJhbGwiLCJmaW5hbEV4aXRDb2RlIiwidGNDb21tYW5kIiwiaGlkZUJpbiIsInNjcmlwdE5hbWUiLCJtaWRkbGV3YXJlIiwid29ya2luZ0RpciIsImNoZGlyIiwiQkVSUllfQklOX0ZPTERFUiIsInVwcGVyS2V5IiwidG9VcHBlckNhc2UiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiXSwibWFwcGluZ3MiOiI0ZUF5SEEsTUFBTUEsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtDLFFBQVFOLEdBQVdPLFdBQVksQ0FBQSxJQUFNSixRQUFVLENBQUEsRUFFbEYsT0FEQU4sRUFBY1csSUFBSVIsRUFBVUcsR0FDckJBLENBQ1QsQ0M5RE9NLGVBQWVDLEVBQ3BCQyxFQUNBQyxFQUNBQyxHQUVBLE9BQU8sSUFBSUMsUUFBUSxDQUFDUixFQUFTUyxLQUMzQixJQUNFLE1BQU1DLEVBQU9DLEVBQU1OLEVBQVNDLEdBQVEsR0FBSUMsR0FBVyxJQUduREcsRUFBS0UsUUFBUUMsY0FBYyxRQUUzQkgsRUFBS0ksUUFBUUQsY0FBYyxRQUUzQixJQUFJRCxFQUFTLEdBQ1RFLEVBQVMsR0FDYkosRUFBS0UsUUFBUUcsR0FBRyxPQUFTQyxJQUN2QkosR0FBVUksRUFDTlQsR0FBU1UsZ0JBQ1hDLFFBQVFOLE9BQU9PLE1BQU1ILEtBR3pCTixFQUFLSSxRQUFRQyxHQUFHLE9BQVNDLElBQ25CVCxHQUFTYSxpQkFDWFIsR0FBVUksRUFFVkYsR0FBVUUsRUFFUlQsR0FBU2MsZ0JBQ1hILFFBQVFKLE9BQU9LLE1BQU1ILEtBSXpCLElBQUlNLEdBQVUsRUFDZCxNQUFNQyxFQUFjQSxNQUNkRCxHQUFZWixFQUFLYyxNQUVyQkYsR0FBVSxFQUNOZixHQUFTa0IsU0FDWEMsUUFBUUMsS0FBSyxZQUFZakIsRUFBS2MsUUFFaENJLEVBQVNsQixFQUFLYyxPQUVaakIsR0FBU3NCLGFBQ1hYLFFBQVFILEdBQUcsYUFBY1EsR0FDekJMLFFBQVFILEdBQUcsU0FBVVEsSUFHdkJiLEVBQUtLLEdBQUcsUUFBVWUsSUFDaEJaLFFBQVFhLGVBQWUsYUFBY1IsR0FDckNMLFFBQVFhLGVBQWUsU0FBVVIsR0FDakNiLEVBQUtzQixtQkFBbUIsU0FDeEJ2QixFQUFPcUIsS0FFVHBCLEVBQUtLLEdBQUcsUUFBUyxDQUFDa0IsRUFBcUJDLEtBQ3JDaEIsUUFBUWEsZUFBZSxhQUFjUixHQUNyQ0wsUUFBUWEsZUFBZSxTQUFVUixRQUNoQlksSUFBYnpCLEVBQUtjLElBQ1BmLEVBQU8sSUFBSTJCLE1BQU0sd0JBRWpCcEMsRUFBUSxDQUNOd0IsSUFBS2QsRUFBS2MsSUFDVlosU0FDQUUsU0FDQXVCLE9BQVFKLEVBQ1JDLGFBS0YzQixHQUFTK0IsUUFDWDVCLEVBQUs2QixPQUFPcEIsTUFBTVosRUFBUStCLE9BQzFCNUIsRUFBSzZCLE9BQU9DLE1BRWhCLENBQUUsTUFBT1YsR0FFUHJCLEVBQU9xQixFQUNULEdBRUo7Ozs7Ozs7O0dDM0lBLE1BQU1XLEVBQUUsSUFBSSxvQkFBb0JDLEVBQUUsQ0FBQyxFQUFFLEtBQUssT0FBTyxXQUFXQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLFdBQVcsV0FBVyxNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsV0FBVyxNQUFNLFdBQVcsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLFdBQVcsTUFBTSxXQUFXLE1BQU0sV0FBVyxNQUFNLFdBQVcsSUFBSSxXQUFXLE1BQU0sRUFBRSxXQUFXLFdBQVcsV0FBVyxXQUFXLE1BQU0sV0FBVyxXQUFXLEVBQUUsV0FBVyxZQUFrRSxNQUFNQyxFQUFFSixJQUFJLE1BQU1DLEVBQUUsR0FBRyxJQUFJLE1BQU1DLEVBQUVDLEtBQUtILEVBQUVLLFVBQVVKLEVBQUVDLEdBQUdDLEVBQUUsT0FBT0YsR0FBRyxNQUFNSyxFQUFFQyxPQUFPLEdBQUdOLEVBQUUsR0FBR08sT0FBTSxFQUFHQyxXQUFVLEVBQUdDLE1BQU0sRUFBRUMsTUFBTSxFQUFFQyxjQUFjLEVBQUUsV0FBQUMsQ0FBWWIsRUFBRUMsRUFBRUMsR0FBR1ksS0FBS0MsUUFBUWQsRUFBRWEsS0FBS0UsV0FBV2QsRUFBRVksS0FBS0csV0FBVyxNQUFNakIsR0FBRyxJQUFJLEVBQUVjLEtBQUtJLFVBQVVKLEtBQUtHLFlBQVksRUFBRUgsS0FBS0ssYUFBYWpCLEdBQUcsRUFBRVksS0FBS00sWUFBWSxHQUFHbEIsSUFBSSxFQUFFLElBQUksSUFBSUYsRUFBRSxFQUFFQSxFQUFFLEtBQUtBLEVBQUVjLEtBQUtiLEVBQUVELEdBQUcsQ0FBQyxDQUFDLE1BQUFxQixDQUFPckIsR0FBRyxHQUFHYyxLQUFLTCxVQUFVLE1BQU0sSUFBSWQsTUFBTSwyQkFBMkIsTUFBTU0sRUFBRWEsS0FBS1AsT0FBT0osRUFBRVcsS0FBS0ksVUFBVUksRUFBRXRCLEVBQUV1QixPQUFPbkIsRUFBRVUsS0FBS0csV0FBV1gsRUFBRVEsS0FBS2IsRUFBRSxJQUFJdUIsRUFBRUMsRUFBRUMsRUFBRSxFQUFFLEtBQUtBLEVBQUVKLEdBQUcsQ0FBQyxHQUFHUixLQUFLTixNQUFNLElBQUlNLEtBQUtOLE9BQU0sRUFBR1AsRUFBRSxHQUFHYSxLQUFLSixNQUFNYyxFQUFFLEVBQUVBLEVBQUVwQixFQUFFLElBQUlvQixFQUFFdkIsRUFBRXVCLEdBQUcsRUFBRSxJQUFJQSxFQUFFVixLQUFLSCxNQUFNZSxFQUFFSixHQUFHRSxFQUFFckIsSUFBSXVCLEVBQUVELEVBQUV6QixFQUFFMkIsWUFBWUQsSUFBSSxFQUFFRCxFQUFFLElBQUl4QixFQUFFdUIsR0FBRyxJQUFJQyxHQUFHdkIsRUFBRSxFQUFFc0IsS0FBS0MsRUFBRSxNQUFNeEIsRUFBRXVCLEdBQUcsS0FBSyxJQUFJQyxHQUFHLElBQUl2QixFQUFFLEVBQUVzQixLQUFLdkIsRUFBRXVCLEdBQUcsS0FBSyxJQUFJLEdBQUdDLElBQUl2QixFQUFFLEVBQUVzQixNQUFNQyxFQUFFLE9BQU9BLEdBQUcsT0FBT3hCLEVBQUV1QixHQUFHLEtBQUssSUFBSUMsR0FBRyxLQUFLdkIsRUFBRSxFQUFFc0IsS0FBS3ZCLEVBQUV1QixHQUFHLEtBQUssSUFBSUMsR0FBRyxFQUFFLEtBQUt2QixFQUFFLEVBQUVzQixLQUFLdkIsRUFBRXVCLEdBQUcsS0FBSyxJQUFJLEdBQUdDLElBQUl2QixFQUFFLEVBQUVzQixPQUFPQyxFQUFFLFFBQVEsS0FBS0EsSUFBSSxHQUFHLE1BQU16QixFQUFFMkIsY0FBY0QsSUFBSSxJQUFJekIsRUFBRXVCLEdBQUcsS0FBSyxJQUFJQyxHQUFHLEtBQUt2QixFQUFFLEVBQUVzQixLQUFLdkIsRUFBRXVCLEdBQUcsS0FBSyxJQUFJQyxHQUFHLEdBQUcsS0FBS3ZCLEVBQUUsRUFBRXNCLEtBQUt2QixFQUFFdUIsR0FBRyxLQUFLLElBQUlDLEdBQUcsRUFBRSxLQUFLdkIsRUFBRSxFQUFFc0IsS0FBS3ZCLEVBQUV1QixHQUFHLEtBQUssSUFBSSxHQUFHQyxJQUFJdkIsRUFBRSxFQUFFc0IsTUFBTSxHQUFHVixLQUFLRixjQUFjWSxFQUFFQSxHQUFHckIsRUFBRSxDQUFDLElBQUlXLEtBQUtILE1BQU1hLEVBQUVyQixFQUFFVyxLQUFLSixNQUFNVCxFQUFFRyxHQUFHb0IsRUFBRSxFQUFFQSxFQUFFcEIsSUFBSW9CLEVBQUVsQixFQUFFa0IsSUFBSXZCLEVBQUV1QixHQUFHSSxFQUFFdEIsR0FBR1EsS0FBS04sT0FBTSxDQUFFLE1BQU1NLEtBQUtILE1BQU1hLENBQUMsQ0FBQyxPQUFPVixJQUFJLENBQUMsUUFBQWUsR0FBVyxHQUFHZixLQUFLTCxVQUFVLE9BQU9LLEtBQUtMLFdBQVUsRUFBRyxNQUFNVCxFQUFFYyxLQUFLUCxPQUFPLElBQUlOLEVBQUVhLEtBQUtGLGNBQWMsTUFBTVYsRUFBRVksS0FBS0csV0FBV2QsRUFBRVcsS0FBS2IsRUFBRSxHQUFHRCxFQUFFQyxHQUFHLElBQUlhLEtBQUtDLFFBQVEsRUFBRWQsR0FBR2EsS0FBS0YsZ0JBQWdCRSxLQUFLSSxVQUFVLElBQUlsQixFQUFFLEdBQUdBLEVBQUVFLEdBQUdELEVBQUUsRUFBRUEsRUFBRUMsRUFBRSxJQUFJRCxFQUFFRCxFQUFFQyxHQUFHLEVBQUUsSUFBSUQsRUFBRUUsRUFBRSxJQUFJLFdBQVdELEVBQUUsRUFBRUEsRUFBRUMsSUFBSUQsRUFBRUUsRUFBRUYsSUFBSUQsRUFBRUMsR0FBRzJCLEVBQUV6QixFQUFFLENBQUMsR0FBQTJCLEdBQU1oQixLQUFLZSxXQUFXLE1BQU01QixFQUFFYSxLQUFLRyxXQUFXLElBQUlmLEVBQUVZLEtBQUtiLEVBQUUsTUFBTUUsRUFBRVcsS0FBS0ssYUFBYUcsRUFBRVIsS0FBS00sV0FBVyxJQUFJZCxFQUFFa0IsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsR0FBRyxLQUFLRCxFQUFFdEIsR0FBRyxDQUFDLElBQUlxQixFQUFFLEVBQUVBLEVBQUV2QixHQUFHd0IsRUFBRXRCLElBQUlxQixJQUFJQyxFQUFFbkIsRUFBRUosRUFBRXNCLEdBQUdFLEdBQUcxQixFQUFFTSxHQUFHLEVBQUUsSUFBSU4sRUFBRSxHQUFHTSxHQUFHTixFQUFFTSxHQUFHLEdBQUcsSUFBSU4sRUFBRU0sR0FBRyxFQUFFLElBQUlOLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEdBQUcsSUFBSU4sRUFBRU0sR0FBRyxHQUFHLElBQUlOLEVBQUVNLEdBQUcsR0FBRyxJQUFJbUIsRUFBRXhCLElBQUksSUFBSUMsRUFBRUUsRUFBRUYsR0FBRzBCLEVBQUUxQixHQUFHc0IsRUFBRSxFQUFFLENBQUMsT0FBT0YsSUFBSWhCLEVBQUVKLEVBQUVzQixHQUFHRSxHQUFHMUIsRUFBRU0sR0FBRyxFQUFFLElBQUlOLEVBQUUsR0FBR00sR0FBR2dCLEVBQUUsSUFBSUksR0FBRzFCLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEVBQUUsS0FBS2dCLEVBQUUsSUFBSUksR0FBRzFCLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEdBQUcsTUFBTW9CLENBQUMsRUFBRSxNQUFNRSxFQUFFLFNBQVM1QixHQUFHLElBQUlDLEVBQUVDLEVBQUVvQixFQUFFbEIsRUFBRUUsRUFBRXNCLEVBQUVKLEVBQUVDLEVBQUVDLEVBQUVLLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEVBQUVDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUdDLEdBQUcsSUFBSTlELEVBQUUsRUFBRUEsRUFBRSxHQUFHQSxHQUFHLEVBQUVsQixFQUFFSixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSU0sRUFBRU4sRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUk0QixFQUFFNUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl3QixFQUFFeEIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUl5QixFQUFFekIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUkwQixFQUFFMUIsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUkrQixFQUFFL0IsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlnQyxFQUFFaEMsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlpQyxFQUFFakMsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlrQyxFQUFFbEMsRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlDLEVBQUVnQyxHQUFHTCxHQUFHLEVBQUVKLElBQUksSUFBSXRCLEVBQUVnQyxHQUFHVixHQUFHLEVBQUVJLElBQUksSUFBSTVCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRUcsR0FBR3FCLEdBQUcsRUFBRUMsSUFBSSxJQUFJeEIsRUFBRUksR0FBR29CLEdBQUcsRUFBRUQsSUFBSSxJQUFJekIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFMkIsR0FBR0csR0FBRyxFQUFFQyxJQUFJLElBQUk5QixFQUFFc0IsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUkvQixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUV3QixHQUFHUSxHQUFHLEVBQUVDLElBQUksSUFBSWhDLEVBQUV3QixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSWpDLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRThCLEdBQUczQixHQUFHLEVBQUVFLElBQUksSUFBSUosRUFBRThCLEdBQUcxQixHQUFHLEVBQUVGLElBQUksSUFBSUosRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFaUMsRUFBRW5DLEVBQUUsR0FBR29DLEVBQUVwQyxFQUFFLEdBQUdtRSxFQUFFbkUsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHb0UsRUFBRXBFLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR2lELEVBQUVqRCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUdrRCxFQUFFbEQsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHaUYsR0FBR2pGLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR2tGLEdBQUdsRixFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUcrRCxFQUFFL0QsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHZ0UsRUFBRWhFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3VELEVBQUV2RCxFQUFFLElBQUksRUFBRUEsRUFBRSxLQUFLLEdBQUd3RCxFQUFFeEQsRUFBRSxJQUFJLEVBQUVBLEVBQUUsS0FBSyxHQUFHcUMsRUFBRXJDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3NDLEVBQUV0QyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdxRSxFQUFFckUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHc0UsRUFBRXRFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR21ELEVBQUVuRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdvRCxFQUFFcEQsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHbUYsR0FBR25GLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR29GLEdBQUdwRixFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUcyRSxHQUFHM0UsRUFBRSxJQUFJLEdBQUdBLEVBQUUsS0FBSyxFQUFFNEUsR0FBRzVFLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEtBQUssRUFBRXlELEVBQUV6RCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUcwRCxFQUFFMUQsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHdUMsRUFBRXZDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3dDLEVBQUV4QyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUd1RSxFQUFFdkUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHd0UsRUFBRXhFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3FELEVBQUVyRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUVzRCxFQUFFdEQsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFNkMsRUFBRTdDLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEtBQUssRUFBRThDLEVBQUU5QyxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUU2RSxHQUFHN0UsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFOEUsR0FBRzlFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRTJELEVBQUUzRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUU0RCxFQUFFNUQsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFeUMsRUFBRXpDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBRzBDLEVBQUUxQyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUd5RSxFQUFFekUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFMEUsR0FBRzFFLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRWlFLEVBQUVqRSxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUVrRSxFQUFFbEUsRUFBRSxJQUFJLEdBQUdBLEVBQUUsS0FBSyxFQUFFK0MsRUFBRS9DLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR2dELEVBQUVoRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUcrRSxHQUFHL0UsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHZ0YsR0FBR2hGLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBRzZELEVBQUU3RCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUc4RCxFQUFFOUQsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHMkMsRUFBRTNDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBRzRDLEVBQUU1QyxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdBLEVBQUUsR0FBR21DLEdBQUdFLEVBQUVFLEVBQUV2QyxFQUFFLEdBQUdvQyxHQUFHRSxFQUFFRSxFQUFFeEMsRUFBRSxJQUFJNkMsR0FBR0UsRUFBRUUsRUFBRWpELEVBQUUsSUFBSThDLEdBQUdFLEVBQUVFLEVBQUVsRCxFQUFFLElBQUl1RCxHQUFHRSxFQUFFRSxFQUFFM0QsRUFBRSxJQUFJd0QsR0FBR0UsRUFBRUUsRUFBRTVELEVBQUUsSUFBSWlFLEdBQUdFLEVBQUVFLEVBQUVyRSxFQUFFLElBQUlrRSxHQUFHRSxFQUFFRSxFQUFFdEUsRUFBRSxJQUFJMkUsSUFBSUUsR0FBR0UsR0FBRy9FLEVBQUUsSUFBSTRFLElBQUlFLEdBQUdFLEdBQUdoRixFQUFFLEdBQUdxQyxHQUFHRSxFQUFFRSxFQUFFekMsRUFBRSxHQUFHc0MsR0FBR0UsRUFBRUUsRUFBRTFDLEVBQUUsSUFBSStDLEdBQUdFLEVBQUVFLEVBQUVuRCxFQUFFLElBQUlnRCxHQUFHRSxFQUFFRSxFQUFFcEQsRUFBRSxJQUFJeUQsR0FBR0UsRUFBRUUsRUFBRTdELEVBQUUsSUFBSTBELEdBQUdFLEVBQUVFLEVBQUU5RCxFQUFFLElBQUltRSxHQUFHRSxFQUFFRSxFQUFFdkUsRUFBRSxJQUFJb0UsR0FBR0UsRUFBRUUsRUFBRXhFLEVBQUUsSUFBSTZFLElBQUlFLEdBQUdFLEdBQUdqRixFQUFFLElBQUk4RSxJQUFJRSxHQUFHRSxHQUFHbEYsRUFBRSxHQUFHdUMsR0FBR0UsRUFBRUUsRUFBRTNDLEVBQUUsR0FBR3dDLEdBQUdFLEVBQUVFLEVBQUU1QyxFQUFFLElBQUlpRCxHQUFHRSxFQUFFRSxFQUFFckQsRUFBRSxJQUFJa0QsR0FBR0UsRUFBRUUsRUFBRXRELEVBQUUsSUFBSTJELEdBQUdFLEVBQUVFLEVBQUUvRCxFQUFFLElBQUk0RCxHQUFHRSxFQUFFRSxFQUFFaEUsRUFBRSxJQUFJcUUsR0FBR0UsRUFBRUUsRUFBRXpFLEVBQUUsSUFBSXNFLEdBQUdFLEVBQUVFLEdBQUcxRSxFQUFFLElBQUkrRSxJQUFJRSxHQUFHRSxHQUFHbkYsRUFBRSxJQUFJZ0YsSUFBSUUsR0FBR0UsR0FBR3BGLEVBQUUsR0FBR3lDLEdBQUdFLEVBQUVSLEVBQUVuQyxFQUFFLEdBQUcwQyxHQUFHRSxFQUFFUixFQUFFcEMsRUFBRSxJQUFJbUQsR0FBR0UsRUFBRVIsRUFBRTdDLEVBQUUsSUFBSW9ELEdBQUdFLEVBQUVSLEVBQUU5QyxFQUFFLElBQUk2RCxHQUFHRSxFQUFFUixFQUFFdkQsRUFBRSxJQUFJOEQsR0FBR0UsRUFBRVIsRUFBRXhELEVBQUUsSUFBSXVFLEdBQUdFLEVBQUVSLEVBQUVqRSxFQUFFLElBQUl3RSxHQUFHRSxHQUFHUixFQUFFbEUsRUFBRSxJQUFJaUYsSUFBSUUsR0FBR1IsR0FBRzNFLEVBQUUsSUFBSWtGLElBQUlFLEdBQUdSLEdBQUc1RSxFQUFFLEdBQUcyQyxHQUFHUixFQUFFRSxFQUFFckMsRUFBRSxHQUFHNEMsR0FBR1IsRUFBRUUsRUFBRXRDLEVBQUUsSUFBSXFELEdBQUdSLEVBQUVFLEVBQUUvQyxFQUFFLElBQUlzRCxHQUFHUixFQUFFRSxFQUFFaEQsRUFBRSxJQUFJK0QsR0FBR1IsRUFBRUUsRUFBRXpELEVBQUUsSUFBSWdFLEdBQUdSLEVBQUVFLEVBQUUxRCxFQUFFLElBQUl5RSxHQUFHUixFQUFFRSxFQUFFbkUsRUFBRSxJQUFJMEUsSUFBSVIsRUFBRUUsRUFBRXBFLEVBQUUsSUFBSW1GLElBQUlSLEdBQUdFLEdBQUc3RSxFQUFFLElBQUlvRixJQUFJUixHQUFHRSxHQUFHOUUsRUFBRSxJQUFJRyxFQUFFbUIsR0FBR3RCLEVBQUUsSUFBSUcsRUFBRW1CLEVBQUUsRUFBRSxFQ1JobEt0QixFQUFFLFdBQVcsTUFBTUcsRUFBRSxDQUFDa0YsU0FBUzFGLE1BQU0yRixLQUFLbkYsSUFBSSxNQUFNSCxFQUFFLENBQUNHLEVBQUVvRixLQUFLcEYsRUFBRXFGLFNBQVMsWUFBTyxJQUFTckYsRUFBRXNGLE9BQU96RixFQUFFMEYsS0FBS3ZGLEVBQUVzRixZQUFPLElBQVN0RixFQUFFd0YsYUFBUSxJQUFTeEYsRUFBRXNGLE9BQU96RixFQUFFMEYsVUFBSyxHQUFRMUYsRUFBRTBGLEtBQUt2RixFQUFFd0YsUUFBUTNGLEdBQUc0RixLQUFLLElBQUksSUFBSWpHLE1BQU1rRyxRQUFRLENBQUMxRixHQUFHSCxFQUFFSSxFQUFFMkIsRUFBRTlCLE1BQU1FLEVBQUVvRixLQUFLdkYsRUFBRUcsRUFBRXFGLFFBQVFwRixPQUFFLElBQVMyQixTQUFTNUIsRUFBRXNGLE1BQU10RixFQUFFc0YsTUFBTTFELE9BQUUsSUFBUzlCLElBQUlFLEVBQUV3RixNQUFNMUYsS0FBS0QsRUFBRSxDQUFDcUYsU0FBU1MsV0FBV1IsS0FBS25GLEdBQUcsQ0FBQzRGLEtBQUtoRSxFQUFFaUUsT0FBTzdGLEtBQUs4RixPQUFPLEVBQUU5RixLQUFLQyxFQUFFOEYsT0FBT0MsS0FBS2hHLEtBQUtGLEVBQUUsQ0FBQ29GLFNBQVN0SSxJQUFJdUksS0FBS25GLEdBQUcsSUFBSUEsRUFBRUUsV0FBV3VGLEtBQUssSUFBSSxJQUFJN0ksSUFBSThJLFFBQVEsQ0FBQzFGLEVBQUVILEtBQUssSUFBSSxNQUFNSSxFQUFFMkIsS0FBSy9CLEVBQUVHLEVBQUUxQyxJQUFJMkMsRUFBRTJCLEtBQUtULEVBQUUsQ0FBQytELFNBQVNlLElBQUlkLEtBQUtuRixHQUFHLElBQUlBLEVBQUVrRyxVQUFVVCxLQUFLLElBQUksSUFBSVEsSUFBSVAsUUFBUSxDQUFDMUYsRUFBRUgsS0FBSyxJQUFJLE1BQU1JLEtBQUtKLEVBQUVHLEVBQUVtRyxJQUFJbEcsS0FBS3dCLEVBQUUsQ0FBQ3lELFNBQVNrQixLQUFLakIsS0FBS25GLEdBQUcsQ0FBQ0EsRUFBRXFHLFVBQVVQLE9BQU8sRUFBRTlGLEtBQUssSUFBSW9HLEtBQUtwRyxJQUFJc0IsRUFBRSxDQUFDNEQsU0FBU29CLE9BQU9uQixLQUFLLEVBQUVvQixNQUFNdkcsRUFBRXdHLE9BQU8zRyxLQUFLRyxFQUFFLENBQUNILEVBQUVHLEdBQUcsQ0FBQ0gsR0FBR2lHLE9BQU8sRUFBRTlGLEVBQUVILEtBQUssSUFBSXlHLE9BQU90RyxFQUFFSCxJQUFJaUMsRUFBRSxDQUFDb0QsU0FBU3VCLElBQUl0QixLQUFLbkYsR0FBRyxDQUFDQSxFQUFFMEcsTUFBTVosT0FBTyxFQUFFOUYsS0FBSyxJQUFJeUcsSUFBSXpHLElBQUksT0FBTyxJQUFJcEQsSUFBSSxDQUFDb0QsRUFBRUgsRUFBRUMsRUFBRXFCLEVBQUVNLEVBQUVILEVBQUVRLEdBQUc2RSxJQUFJM0csR0FBRyxDQUFDQSxFQUFFa0YsU0FBU0UsS0FBS3BGLElBQUksQ0FBMzJCLEdBQSsyQkMsRUFBRSxJQUFJMkcsWUFBWWhGLEVBQUUsSUFBSWlGLFlBQVksUUNBenlCLFNBQVN0RixFQUFFdEIsT0FBRSxFQUFPRCxFQUFFSCxHQUFHLE9BQU9pSCxLQUFLQyxVQUFVbkYsRUFBRTNCLEVBQUVELEdBQUcsQ0FBQyxTQUFTNkIsRUFBRWhDLEdBQUcsUUFBRyxJQUFTQSxFQUFFLE9BQU0sRUFBRyxHQUFHLGlCQUFpQkEsRUFBRSxDQUFDLEdBQUdtSCxPQUFPQyxNQUFNcEgsR0FBRyxPQUFNLEVBQUcsSUFBSW1ILE9BQU9FLFNBQVNySCxHQUFHLE9BQU9BLEVBQUUsR0FBRSxHQUFHLENBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNd0IsRUFBRSxHQUFHLFNBQVNPLEVBQUU1QixFQUFFeUIsRUFBRTVCLEdBQUcsTUFBTXNCLEVBQUVVLEVBQUU3QixHQUFHLEdBQUcsT0FBT21CLEVBQUUsT0FBT0EsRUFBRSxNQUFNcEIsRUFBRSxHQUFHRCxFQUFFLElBQUlsRCxJQUFJLE9BQU8sU0FBU2lELEVBQUVHLEdBQUcsTUFBTW1CLEVBQUVVLEVBQUU3QixHQUFHLEdBQUcsT0FBT21CLEVBQUUsT0FBT0EsRUFBRSxJQUFJRyxFQUFFeEIsRUFBRTlDLElBQUlnRCxHQUFHLFFBQUcsSUFBU3NCLEVBQUUsT0FBT0EsRUFBRSxPQUFPQSxFQUFFdkIsRUFBRXFCLGNBQWNwQixHQUFHLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxVQUFVRCxFQUFFdUIsR0FBR3RCLEVBQUVGLEVBQUV4QyxJQUFJMEMsRUFBRXNCLEdBQUcsTUFBTSxJQUFJLFNBQVN2QixFQUFFdUIsR0FBRyxFQUFDLEVBQUd0QixFQUFFbUgsU0FBUyxLQUFLckgsRUFBRXhDLElBQUkwQyxFQUFFc0IsR0FBRyxNQUFNLElBQUksU0FBUyxHQUFHLE9BQU90QixFQUFFRCxFQUFFdUIsR0FBR3RCLEVBQUVGLEVBQUV4QyxJQUFJMEMsRUFBRXNCLFFBQVEsR0FBRzhGLE1BQU1DLFFBQVFySCxHQUFHLENBQUMsTUFBTUMsRUFBRSxTQUFTSixHQUFHLEdBQUd3QixFQUFFRCxPQUFPdkIsRUFBRSxDQUFDLE1BQU1JLEVBQUVvQixFQUFFRCxPQUFPQyxFQUFFRCxPQUFPdkIsRUFBRXdCLEVBQUVpRyxNQUFLLEVBQUdySCxFQUFFSixFQUFFLENBQUMsT0FBT3dCLEVBQUVrRyxNQUFNLEVBQUUxSCxFQUFFLENBQXpGLENBQTJGRyxFQUFFb0IsUUFBUXJCLEVBQUV1QixHQUFHckIsRUFBRUgsRUFBRXhDLElBQUkwQyxFQUFFc0IsR0FBRyxJQUFJLE1BQU1HLEVBQUVOLEtBQUtuQixFQUFFRSxVQUFVRCxFQUFFd0IsR0FBRzVCLEVBQUVzQixFQUFFLEtBQUssQ0FBQyxNQUFNQSxFQUFFSSxHQUFHLFNBQVMxQixFQUFFRyxHQUFHLE1BQU15QixFQUFFNUIsRUFBRWEsWUFBWSxHQUFHLG1CQUFtQmUsRUFBRSxDQUFDLE1BQU14QixFQUFFd0IsRUFBRTJELEtBQUtqRSxFQUFFbkIsRUFBRWhELElBQUlpRCxHQUFHLFFBQUcsSUFBU2tCLEVBQUUsTUFBTSxDQUFDbEIsRUFBRWtCLEVBQUVnRSxLQUFLdEYsR0FBRyxDQUFDLE1BQU1zQixFQUFFcUcsT0FBT3RILFFBQVFMLEdBQUdFLEVBQUVvQixFQUFFQyxPQUFPdEIsRUFBRXNILE1BQU1qQyxLQUFLLENBQUMvRCxPQUFPckIsRUFBRUEsSUFBSSxJQUFJLElBQUlGLEVBQUUsRUFBRUEsRUFBRUUsRUFBRUYsSUFBSSxDQUFDLE1BQU1JLEVBQUVrQixFQUFFdEIsR0FBR0csRUFBRUgsRUFBRUEsRUFBRUMsRUFBRUUsR0FBR0MsRUFBRSxHQUFHSCxFQUFFRSxFQUFFLEdBQUdDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0RBOW1DLEdDQWluQ0gsRUFBRSxDQUFsUSxDQUFvUUUsRUFBRXlCLEdBQUdJLEVBQUVOLEVBQUVILE9BQU9DLEVBQUUrRixNQUFNakMsS0FBSyxDQUFDL0QsT0FBT1MsRUFBRSxJQUFJUixFQUFFLEdBQUdGLEVBQUVwQixFQUFFdUIsR0FBR0QsRUFBRXZCLEVBQUV4QyxJQUFJMEMsRUFBRXNCLEdBQUcsSUFBSSxJQUFJckIsRUFBRSxFQUFFQSxFQUFFNEIsRUFBRTVCLElBQUlvQixFQUFFcEIsRUFBRSxHQUFHSixFQUFFMEIsRUFBRXRCLEdBQUcsRUFBRSxPQUFPcUIsQ0FBQyxDQUF4MUIsQ0FBMDFCdEIsR0FBR0QsQ0FBQyxDQ0E5cEMsU0FBU29CLEVBQUVBLEVBQUV0QixHQUFHLE9IUW9VLFNBQVdBLEdBQUcsT0FBTyxJQUFJTSxFQUFFLElBQUlMLEVBQUUsS0FBS29CLE9BQU9yQixHQUFHOEIsS0FBSyxDR1JsWEYsQ0FBRXhCLEVBQUUsQ0FBQ2tCLEVBQUV0QixJQUFJLENDQS9CLE1BQUNJLEVBQTBDLFVBQVl3SCxjQUFjekgsRUFBRWdILE9BQU9VLGtCQUFrQkMsWUFBWTFILEVBQUVKLEdBQUcsQ0FBQSxHQUFJLE9BQU8sU0FBU0EsRUFBRXlCLEdBQUcsSUFBSUcsRUFBRU4sRUFBRXBCLEVBQUUsTUFBTSxXQUFXdUIsR0FBR3NHLEtBQUssV0FBVyxNQUFNdEcsRUFBRXJCLEVBQUVVLEtBQUssSUFBSWlCLEVBQUV3RSxLQUFLeUIsTUFBTSxPQUFPOUgsSUFBSXVCLEdBQUdNLEVBQUVULEVBQUVuQixLQUFLRCxFQUFFdUIsRUFBRUcsRUFBRTVCLEVBQUVpSSxLQUFLbkgsTUFBTVEsRUFBRVMsR0FBR0gsQ0FBQyxFQUFFLFlBQVlHLEdBQUcsTUFBTUMsRUFBRTVCLEVBQUVVLEtBQUtpQixHQUFHekIsRUFBRWlHLEtBQUt5QixNQUFNLE9BQU85SCxJQUFJOEIsR0FBRzFCLEVBQUVnQixFQUFFbkIsS0FBS0QsRUFBRThCLEVBQUVKLEVBQUVILEVBQUV6QixFQUFFaUksS0FBS25ILFFBQVFpQixHQUFHL0IsS0FBSytCLEdBQUdULEVBQUVoQixHQUFHc0IsQ0FBQyxDQUFDLENBQUMsQ0FBdFhBLENBQUUsQ0FBQ2tHLFlBQVk5SCxVQ1NuRyxNQUFNa0ksVUFBUUMsK3FGQUFBQyxDQUFBdEgsS0FBQSxHQUFBLENBQUEsQ0FhbEJ1SCxFQUFVLEVBQUEsa0JBQUEsQ0FTVkEsRUFBVSxFQUFBLGdCQUFBLENBYVZBLG9CQU9BQSxFQUFVLEVBQUEsY0FBQSxDQUtWQSxFQUFVLEVBQUEsaUJBQUEsQ0FTVkEsRUFBVSxFQUFBLGlCQUFBLENBS1ZBLEVBQVUsRUFBQSxRQUFBLENBS1ZBLEVBQVUsRUFBQSxtQkFBQSxDQU1WQSxFQUFVLEVBQUEsT0FBQSxDQWFWQSxvQkFLQUEsRUFBVSxFQUFBLG1CQUFBLENBS1ZBLEVBQVUsRUFBQSxhQUFBLENBS1ZBLEVBQVUsRUFBQSxhQUFBLENBS1ZBLEVBQVUsRUFBQSxxQkFBQSxDQVNWQSxtQkFBVWxJLENBQUEsQ0FqSE1tSSxVQUFJSCxFQUFBckgsTUFFSnlILFdBQWEsSUFBSXhMLElBSWxDOEQsV0FBQUEsQ0FBWTJILEVBQWlCRixFQUF3QkcsR0FDbkQzSCxLQUFLNEgsU0FBV3BMLEVBQUtDLFFBQVFpTCxHQUM3QjFILEtBQUt3SCxLQUFPQSxFQUNaeEgsS0FBSzJILFFBQVVBLENBQ2pCLENBRUEsa0JBQ0lFLEdBQ0YsSUFDRSxNQUFPLGNBQWNDLEtBQUtDLEVBQUdDLGFBQWF4TCxFQUFLeUwsS0FBS2pJLEtBQUtrSSxZQUFhLGtCQUFtQixRQUMzRixDQUFFLE1BQ0EsT0FBTyxDQUNULENBQ0YsQ0FFQSxnQkFDSUMsR0FDRixPQUFPbkksS0FBS29JLFlBQVlDLFNBQVNDLE9BQU9DLFNBQVMsaUJBQzdDLGlCQUNBdkksS0FBS29JLFlBQVlDLFNBQVNDLE1BQ3hCLDBCQUF5QnRJLEtBQUt3SCxLQUFLdEosUUFBVSxZQUFjLElBQzNELHdCQUNSLENBRUEsV0FBSXdKLEdBQ0YsT0FBTzFILEtBQUs0SCxRQUNkLENBRUEsZUFDSU0sR0FDRixPQUFPSCxFQUFHUyxXQUFXaE0sRUFBS3lMLEtBQUtqSSxLQUFLMEgsUUFBUyxLQUFNLEtBQU0saUJBQ3JEbEwsRUFBS0MsUUFBUXVELEtBQUswSCxRQUFTLEtBQU0sTUFDakMxSCxLQUFLMEgsT0FDWCxDQUVBLGNBQ0llLEdBQ0YsT0FBT1YsRUFBR0MsYUFBYWhJLEtBQUswSSxTQUFTLGNBQWUsT0FDdEQsQ0FFQSxpQkFDSUMsR0FDRixJQUNFLFFBQVMzSSxLQUFLMEksU0FBUyxhQUN6QixDQUFFLE1BQ0EsT0FBTyxDQUNULENBQ0YsQ0FFQSxpQkFDSUUsR0FDRixPQUFPYixFQUFHUyxXQUFXaE0sRUFBS3lMLEtBQUtqSSxLQUFLMEgsUUFBUyxPQUMvQyxDQUVBLFFBQ0lqRCxHQUNGLE9BQU96RSxLQUFLb0ksWUFBWTNELE1BQVEsU0FDbEMsQ0FFQSxtQkFDSW9FLEdBRUYsT0FEYTdJLEtBQUtvSSxZQUFZM0QsTUFBUSxXQUMxQnFFLFdBQVcsSUFBSyxJQUFJQSxXQUFXLElBQUssSUFDbEQsQ0FFQSxPQUNJQyxHQUNGLElBQUsvSSxLQUFLMkgsUUFBUyxPQUFPaEssUUFBUW9MLElBRWxDLE1BQU9DLEVBQVNDLEdQcENiLFNBQ0x6QixFQUNBMEIsR0FFQSxJQUFJQyxHQUFZM0IsRUFBS3VCLEtBQU8sSUFBSS9DLElBQUtvRCxHQUFZNU0sRUFBS0MsUUFBUXlNLEVBQUtFLEVBQVE1QyxhQUMzRSxNQUFNNkMsRUFDSjdCLEVBQUs4QixhQUNKOUIsRUFBSytCLGVBQ0Y1TCxRQUFRb0wsSUFBSVMsVUFBWSxjQUN4QmhDLEVBQUtpQyxlQUNIOUwsUUFBUW9MLElBQUlXLFFBQVUvTCxRQUFRb0wsSUFBSVMsVUFBWSxtQkFDOUM1SyxHQUNSLEdBQXVCLGlCQUFaeUssRUFBc0IsQ0FDL0IsR0FBd0IsSUFBcEJGLEVBQVMxSSxTQUNYMEksRUFBU3ZFLEtBQUtwSSxFQUFLeUwsS0FBS2lCLEVBQUssU0FDekIxQixFQUFLbUMsZ0JBQWdCLENBQ3ZCLE1BQU1DLEVBQVdwTixFQUFLQyxRQUFReU0sRUFBSyxLQUFNLE1BQ3JDbkIsRUFBR1MsV0FBV2hNLEVBQUt5TCxLQUFLMkIsRUFBVSxrQkFDcENULEVBQVN2RSxLQUFLcEksRUFBS3lMLEtBQUsyQixFQUFVLFFBRXRDLENBRUZULEVBQVdBLEVBQVNVLFFBQVNULEdBQzNCQyxFQUNJLENBQUMsR0FBR0QsS0FBV0MsVUFBaUIsR0FBR0QsVUFBaUIsR0FBR0EsS0FBV0MsSUFBV0QsR0FDN0UsQ0FBQyxHQUFHQSxVQUFpQkEsR0FFN0IsQ0FDQUQsRUFBV0EsRUFBU1csT0FBUVYsR0FBWXJCLEVBQUdTLFdBQVdZLElBQVVwRCxJQUFLb0QsR0FBWTVNLEVBQUt1TixTQUFTYixFQUFLRSxJQUNoRzVCLEVBQUt0SixVQUNQQyxRQUFRQyxLQUFLLFdBQVdULFFBQVFvTCxJQUFJVyxxQkFBcUIvTCxRQUFRb0wsSUFBSVMsWUFDckVyTCxRQUFRQyxLQUFLLHFCQUFzQitLLEVBQVNsQixLQUFLLFFBR25ELE1BQU0rQixFQUFpRCxHQUNqRGhCLEVBQWtDLENBQUEsRUFDeEMsSUFBSyxNQUFNSSxLQUFXRCxFQUFVLENBQzlCLElBQUljLEVBQVEsRUFDWixJQUFLLE1BQU9DLEVBQUtDLEtBQVV0RCxPQUFPdEgsUUFBUXJELEVBQVlNLEVBQUt5TCxLQUFLaUIsRUFBS0UsS0FDN0RjLEtBQU9sQixJQUNYQSxFQUFRa0IsR0FBT0MsRUFDZkYsS0FHSkQsRUFBMkJwRixLQUFLLENBQUN3RSxFQUFTYSxJQUN0Q3pDLEVBQUt0SixTQUFXK0wsRUFBUSxHQUMxQjlMLFFBQVFDLEtBQUssUUFBUTZMLGdDQUFvQ2IsSUFFN0QsQ0FFQSxHQUFJNUIsRUFBSzRDLFNBQVUsQ0FDakIsTUFDTUMsRUFEY3hELE9BQU95RCxLQUFLcE8sRUFBWU0sRUFBS3lMLEtBQUtpQixFQUFLMUIsRUFBSzRDLFlBQ2hDTixPQUFRSSxLQUFVQSxLQUFPbEIsSUFDekQsR0FBSXFCLEVBQVk1SixPQUFTLEVBQ3ZCLE1BQU0sSUFBSTVCLE1BQU0scUNBQXFDc0ssRUFBU2xCLEtBQUssWUFBWW9DLEVBQVlwQyxLQUFLLFNBRXBHLENBQ0EsTUFBTyxDQUFDZSxFQUFTZ0IsRUFDbkIsQ090QndETyxDQUF5QnZLLEtBQUt3SCxLQUFNeEgsS0FBSzBILFNBQzdGLElBQUssTUFBTzBCLEVBQVNhLEtBQVVoQixFQUM3QjlLLFFBQVFDLEtBQUssVUFBVTZMLGdDQUFvQ2IsS0FJN0QsTUFBTyxJQUFLekwsUUFBUW9MLE9BQVFDLEVBQzlCLENBRUEsZUFDSVosR0FDRixPQUFPakMsS0FBS3FFLE1BQU16QyxFQUFHQyxhQUFhaEksS0FBS3lLLGdCQUFpQixRQUMxRCxDQUVBLG1CQUNJQSxHQUNGLE9BQU9qTyxFQUFLeUwsS0FBS2pJLEtBQUswSCxRQUFTLGVBQ2pDLENBRUEsYUFDSWdELEdBQ0YsU0FBVTFLLEtBQUtvSSxZQUFZdUMsY0FBY0MsUUFBVTVLLEtBQUtvSSxZQUFZeUMsaUJBQWlCRCxPQUN2RixDQUVBLGFBQ0lFLEdBQ0YsU0FBVTlLLEtBQUtvSSxZQUFZdUMsY0FBY0ksUUFBVS9LLEtBQUtvSSxZQUFZeUMsaUJBQWlCRSxPQUN2RixDQUVBLHFCQUNJQyxHQUNGLE9BQU94TyxFQUFLeU8sUUFBUWpMLEtBQUswSSxTQUFTLGlCQUFtQjFJLEtBQUswSCxRQUN0RDFILEtBQUtvSSxZQUNKakMsS0FBS3FFLE1BQ0p6QyxFQUFHQyxhQUFheEwsRUFBS3lMLEtBQUt6TCxFQUFLeU8sUUFBUWpMLEtBQUswSSxTQUFTLGVBQWdCLGdCQUFpQixRQUU5RixDQUVBLGFBQ0l3QyxHQUNGLElBQUlDLEdBQVcsRUFDWEMsRUFBY3BMLEtBQUswSCxRQUN2QixPQUFTLENBQ1AsTUFBTTJELEVBQVU3TyxFQUFLeUwsS0FBS21ELEVBQWEsZUFBZ0IsUUFNdkQsR0FMSXJELEVBQUdTLFdBQVc2QyxLQUNoQnJMLEtBQUsrSSxJQUFJdUMsS0FBTyxHQUFHRCxLQUFXckwsS0FBSytJLElBQUl1QyxPQUN2Q0gsR0FBVyxHQUdUcEQsRUFBR1MsV0FBV2hNLEVBQUt5TCxLQUFLbUQsRUFBYSxTQUN2QyxNQUVGLE1BQU1HLEVBQWEvTyxFQUFLeU8sUUFBUUcsR0FDaEMsR0FBSUEsSUFBZ0JHLEVBQ2xCLE1BRUZILEVBQWNHLENBQ2hCLENBQ0EsT0FBT0osQ0FDVCxDQUVBekMsUUFBQUEsQ0FBUzhDLEdBQ1AsSUFBSXJQLEVBQVc2RCxLQUFLeUgsV0FBV3BMLElBQUltUCxHQUNuQyxHQUFJclAsRUFBVSxPQUFPQSxFQUtyQixHQUhBQSxFQUFXLENBQUNxUCxFQUFVaFAsRUFBS3lMLEtBQUssS0FBTSxLQUFNdUQsSUFDekN4RixJQUFLdkUsR0FBTWpGLEVBQUtDLFFBQVF1RCxLQUFLMEgsUUFBU2pHLElBQ3RDZ0ssS0FBTWhLLEdBQU1zRyxFQUFHUyxXQUFXL0csS0FDeEJ0RixFQUNILE1BQU0sSUFBSTBDLE1BQU0sbUJBQW1CMk0sS0FHckMsT0FEQXhMLEtBQUt5SCxXQUFXOUssSUFBSTZPLEVBQVVyUCxHQUN2QkEsQ0FDVCxFQVNLLFNBQVN1UCxFQUFnQmxFLEVBQXdCRyxHQUFVLEVBQU1ELEdBRXRFLEdBREFBLElBQVkvSixRQUFRdUwsTUFDZm5CLEVBQUdTLFdBQVdoTSxFQUFLeUwsS0FBS1AsRUFBUyxpQkFFdEMsT0FBTyxJQUFJTixFQUFRTSxFQUFTRixFQUFNRyxFQUNwQyxDQUVPL0ssZUFBZStPLEVBQ3BCbkUsRUFDQUcsR0FBVSxFQUNWRCxHQUVBLE1BQU1rRSxFQVlELFNBQ0xwRSxFQUNBRyxHQUFVLEVBQ1ZELEdBR0EsR0FEQUEsSUFBWS9KLFFBQVF1TCxPQUNmbkIsRUFBR1MsV0FBV2hNLEVBQUt5TCxLQUFLUCxFQUFTLGlCQUFrQixPQUV4RCxNQUFNbUUsRUFBYyxJQUFJekUsRUFBUU0sRUFBU0YsRUFBTUcsR0FDL0MsSUFBSW1FLEVBQWNELEVBQ2xCLElBQUtBLEVBQVl6RCxZQUFZMkQsWUFBY3ZQLEVBQUt5TyxRQUFRdkQsR0FBU3NFLFNBQVMsYUFBYyxDQUN0RixNQUFNOUQsRUFBYzFMLEVBQUtDLFFBQVFpTCxFQUFTLEtBQU0sTUFDNUNLLEVBQUdTLFdBQVdoTSxFQUFLeUwsS0FBS0MsRUFBYSxtQkFDdkM0RCxFQUFjLElBQUkxRSxFQUFRYyxFQUFhVixFQUFNRyxHQUVqRCxDQUNBLE1BQU8sQ0FBRXNFLEtBQU1ILEVBQWFJLEtBQU1MLEVBQ3BDLENBN0I4Qk0sQ0FBd0IzRSxFQUFNRyxFQUFTRCxHQUNuRSxHQUFLa0UsRUFFTCxNQUFPLElBQ0ZBLEVBQ0hRLFlBQ0VSLEVBQW9CSyxPQUFTTCxFQUFvQk0sV0FDdkNHLEVBQXlCN0UsRUFBTW9FLEVBQW9CSyxLQUFNdEUsR0FDL0QsQ0FBQ2lFLEVBQW9CTSxNQUUvQixDQXFCQXRQLGVBQWV5UCxFQUNiN0UsRUFDQXNFLEVBQ0FuRSxHQUVBLE1BQU0yRSxFQUFXLENBQUNSLEdBRVpTLEVBQVlULEVBQVkxRCxZQUFZMkQsV0FDMUMsSUFBS3RGLE1BQU1DLFFBQVE2RixHQUFZLE9BQU9ELEVBRXRDLE1BQU1FLEVBQXdCLEdBQ3hCQyxFQUF3QixHQUM5QixJQUFLLE1BQU1DLEtBQWlCSCxFQUFVdkcsSUFBSzJHLEdBQWVuUSxFQUFLeUwsS0FBSzZELEVBQVlwRSxRQUFTaUYsSUFDbkY1RSxFQUFHUyxXQUFXa0UsR0FDaEJELEVBQVk3SCxLQUFLOEgsR0FFakJGLEVBQVk1SCxLQUFLOEgsR0FHckJELEVBQVk3SCxjQUFlZ0ksRUFBT0osRUFBYSxDQUFFSyxLQUFLLEVBQU1DLGlCQUFpQixLQUM3RSxJQUFLLE1BQU1DLEtBQXFCTixFQUN6QjFFLEVBQUdTLFdBQVdoTSxFQUFLeUwsS0FBSzhFLEVBQW1CLGtCQUVoRFQsRUFBUzFILEtBQUssSUFBSXdDLEVBQVEyRixFQUFtQnZGLEVBQU1HLElBRXJELE9BQU8yRSxDQUNULENDNU9PLE1BQU1VLEVBRVhyUCxRQUFRc1AsU0FBU0MsS0FFakJ2UCxRQUFRNkosS0FBSyxJQUFJd0UsU0FBUyxTQUMxQnJPLFFBQVFvTCxJQUFJb0UsY0FBY25CLFNBQVMsUUFFeEJvQixFQUFrQkosRUFBaUIsZ0JBQWtCLE9BQ3JESyxFQUFpQkwsRUFBaUIsTUFBUSxPQUMxQ00sRUFBd0JOLEVBQWlCLGdCQUFrQixPQ2MzRE8sRUFBb0YsQ0FDL0Z6USxRQUFTLGdCQUNUMFEsU0FBVSw2Q0FWSSxDQUNkMVEsUUFBUyxDQUNQMlEsWUFBYSw0Q0FDYkMsS0FBTSxTQUNOQyxNQUFPLE1BUVQsYUFBTUMsQ0FBUXBHLFNBS1Q1SyxlQUVMNEssRUFDQXFHLEdBRUEsTUFBTUMsRUFBVXBDLEVBQWdCbEUsR0FBTSxFQUFNcUcsR0FDNUMsSUFBS0MsRUFFSCxPQURBM1AsUUFBUUksTUFBTXdQLEVBQU1DLElBQUksdUJBQ2pCLEVBS1QsR0FGQXhHLEVBQU8sSUFBS0EsRUFBTTFLLFFBQVMwSyxFQUFLMUssVUFBWWtRLEVBQWlCLGdCQUFrQixnQkFFMUVqRixFQUFHUyxXQUFXaE0sRUFBS3lMLEtBQUs2RixFQUFRNUYsWUFBYSxTQUVoRCxPQURBSSxFQUFNd0YsRUFBU3RHLElBQ1IsRUFHVCxNQUFPeUcsRUFBU0MsRUFBZUMsU0FpQzFCdlIsZUFDTGtSLEVBQ0F0RyxHQUVBLE1BQU00RyxFQUFxQjVSLEVBQUtDLFFBQVFxUixFQUFRcEcsUUFBUyxlQUFnQixTQUFVLFNBQzdFd0csRUFBZ0IxUixFQUFLQyxRQUFRMlIsRUFBb0Isb0JBQ2pEckcsRUFBR3NHLFNBQVNDLE1BQU1GLEVBQW9CLENBQUVHLFdBQVcsSUFFekQsTUFBTUMsRUFBT0MsRUFBVyxVQUVsQkMsRUFBYUMsRUFBY0MsU0FBUyxxQkFBc0IsQ0FBRTFGLElBQUs0RSxFQUFRcEcsVUFBV2xCLFdBQVdxSSxPQUNyR0wsRUFBS2pPLE9BQU9tTyxHQUVaLE1BQU1JLEVBQWtCM0ksS0FBS0MsVUFDM0JTLE9BQU90SCxRQUFRdU8sRUFBUS9FLEtBQ3BCZSxPQUFPLEVBQUVJLE1BQVU2RSxFQUFvQkMsSUFBSTlFLElBQzNDK0UsU0FBUyxFQUFFQyxJQUFRQyxLQUFVRCxFQUFLRSxjQUFjRCxLQUVyRFgsRUFBS2pPLE9BQU91TyxTQTJCZGxTLGVBQ0VrUixFQUNBdEcsRUFDQWdILEdBRUEsT0FBTyxJQUFJdlIsUUFBU1IsSUFDbEIsTUFZTTRTLEVBWk1WLEVBQWNXLFVBQVUsTUFBTyxDQUFDLE9BQVEsZUFBZ0IsQ0FDbEVwRyxJQUFLNEUsRUFBUXBHLFFBQ2JxQixJQUFLK0UsRUFBUS9FLElBQ2J3RyxNQUFPLE9BQ1BDLFNBQVUsU0FFVW5TLE9BQ25Cd1IsT0FDQVksTUFBTSxNQUNOekosSUFBSzdKLEdBQ21CLFNBQXZCMlIsRUFBUS9FLElBQUlXLE9BQW9Cdk4sRUFBU3VULFFBQVEsd0NBQXlDLElBQU12VCxHQUVoRTJOLE9BQ2pDM04sSUFDRXdULEVBQWdCQyxLQUFNQyxHQUFZMVQsRUFBU29NLFNBQVNzSCxLQUNuREMsRUFBY0YsS0FBTUcsR0FBVzVULEVBQVM2UCxTQUFTK0QsT0FDbERDLEVBQWdCSixLQUFNQyxHQUFZMVQsRUFBU29NLFNBQVNzSCxLQUVyRHJJLEVBQUt0SixTQUNQQyxRQUFRQyxLQUFLLGtCQUFrQmlSLEVBQWtCcEgsS0FBSyxTQUl4RCxNQUFNOUssRUFBT3dSLEVBQWN2UixNQUFNLE1BQU8sQ0FBQyxPQUFRLFFBQVNpUyxHQUFvQixDQUFFbkcsSUFBSzRFLEVBQVE1RixjQUM3Ri9LLEVBQUtFLE9BQU9HLEdBQUcsT0FBU0MsSUFDdEIrUSxFQUFLak8sT0FBTzlDLEdBQ1IrSixFQUFLdEosVUFDUEMsUUFBUUMsS0FBSyxRQUFTWCxHQUN0QlUsUUFBUUMsS0FBSyxRQUFTb1EsRUFBS3lCLE9BQU9DLE9BQU8sV0FHN0MvUyxFQUFLSyxHQUFHLFFBQVMsS0FDZmYsT0FHTixDQWxFUTBULENBQXlCckMsRUFBU3RHLEVBQU1nSCxHQUM5QyxNQUFNTCxFQUFjSyxFQUFLMEIsT0FBTyxPQUUxQkUsUUMvRER4VCxlQUFvQ3lULEdBQ3pDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQU85UixHQUNQLEdBQXFCLGlCQUFWQSxHQUFzQkEsR0FBUyxTQUFVQSxHQUF3QixXQUFmQSxFQUFNRyxLQUNqRSxPQUVGLE1BQU1ILENBQ1IsQ0FDRixDRHNEa0MrUixDQUFrQixJQUFNdkksRUFBR3NHLFNBQVNrQyxTQUFTckMsRUFBZSxTQUM1RixNQUFPLENBQUNrQyxJQUFzQmpDLEVBQWFELEVBQWVDLEVBQzVELENBMURzRHFDLENBQWExQyxFQUFTdEcsR0FDMUUsR0FBSXlHLEVBRUYsT0FEQTlQLFFBQVFDLEtBQUsyUCxFQUFNMEMsTUFBTSxnQkFBZ0JqSixFQUFLMUssaUJBQ3ZDLEVBR1QsSUFBS3dMLEVBQU13RixFQUFTdEcsR0FBTyxPQUV0QkEsRUFBS2tKLGNBQ0YzSSxFQUFHc0csU0FBU3NDLFVBQVV6QyxFQUFlQyxFQUFhLFFBRTFELE9BQU8sQ0FDVCxDQWxDVXlDLENBQWNwSixFQUN0QixHQW1DRixTQUFTYyxFQUFNd0YsRUFBa0J0RyxHQUUvQixHQURBckosUUFBUUMsS0FBSzJQLEVBQU0wQyxNQUFNLFFBQVFqSixFQUFLMUssY0FDakMwSyxFQUFLa0osT0FBUSxDQUNoQixNQUFNRyxFQUFNbEMsRUFBY1csVUFBVTlILEVBQUsxSyxTQUFXLEdBQUksQ0FDdERvTSxJQUFLNEUsRUFBUXBHLFFBQ2JxQixJQUFLK0UsRUFBUS9FLElBQ2IrSCxPQUFPLEVBQ1B2QixNQUFPLFlBRVQsR0FBbUIsSUFBZnNCLEVBQUkvUixPQUVOLE9BREFuQixRQUFRb1QsU0FBV0YsRUFBSS9SLFFBQVUsR0FDMUIsQ0FFWCxDQUNBLE9BQU8sQ0FDVCxDQUVBLE1BQU1pUSxFQUFzQixJQUFJekosSUFBSSxDQUFDLEtBQU0sVUFBVyxXQTZCdEQsTUFBTXFLLEVBQWtCLENBQUMsT0FBUSxXQUMzQkcsRUFBZ0IsQ0FDcEIsTUFDQSxPQUNBLE9BQ0EsT0FDQSxNQUNBLE9BQ0EsT0FDQSxPQUNBLFFBQ0Esa0JBRUEsZUFDQSxhQUVJRSxFQUFrQixDQUFDLFFBQVMsU0FBVSxhQUFjLGlCQUFrQixrQkV2SDVFLE1BQU1nQixHQUFTLElBQUkxTCxJQWVuQjFJLGVBQWVxVSxHQUE4QkMsR0FDM0MsVUFDUUMsRUFBZ0JELEVBQ3hCLENBQUUsTUFDQSxDQUVKLENDMUJPLE1BQU1FLEdBQWMsSUFBSUMsRUNlekJDLEdBQTBCLENBQzlCQyxjQUFjLEdBR1QzVSxlQUFlNFUsR0FDcEJDLEVBQ0EzRCxFQUNBdEcsRUFDQWtLLEVBQWdCSixJQUVoQixNQUFPSyxFQUFpQkMsR0FBa0JDLEdBQWdCSixFQUFRM0QsR0FLbEUsR0FKQWdFLEdBQVdILEVBQWlCN0QsR0FDeEJ0RyxFQUFLdEosU0FDUDRULEdBQVdGLEVBQWdCOUQsRUFBUyxlQUFlLEdBRWpEdEcsRUFBS2tKLE9BRVAsT0FEQXFCLEdBQTZCSixFQUFpQixFQUFHRCxHQUMxQyxFQUdULE1BQU1SLEVBQU8sK0JBQStCYyxLQUFLSixLQUFrQixHQUMvREEsRUFBZXJKLFNBQVMsWUFBYzJJLElBQVNVLEVBQWVySixTQUFTLHFCRjdCdEUzTCxlQUFtRHNVLFNBQ2xERCxHQUE4QkMsR0FDcEMsTUFBTWUsRUFBV3JWLFVBQ1hvVSxHQUFPaEMsSUFBSWtDLEtBRWZGLEdBQU94TCxJQUFJMEwsU0FDTEQsR0FBOEJDLEtBRXRDLElBQUssTUFBTXZTLElBQVUsQ0FBQyxhQUFjLFNBQVUsVUFBVyxXQUN2RGhCLFFBQVFILEdBQUdtQixFQUFRc1QsRUFFdkIsQ0VtQlVDLENBQW9DN0wsT0FBTzZLLElBRW5ELE1BQU1MLFFBQVloVSxFQUFXK1UsT0FBZ0JoVCxFQUFXLENBQ3REc0ssSUFBSzRFLEVBQVFwRyxRQUNicUIsSUFBS29KLEdBQWFyRSxFQUFRL0UsSUFBSzJJLEdBQy9CWixPQUFPLEVBQ1B2QixNQUFPLFVBQ1A2QyxRQUFTVixFQUFLVSxRQUNkOVQsWUFBWSxFQUNaSixRQUFTc0osRUFBS3RKLFVBR2hCLE9BREE2VCxHQUE2QkosRUFBaUJkLEVBQUkvUixPQUFRNFMsR0FDbkRiLEVBQUkvUixRQUFVLENBQ3ZCLENBRU8sU0FBU3VULEdBQ2RaLEVBQ0EzRCxFQUNBdEcsRUFDQWtLLEVBQWdCSixJQUVoQixPQUFPRixHQUFZa0IseUJBQXlCMVYsVUFDMUMsTUFBTytVLEVBQWlCQyxHQUFrQkMsR0FBZ0JKLEVBQVEzRCxHQUVsRSxHQURBZ0UsR0FBV0gsRUFBaUI3RCxFQUFTLG9CQUFvQixHQUNyRHRHLEVBQUtrSixPQU1QLE9BTEFvQixHQUFXSCxFQUFpQjdELEVBQVMsaUJBQ2pDdEcsRUFBS3RKLFNBQ1A0VCxHQUFXRixFQUFnQjlELEVBQVMsaUJBQWlCLEdBRXZEaUUsR0FBNkJKLEVBQWlCLEVBQUdELEdBQzFDLEVBR1QsTUFBTWIsUUFBWWhVLEVBQVcrVSxPQUFnQmhULEVBQVcsQ0FDdERzSyxJQUFLNEUsRUFBUXBHLFFBQ2JxQixJQUFLb0osR0FBYXJFLEVBQVEvRSxJQUFLMkksR0FDL0JaLE9BQU8sRUFDUHZCLE1BQU8sT0FDUDZDLFFBQVNWLEVBQUtVLFFBQ2R2VSxrQkFBa0IsRUFDbEJTLFlBQVksRUFDWkosUUFBU3NKLEVBQUt0SixVQUVoQjRULEdBQVdILEVBQWlCN0QsRUFBUyxpQkFDakN0RyxFQUFLdEosU0FDUDRULEdBQVdGLEVBQWdCOUQsRUFBUyxpQkFBaUIsR0FFdkQsTUFBTXlFLEVBQU0xQixFQUFJeFQsT0FBT3dSLE9BTXZCLE9BTEkwRCxJQUNGNVUsUUFBUU4sT0FBT08sTUFBTTJVLEdBQ3JCNVUsUUFBUU4sT0FBT08sTUFBTSxPQUV2Qm1VLEdBQTZCSixFQUFpQmQsRUFBSS9SLE9BQVE0UyxHQUNuRGIsRUFBSS9SLFFBQVUsR0FFekIsQ0FLQSxTQUFTK1MsR0FBZ0JKLEVBQWdCM0QsR0FDdkMsSUFBSTBFLEVBQVlmLEVBQ2IzSSxXQUFXLEtBQU0sSUFDakJBLFdBQVcsU0FBVSxLQUNyQkEsV0FBVyxVQUFXZ0YsRUFBUTFGLFlBQVl1QyxjQUFjOEgsTUFBUSxxQkFBdUIsZ0JBQ3ZGM0osV0FBVyxPQUFRZ0YsRUFBUWpHLGVBQWlCLGlCQUFtQixTQUUvRGlCLFdBQVcsWUFBYWtFLEVBQWlCLGlCQUFtQixhQUMzREEsSUFDRndGLEVBQVlBLEVBQ1QxSixXQUFXLG9CQUFxQixpQkFDaENBLFdBQVcsOEJBQStCLGlCQUUxQ0EsV0FBVyxnQkFBaUIsZ0JBQzVCQSxXQUFXLHdCQUF5QixZQUVwQ0EsV0FBVywrQ0FBZ0QsS0FFaEUwSixFQUFZQSxFQUFVM0QsT0FDdEIsTUFBTThDLEVBQWtCZSxHQUFjRixFQUFVMUosV0FBVyxRQUFTLEdBQUd3RSxPQUNqRXNFLEVBQWlCYyxHQUNyQkYsRUFFRzFKLFdBQVcsbUJBQW9CLEdBQUd3RSxpQkFDbEN4RSxXQUFXLFNBQVVrRSxHQUFrQmMsRUFBUTVDLFVBQVksR0FBSyxHQUFHb0MsT0FJeEUsTUFBTyxDQUFDLFNBRGNRLEVBQVEvRSxJQUFJVyxPQUFTLGtCQUFrQm9FLEVBQVEvRSxJQUFJUyxVQUFZLGdCQUFrQixNQUNyRW1JLElBQW1CQyxFQUN2RCxDQUVPLFNBQVNFLEdBQVdhLEVBQTBCN0UsRUFBa0I4RSxFQUFTLFFBQVNDLEdBQU8sR0FDOUYxVSxRQUFRQyxLQUNOLE1BQ0d5VSxFQUFPOUUsRUFBTStFLEtBQU8vRSxFQUFNZ0YsTUFBTWhGLEVBQU1pRixLQUFLLEdBQUdKLE1BQVlELEdBQzNENUUsRUFBTStFLEtBQUssT0FBT2hGLEVBQVFwRyxXQUVoQyxDQUVPLFNBQVNxSyxHQUNkTixFQUNBVixFQUNBVyxHQUVpQixJQUFiWCxFQUNGNVMsUUFBUUMsS0FBSzJQLEVBQU0wQyxNQUFNMUMsRUFBTWlGLEtBQUssYUFBY3ZCLEtBRWxEdFQsUUFBUUMsS0FBSzJQLEVBQU1DLElBQUlELEVBQU1pRixLQUFLLHFCQUFxQmpDLFFBQWdCVSxLQUM3QyxJQUF0QkMsRUFBS0gsY0FDUDVULFFBQVFzVixLQUFLbEMsR0FBWSxHQUcvQixDQUVBLFNBQVNvQixHQUFhcEosRUFBeUMySSxHQUM3RCxNQUFNd0IsRUFBUyxJQUFLbkssR0FPcEIsT0FOSTJJLEVBQUt5QixLQUNQRCxFQUFPRSxHQUFLLEtBRVYxQixFQUFLMkIsYUFDUEgsRUFBT0ksWUFBYyxLQUVoQkosQ0FDVCxDQUVBLFNBQVNSLEdBQWM1VixHQUVyQixPQUFPQSxFQUFReUwsU0FBUyxhQUV0QnpMLEVBQVF5TCxTQUFTLGVBRWpCekwsRUFBUXlMLFNBQVMsV0FDakJ6TCxFQUFReUwsU0FBUyx1QkFDZnpMLEVBQVFnTSxXQUFXLFlBQWEsT0FDaENoTSxDQUNOLENDcEtBLE1Ba0JNeVcsR0FBa0IsSUFBSWpPLElBQUksQ0FBQyxNQUFPLE1BQU8sS0FBTSxPQUFRLFFBQVMsTUFBTyxNQUFPLE1BQU8sS0FBTSxRQUMzRmtPLEdBQXFCLElBQUlsTyxJQUFJLENBQ2pDLE1BQ0EsTUFDQSxNQUNBLE9BQ0EsS0FDQSxPQUNBLFFBQ0EsTUFDQSxLQUNBLE1BQ0EsTUFDQSxPQUNBLEtBQ0EsTUFDQSxNQUNBLE9BQ0EsUUFFSW1PLEdBQXlCLElBQUluTyxJQUFJLElBQUlrTyxJQUFvQjFKLE9BQVE0SixJQUFTSCxHQUFnQnZFLElBQUkwRSxLQUV2RkMsR0FHVCxDQUNGN1csUUFBUyxrQkFDVDBRLFNBQVUsMkJBN0NJLENBQ2RvRyxJQUFLLENBQ0huRyxZQUFhLHlCQUNiQyxLQUFNLFdBRVJtRyxPQUFRLENBQ05wRyxZQUFhLGtCQUNiQyxLQUFNLFlBd0NSLGFBQU1FLENBQVFwRyxHQUNQd0YsSUFDSDdPLFFBQVFJLE1BQU13UCxFQUFNQyxJQUFJLDJDQUN4QnJRLFFBQVFzVixLQUFLLElBR2YsTUFBTTNHLFFBQWlCWCxFQUF1Qm5FLEdBQU0sR0FDL0M4RSxJQUNIbk8sUUFBUUksTUFBTXdQLEVBQU1DLElBQUksc0JBQ3hCclEsUUFBUXNWLEtBQUssSUFHZixNQUFNYSxFQUFRdE0sRUFBS3NNLE9BQVMsR0FDNUIsSUFBSUMsRUFDQUMsRUFDQUMsRUFDSixHQUFJSCxFQUFNclQsT0FBUyxFQUFHLENBQ3BCLE1BQU15VCxFQUF3QyxHQUN4Q0MsRUFBNkMsR0FDN0NDLEVBQWlDLEdBQ3ZDLElBQUssTUFBTUMsS0FBUVAsRUFBTyxDQUN4QixNQUFNM1gsRUFBV0ssRUFBS0MsUUFBUTZYLE9BQU9ELElBQ3JDLEdBQ0VsWSxFQUFTNlAsU0FBUyxtQkFDbEI3UCxFQUFTb00sU0FBUyxvQkFDbEJwTSxFQUFTNlAsU0FBUyxtQkFDbEI3UCxFQUFTb00sU0FBUyxtQkFFbEIsU0FHRixNQUFNZ00sRUFBWS9YLEVBQUtnWSxRQUFRclksR0FBVXlLLE1BQU0sR0FDM0N6SyxFQUFTNlAsU0FBUyxpQkFDcEJvSSxFQUFxQnhQLEtBQUt6SSxHQUNqQm9YLEdBQWdCdkUsSUFBSXVGLEdBQzdCTCxFQUE0QnRQLEtBQUt6SSxHQUN4QnFYLEdBQW1CeEUsSUFBSXVGLElBQ2hDSixFQUFpQ3ZQLEtBQUt6SSxFQUUxQyxDQUNBNFgsRUFBZ0JHLEVBQTRCbE8sSUFBS3BGLEdBQU0sSUFBSUEsTUFBTXFILEtBQUssS0FDdEUrTCxFQUFtQkcsRUFBaUNuTyxJQUFLcEYsR0FBTSxJQUFJQSxNQUFNcUgsS0FBSyxLQUM5RWdNLEVBQTBCRyxFQUFxQnBPLElBQUtwRixHQUFNLElBQUlBLE1BQU1xSCxLQUFLLElBQzNFLE1BQ0U4TCxFQUFnQixHQUNoQkMsRUFBbUIsZ0JBQWdCLElBQUlQLElBQXdCeEwsS0FBSyxvQ0FDcEVnTSxFQUEwQjNILEVBQVNGLFlBQVlwRyxJQUFLdkUsR0FBTSxJQUFJQSxFQUFFZ0osb0JBQW9CeEMsS0FBSyxLQUczRixNQUFNd00sRUFDSmpOLEVBQUtvTSxLQUFPcE0sRUFBS3FNLE9BQVMsY0FBZ0JyTSxFQUFLb00sSUFBTSxhQUFlcE0sRUFBS3FNLE9BQVMsZUFBaUIsT0FDckcsSUFBSWEsR0FDQVgsR0FBa0MsSUFBakJELEVBQU1yVCxVQUN6QmlVLEVBQWVyQyxHQUNiLG1CQUFtQm9DLHlFQUFvRlYsSUFDdkd6SCxFQUFTSixLQUNUMUUsRUFDQSxDQUFFNkwsWUFBWSxLQUdkN0wsRUFBS3FNLFNBQ0hHLEdBQ0czQixHQUNILDhFQUE4RTJCLElBQzlFMUgsRUFBU0osS0FDVDFFLEVBQ0EsQ0FBRTZMLFlBQVksSUFHZFksVUFDSVMsRUFDRHJDLEdBQXVCLCtCQUErQjRCLElBQTJCM0gsRUFBU0osS0FBTTFFLEVBQU0sQ0FDekc2TCxZQUFZLEtBSXBCLEdDbklLLFNBQVVzQixHQUF5QkMsRUFBcUJ0SSxHQUM3RCxJQUFLLE1BQU13QixLQUFXeEIsRUFDcEJuTyxRQUFRQyxLQUFLLFlBQVl3VyxVQUFvQjlHLEVBQVFySixrQkFFL0NxSixDQUVWLENDS0EsTUFRYStHLEdBQTZGLENBQ3hHL1gsUUFBUyx5QkFDVDBRLFNBQVUsOERBVkksQ0FDZHNILFFBQVMsQ0FDUHJILFlBQWEseUVBQ2JDLEtBQU0sVUFDTkMsTUFBTyxNQVFULGFBQU1DLENBQVFwRyxHQUNaLE1BQU04RSxRQUFpQlgsRUFBdUJuRSxHQUN6QzhFLElBQ0huTyxRQUFRSSxNQUFNd1AsRUFBTUMsSUFBSSxzQkFDeEJyUSxRQUFRc1YsS0FBSyxJQUdmLElBQUssTUFBTW5GLEtBQVc2RyxHQUF5Qix5QkFBMEJySSxFQUFTRixhQUFjLENBQzlGLE1BQU1oRSxFQUEyQjBGLEVBQVExRixZQUNuQ2tDLEVBQU8sQ0FBQyxlQUFnQixtQkFDOUIsSUFBSyxNQUFNSixLQUFPSSxFQUFNLENBQ3RCLE1BQU15SyxFQUFPM00sRUFBWThCLElBQVEsQ0FBQSxFQUNqQyxJQUFLLE1BQU96RixFQUFNMEYsS0FBVXRELE9BQU90SCxRQUFRd1YsR0FDckM1SyxHQUFPNkssV0FBVyxxQkFDcEJELEVBQUt0USxHQUFRLEtBQUtBLElBR3hCLENBUUEsR0FOQXdRLEdBQXdCek4sRUFBTVksR0FFOUI4TSxHQUFnQjlNLEdBRWhCK00sR0FBa0IvTSxHQUVkWixFQUFLa0osT0FBUSxTQUVqQixNQUFNMEUsRUFBYzVOLEVBQUtzTixRQUFVdFksRUFBS3lMLEtBQUs2RixFQUFRcEcsUUFBUyxRQUFVb0csRUFBUXBHLGNBQzFFSyxFQUFHc0csU0FBU0MsTUFBTThHLEVBQWEsQ0FBRTdHLFdBQVcsVUFDNUN4RyxFQUFHc0csU0FBU3NDLFVBQVVuVSxFQUFLeUwsS0FBS21OLEVBQWEsZ0JBQWlCalAsS0FBS0MsVUFBVWdDLEdBQWMsT0FDbkcsQ0FDS1osRUFBS2tKLFFBQVdsSixFQUFLc04sVUFDeEJuRyxFQUFjVyxVQUFVakMsRUFBZ0IsQ0FBQyxXQUFZLENBQ25Ea0MsTUFBTyxZQUVUcFIsUUFBUUMsS0FBSywyQkFFakIsR0FHRixTQUFTNlcsR0FBd0J6TixFQUEyQ1ksR0FDMUUsSUFBS1osRUFBS3NOLFFBR1IsY0FGTzFNLEVBQVl5QyxxQkFDbkIxTSxRQUFRQyxLQUFLLGdDQUlmLE1BQU1pWCxFQUFVak4sRUFBWXlDLGlCQUFtQixDQUFBLEVBQ3pDeUssRUFBdUIsQ0FDM0IsWUFDQSxRQUNBLGVBQ0EsNkNBQ0EsU0FDQSxRQUNBLFdBQ0EsT0FDQSxZQUNBLGNBQ0EsV0FDQSxhQUNBLFdBQ0EsUUFDQSxVQUNBLG1CQUNBLG9CQUNBLFVBQ0EsVUFFSUMsRUFBd0IsR0FDOUIsSUFBSyxNQUFNOVEsS0FBUW9DLE9BQU95RCxLQUFLK0ssSUFFM0JDLEVBQXFCMUYsS0FBTTRGLEdBQVMvUSxFQUFLOEQsU0FBU2lOLEtBQ2pEL1EsRUFBSzhELFNBQVMsZ0JBQWtCOUQsRUFBSzhELFNBQVMsb0JBR3hDOE0sRUFBUTVRLEdBQ2Y4USxFQUFZM1EsS0FBS0gsSUFHckJ0RyxRQUFRQyxLQUFLLDJCQUE0Qm1YLEVBQVl0TixLQUFLLE9BQVMsT0FDckUsQ0FFQSxTQUFTaU4sR0FBZ0I5TSxHQUN2QixNQUFNcU4sRUFBZ0MsQ0FBQyxRQUFTLFNBQVUsU0FBVSxPQUFRLFFBQVMsUUFDL0VDLEVBQW1DLENBQUMsU0FBVSxVQUM5Q3JOLEVBQVdELEVBQVlDLFNBQVcsQ0FBQSxFQUNsQ3NOLEVBQTJCLEdBQ2pDLElBQUssTUFBT2xSLEVBQU1tUixLQUFZL08sT0FBT3RILFFBQVE4SSxJQUV6Q29OLEVBQThCN0YsS0FBTTRGLEdBQVMvUSxFQUFLdVEsV0FBV1EsS0FFN0RFLEVBQWlDOUYsS0FBTTRGLEdBQVNJLEVBQVFyTixTQUFTaU4sSUFBU0ksRUFBUS9HLFNBQVcyRyxFQUFLM0csa0JBRzNGeEcsRUFBUTVELEdBQ2ZrUixFQUFlL1EsS0FBS0gsSUFHeEJ0RyxRQUFRQyxLQUFLLG1CQUFvQnVYLEVBQWUxTixLQUFLLE9BQVMsT0FDaEUsQ0FFQSxTQUFTa04sR0FBa0IvTSxVQUNsQkEsRUFBWXlOLGVBQ1p6TixFQUFZME4scUJBQ1oxTixFQUFZMk4sUUFDckIsQ0N4Q08sTUFBTUMsR0FBZ0IsSUFoRjdCLE1BQ0VDLE1BQUFBLENBQU90UyxFQUFZdVMsRUFBb0IsSUFDckMsTUFBTyx5QkFBd0JBLEVBQW9CLElBQUlBLElBQXNCLEdBQy9FLENBRUFDLFdBQUFBLENBQVlySSxFQUFrQnNJLEdBQzVCLE1BQU1DLEVBQVV2SSxFQUFRMUYsWUFBWXVDLGNBQWM4SCxNQUFRLEtBQU8sU0FFakUsTUFBTyxVQUFVNEQsaUVBQXVFQSx5REFDM0RBLHdCQUE4QkQsZ0JBQXlCQyxvRUFDdEYsQ0FFQUMsVUFBQUEsQ0FBVzNTLEdBQ1QsTUFBTyxHQUFHeUosOE1BS1osQ0FFQW1KLE9BQUFBLENBQVF6SSxFQUFrQm9JLEVBQW9CLElBQzVDLE1BQU8sd0JBQXdCQSxFQUFvQixJQUFJQSxJQUFzQiw0QkFBNEJsVyxLQUFLd1csS0FBSzFJLElBQ3JILENBRUEySSxVQUFBQSxDQUFXOVMsRUFBWXVTLEVBQW9CLElBQ3pDLE1BQU8sc0JBQXFCQSxFQUFvQixJQUFJQSxJQUFzQixHQUM1RSxDQUVBeFcsS0FBQUEsQ0FBTW9PLEVBQWtCb0ksRUFBb0IsSUFHMUMsTUFBTywyQ0FBMkNBLEVBQW9CLElBQUlBLElBQXNCLFNBQVNsVyxLQUFLd1csS0FBSzFJLElBQ3JILENBRUE0SSxPQUFBQSxDQUFRNUksRUFBa0JzSSxFQUFvQk8sR0FFNUMsTUFBTyxVQURTN0ksRUFBUTFGLFlBQVl1QyxjQUFjOEgsTUFBUSxLQUFPLG1HQUNrRGtFLEtBQWNQLEdBQ25JLENBRUFJLElBQUFBLENBQUsxSSxFQUFrQjhJLEdBQ3JCLE9BQUk5SSxFQUFRMUYsWUFBWXVDLGNBQWM4SCxNQUFjLHNCQUFxQm1FLEVBQWEsT0FBT0EsSUFBZSxJQUN4R0EsRUFBbUIsb0JBQW9CQSxJQUN0QzlJLEVBQVExRixZQUFZd0MsUUFBK0M0TCxLQUFhLHNCQUM5RSx3RUFDVCxDQUVBSyxNQUFBQSxDQUFPL0ksRUFBa0JnSixFQUFzQlosRUFBb0IsSUFDakUsTUFBTWEsRUFBYyxRQUNwQixJQUFJbkUsRUFBUyxHQUViLEdBQUlrRSxFQUNGLElBQ0UsSUFBSWhSLElBQUlnUixHQUNSbEUsRUFBUyxnQkFBZ0JrRSxJQUMzQixDQUFFLE1BRUFsRSxFQUFTLGdCQUFnQm1FLElBREp2YSxFQUFLQyxRQUFRcWEsS0FFcEMsTUFDSyxHQUFJaEosRUFBUS9FLElBQUlpTyxjQUFjaEMsV0FBVytCLEdBQWMsQ0FDNUQsTUFBTUUsRUFBaUIsQ0FDckIsQ0FBRUMsV0FBWTFhLEVBQUt5TCxLQUFLLFNBQVUsaUJBQWtCa1AsT0FBUSxVQUM1RCxDQUFFRCxXQUFZMWEsRUFBS3lMLEtBQUssU0FBVSxVQUFXa1AsT0FBUTNhLEVBQUt5TCxLQUFLLFNBQVUsV0FDekUsQ0FBRWlQLFdBQVkxYSxFQUFLeUwsS0FBSyxLQUFNLGlCQUFrQmtQLE9BQVEsT0FFMUQsSUFBSyxNQUFNQSxPQUFFQSxFQUFNRCxXQUFFQSxLQUFnQkQsRUFDbkMsR0FBSWxQLEVBQUdTLFdBQVdoTSxFQUFLQyxRQUFRcVIsRUFBUXBHLFFBQVN3UCxJQUFjLENBTTVEdEUsRUFBUyxnQkFBZ0JtRSxJQUxKdmEsRUFBS0MsUUFDeEJxUixFQUFRcEcsUUFDUnlQLEVBQ0FySixFQUFRL0UsSUFBSWlPLGFBQWFwUSxNQUFNbVEsT0FHakMsS0FDRixDQUVKLENBQ0EsTUFBTyxHQUFHbkUsaUJBQXNCc0QsRUFBb0IsSUFBSUEsSUFBc0IsSUFDaEYsR0N0RldrQixHQUF1QixDbEJLbENyTyxJQUFLLENBQ0gwRSxZQUFhLDJCQUNiQyxLQUFNLFNBRVIsY0FBZSxDQUNiRCxZQUNFLHdMQUNGQyxLQUFNLFVBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLDBGQUNiQyxLQUFNLFdBRVIsbUJBQW9CLENBQ2xCRCxZQUFhLGlFQUNiQyxLQUFNLFVBQ04ySixTQUFTLEdBRVgsbUJBQW9CLENBQ2xCNUosWUFBYSxxR0FDYkMsS0FBTSxVQUNOMkosU0FBUyxHQUVYLFlBQWEsQ0FDWDVKLFlBQWEscUZBQ2JDLEtBQU0sU0FDTjJKLFFBQVMsZ0JBRVhuWixRQUFTLENBQ1B1UCxZQUFhLHNDQUNiQyxLQUFNLFVBQ05DLE1BQU8sS2tCakNULGNBQWUsQ0FDYkYsWUFBYSxzQkFDYkMsS0FBTSxTQUNOQyxNQUFPLEtBRVQsVUFBVyxDQUNURixZQUFhLDJDQUNiQyxLQUFNLFVBQ05DLE1BQU8sQ0FBQyxNQUFPLE9DRGIySixHQUFVLENBQUEsRUFFSEMsR0FBK0IsQ0FDMUN6YSxRQUFTLFNBQ1QwUSxTQUFVLHNCQUNWOEosUUFBVUUsR0FDREEsRUFDSjFhLFFBQVEyYSxJQUNSM2EsUUFBUTRhLElBQ1I1YSxRQUFRNmEsSUFDUjdhLFFBQVE4YSxJQUNSOWEsUUFBUSthLElBQ1IvYSxRQUFRZ2IsSUFDUmhiLFFBQVFpYixJQUNSamIsUUFBUWtiLElBQ1JsYixRQUFRbWIsSUFDUm5iLFFBQVFvYixJQUNSQyxnQkFDQUMsUUFBTyxHQUVaeEssT0FBQUEsR0FDRSxHQUlFNkosR0FBNkUsQ0FDakYzYSxRQUFTLFNBQ1QwUSxTQUFVLHdEQUNWOEosR0FDQSxhQUFNMUosQ0FBUXBHLEdBQ1osTUFBTTZRLFFBQW9CQyxHQUFtQjlRLEdBQ3ZDK1EsRUFBaUJDLEdBQXNCaFIsR0FDN0MsSUFBSyxNQUFNc0csS0FBVzZHLEdBQXlCLGdCQUFpQjBELFNBQ3hEN0csR0FBYXdFLEdBQWNDLE9BQU9uSSxFQUFTeUssR0FBaUJ6SyxFQUFTdEcsRUFFL0UsR0FHSWlSLEdBQXFCLElBQ3RCbkIsR0FDSCxjQUFlLENBQ2I3SixZQUFhLDJDQUNiaUwsY0FBYyxFQUNkaEwsS0FBTSxTQUNOQyxNQUFPLE1BSUwrSixHQUE2RixDQUNqRzVhLFFBQVMsNkJBQ1QwUSxTQUFVLHVGQUNWOEosUUFBU21CLEdBQ1QsYUFBTTdLLENBQVFwRyxHQUNaLE1BQU02USxRQUFvQkMsR0FBbUI5USxHQUM3QyxJQUFLLE1BQU1zRyxLQUFXNkcsR0FBeUIsc0JBQXVCMEQsU0FDOUQ3RyxHQUFhd0UsR0FBY0csWUFBWXJJLEVBQVN0RyxFQUFLNE8sWUFBYXRJLEVBQVN0RyxFQUVyRixHQUdJbVEsR0FBaUYsQ0FDckY3YSxRQUFTLGFBQ1QwUSxTQUFVLGtDQUNWOEosR0FDQSxhQUFNMUosQ0FBUXBHLEdBQ1osTUFBTTZRLFFBQW9CQyxHQUFtQjlRLEdBQzdDLElBQUssTUFBTXNHLEtBQVc2RyxHQUF5QixvQkFBcUIwRCxTQUM1RDdHLEdBQWF3RSxHQUFjTSxXQUFXeEksR0FBVUEsRUFBU3RHLEVBRW5FLEdBR0lvUSxHQUE4RSxDQUNsRjlhLFFBQVMsVUFDVDBRLFNBQVUscURBQ1Y4SixHQUNBLGFBQU0xSixDQUFRcEcsR0FDWixNQUFNNlEsUUFBb0JDLEdBQW1COVEsR0FDdkMrUSxFQUFpQkMsR0FBc0JoUixHQUM3QyxJQUFLLE1BQU1zRyxLQUFXNkcsR0FBeUIsaUJBQWtCMEQsU0FDekQ3RyxHQUFhd0UsR0FBY08sUUFBUXpJLEVBQVN5SyxHQUFpQnpLLEVBQVN0RyxFQUVoRixHQUdJcVEsR0FBaUYsQ0FDckYvYSxRQUFTLGNBQ1QwUSxTQUFVLGtDQUNWOEosR0FDQSxhQUFNMUosQ0FBUXBHLEdBQ1osTUFBTTZRLFFBQW9CQyxHQUFtQjlRLEdBQ3ZDK1EsRUFBaUJDLEdBQXNCaFIsR0FDN0MsSUFBSyxNQUFNc0csS0FBVzZHLEdBQXlCLHFCQUFzQjBELFNBQzdEN0csR0FBYXdFLEdBQWNTLFdBQVczSSxFQUFTeUssR0FBaUJ6SyxFQUFTdEcsRUFFbkYsR0FHSXNRLEdBQTRFLENBQ2hGaGIsUUFBUyxRQUNUMFEsU0FBVSxtQkFDVjhKLEdBQ0EsYUFBTTFKLENBQVFwRyxHQUNaLE1BQU02USxRQUFvQkMsR0FBbUI5USxHQUN2QytRLEVBQWlCQyxHQUFzQmhSLEdBQzdDLElBQUssTUFBTXNHLEtBQVc2RyxHQUF5QixlQUFnQjBELFNBQ3ZEN0csR0FBYXdFLEdBQWN0VyxNQUFNb08sRUFBU3lLLEdBQWlCekssRUFBU3RHLEVBRTlFLEdBV0l1USxHQUFxRixDQUN6RmpiLFFBQVMsd0JBQ1QwUSxTQUFVLHNDQUNWOEosUUFYcUIsSUFDbEJtQixHQUNIRSxPQUFRLENBQ05sTCxZQUFhLG9GQUNiQyxLQUFNLFdBUVIsYUFBTUUsQ0FBUXBHLEdBQ1osTUFBTTZRLFFBQW9CQyxHQUFtQjlRLEdBQzdDLElBQUssTUFBTXNHLEtBQVc2RyxHQUF5QixpQkFBa0IwRCxHQUFjLENBQzdFLE1BQU1NLEVBQ0puUixFQUFLbVIsU0FBVzdLLEVBQVExRixZQUFZdUMsY0FBYzhILE1BQVEsc0JBQXdCLGlDQUM5RWpCLEdBQWF3RSxHQUFjVSxRQUFRNUksRUFBU3RHLEVBQUs0TyxXQUFZdUMsR0FBUzdLLEVBQVN0RyxFQUN2RixDQUNGLEdBWUl3USxHQUErRSxDQUNuRmxiLFFBQVMsT0FDVDBRLFNBQVUsNkJBQ1Y4SixRQVprQixJQUNmQSxHQUNIakQsS0FBTSxDQUNKMUcsTUFBTyxJQUNQRixZQUFhLDJCQUNiQyxLQUFNLFdBUVIsYUFBTUUsQ0FBUXBHLEdBQ1osTUFBTTZRLFFBQW9CQyxHQUFtQjlRLEdBQzdDLElBQUssTUFBTXNHLEtBQVc2RyxHQUF5QixjQUFlMEQsU0FDdEQ3RyxHQUFhd0UsR0FBY1EsS0FBSzFJLEVBQVN0RyxFQUFLNk0sTUFBT3ZHLEVBQVN0RyxFQUV4RSxHQWVJeVEsR0FBbUYsQ0FDdkZuYixRQUFTLDBCQUNUMFEsU0FBVSxxQkFDVjhKLFFBZm9CLElBQ2pCQSxHQUNILGlCQUFrQixDQUNoQjdKLFlBQWEsOEJBQ2JDLEtBQU0sVUFFUmtMLFNBQVUsQ0FDUm5MLFlBQWEsZ0ZBQ2JDLEtBQU0sWUFRUixhQUFNRSxDQUFRcEcsR0FDWixHQUFJQSxFQUFLb1IsVUFBWXBSLEVBQUtzUCxZQUN4QixNQUFNLElBQUlqWSxNQUFNLDREQUdsQixNQUFNd1osUUFBb0JDLEdBQW1COVEsR0FDdkMrUSxFQUFpQkMsR0FBc0JoUixFQUFNLENBQUMsaUJBQWtCLGFBQ3RFLElBQUssTUFBTXNHLEtBQVc2RyxHQUF5QixnQkFBaUIwRCxHQUFjLENBQzVFLE1BQU12QixFQUFjdFAsRUFBS29SLFNBQ3JCOUssRUFBUTFGLFlBQVl1QyxjQUFjOEgsTUFDaEMsc0JBQ0EsMEJBQ0ZqTCxFQUFLc1AsYUFBYXRRLGlCQUNoQmdMLEdBQWF3RSxHQUFjYSxPQUFPL0ksRUFBU2dKLEVBQWF5QixHQUFpQnpLLEVBQVN0RyxFQUMxRixDQUNGLEdBS0kwUSxHQUE0RixDQUNoR3BiLFFBQVMsY0FDVDBRLFNBQVUsaURBQ1Y4SixRQUw0QixDQUFFdmEsS0FBTSxDQUFFMlEsS0FBTSxVQU01QyxhQUFNRSxDQUFRcEcsR0FDWixNQUFNNlEsUUFBb0JDLEdBQW1COVEsR0FHdkNxUixFQUFjLEVBRkpyUixFQUFLekssTUFBTWtMLEtBQUssTUFBUSxJQUFJNlEsVUFDckJOLEdBQXNCaFIsRUFBTSxDQUFDLFVBQ1BzQyxPQUFPaVAsU0FBUzlRLEtBQUssS0FDbEUsSUFBSyxNQUFNNkYsS0FBVzZHLEdBQXlCLFVBQVVrRSxJQUFlUixTQUNoRTdHLEdBQWEsVUFBVXFILElBQWUvSyxFQUFTdEcsRUFFekQsR0FHRjVLLGVBQWUwYixHQUFtQjlRLEdBQ2hDLE1BQU04RSxRQUFpQlgsRUFBdUJuRSxHQUN6QzhFLElBQ0huTyxRQUFRSSxNQUFNd1AsRUFBTUMsSUFBSSxzQkFDeEJyUSxRQUFRc1YsS0FBSyxJQUdmLE1BQU0rRixFQUFXMU0sRUFBU0YsWUFBWXRDLE9BQ25DZ0UsR0FBWUEsRUFBUTFGLFlBQVl1QyxjQUFjQyxRQUFVa0QsRUFBUTFGLFlBQVl5QyxpQkFBaUJELFFBTWhHLE9BSndCLElBQXBCb08sRUFBU3ZZLFNBQ1h0QyxRQUFRSSxNQUFNd1AsRUFBTUMsSUFBSSw2QkFDeEJyUSxRQUFRc1YsS0FBSyxJQUVSK0YsQ0FDVCxDQUtPLFNBQVNSLEdBQXNCaFIsRUFBK0J5UixFQUF5QixJQUM1RixNQUFNVixFQUEyQixHQUczQlcsRUFBbUJyUyxPQUFPeUQsS0FBSzhNLElBQy9CK0IsRUFBc0J0UyxPQUFPdEIsT0FBTzZSLElBQ3ZDdk4sUUFBU3VQLEdBQ0osVUFBV0EsRUFDTjNTLE1BQU1DLFFBQVEwUyxFQUFPekwsT0FBU3lMLEVBQU96TCxNQUFRLENBQUN5TCxFQUFPekwsT0FFdkQsSUFFUjNILElBQUlzTyxRQUVEK0UsRUFBa0IsSUFBSS9ULElBQUksSUFDM0IyVCxLQUNBQyxLQUNBQyxFQUVILElBQ0EsT0FHRixJQUFLLE1BQU9qUCxFQUFLQyxLQUFVdEQsT0FBT3RILFFBQVFpSSxHQUN4QyxJQUFLNlIsRUFBZ0JySyxJQUFJOUUsR0FBTSxDQUc3QixNQUFNb1AsRUFBZXBQLEVBQUlwQixXQUFXLFNBQVd5USxHQUFVLElBQUlBLEVBQU1DLGlCQUNuRSxHQUFJRixJQUFpQnBQLFFBQThCdEwsSUFBdkI0SSxFQUFLOFIsR0FDL0IsU0FJRixHQUFxQixrQkFBVm5QLEdBQXVCQSxFQUNoQ29PLEVBQWUzVCxLQUFLLEtBQUtzRixVQUd0QixHQUFxQixpQkFBVkMsR0FBdUMsaUJBQVZBLEVBQzNDb08sRUFBZTNULEtBQUssS0FBS3NGLElBQU9vSyxPQUFPbkssU0FHcEMsR0FBSTFELE1BQU1DLFFBQVF5RCxHQUNyQixJQUFLLE1BQU1zUCxLQUFRdFAsRUFDakJvTyxFQUFlM1QsS0FBSyxLQUFLc0YsSUFBT29LLE9BQU9tRixHQUc3QyxDQUdGLE9BQU9sQixFQUFldFEsS0FBSyxJQUM3QixDQ3hSQSxNQW9CYXlSLEdBR1QsQ0FDRjVjLFFBQVMsNEJBQ1QwUSxTQUFVLG9EQXpCSSxDQUNkbU0sTUFBTyxDQUNMbE0sWUFBYSx3QkFDYkMsS0FBTSxTQUNOQyxNQUFPLElBQ1AwSixRQUFTLElBc0JYLGFBQU16SixDQUFRcEcsR0FDWixNQUFNc0csRUFBVXBDLEVBQWdCbEUsR0FDM0JzRyxJQUNIM1AsUUFBUUksTUFBTXdQLEVBQU1DLElBQUksc0JBQ3hCclEsUUFBUXNWLEtBQUssSUFHZixNQUFNMkcsRUFBYSxDQUFDcFMsRUFBSzFLLFdBQWEwSyxFQUFLekssTUFBUSxNQUFReUssRUFBSzdELEVBQUVpRCxNQUFNLElBQUlrRCxPQUFPaVAsU0FDbkYsSUFBSWMsRUFBYSxFQUNqQixJQUFLLElBQUl6YSxFQUFJLEVBQUdBLEVBQUlvSSxFQUFLbVMsTUFBT3ZhLElBUTlCLEdBUElBLEVBQUksR0FDTmpCLFFBQVFDLEtBQUssS0FBSzJQLEVBQU0rTCxPQUFPLElBQUkxYSxlQUFld2EsRUFBVzNSLEtBQUssV0FHcEU0UixRQUFtQnJJLEdBQWFvSSxFQUFXM1IsS0FBSyxLQUFNNkYsRUFBU3RHLEVBQU0sQ0FDbkUrSixjQUFjLElBRUcsSUFBZnNJLEVBQWtCLE9BRXhCbGMsUUFBUXNWLEtBQUs0RyxFQUNmLEdDdENXRSxHQUE0RSxDQUN2RmpkLFFBQVMsUUFDVDBRLFNBQVUsaUVBSkksQ0FBQSxFQU1kLGFBQU1JLENBQVFwRyxTQU1UNUssZUFDTDRLLEVBQ0FxRyxHQUVBLE1BQU12QixRQUFpQlgsRUFBdUJuRSxHQUFNLEVBQU9xRyxHQUN0RHZCLElBQ0huTyxRQUFRSSxNQUFNd1AsRUFBTUMsSUFBSSxzQkFDeEJyUSxRQUFRc1YsS0FBSyxJQUdmLElBQUssTUFBTW5GLEtBQVc2RyxHQUF5QixRQUFTckksRUFBU0YsYUFBYyxDQUM3RSxNQUFNNE4sUUFBZ0JqUyxFQUFHa1MsUUFBUW5NLEVBQVFwRyxRQUFTLENBQUV3UyxlQUFlLElBQ25FLEdBQUlwTSxJQUFZeEIsRUFBU0wsS0FBTSxDQUM3QixHQUFzQixXQUFsQmtPLEVBQUdDLFdBQXlCLENBQzlCLE1BQU1DLEVBQVcsQ0FBQyxVQUNkdk0sRUFBUW5GLGVBQ1YwUixFQUFTelYsS0FBSyxnQkFFVnlOLEdBQXVCLGdCQUFnQmdJLEVBQVNwUyxLQUFLLE9BQVE2RixFQUFTdEcsRUFDOUUsQ0FFSXdTLEVBQVFwSyxLQUFNek8sR0FBTUEsRUFBRW1aLFVBQVluWixFQUFFc0QsS0FBSzhELFNBQVMsb0JBQzlDaUosR0FBYSxlQUFnQjFELEVBQVN0RyxFQUFNLENBQUUrSixjQUFjLEdBRXRFLENBRUEsR0FBSXlJLEVBQVFwSyxLQUFNek8sR0FBTUEsRUFBRW1aLFVBQXVCLG1CQUFYblosRUFBRXNELE1BQTRCLE9BQzVENE4sR0FBdUIsNENBQTZDdkUsRUFBU3RHLEdBQ25GLE9BQVMrUyxHQUFXNUwsRUFBY0MsU0FBUyx1QkFBdUJwSSxXQUFXcUksT0FBT1ksTUFBTSxhQUNwRjRDLEdBQXVCLGtCQUFrQmtJLElBQVd6TSxFQUFTdEcsU0FDN0Q0SixHQUFZb0osbUJBQ1poSixHQUFhLHVDQUF3QzFELEVBQVN0RyxTQUM5RGdLLEdBQWEsd0JBQXlCMUQsRUFBU3RHLEVBQ3ZELENBR0dzRyxJQUFZeEIsRUFBU0wsTUFBU0ssRUFBU0wsS0FBSzdELFlBQVlDLFVBQVUsY0FDbkV5RixFQUFRMUYsWUFBWUMsVUFBVSxtQkFFeEJtSixHQUFhLEdBQUdsRSxhQUFrQ1EsRUFBU3RHLEVBRXJFLENBRUEsTUFBTXNHLEVBQVV4QixFQUFTRixZQUFZWCxLQUFNaEssR0FBTUEsRUFBRTJHLFlBQVl5QyxpQkFBaUI0UCxZQUM1RTNNLFNBQ0kwRCxHQUFhLEdBQUdsRSxtQ0FBd0RRLEVBQVN0RyxFQUUzRixDQXBEVWtULENBQU1sVCxFQUNkLEdDWUssU0FBU21ULEdBQVVuVCxHQUN4QixPQUFRQSxFQUE2Qm9ULE9BQVMsZUFBaUIsRUFDakUsQ0M1Qk9oZSxlQUFlaWUsR0FBa0JDLEVBQVksSUFBTUMsRUFBYyxLQUN0RSxJQUFLLElBQUk3SixFQUFPNEosRUFBVzVKLEVBQU80SixFQUFZQyxFQUFhN0osSUFDekQsU0FBVThKLEdBQWdCOUosR0FDeEIsT0FBT0EsRUFHWCxNQUFNLElBQUlyUyxNQUFNLG9DQUFvQ2ljLEtBQWFBLEVBQVlDLEVBQWMsSUFDN0YsQ0FPQW5lLGVBQWVvZSxHQUFnQjlKLEdBQzdCLE9BQU8sSUFBSWpVLFFBQVNSLElBQ2xCLE1BQU13ZSxFQUFTQyxJQUVmRCxFQUFPRSxLQUFLLFFBQVVDLElBQ2hCQSxFQUFJMWMsS0FDTmpDLEdBQVEsS0FNWndlLEVBQU9FLEtBQUssWUFBYSxLQUN2QkYsRUFBT0ksTUFBTSxLQUNYNWUsR0FBUSxPQUlad2UsRUFBT0ssT0FBT3BLLEVBQU0sY0FFeEIsQ0NHTyxNQUFNcUssR0FBZ0IsSUFwQzdCLE1BQ0VDLGFBQUFBLENBQWMxTixFQUFrQnlNLEdBRTlCLE1BQU0zSCxFQUFTOUUsRUFBUTlDLGtCQUFrQjNDLFVBQVUsd0JBQy9DLG9DQUNBLEdBQ0osTUFBTyxNQUFNN0wsRUFBS3lPLFFBQVE2QyxFQUFRcEYsU0FBUywwQkFDdENrSyxzRkFDaUM5RSxFQUFRakYsbUlBRXJCaUYsRUFBUS9FLElBQUlXLDBDQUNSNlEsS0FDL0IsQ0FFQWtCLFlBQUFBLENBQWEzTixFQUFrQjROLEdBQVcsRUFBT3hGLEVBQW9CLEdBQUl5RixFQUFpQixJQUN4RixNQUFPLEdBQUczYixLQUFLNGIsS0FBSzlOLFNBQWU0TixFQUFXLFlBQWMsS0FBSzFiLEtBQUtILE1BQ3BFaU8sRUFDQW9JLEVBQ0F5RixJQUVKLENBRUE5YixLQUFBQSxDQUFNaU8sRUFBa0JvSSxFQUFvQixHQUFJeUYsRUFBaUIsSUFFL0QsT2JIRyxTQUF5QmxLLEVBQWdCM0QsR0FDOUMsTUFBTW1FLEVBQVdBLEtBQ2YsR0FBSWpCLEdBQU9oQyxJQUFJeUMsR0FBUyxPQUV4QlQsR0FBT3hMLElBQUlpTSxHQUNYSyxHQUFXTCxFQUFRM0QsR0FDbkIsTUFBTWhQLE9BQUVBLEdBQVd3USxFQUFVbUMsRUFBUSxDQUFFdkksSUFBSzRFLEVBQVFwRyxRQUFTb0osT0FBTyxFQUFNdkIsTUFBTyxZQUNqRndDLEdBQTZCTixFQUFRM1MsRUFBUSxLQUUvQyxJQUFLLE1BQU1ILElBQVUsQ0FBQyxhQUFjLFNBQVUsVUFBVyxXQUN2RGhCLFFBQVFILEdBQUdtQixFQUFRc1QsRUFFdkIsQ2FWSTRKLENBQWdCN2IsS0FBSzRiLEtBQUs5TixHQUFVQSxHQUM3QixxREFBcURBLEVBQVFqRixtQkFBbUJxTixLQUFxQnBJLEVBQVFqRixtQkFBbUI4UyxHQUN6SSxDQUVBQyxJQUFBQSxDQUFLOU4sR0FDSCxNQUFPLHdEQUF3REEsRUFBUWpGLGdDQUN6RSxDQUVBaVQsT0FBQUEsR0FDRSxNQUFPLG1EQUNULEdDdEJLLE1BQWVDLEdBQ3BCQyxXQUFBQSxDQUFZbE8sRUFBa0J5TSxFQUFVLGVBQ3RDLE9BQU9nQixHQUFjQyxjQUFjMU4sRUFBU3lNLEVBQzlDLENBUUEwQixXQUFBQSxDQUFZbk8sRUFBa0J0RyxHQUM1QixNQUFNMEosRUFBTzdLLE9BQU95SCxFQUFRL0UsSUFBSW1ULE9BQVMsS0FDekMsTUFBTyxHQUFHbGMsS0FBS2djLFlBQVlsTyxLQUFXNk0sR0FBVW5ULHdFQUV6QytULEdBQWNFLGFBQ2YzTixHQUNBLEVBQ0F0RyxFQUFLMlUsNkJBQStCLEdBQ3BDM1UsRUFBSzRVLG9CQUFzQixrQkFFMUJwYyxLQUFLcWMsZUFBZXZPLEVBQVN0RyxFQUFNMEosS0FDNUMsQ0FFQW9MLE9BQUFBLENBQ0V4TyxFQUNBdEcsR0FDQStVLGVBQUVBLEVBQWlCLGlCQUFnQkMsZ0JBQUVBLEVBQWVDLGFBQUVBLElBRXRELE1BQU0xVCxFQUFNK0UsRUFBUS9FLElBQUlXLE9BQ2xCd0gsRUFBT3BELEVBQVEvRSxJQUFJbVQsTUFBUSxPQUMzQm5NLEVBQVNqQyxFQUFRMUYsWUFBWUMsVUFBVSx1QkFBeUIsK0JBQWlDLEdBQ2pHcVUsRUFBYWxWLEVBQUttVixTQUFXblYsRUFBS21WLFFBQVFsYyxPQUFTLEVBQUkrRyxFQUFLbVYsUUFBUTFVLEtBQUssS0FBTyxZQUN0RixNQUFPLFVBQVVjLHdCQUEwQkEsYUFBZUEsVUFBWW1JLDBFQUMxRHNMLGNBQTRCQyx1RUFDWXZMLGdDQUNULG1CQUFuQnFMLEVBQXNDLFFBQVFHLElBQWVILElBQWlCeE0sSUFDeEcsQ0FFQTZNLFVBQUFBLENBQ0U5TyxFQUNBdEcsR0FDQStVLGVBQUVBLEVBQWlCLGlCQUFnQkUsYUFBRUEsSUFFckMsTUFBTTFULEVBQU0rRSxFQUFRL0UsSUFBSVcsT0FDbEJ3SCxFQUFPcEQsRUFBUS9FLElBQUltVCxNQUFRLE9BQzNCbk0sRUFBU2pDLEVBQVExRixZQUFZQyxVQUFVLHVCQUF5QiwrQkFBaUMsR0FDakdxVSxFQUFhbFYsRUFBS21WLFNBQVduVixFQUFLbVYsUUFBUWxjLE9BQVMsRUFBSStHLEVBQUttVixRQUFRMVUsS0FBSyxLQUFPLFlBQ3RGLE1BQU8sVUFBVWMsd0JBQTBCQSxhQUFlQSxVQUFZbUksbUVBQ2pFdUwsdUVBQytDdkwsZ0NBQ1QsbUJBQW5CcUwsRUFBc0MsUUFBUUcsSUFBZUgsSUFBaUJ4TSxJQUN4RyxDQUlBOE0sUUFBQUEsQ0FBUy9PLEVBQWtCdEcsR0FDekIsTUFBTWtWLEVBQWFsVixFQUFLbVYsU0FBV25WLEVBQUttVixRQUFRbGMsT0FBUyxFQUFJK0csRUFBS21WLFFBQVExVSxLQUFLLEtBQU8sYUFDdEYsT0FBSTZGLEVBQVFoRCxVQUVILFVBQVVnRCxFQUFRL0UsSUFBSVcsMEJBQTBCZ1QsMENBQzlDNU8sRUFBUWpHLGVBQ1YsVUFBVWlHLEVBQVEvRSxJQUFJVyxtQkFBbUJnVCxJQUUzQyxrQkFDVCxDQUVVSSxPQUFBQSxDQUFRaFAsRUFBa0J0RyxFQUFrQjBKLEVBQU9wRCxFQUFRL0UsSUFBSW1ULE1BQVEsS0FDL0UsTUFBTyx5Q0FBeUNoTCx5RUFDSUEsMEVBQ0NBLDBFQUNBQSwwRUFDQUEsMEVBQ0FBLEdBQ3ZELENBRVVtTCxjQUFBQSxDQUFldk8sRUFBa0J0RyxFQUFrQjBKLEVBQU9wRCxFQUFRL0UsSUFBSW1ULE1BQVEsS0FDdEYsTUFBTyxHQUFHbGMsS0FBSzhjLFFBQ2JoUCxFQUNBdEcsRUFDQTBKLHNDQUNtQ0EsNENBQStDQSxHQUN0RixFQzNCSyxNQUFNNkwsR0FBZSxJQTdENUIsY0FBMkJoQixHQUNoQmxjLEtBQUFBLENBQU1pTyxFQUFrQnRHLEdBQy9CLE1BQU13VixFQUFTbFAsRUFBUS9FLElBQUlXLE9BQVMsV0FBV29FLEVBQVEvRSxJQUFJVyxVQUFZLEdBQ2pFd0gsRUFBTzdLLE9BQU95SCxFQUFRL0UsSUFBSW1ULE9BQVMsSUFDekMsTUFBTyxHQUFHYyx1RUFDUTlMLEtBQVExSixFQUFLNFUsb0JBQXNCLGVBQ2hEcGMsS0FBS3FjLGVBQWV2TyxFQUFTdEcsRUFBTTBKLEtBQzFDLENBRVMrTCxlQUFBQSxDQUFnQm5QLEVBQWtCdEcsRUFBa0IwSixHQUUzRCxNQUFPLEdBRFFwRCxFQUFRL0UsSUFBSVcsT0FBUyxXQUFXb0UsRUFBUS9FLElBQUlXLFVBQVksK0VBRWxFLENBQ0RzTSxHQUFjTyxRQUFRekksR0FDdEJBLEVBQVEzRixhQUNSLFFBQVErSSx1QkFBMEJwRCxFQUFRcEYsU0FBUywyQkFBMkJsQixFQUFLNFUsb0JBQXNCLE1BQ3pHblUsS0FBSyxvQkFDSmpJLEtBQUtxYyxlQUFldk8sRUFBU3RHLEVBQU0wSixLQUMxQyxDQUVTZ00sU0FBQUEsQ0FBVXBQLEVBQWtCdEcsR0FDbkMsTUFBTTBKLEVBQU83SyxPQUFPeUgsRUFBUS9FLElBQUltVCxPQUFTLEtBQ3pDLE1BQU8seURBQ0YsSUFDRWxHLEdBQWN0VyxNQUFNb08sR0FBUzJCLE1BQU0sTUFDdEMzQixFQUFRM0YsYUFDUixxQkFBcUIyRixFQUFRcEYsU0FBUywyQkFFckMxQyxJQUFLckYsR0FBTSxHQUFHQSxFQUFFa08sU0FBUzhMLEdBQVVuVCxNQUNuQ1MsS0FBSyxvQkFDTGpJLEtBQUs4YyxRQUFRaFAsRUFBU3RHLEVBQU0wSixLQUNuQyxDQUVTb0wsT0FBQUEsQ0FBUXhPLEVBQWtCdEcsRUFBZ0J4SyxHQUNqRCxPQUFPbWdCLE1BQU1iLFFBQVF4TyxFQUFTdEcsRUFBTSxDQUNsQytVLGVBQWdCdmYsRUFBUXVmLGVBQ3hCQyxnQkFBaUIsS0FDakJDLGFBQ0V6ZixFQUFReWYsY0FDUixJQUNLekcsR0FBY3RXLE1BQU1vTyxHQUFTMkIsTUFBTSxNQUN0QzNCLEVBQVEzRixhQUNSLHFCQUFxQjJGLEVBQVFwRixTQUFTLDJCQUVyQzFDLElBQUtyRixHQUFNLEdBQUdBLEVBQUVrTyxTQUFTOEwsR0FBVW5ULE1BQ25DUyxLQUFLLFNBRWQsQ0FFUzJVLFVBQUFBLENBQVc5TyxFQUFrQnRHLEdBQWdCK1UsZUFBRUEsRUFBY0UsYUFBRUEsSUFDdEUsTUFDTVcsRUFBc0IsZ0JBRGZ0UCxFQUFRL0UsSUFBSW1ULE1BQVEsU0FDa0J2QixHQUFVblQsS0FDN0QsT0FBTzJWLE1BQU1QLFdBQVc5TyxFQUFTdEcsRUFBTSxDQUFFK1UsaUJBQWdCRSxhQUFjQSxHQUFnQlcsR0FDekYsQ0FFQSxlQUFlQyxDQUFVdlAsRUFBa0J0RyxHQUN6QyxNQUFNMEosUUFBYTJKLEtBQ25CLE1BQU8sVUFBVS9NLEVBQVEvRSxJQUFJVyw4RUFBOEV3SCxJQUFPeUosR0FBVW5ULFFBQVd4SCxLQUFLOGMsUUFBUWhQLEVBQVN0RyxFQUFNMEosS0FDckssR0NNSyxNQUFNb00sR0FBb0IsSUEvRGpDLGNBQWdDdkIsR0FDckJsYyxLQUFBQSxDQUFNaU8sRUFBa0J0RyxHQUUvQixNQUFPLFFBRE1uQixPQUFPeUgsRUFBUS9FLElBQUltVCxPQUFTLHlCQUNBMVUsRUFBSytWLE1BQVEsVUFBWSxzQkFBc0IvVixFQUFLNFUsb0JBQXNCLElBQ3JILENBRVNILFdBQUFBLENBQVluTyxFQUFrQnRHLEdBQ3JDLE1BQU8sR0FBR3hILEtBQUtnYyxZQUFZbE8sS0FBVzZNLEdBQVVuVCxTQUFZK1QsR0FBY0UsYUFDeEUzTixHQUNBLEVBQ0F0RyxFQUFLMlUsNkJBQStCLEdBQ3BDM1UsRUFBSzRVLG9CQUFzQixLQUUvQixDQUVTYSxlQUFBQSxDQUFnQm5QLEVBQWtCdEcsRUFBa0IwSixFQUFPLE1BQ2xFLE1BQU8sdUJBQ0xwRCxFQUFRM0YsZUFDUHdTLEdBQVVuVCwyQ0FBOEMwSixNQUFTOUQsbUJBQWlDNUYsRUFBSzRVLG9CQUFzQixJQUNsSSxDQUVTYyxTQUFBQSxDQUFVcFAsRUFBa0J0RyxHQUNuQyxNQUFPLEdBQUdzRyxFQUFRcEQsVUFBWSxtREFBcUQsTUFBTTFLLEtBQUtpZCxnQkFDNUZuUCxFQUNBdEcsS0FFSixDQUVTOFUsT0FBQUEsQ0FDUHhPLEVBQ0F0RyxHQUNBaVYsYUFDRUEsRUFBZSxHQUFHM08sRUFBUXBELFVBQVksbURBQXFELE1BQU0xSyxLQUFLaWQsZ0JBQ3BHblAsRUFDQXRHLFFBSUosTUFBTTBKLEVBQU9wRCxFQUFRL0UsSUFBSW1ULE1BQVEsT0FDM0JuTSxFQUFTakMsRUFBUTFGLFlBQVlDLFVBQVUsdUJBQXlCLCtCQUFpQyxHQUNqR3FVLEVBQWFsVixFQUFLbVYsU0FBV25WLEVBQUttVixRQUFRbGMsT0FBUyxFQUFJK0csRUFBS21WLFFBQVExVSxLQUFLLEtBQU8sWUFDdEYsTUFBTyw4QkFBOEI2RixFQUFRL0UsSUFBSVcsZUFBZXdILG1FQUMzRHVMLHVFQUMrQ3ZMLG1CQUFzQndMLDBDQUFtRDNNLElBQy9ILENBRVM2TSxVQUFBQSxDQUFXOU8sRUFBa0J0RyxHQUFnQmlWLGFBQUVBLElBQ3RELE1BQU12TCxFQUFPcEQsRUFBUS9FLElBQUltVCxNQUFRLE9BQzNCbk0sRUFBU2pDLEVBQVExRixZQUFZQyxVQUFVLHVCQUF5QiwrQkFBaUMsR0FDakdxVSxFQUFhbFYsRUFBS21WLFNBQVduVixFQUFLbVYsUUFBUWxjLE9BQVMsRUFBSStHLEVBQUttVixRQUFRMVUsS0FBSyxLQUFPLFlBQ3RGLE1BQU8sOEJBQ0w2RixFQUFRL0UsSUFBSVcsZUFDTHdILG1FQUNKdUwsR0FBZ0J6YyxLQUFLSCxNQUFNaU8sRUFBU3RHLHdFQUNXMEosbUJBQXNCd0wsMENBQW1EM00sSUFDL0gsQ0FFQSxlQUFlc04sQ0FBVXZQLEVBQWtCdEcsR0FDekMsTUFBTTBKLFFBQWEySixLQUNuQixNQUFPLFVBQVUvTSxFQUFRL0UsSUFBSVcsZUFBZXdILDREQUErRGxSLEtBQUtILE1BQU1pTyxFQUFTdEcsUUFBV3hILEtBQUs4YyxRQUFRaFAsRUFBU3RHLEVBQU0wSixLQUN4SyxHQ0ZLLE1BQU1zTSxHQUFjLElBM0QzQixjQUEwQnpCLEdBQ2ZsYyxLQUFBQSxDQUFNaU8sRUFBa0J0RyxHQUMvQixNQUFNMEosRUFBTzdLLE9BQU95SCxFQUFRL0UsSUFBSW1ULE9BQVMsSUFDekMsTUFBTyxpRkFDc0JoTCxLQUFRMUosRUFBSzRVLG9CQUFzQixlQUMzRHBjLEtBQUtxYyxlQUFldk8sRUFBU3RHLEVBQU0wSixLQUMxQyxDQUVTK0wsZUFBQUEsQ0FBZ0JuUCxFQUFrQnRHLEVBQWtCMEosR0FDM0QsTUFBTyw2RUFDRixJQUNHcEQsRUFBUXBELFVBQVksQ0FBQ3NMLEdBQWNPLFFBQVF6SSxJQUFZLEdBQzNEQSxFQUFRM0YsYUFDUixRQUFRK0ksdUJBQTBCcEQsRUFBUXBGLFNBQVMsMkJBQTJCbEIsRUFBSzRVLG9CQUFzQixNQUN6R25VLEtBQUssb0JBQ0pqSSxLQUFLcWMsZUFBZXZPLEVBQVN0RyxFQUFNMEosS0FDMUMsQ0FFU2dNLFNBQUFBLENBQVVwUCxFQUFrQnRHLEdBQ25DLE1BQU0wSixFQUFPN0ssT0FBT3lILEVBQVEvRSxJQUFJbVQsT0FBUyxLQUN6QyxNQUFPLHlEQUNGLElBQ0dwTyxFQUFRcEQsVUFBWXNMLEdBQWN0VyxNQUFNb08sR0FBUzJCLE1BQU0sTUFBUSxHQUNuRTNCLEVBQVEzRixhQUNSLHFCQUFxQjJGLEVBQVFwRixTQUFTLDJCQUVyQzFDLElBQUtyRixHQUFNLEdBQUdBLEVBQUVrTyxTQUFTOEwsR0FBVW5ULE1BQ25DUyxLQUFLLG9CQUNMakksS0FBSzhjLFFBQVFoUCxFQUFTdEcsRUFBTTBKLEtBQ25DLENBRVNvTCxPQUFBQSxDQUFReE8sRUFBa0J0RyxFQUFnQnhLLEdBQ2pELE9BQU9tZ0IsTUFBTWIsUUFBUXhPLEVBQVN0RyxFQUFNLENBQ2xDK1UsZUFBZ0J2ZixFQUFRdWYsZUFDeEJDLGdCQUFpQixLQUNqQkMsYUFDRXpmLEVBQVF5ZixjQUNSLElBQ00zTyxFQUFRcEQsVUFBWXNMLEdBQWN0VyxNQUFNb08sR0FBUzJCLE1BQU0sTUFBUSxHQUNuRTNCLEVBQVEzRixhQUNSLHFCQUFxQjJGLEVBQVFwRixTQUFTLDJCQUVyQzFDLElBQUtyRixHQUFNLEdBQUdBLEVBQUVrTyxTQUFTOEwsR0FBVW5ULE1BQ25DUyxLQUFLLFNBRWQsQ0FFUzJVLFVBQUFBLENBQVc5TyxFQUFrQnRHLEdBQWdCaVYsYUFBRUEsSUFDdEQsTUFDTVcsRUFBc0IsMkJBRGZ0UCxFQUFRL0UsSUFBSW1ULE1BQVEsU0FDNkJ2QixHQUFVblQsS0FDeEUsT0FBTzJWLE1BQU1QLFdBQVc5TyxFQUFTdEcsRUFBTSxDQUFFaVYsYUFBY0EsR0FBZ0JXLEdBQ3pFLENBRUEsZUFBZUMsQ0FBVXZQLEVBQWtCdEcsR0FDekMsTUFBTTBKLFFBQWEySixLQUNuQixNQUFPLFVBQVUvTSxFQUFRL0UsSUFBSVcseUZBQXlGd0gsSUFBT3lKLEdBQVVuVCxRQUFXeEgsS0FBSzhjLFFBQVFoUCxFQUFTdEcsRUFBTTBKLEtBQ2hMLEdDcEJLLE1BQU11TSxHQUFrQixJQXRDL0IsY0FBOEIxQixHQUNuQmxjLEtBQUFBLENBQU1pTyxFQUFrQnRHLEdBRS9CLE1BQU8sUUFETW5CLE9BQU95SCxFQUFRL0UsSUFBSW1ULE9BQVMseUJBQ0ExVSxFQUFLK1YsTUFBUSxVQUFZLHNCQUFzQi9WLEVBQUs0VSxvQkFBc0IsSUFDckgsQ0FFU0gsV0FBQUEsQ0FBWW5PLEVBQWtCdEcsR0FDckMsTUFBTyxHQUFHeEgsS0FBS2djLFlBQVlsTyxLQUFXNk0sR0FBVW5ULFNBQVkrVCxHQUFjRSxhQUN4RTNOLEdBQ0EsRUFDQXRHLEVBQUsyVSw2QkFBK0IsR0FDcEMzVSxFQUFLNFUsb0JBQXNCLEtBRS9CLENBRVNhLGVBQUFBLENBQWdCblAsRUFBa0J0RyxHQUN6QyxNQUFPLHVCQUF1QnNHLEVBQVEzRix1Q0FBdUNpRixtQkFDM0U1RixFQUFLNFUsb0JBQXNCLElBRS9CLENBRVNjLFNBQUFBLEdBQ1AsTUFBTyxvQkFDVCxDQUVTWixPQUFBQSxHQUNQLE1BQU8sb0JBQ1QsQ0FFU00sVUFBQUEsR0FDUCxNQUFPLG9CQUNULENBRVNTLFNBQUFBLEdBQ1AsT0FBT3BnQixRQUFRUixRQUFRLHFCQUN6QixHQzBCSyxNQUFNaWhCLEdBQWUsSUEzRDVCLGNBQTJCM0IsR0FDaEJsYyxLQUFBQSxDQUFNaU8sRUFBa0J0RyxHQUMvQixNQUFNMEosRUFBTzdLLE9BQU95SCxFQUFRL0UsSUFBSW1ULE9BQVMsSUFDekMsTUFBTyxRQUFRaEwscUVBQ0ExSixFQUFLNFUsb0JBQXNCLGVBQ3JDcGMsS0FBS3FjLGVBQWV2TyxFQUFTdEcsRUFBTTBKLEtBQzFDLENBRVMrTCxlQUFBQSxDQUFnQm5QLEVBQWtCdEcsRUFBa0IwSixHQUMzRCxNQUFPLDZFQUNGOEUsR0FBY08sUUFBUXpJLFNBQWVBLEVBQVEzRix3QkFBd0IrSSx1QkFBMEJwRCxFQUFRcEYsU0FDeEcsMkJBQ0dsQixFQUFLNFUsb0JBQXNCLGVBQzdCcGMsS0FBS3FjLGVBQWV2TyxFQUFTdEcsRUFBTTBKLEtBQzFDLENBRVNnTSxTQUFBQSxDQUFVcFAsRUFBa0J0RyxHQUNuQyxNQUFNMEosRUFBTzdLLE9BQU95SCxFQUFRL0UsSUFBSW1ULE9BQVMsS0FDekMsTUFBTyx5REFDRixJQUNFbEcsR0FBY3RXLE1BQU1vTyxHQUFTMkIsTUFBTSxNQUN0QzNCLEVBQVEzRixhQUNSLHFCQUFxQjJGLEVBQVFwRixTQUFTLDJCQUVyQzFDLElBQUtyRixHQUFNLEdBQUdBLEVBQUVrTyxTQUFTOEwsR0FBVW5ULE1BQ25DUyxLQUFLLG9CQUNMakksS0FBSzhjLFFBQVFoUCxFQUFTdEcsRUFBTTBKLEtBQ25DLENBRVNvTCxPQUFBQSxDQUFReE8sRUFBa0J0RyxFQUFnQnhLLEdBQ2pELE9BQU9tZ0IsTUFBTWIsUUFBUXhPLEVBQVN0RyxFQUFNLENBQ2xDK1UsZUFBZ0J2ZixFQUFRdWYsZUFDeEJDLGdCQUFpQixTQUNqQkMsYUFDRXpmLEVBQVF5ZixjQUNSLElBQ0t6RyxHQUFjdFcsTUFBTW9PLEdBQVMyQixNQUFNLE1BQ3RDM0IsRUFBUTNGLGFBQ1IscUJBQXFCMkYsRUFBUXBGLFNBQVMsMkJBRXJDMUMsSUFBS3JGLEdBQU0sR0FBR0EsRUFBRWtPLFNBQVM4TCxHQUFVblQsTUFDbkNTLEtBQUssU0FFZCxDQUVTMlUsVUFBQUEsQ0FDUDlPLEVBQ0F0RyxHQUNBK1UsZUFBRUEsRUFBY0UsYUFBRUEsRUFBZSxZQUFZOUIsR0FBVW5ULE9BRXZELE9BQU8yVixNQUFNUCxXQUFXOU8sRUFBU3RHLEVBQU0sQ0FBRStVLGlCQUFnQkUsZ0JBQzNELENBRUEsZUFBZVksQ0FBVXZQLEVBQWtCdEcsR0FDekMsTUFBTTBKLFFBQWEySixLQUNuQixNQUFPLFVBQVUvTSxFQUFRL0UsSUFBSVcsZUFBZXdILHFFQUF3RXlKLEdBQVVuVCxRQUFXeEgsS0FBSzhjLFFBQVFoUCxFQUFTdEcsRUFBTTBKLEtBQ3ZLLEdDdEVXeU0sR0FBcUIsQ0FBQyxVQUFXLFVBQVcsU0FBVSxRQ3lCdERsQixHQUEwRyxDQUNySDNmLFFBQVMsaUJBQ1QwUSxTQUFVLG9CQVhJLENWYmQrUCxNQUFPLENBQ0w5UCxZQUFhLHlCQUNiQyxLQUFNLFdBRVIzUSxLQUFNLENBQ0owUSxZQUFhLDZCQUNiQyxLQUFNLFFBQ05DLE1BQU8sSUFDUDBKLFFBQVMsSUFFWCxpQkFBa0IsQ0FDaEI1SixZQUFhLDZCQUNiQyxLQUFNLFFBQ04ySixRQUFTLElVRVh1RyxLQUFNLENBQ0puUSxZQUFhLCtFQUNiQyxLQUFNLFNBQ05DLE1BQU8sTUFRVCxhQUFNQyxDQUFRcEcsSVZKVCxTQUNMQSxHQUVDQSxFQUFvQjRVLG1CQUFxQixJQUFLNVUsRUFBS3pLLE1BQVEsTUFBU3lLLEVBQUs3RCxHQUFHaUQsTUFBTSxJQUFNLElBQ3RGWixJQUFLNlgsR0FBUSxJQUFJQSxNQUNqQjVWLEtBQUssS0FDUFQsRUFBb0IyVSw2QkFBK0IzVSxFQUFLc1csZUFBaUIsSUFBSTlYLElBQUs2WCxHQUFRLElBQUlBLE1BQVE1VixLQUFLLElBQzlHLENVRkk4VixDQUFjdlcsR0FFZCxNQUFNOEUsUUFBaUJYLEVBQXVCbkUsR0FDekM4RSxJQUNIbk8sUUFBUUksTUFBTXdQLEVBQU1DLElBQUksc0JBQ3hCclEsUUFBUXNWLEtBQUssSUFHZixJQUFLLE1BQU1uRixLQUFXeEIsRUFBU0YsWUFBYSxDQUMxQyxNQUFNMkksRUFBT2pILEVBQVExRixZQUFZdUMsY0FBZ0IsQ0FBQSxFQUMzQzBLLEVBQVV2SCxFQUFRMUYsWUFBWXlDLGlCQUFtQixDQUFBLEVBQ3ZELElBQUl4QyxFQUNKLEdBQUkwTSxFQUFLdEMsTUFDUHBLLEVBQVUwVSxRQUNMLEdBQUloSSxFQUFLaUosS0FDZDNWLEVBQVVtVixRQUNMLEdBQUluSSxFQUFRLGtCQUNqQmhOLEVBQVVxVixRQUNMLEdBQ0pDLEdBQW1CL04sS0FBTW5PLEdBQU1zVCxFQUFLdFQsTUFBUXNULEVBQUssdUJBQ2pEakgsRUFBUW5GLGVBQWlCLGdCQUFnQmIsS0FBS2dHLEVBQVFyRixZQUV2REosRUFBVWlWLE9BQ0wsS0FBSXZJLEVBQUssY0FBZU0sRUFBUSxZQUdyQyxTQUZBaE4sRUFBVW9WLEVBR1osQ0FHQSxPQUZBdGYsUUFBUUMsS0FBSyx1QkFBdUIwUCxFQUFRckosWUFFcEMrQyxFQUFLb1csTUFBUSxPQUNuQixJQUFLLE1BQ0wsSUFBSyxjQUFlLENBQ2xCLE1BQU1oTCxFQUFTcUwsR0FBOEJsSixFQUFNLHFCQUM3Q3ZELEdBQWEsR0FBR29CLElBQVN2SyxFQUFReEksTUFBTWlPLEVBQVN0RyxLQUFTc0csRUFBU3RHLEdBQ3hFLEtBQ0YsQ0FDQSxJQUFLLFVBQVcsQ0FDZCxNQUFNb0wsRUFBU3FMLEdBQThCbEosRUFBTSxXQUM3QzdELEVBQU83SyxPQUFPeUgsRUFBUS9FLElBQUltVCxPQUFTLFdBQ25DMUssR0FBYSxHQUFHb0IsSUFBU3ZLLEVBQVE0VSxnQkFBZ0JuUCxFQUFTdEcsRUFBTTBKLEtBQVNwRCxFQUFTdEcsR0FDeEYsS0FDRixDQUNBLElBQUssU0FBVSxDQUNiLE1BQU1vTCxFQUFTcUwsR0FBOEJsSixFQUFNLGlCQUM3Q3ZELEdBQWEsR0FBR29CLElBQVN2SyxFQUFRNFQsWUFBWW5PLEVBQVN0RyxLQUFTc0csRUFBU3RHLEdBQzlFLEtBQ0YsQ0FDQSxJQUFLLGVBQWdCLENBQ25CLE1BQU1vTCxFQUFTcUwsR0FBOEJsSixFQUFNLFdBQ25Edk4sRUFBSzRVLG1CQUFxQixvQkFDcEI1SyxHQUFhLEdBQUdvQixJQUFTdkssRUFBUTRULFlBQVluTyxFQUFTdEcsS0FBU3NHLEVBQVN0RyxHQUM5RSxLQUNGLENBQ0EsSUFBSyxPQUFRLENBQ1gsTUFBTW9MLEVBQVNxTCxHQUE4QmxKLEVBQU0sY0FDN0N2RCxHQUFhLEdBQUdvQixJQUFTdkssRUFBUTZVLFVBQVVwUCxFQUFTdEcsS0FBU3NHLEVBQVN0RyxHQUM1RSxLQUNGLENBQ0EsUUFDRSxNQUFNLElBQUkzSSxNQUFNLHVCQUF1QjJJLEVBQUtvVyxRQUdsRCxDQUNGLEdBR0YsU0FBU0ssR0FBOEJsSixFQUF1Q21KLEdBQzVFdmdCLFFBQVFvTCxJQUFJVyxTQUFXd1UsRUFDdkIsSUFBSXRMLEVBQVMsVUFBVWpWLFFBQVFvTCxJQUFJVyxVQUtuQyxPQUpJcUwsRUFBS2lKLE9BQ1ByZ0IsUUFBUW9MLElBQUlvVixtQkFBcUJ4Z0IsUUFBUW9MLElBQUlXLE9BQzdDa0osR0FBVSxzQkFBc0JqVixRQUFRb0wsSUFBSVcsV0FFdkNrSixDQUNULENDbkZBLE1BdUNhd0wsR0FHVCxDQUNGdGhCLFFBQVMsb0JBQ1QwUSxTQUFVLGlFQUNWOEosUUFBUyxDQTVDVCtHLElBQUssQ0FDSDVRLFlBQ0UsNEhBQ0ZDLEtBQU0sU0FDTjRRLFFBQVMsQ0FDUCxXQUNBLGVBQ0EsU0FDQSxhQUNBLFNBQ0EsZUFDQSxRQUNBLFdBQ0EsU0FFRmpILFFBQVMsWUFFWHVELE9BQVEsQ0FDTm5OLFlBQWEsMkJBQ2JDLEtBQU0sV0FFUixlQUFnQixDQUNkRCxZQUFhLHlCQUNiQyxLQUFNLFVBS1JpUCxRQUFTLENBQ1BsUCxZQUFhLG9CQUNiQyxLQUFNLFVBZVIsYUFBTUUsQ0FBUXBHLFNBS1Q1SyxlQUNMNEssR0FFQSxNQUFNOEUsUUFBaUJYLEVBQXVCbkUsR0FDekM4RSxJQUNIbk8sUUFBUUksTUFBTXdQLEVBQU1DLElBQUksc0JBQ3hCclEsUUFBUXNWLEtBQUssSUFHWDNHLEVBQVNGLFlBQVkzTCxPQUFTLElBRWhDOUMsUUFBUW9MLElBQUlxSyxHQUFLLEtBRW5CelYsUUFBUW9MLElBQUl1SyxjQUFnQixJQUM1QjNWLFFBQVFvTCxJQUFJVyxTQUFXLE9BR3ZCLE1BQU02VSxFQUFlL1csRUFBS21WLFNBQVcsR0FDL0I2QixFQUEyQyxJQUF2QkQsRUFBWTlkLE9BR2hDZ2UsRUFBZ0JGLEVBQVkzTyxLQUFNOE8sR0FBV0EsRUFBT25XLFNBQVMsU0FDN0RvVyxFQUFpQkosRUFBWTNPLEtBQU04TyxHQUFXQSxFQUFPblcsU0FBUyxVQUM5RHFXLEVBQWdCSixHQUFxQkcsRUFDckNFLEVBQWVMLEdBQXFCQyxFQUUxQyxJQUFLLE1BQU0zUSxLQUFXeEIsRUFBU0YsWUFBYSxDQUMxQyxNQUFNMkksRUFBT2pILEVBQVExRixZQUFZdUMsY0FBZ0IsQ0FBQSxFQUMzQzBLLEVBQVV2SCxFQUFRMUYsWUFBWXlDLGlCQUFtQixDQUFBLEVBQ3ZELElBQUl4QyxFQWdCSixHQWRFQSxFQURFME0sRUFBS3RDLE1BQ0dzSyxHQUNEaEksRUFBS2lKLEtBQ0pSLEdBQ0RuSSxFQUFRLGtCQUNQcUksR0FDREMsR0FBbUIvTixLQUFNbk8sR0FBTXNULEVBQUt0VCxNQUFRc1QsRUFBSyxzQkFDaER1SSxHQUVBRyxHQUdadGYsUUFBUUMsS0FBSyxzQkFBc0IwUCxFQUFRckosWUFHdkNtYSxHQUFpQjdXLEVBQUdTLFdBQVdoTSxFQUFLeUwsS0FBSzZGLEVBQVFwRyxRQUFTLE9BQVEsU0FBVSxDQUM5RSxNQUFNb1gsRUFBY1AsRUFBWXpVLE9BQVE0VSxHQUFXQSxFQUFPblcsU0FBUyxVQUM3RHdXLEVBQVcsSUFBS3ZYLEVBQU1tVixRQUFTbUMsRUFBWXJlLE9BQVMsRUFBSXFlLE9BQWNsZ0IsU0FDdEU0UyxHQUFhbkosRUFBUXdVLFNBQVMvTyxFQUFTaVIsR0FBV2pSLEVBQVN0RyxFQUFNLENBQUU0SyxRQUFTNUssRUFBS3dYLGFBQ3pGLENBRUEsSUFBS0gsSUFBaUI5VyxFQUFHUyxXQUFXaE0sRUFBS3lMLEtBQUs2RixFQUFRcEcsUUFBUyxPQUFRLFFBQ3JFLFNBSUYsTUFBTXVYLEVBQWFWLEVBQVl6VSxPQUFRNFUsR0FBV0EsRUFBT25XLFNBQVMsU0FDNUQyVyxFQUFVLElBQUsxWCxFQUFNbVYsUUFBU3NDLEVBQVd4ZSxPQUFTLEVBQUl3ZSxPQUFhcmdCLEdBRXpFLE9BQVE0SSxFQUFLNlcsS0FDWCxJQUFLLGlCQUNHN00sR0FBYW5KLEVBQVFpVSxRQUFReE8sRUFBU29SLEVBQVMsQ0FBQSxHQUFLcFIsRUFBU3RHLEdBQ25FLFNBRUYsSUFBSyxxQkFDR2dLLEdBQWFuSixFQUFRdVUsV0FBVzlPLEVBQVNvUixFQUFTLENBQUEsR0FBS3BSLEVBQVN0RyxHQUN0RSxTQUVGLElBQUssZUFDRzJYLEdBQWFyUixFQUFTb1IsRUFBUzdXLEdBQ3JDLFNBRUYsSUFBSyxlQUFnQixDQUNuQixNQUFNK1csRUFBWUgsRUFBV3hlLE9BQVMsRUFBSXdlLEVBQVdoWCxLQUFLLEtBQU8sa0JBQzNEa1gsR0FBYXJSLEVBQVNvUixFQUFTN1csRUFBUyxRQUFRK1csYUFDdEQsUUFDRixFQUVGLEdBQUlySyxFQUFLdEMsT0FBU3NDLEVBQUtpSixNQUFRM0ksRUFBUSxrQkFBbUIsQ0FDeEQsTUFBTStKLEVBQVlILEVBQVd4ZSxPQUFTLEVBQUl3ZSxFQUFXaFgsS0FBSyxLQUFPLFlBQ2pFLE9BQVFULEVBQUs2VyxLQUNYLElBQUssZUFDRzdNLEdBQ0puSixFQUFRaVUsUUFBUXhPLEVBQVNvUixFQUFTLENBQUUzQyxlQUFnQixRQUFRNkMsZUFDNUR0UixFQUNBdEcsR0FFRixNQUVGLElBQUssbUJBQ0dnSyxHQUNKbkosRUFBUXVVLFdBQVc5TyxFQUFTb1IsRUFBUyxDQUFFM0MsZUFBZ0IsUUFBUTZDLGVBQy9EdFIsRUFDQXRHLEdBRUYsTUFFRixJQUFLLGNBQ0dnSyxHQUNKbkosRUFBUWlVLFFBQVF4TyxFQUFTb1IsRUFBUyxDQUFFM0MsZUFBZ0IsUUFBUTZDLGNBQzVEdFIsRUFDQXRHLEdBRUYsTUFFRixJQUFLLFdBQVksQ0FDZixNQUFNMEosRUFBT3BELEVBQVEvRSxJQUFJbVQsTUFBUSxhQUMzQjFLLEdBQ0puSixFQUFRaVUsUUFBUXhPLEVBQVNvUixFQUFTLENBQUUzQyxlQUFnQiw0QkFBNEJyTCxNQUNoRnBELEVBQ0F0RyxHQUVGLEtBQ0YsQ0FDQSxJQUFLLGNBQ0dnSyxHQUFhLDRCQUE2QjFELEVBQVN0RyxHQUkvRCxDQUNGLENBQ0YsQ0E3SFVNLENBQUtOLEVBQ2IsR0E4SEY1SyxlQUFldWlCLEdBQ2JyUixFQUNBdEcsRUFDQWEsRUFDQWtVLEdBRUE1ZSxRQUFRb0wsSUFBSXNXLFlBQWMsVUFDcEI3TixHQUFhLEdBQUduSixFQUFRMlQsWUFBWWxPLEVBQVMsVUFBVTZNLEdBQVVuVCxLQUFTc0csRUFBU3RHLEdBQ3pGN0osUUFBUW9ULGVBQWlCUyxHQUN2Qm5KLEVBQVFpVSxRQUFReE8sRUFBU3RHLEVBQU0sQ0FDN0IrVSxpQkFDQUUsYUFBYyxHQUFHbEIsR0FBY0UsYUFBYTNOLEdBQVMsS0FBUTZNLEdBQVVuVCxPQUV6RXNHLEVBQ0F0RyxFQUNBLENBQUUrSixjQUFjLFVBRVpDLEdBQWErSixHQUFjSyxLQUFLOU4sR0FBVUEsRUFBU3RHLEVBQzNELENDak1BLE1BQ2E4WCxHQUdULENBQ0Z4aUIsUUFBUyxhQUNUMFEsU0FBVSxzQ0FDVjhKLFFBUHNCLENBQUEsRUFRdEIsYUFBTTFKLENBQVFwRyxTQUtUNUssZUFDTDRLLEdBRUEsTUFBTThFLFFBQWlCWCxFQUF1Qm5FLEdBQ3pDOEUsSUFDSG5PLFFBQVFJLE1BQU13UCxFQUFNQyxJQUFJLHNCQUN4QnJRLFFBQVFzVixLQUFLLElBR1gzRyxFQUFTRixZQUFZM0wsT0FBUyxJQUVoQzlDLFFBQVFvTCxJQUFJcUssR0FBSyxLQUVuQnpWLFFBQVFvTCxJQUFJdUssY0FBZ0IsSUFDNUIzVixRQUFRb0wsSUFBSVcsU0FBVyxPQUV2QixJQUFLLE1BQU1vRSxLQUFXeEIsRUFBU0YsWUFBYSxDQUMxQyxNQUFNMkksRUFBT2pILEVBQVExRixZQUFZdUMsY0FBZ0IsQ0FBQSxFQUMzQzBLLEVBQVV2SCxFQUFRMUYsWUFBWXlDLGlCQUFtQixDQUFBLEVBQ3ZELElBQUl4QyxFQXNCSixHQXBCRUEsRUFERTBNLEVBQUt0QyxNQUNHc0ssR0FDRGhJLEVBQUtpSixLQUNKUixHQUNEbkksRUFBUSxrQkFDUHFJLEdBQ0RDLEdBQW1CL04sS0FBTW5PLEdBQU1zVCxFQUFLdFQsTUFBUXNULEVBQUssc0JBQ2hEdUksR0FFQUcsR0FHWnRmLFFBQVFDLEtBQUssNEJBQTRCMFAsRUFBUXJKLGtCQUUzQzROLEdBQXVCa0osR0FBY08sVUFBV2hPLEVBQVN0RyxHQUMzRE8sRUFBR1MsV0FBV2hNLEVBQUt5TCxLQUFLNkYsRUFBUXBHLFFBQVMsT0FBUSxnQkFFN0MySyxHQUF1QmhLLEVBQVF3VSxTQUFTL08sRUFBU3RHLEdBQU1zQixXQUFXLGVBQWdCLElBQUtnRixFQUFTdEcsU0FFbEc2SyxTQUE2QmhLLEVBQVFnVixVQUFVdlAsRUFBU3RHLEdBQU9zRyxFQUFTdEcsU0FDeEU0SixHQUFZb0osYUFDZHpTLEVBQUdTLFdBQVdoTSxFQUFLeUwsS0FBSzZGLEVBQVFwRyxRQUFTLE9BQVEsUUFBUyxDQUN4RG9HLEVBQVFuRixnQkFDVmhMLFFBQVFvTCxJQUFJc1csWUFBYyxVQUNwQjdOLEdBQWEsR0FBR25KLEVBQVEyVCxZQUFZbE8sRUFBUyxVQUFVNk0sR0FBVW5ULEtBQVNzRyxFQUFTdEcsSUFFM0YsTUFBTXhLLEVBQVU4USxFQUFRbkYsY0FDcEIsQ0FDRThULGFBQWNsQixHQUFjRSxhQUFhM04sR0FBUyxJQUVwRCxDQUFBLEVBQ0puUSxRQUFRb1QsZUFBaUJTLEdBRXZCbkosRUFBUWlVLFFBQVF4TyxFQUFTdEcsRUFBTXhLLEdBQVM4TCxXQUFXLGVBQWdCLElBQ25FZ0YsRUFDQXRHLEVBQ0EsQ0FDRStKLGNBQWMsVUFHWkMsR0FBYStKLEdBQWNLLEtBQUs5TixHQUFVQSxFQUFTdEcsRUFDM0QsQ0FDRixDQUNGLENBbkVVK1gsQ0FBUy9YLEVBQ2pCLEdDckJGLE1BRWFnWSxHQUdULENBQ0YxaUIsUUFBUyxZQUNUMFEsU0FBVSw2Q0FDVjhKLFFBUmMsQ0FBQSxFQVNkLGFBQU0xSixDQUFRcEcsR0FDWixNQUFNOEUsUUFBaUJYLEVBQXVCbkUsR0FBTSxHQUMvQzhFLElBQ0huTyxRQUFRSSxNQUFNd1AsRUFBTUMsSUFBSSxzQkFDeEJyUSxRQUFRc1YsS0FBSyxJQUdmLE1BQU01RSxFQUFXL0IsRUFBU0YsWUFBWXBHLElBQUlwSixVQUN4QyxNQUFNNmlCLEVBQXFCLEdBYzNCLElBYkszUixFQUFRMUYsWUFBWTJELFdBUXZCK0IsRUFBUWxGLGdCQUNQa0YsRUFBUTFGLFlBQVl1QyxjQUFjK1UsWUFBYzVSLEVBQVExRixZQUFZeUMsaUJBQWlCNlUsYUFFdEZELEVBQVM3YSxLQUFLLCtCQVZWa0osRUFBUTFGLFlBQVl1QyxjQUFjK1UsWUFBYzVSLEVBQVExRixZQUFZeUMsaUJBQWlCNlUsYUFDdkZELEVBQVM3YSxLQUFLLDZCQUVaa0osRUFBUTFGLFlBQVl5QyxpQkFBaUI4VSxTQUN2Q0YsRUFBUzdhLEtBQUssaUJBUVg2YSxFQUFTaGYsT0FBUyxHQUFHLENBQzFCLE1BQU1zUSxRQUFpQnNCLEdBQXVCb04sRUFBU3hYLEtBQUssUUFBUzZGLEVBQVN0RyxFQUFNLENBRWxGMkwsR0FBSTdHLEVBQVNGLFlBQVkzTCxPQUFTLEVBQ2xDOFEsY0FBYyxFQUNkOEIsWUFBWSxJQUlSdU0sRUFBY3BqQixFQUFLeUwsS0FBSzZGLEVBQVFwRyxRQUFTLFNBQy9DLElBQUlxSixJQUFZaEosRUFBR1MsV0FBV29YLEdBTTlCLE9BQU83TyxFQUxMaEosRUFBRzhYLE9BQU9ELEVBQWEsQ0FBRUUsT0FBTyxFQUFNdlIsV0FBVyxJQUNqRHBRLFFBQVFDLEtBQUsyUCxFQUFNK0wsT0FBTyw0REFLOUIsSUFFSWlHLFFBQWtCOWlCLFFBQVEraUIsSUFBSTNSLEdBQ3BDLElBQUk0UixFQUFnQixFQUNwQixJQUFLLE1BQU83Z0IsRUFBRzJSLEtBQWFnUCxFQUFVeGdCLFVBQ3BDLEdBQUl3UixFQUFVLEVBQ0N6RSxFQUFTRixZQUFZaE4sSUFBSWdKLFlBQVl1QyxjQUFnQixDQUFBLEdBQ3pEOEgsT0FDUHRVLFFBQVFDLEtBQUsyUCxFQUFNK0wsT0FBTyxnRUFFNUJtRyxFQUFnQmxQLENBQ2xCLENBRUVrUCxHQUFldGlCLFFBQVFzVixLQUFLZ04sRUFDbEMsR0FHV0MsR0FBdUcsSUFDL0dWLEdBQ0gxaUIsUUFBUyxZQzFETDBhLEVBQU0ySSxFQUFReGlCLFFBQVE2SixPQUN6QjRZLFdBQVcsTUFDWHBqQixRQUFRb2EsSUFDUmlKLFdBQVk3WSxJQUNYLE1BQU04WSxFQUFhOVksRUFBSyxlQUN4QixHQUFJOFksRUFBWSxDQUNkLE1BQU01WSxFQUFVbEwsRUFBS0MsUUFBUTZqQixHQUM3QjNpQixRQUFRNGlCLE1BQU03WSxFQUNoQixFcEM0R0csU0FBOENzQixHQUUvQ0EsRUFBUXNDLE1BQVF0QyxFQUFRd1gsbUJBQzFCeFgsRUFBUXNDLEtBQU90QyxFQUFRc0MsS0FBS29FLFFBQVEsR0FBRzFHLEVBQVF3WCxvQkFBcUIsSUFFakUxWCxXQUFXLG1DQUFvQyxJQUUvQ0EsV0FBVyxzQkFBdUIsSUFDbENBLFdBQVcsaUJBQWtCLEtBRWxDLElBQUssTUFBTW9CLEtBQU9yRCxPQUFPeUQsS0FBS3RCLEdBQVUsQ0FDdEMsTUFBTXlYLEVBQVd2VyxFQUFJd1csZUFFbkJELEVBQVN6TCxXQUFXLFNBQ3BCeUwsRUFBU3pMLFdBQVcsVUFDcEJ5TCxFQUFTekwsV0FBVyxXQUNQLGdCQUFieUwsR0FDYSxhQUFiQSxXQUdPelgsRUFBUWtCLEVBRW5CLENBQ0YsQ29DaklJeVcsQ0FBcUNoakIsUUFBUW9MLE9BRTlDak0sUUFBUXlRLEdBQ1J6USxRQUFRNlcsSUFDUjdXLFFBQVErWCxJQUNSL1gsUUFBUXlhLElBQ1J6YSxRQUFRNGMsSUFDUjVjLFFBQVFpZCxJQUNSamQsUUFBUTJmLElBQ1IzZixRQUFRc2hCLElBQ1J0aEIsUUFBUXdpQixJQUNSeGlCLFFBQVEwaUIsSUFDUjFpQixRQUFRb2pCLElBQ1IvSCxnQkFDQUMsU0FDQW1DLFFBR0gsV0FDRSxJQUFJcUcsRUFBaUJwa0IsRUFBS3lPLFFBQVEsSUFBSW5GLGdCQUFnQithLEtBQUtDLFVBQzNELE1BQVEvWSxFQUFHUyxXQUFXaE0sRUFBS3lMLEtBQUsyWSxFQUFnQixrQkFDOUNBLEVBQWlCcGtCLEVBQUt5TyxRQUFRMlYsR0FLaEMsT0FIb0J6YSxLQUFLcUUsTUFBTXpDLEVBQUdDLGFBQWF4TCxFQUFLeUwsS0FBSzJZLEVBQWdCLGdCQUFpQixTQUd2RXJHLE9BQ3JCLENBWld3RyxJQUNSQyxPQUFPeFosS0FhVixJQUFLLE1BQU03SSxJQUFVLENBQUMsU0FBVSxVQUFXLFdBQ3pDaEIsUUFBUUgsR0FBR21CLEVBQVEsSUFBTWhCLFFBQVFzViIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlsyLDMsNCw1LDZdfQ==